Compare commits
	
		
			94 Commits
		
	
	
		
			v0.14.0-b3
			...
			v0.14.0-b4
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|   | 04aa9f0e61 | ||
|   | 45d7e66488 | ||
|   | bdff05feaf | ||
|   | 8503aba583 | ||
|   | bb8223d4ff | ||
|   | 5df197e814 | ||
|   | 5fe09e9787 | ||
|   | 1ed817932b | ||
|   | 0ccadb246f | ||
| ![dependabot[bot]](/assets/img/avatar_default.png)  | b67235a7e5 | ||
|   | 93853613bd | ||
|   | 1ecb4fedcc | ||
|   | c8fdf3731a | ||
|   | f8e766ffc0 | ||
|   | 050489dd80 | ||
|   | 2db966ba47 | ||
|   | aa54d65f63 | ||
|   | e3ee48b52e | ||
|   | 8ccf349458 | ||
|   | 2fce15db94 | ||
|   | 0cf50e8000 | ||
|   | 5b9630cf46 | ||
|   | 7dcbb409a9 | ||
|   | 286e057fae | ||
|   | 7d4fe341f1 | ||
|   | 76acb7bb58 | ||
|   | 5ef7cd7bdd | ||
|   | ebb4628e66 | ||
|   | 0928060c75 | ||
|   | d8f9a9a03c | ||
|   | abfb8bbc34 | ||
|   | 82e01f7b17 | ||
| ![dependabot[bot]](/assets/img/avatar_default.png)  | a97609e920 | ||
|   | f1e1bd41b9 | ||
|   | 57d35858d8 | ||
|   | 0b956c66c1 | ||
|   | b1dfa1db61 | ||
|   | cb579ecc62 | ||
|   | ae235aa58c | ||
|   | 6302056182 | ||
|   | 5e20abd7f1 | ||
|   | 72a72dbc88 | ||
|   | 4766666913 | ||
|   | fa6070c680 | ||
|   | 6267d11e51 | ||
|   | 822298ab66 | ||
|   | 2ad3ab7f0d | ||
|   | f437fd6cd6 | ||
|   | 42b247756a | ||
|   | fbbf2d5eb3 | ||
|   | 788a276616 | ||
|   | 196779ffb6 | ||
|   | 59a144baed | ||
|   | ad825b80b0 | ||
|   | 45a0061660 | ||
|   | 8831c76fb4 | ||
|   | 66616e1cab | ||
|   | fa281a0df0 | ||
|   | d48a96599f | ||
|   | 7de7ef8e8c | ||
|   | 406a254523 | ||
|   | eabd6f60ef | ||
|   | e416d06aa9 | ||
|   | 65e073e6b8 | ||
|   | 45ac0d5dc6 | ||
|   | c9ef034ab8 | ||
|   | c89f38f4f8 | ||
|   | 858b57d77a | ||
|   | 9b87892036 | ||
|   | 272f96b405 | ||
|   | 3e519001a3 | ||
|   | f442aad962 | ||
|   | fa9b151c36 | ||
|   | 481bd6f57a | ||
|   | f015227fc8 | ||
|   | 61ba16b779 | ||
|   | f6e86bfcf8 | ||
|   | 498dd76730 | ||
|   | ebd909dfe7 | ||
|   | 067ed1258b | ||
|   | ef3c72a24f | ||
|   | b257f476c9 | ||
|   | d3af2be79a | ||
|   | e4ee392c27 | ||
|   | 63df85f7f9 | ||
|   | b29611509e | ||
|   | dd1cf0ec56 | ||
|   | 9831e7bc3b | ||
|   | 90e37439e5 | ||
|   | 65f2490e89 | ||
|   | c14a921e5a | ||
|   | 2bc8ffefce | ||
|   | b88d8c85cb | ||
|   | 693f52d984 | 
							
								
								
									
										36
									
								
								CHANGELOG.md
									
									
									
									
									
								
							
							
						
						
									
										36
									
								
								CHANGELOG.md
									
									
									
									
									
								
							| @@ -1,7 +1,41 @@ | ||||
| ## WLED changelog | ||||
|  | ||||
| #### Build 2306180 | ||||
| #### Build 2308110 | ||||
| -   Release of WLED beta version 0.14.0-b4 "Hoshi" | ||||
| -   Reset effect data immediately upon mode change | ||||
|  | ||||
| #### Build 2308030 | ||||
| -   Improved random palette handling and blending | ||||
| -   Soap bugfix | ||||
| -   Fix ESP-NOW crash with AP mode Always | ||||
|  | ||||
| #### Build 2307180 | ||||
| -   Bus-level global buffering (#3280) | ||||
| -   Removed per-segment LED buffer (SEGMENT.leds) | ||||
| -   various fixes and improvements (ESP variants platform 5.3.0, effect optimizations, /json/cfg pin allocation) | ||||
|  | ||||
| #### Build 2307130 | ||||
| -   larger `oappend()` stack buffer (3.5k) for ESP32 | ||||
| -   Preset cycle bugfix (#3262) | ||||
| -   Rotary encoder ALT fix for large LED count (#3276) | ||||
| -   effect updates (2D Plasmaball), `blur()` speedup | ||||
| -   On/Off toggle from nodes view (may show unknow device type on older versions) (#3291) | ||||
| -   various fixes and improvements (ABL, crashes when changing presets with different segments) | ||||
|  | ||||
| #### Build 2306270 | ||||
| -   ESP-NOW remote support (#3237) | ||||
| -   Pixel Magic tool (display pixel art) (#3249) | ||||
| -   Websocket (peek) fallback when connection cannot be established, WS retries (#3267) | ||||
| -   Add WiFi network scan RPC command to Improv Serial (#3271) | ||||
| -   Longer (custom option available) segment name for ESP32 | ||||
| -   various fixes and improvements | ||||
|  | ||||
| #### Build 2306210 | ||||
| -   0.14.0-b3 release | ||||
| -   respect global I2C in all usermods (no local initilaisation of I2C bus) | ||||
| -   Multi relay usermod compile-time enabled option (-D MULTI_RELAY_ENABLED=true|false) | ||||
|  | ||||
| #### Build 2306180 | ||||
| -   Added client-side option for applying effect defaults from metadata | ||||
| -   Improved ESP8266 stability by reducing WebSocket response resends | ||||
| -   Updated ESP8266 core to 3.1.2 | ||||
|   | ||||
							
								
								
									
										8
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										8
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							| @@ -1,6 +1,6 @@ | ||||
| { | ||||
|   "name": "wled", | ||||
|   "version": "0.14.0-b3", | ||||
|   "version": "0.14.0-b4", | ||||
|   "lockfileVersion": 1, | ||||
|   "requires": true, | ||||
|   "dependencies": { | ||||
| @@ -1409,9 +1409,9 @@ | ||||
|       "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" | ||||
|     }, | ||||
|     "semver": { | ||||
|       "version": "5.7.1", | ||||
|       "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", | ||||
|       "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" | ||||
|       "version": "5.7.2", | ||||
|       "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", | ||||
|       "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==" | ||||
|     }, | ||||
|     "semver-diff": { | ||||
|       "version": "2.1.0", | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| { | ||||
|   "name": "wled", | ||||
|   "version": "0.14.0-b3", | ||||
|   "version": "0.14.0-b4", | ||||
|   "description": "Tools for WLED project", | ||||
|   "main": "tools/cdata.js", | ||||
|   "directories": { | ||||
|   | ||||
| @@ -10,8 +10,8 @@ | ||||
| # ------------------------------------------------------------------------------ | ||||
|  | ||||
| # CI binaries | ||||
| ;; default_envs = nodemcuv2, esp8266_2m, esp01_1m_full, esp32dev, esp32_eth # ESP32 variant builds are temporarily excluded from CI due to toolchain issues on the GitHub Actions Linux environment | ||||
| default_envs = nodemcuv2, esp8266_2m, esp01_1m_full, esp32dev, esp32_eth, lolin_s2_mini, esp32c3dev, esp32s3dev_8MB | ||||
| ; default_envs = nodemcuv2, esp8266_2m, esp01_1m_full, esp32dev, esp32_eth # ESP32 variant builds are temporarily excluded from CI due to toolchain issues on the GitHub Actions Linux environment | ||||
| default_envs = nodemcuv2, esp8266_2m, esp01_1m_full, esp32dev, esp32_eth, lolin_s2_mini, esp32c3dev, esp32s3dev_8MB, esp32s3dev_8MB_PSRAM_opi | ||||
|  | ||||
| # Release binaries | ||||
| ; default_envs = nodemcuv2, esp8266_2m, esp01_1m_full, esp32dev, esp32_eth, lolin_s2_mini, esp32c3dev, esp32s3dev_8MB | ||||
| @@ -40,6 +40,8 @@ default_envs = nodemcuv2, esp8266_2m, esp01_1m_full, esp32dev, esp32_eth, lolin_ | ||||
| ; default_envs = esp32dev_qio80 | ||||
| ; default_envs = esp32_eth_ota1mapp | ||||
| ; default_envs = esp32s2_saola | ||||
| ; default_envs = esp32c3dev | ||||
| ; default_envs = lolin_s2_mini | ||||
|  | ||||
| src_dir  = ./wled00 | ||||
| data_dir = ./wled00/data | ||||
| @@ -173,7 +175,7 @@ upload_speed = 115200 | ||||
| # ------------------------------------------------------------------------------ | ||||
| lib_compat_mode = strict | ||||
| lib_deps = | ||||
|     fastled/FastLED @ 3.5.0 | ||||
|     fastled/FastLED @ 3.6.0 | ||||
|     IRremoteESP8266 @ 2.8.2 | ||||
|     makuna/NeoPixelBus @ 2.7.5 | ||||
|     https://github.com/Aircoookie/ESPAsyncWebServer.git @ ~2.0.7 | ||||
| @@ -199,7 +201,7 @@ build_flags = | ||||
|   -DESP8266 | ||||
|   -DFP_IN_IROM | ||||
|   ;-Wno-deprecated-declarations | ||||
|   -Wno-register  ;; leaves some warnings when compiling C files: command-line option '-Wno-register' is valid for C++/ObjC++ but not for C | ||||
|   ;-Wno-register  ;; leaves some warnings when compiling C files: command-line option '-Wno-register' is valid for C++/ObjC++ but not for C | ||||
|   ;-Dregister= # remove warnings in C++17 due to use of deprecated register keyword by the FastLED library ;; warning: this can be dangerous | ||||
|   -Wno-misleading-indentation | ||||
|   ; NONOSDK22x_190703 = 2.2.2-dev(38a443e) | ||||
| @@ -247,9 +249,8 @@ lib_deps = | ||||
| ;; | ||||
| ;; please note that you can NOT update existing ESP32 installs with a "V4" build. Also updating by OTA will not work properly. | ||||
| ;; You need to completely erase your device (esptool erase_flash) first, then install the "V4" build from VSCode+platformio. | ||||
| platform = espressif32@5.2.0 | ||||
| platform = espressif32@5.3.0 | ||||
| platform_packages = | ||||
|   toolchain-riscv32-esp @ 8.4.0+2021r2-patch5 ; required for platform version < 5.3.0, remove this line when upgrading to platform >=5.3.0 | ||||
| build_flags = -g | ||||
|   -Wshadow=compatible-local ;; emit warning in case a local variable "shadows" another local one | ||||
|   -DARDUINO_ARCH_ESP32 -DESP32 | ||||
| @@ -263,9 +264,8 @@ lib_deps = | ||||
|  | ||||
| [esp32s2] | ||||
| ;; generic definitions for all ESP32-S2 boards | ||||
| platform = espressif32@5.2.0 | ||||
| platform = espressif32@5.3.0 | ||||
| platform_packages = | ||||
|   toolchain-riscv32-esp @ 8.4.0+2021r2-patch5 ; required for platform version < 5.3.0, remove this line when upgrading to platform >=5.3.0 | ||||
| build_flags = -g | ||||
|   -DARDUINO_ARCH_ESP32 | ||||
|   -DARDUINO_ARCH_ESP32S2 | ||||
| @@ -283,9 +283,8 @@ lib_deps = | ||||
|  | ||||
| [esp32c3] | ||||
| ;; generic definitions for all ESP32-C3 boards | ||||
| platform = espressif32@5.2.0 | ||||
| platform = espressif32@5.3.0 | ||||
| platform_packages = | ||||
|   toolchain-riscv32-esp @ 8.4.0+2021r2-patch5 ; required for platform version < 5.3.0, remove this line when upgrading to platform >=5.3.0 | ||||
| build_flags = -g | ||||
|   -DARDUINO_ARCH_ESP32 | ||||
|   -DARDUINO_ARCH_ESP32C3 | ||||
| @@ -302,9 +301,8 @@ lib_deps = | ||||
|  | ||||
| [esp32s3] | ||||
| ;; generic definitions for all ESP32-S3 boards | ||||
| platform = espressif32@5.2.0 | ||||
| platform = espressif32@5.3.0 | ||||
| platform_packages = | ||||
|   toolchain-riscv32-esp @ 8.4.0+2021r2-patch5 ; required for platform version < 5.3.0, remove this line when upgrading to platform >=5.3.0 | ||||
| build_flags = -g | ||||
|   -DESP32 | ||||
|   -DARDUINO_ARCH_ESP32 | ||||
| @@ -435,6 +433,7 @@ platform_packages = ${esp32.platform_packages} | ||||
| upload_speed = 921600 | ||||
| build_unflags = ${common.build_unflags} | ||||
| build_flags = ${common.build_flags_esp32} -D WLED_RELEASE_NAME=ESP32_Ethernet -D RLYPIN=-1 -D WLED_USE_ETHERNET -D BTNPIN=-1 | ||||
|   -D WLED_DISABLE_ESPNOW ;; ESP-NOW requires wifi, may crash with ethernet only | ||||
| lib_deps = ${esp32.lib_deps} | ||||
| board_build.partitions = ${esp32.default_partitions} | ||||
|  | ||||
| @@ -448,6 +447,7 @@ board_build.flash_mode = qio | ||||
| upload_speed = 460800 | ||||
| build_unflags = ${common.build_unflags} | ||||
| build_flags = ${common.build_flags} ${esp32s2.build_flags} #-D WLED_RELEASE_NAME=S2_saola | ||||
|   ;-DLOLIN_WIFI_FIX ;; try this in case Wifi does not work | ||||
|   -DARDUINO_USB_CDC_ON_BOOT=1 | ||||
| lib_deps = ${esp32s2.lib_deps} | ||||
|  | ||||
| @@ -458,10 +458,11 @@ platform_packages = ${esp32c3.platform_packages} | ||||
| framework = arduino | ||||
| board = esp32-c3-devkitm-1 | ||||
| board_build.partitions = tools/WLED_ESP32_4MB_1MB_FS.csv | ||||
| build_flags = ${common.build_flags} ${esp32c3.build_flags} #-D WLED_RELEASE_NAME=ESP32-C3 | ||||
| build_flags = ${common.build_flags} ${esp32c3.build_flags} -D WLED_RELEASE_NAME=ESP32-C3 | ||||
|   -D WLED_WATCHDOG_TIMEOUT=0 | ||||
|   ; -DARDUINO_USB_CDC_ON_BOOT=1 ;; for virtual CDC USB | ||||
|   -DARDUINO_USB_CDC_ON_BOOT=0   ;; for serial-to-USB chip | ||||
|   -DLOLIN_WIFI_FIX ; seems to work much better with this | ||||
|   -DARDUINO_USB_CDC_ON_BOOT=1 ;; for virtual CDC USB | ||||
|   ;-DARDUINO_USB_CDC_ON_BOOT=0   ;; for serial-to-USB chip | ||||
| upload_speed = 460800 | ||||
| build_unflags = ${common.build_unflags} | ||||
| lib_deps = ${esp32c3.lib_deps} | ||||
| @@ -473,10 +474,10 @@ platform = ${esp32s3.platform} | ||||
| platform_packages = ${esp32s3.platform_packages} | ||||
| upload_speed = 921600 ; or  460800 | ||||
| build_unflags = ${common.build_unflags} | ||||
| build_flags = ${common.build_flags} ${esp32s3.build_flags} | ||||
| build_flags = ${common.build_flags} ${esp32s3.build_flags} -D WLED_RELEASE_NAME=ESP32-S3_8MB | ||||
|   -D CONFIG_LITTLEFS_FOR_IDF_3_2 -D WLED_WATCHDOG_TIMEOUT=0 | ||||
|   -D ARDUINO_USB_CDC_ON_BOOT=0  ;; -D ARDUINO_USB_MODE=1 ;; for boards with serial-to-USB chip | ||||
|   ;-D ARDUINO_USB_CDC_ON_BOOT=1 ;; -D ARDUINO_USB_MODE=0 ;; for boards with USB-OTG connector only (USBCDC or "TinyUSB") | ||||
|   ;-D ARDUINO_USB_CDC_ON_BOOT=1 ;; -D ARDUINO_USB_MODE=1 ;; for boards with USB-OTG connector only (USBCDC or "TinyUSB") | ||||
|   ;-D WLED_DEBUG | ||||
| lib_deps = ${esp32s3.lib_deps} | ||||
| board_build.partitions = tools/WLED_ESP32_8MB.csv | ||||
| @@ -485,19 +486,18 @@ board_build.flash_mode = qio | ||||
| ; board_build.flash_mode = dio   ;; try this if you have problems at startup | ||||
| monitor_filters = esp32_exception_decoder | ||||
|  | ||||
| [env:esp32s3dev_8MB_PSRAM] | ||||
| ;; ESP32-TinyS3 development board, with 8MB FLASH and 8MB PSRAM (memory_type: qio_opi, qio_qspi, or opi_opi) | ||||
| ;board = um_tinys3 ;    -> needs workaround from https://github.com/Aircoookie/WLED/pull/2905#issuecomment-1328049860 | ||||
| ;board = esp32s3box   ; -> error: 'esp32_adc2gpio' was not declared in this scope | ||||
| board = esp32-s3-devkitc-1 ; -> compiles, but does not support PSRAM | ||||
| [env:esp32s3dev_8MB_PSRAM_opi] | ||||
| ;; ESP32-S3 development board, with 8MB FLASH and >= 8MB PSRAM (memory_type: qio_opi) | ||||
| board = esp32-s3-devkitc-1 ;; generic dev board; the next line adds PSRAM support | ||||
| board_build.arduino.memory_type = qio_opi     ;; use with PSRAM: 8MB or 16MB | ||||
| platform = ${esp32s3.platform} | ||||
| platform_packages = ${esp32s3.platform_packages} | ||||
| upload_speed = 921600 | ||||
| build_unflags = ${common.build_unflags} | ||||
| build_flags = ${common.build_flags} ${esp32s3.build_flags} | ||||
|   -D CONFIG_LITTLEFS_FOR_IDF_3_2 -D WLED_WATCHDOG_TIMEOUT=0 | ||||
|   ;-D ARDUINO_USB_CDC_ON_BOOT=0 ;; -D ARDUINO_USB_MODE=1 ;; for boards with serial-to-USB chip | ||||
|   -D ARDUINO_USB_CDC_ON_BOOT=1  ;; -D ARDUINO_USB_MODE=0 ;; for boards with USB-OTG connector only (USBCDC or "TinyUSB") | ||||
|   ;-D ARDUINO_USB_CDC_ON_BOOT=0  ;; -D ARDUINO_USB_MODE=1 ;; for boards with serial-to-USB chip | ||||
|   -D ARDUINO_USB_CDC_ON_BOOT=1 -D ARDUINO_USB_MODE=1      ;; for boards with USB-OTG connector only (USBCDC or "TinyUSB") | ||||
|   ; -D WLED_RELEASE_NAME=ESP32-S3_PSRAM | ||||
|   -D WLED_USE_PSRAM -DBOARD_HAS_PSRAM ; tells WLED that PSRAM shall be used | ||||
| lib_deps = ${esp32s3.lib_deps} | ||||
| @@ -506,6 +506,13 @@ board_build.f_flash = 80000000L | ||||
| board_build.flash_mode = qio | ||||
| monitor_filters = esp32_exception_decoder | ||||
|  | ||||
| [env:esp32s3dev_8MB_PSRAM_qspi] | ||||
| ;; ESP32-TinyS3 development board, with 8MB FLASH and PSRAM (memory_type: qio_qspi) | ||||
| extends = env:esp32s3dev_8MB_PSRAM_opi | ||||
| ;board = um_tinys3 ;    -> needs workaround from https://github.com/Aircoookie/WLED/pull/2905#issuecomment-1328049860 | ||||
| board = esp32-s3-devkitc-1 ;; generic dev board; the next line adds PSRAM support | ||||
| board_build.arduino.memory_type = qio_qspi ;; use with PSRAM: 2MB or  4MB | ||||
|  | ||||
| [env:esp8285_4CH_MagicHome] | ||||
| board = esp8285 | ||||
| platform = ${common.platform_wled_default} | ||||
| @@ -573,10 +580,10 @@ platform = ${esp32s2.platform} | ||||
| platform_packages = ${esp32s2.platform_packages} | ||||
| board = lolin_s2_mini | ||||
| board_build.partitions = tools/WLED_ESP32_4MB_1MB_FS.csv | ||||
| build_unflags = ${common.build_unflags} -DARDUINO_USB_CDC_ON_BOOT=1 | ||||
| build_flags = ${common.build_flags} ${esp32s2.build_flags} #-D WLED_RELEASE_NAME=LolinS2 | ||||
| build_unflags = ${common.build_unflags} #-DARDUINO_USB_CDC_ON_BOOT=1 | ||||
| build_flags = ${common.build_flags} ${esp32s2.build_flags} -D WLED_RELEASE_NAME=ESP32-S2 | ||||
|   -DBOARD_HAS_PSRAM | ||||
|   -DARDUINO_USB_CDC_ON_BOOT=0 | ||||
|   -DARDUINO_USB_CDC_ON_BOOT=1 # try disabling and enabling unflag above in case of board-specific issues, will disable Serial | ||||
|   -DARDUINO_USB_MSC_ON_BOOT=0 | ||||
|   -DARDUINO_USB_DFU_ON_BOOT=0 | ||||
|   -DLOLIN_WIFI_FIX ; seems to work much better with this | ||||
|   | ||||
| @@ -12,7 +12,7 @@ anyio==3.6.2 | ||||
|     # via starlette | ||||
| bottle==0.12.25 | ||||
|     # via platformio | ||||
| certifi==2022.12.7 | ||||
| certifi==2023.7.22 | ||||
|     # via requests | ||||
| charset-normalizer==3.1.0 | ||||
|     # via requests | ||||
|   | ||||
							
								
								
									
										8
									
								
								tools/WLED_ESP32_16MB_9MB_FS.csv
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								tools/WLED_ESP32_16MB_9MB_FS.csv
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,8 @@ | ||||
| # Name,   Type, SubType, Offset,  Size, Flags | ||||
| nvs,      data, nvs,     0x9000,  0x5000, | ||||
| otadata,  data, ota,     0xe000,  0x2000, | ||||
| app0,     app,  ota_0,   0x10000, 0x300000, | ||||
| app1,     app,  ota_1,   0x310000,0x300000, | ||||
| spiffs,   data, spiffs,  0x610000,0x9E0000, | ||||
| coredump, data, coredump,,64K | ||||
| # to create/use ffat, see https://github.com/marcmerlin/esp32_fatfsimage | ||||
| 
 | 
| @@ -3,4 +3,5 @@ nvs,      data, nvs,     0x9000,  0x5000, | ||||
| otadata,  data, ota,     0xe000,  0x2000, | ||||
| app0,     app,  ota_0,   0x10000, 0x200000, | ||||
| app1,     app,  ota_1,   0x210000,0x200000, | ||||
| spiffs,   data, spiffs,  0x410000,0x3F0000, | ||||
| spiffs,   data, spiffs,  0x410000,0x3E0000, | ||||
| coredump, data, coredump,,64K | ||||
|   | ||||
| 
 | 
| @@ -222,6 +222,7 @@ writeHtmlGzipped("wled00/data/index.htm", "wled00/html_ui.h", 'index'); | ||||
| writeHtmlGzipped("wled00/data/simple.htm", "wled00/html_simple.h", 'simple'); | ||||
| writeHtmlGzipped("wled00/data/pixart/pixart.htm", "wled00/html_pixart.h", 'pixart'); | ||||
| writeHtmlGzipped("wled00/data/cpal/cpal.htm", "wled00/html_cpal.h", 'cpal'); | ||||
| writeHtmlGzipped("wled00/data/pxmagic/pxmagic.htm", "wled00/html_pxmagic.h", 'pxmagic'); | ||||
| /* | ||||
| writeChunks( | ||||
|   "wled00/data", | ||||
| @@ -389,12 +390,6 @@ const char PAGE_dmxmap[] PROGMEM = R"=====()====="; | ||||
|       method: "gzip", | ||||
|       filter: "html-minify", | ||||
|     }, | ||||
|     { | ||||
|       file: "liveviewws.htm", | ||||
|       name: "PAGE_liveviewws", | ||||
|       method: "gzip", | ||||
|       filter: "html-minify", | ||||
|     }, | ||||
|     { | ||||
|       file: "liveviewws2D.htm", | ||||
|       name: "PAGE_liveviewws2D", | ||||
|   | ||||
| @@ -1149,6 +1149,13 @@ class AudioReactive : public Usermod { | ||||
|           if (audioSource) audioSource->initialize(i2swsPin, i2ssdPin); | ||||
|           break; | ||||
|         #endif | ||||
|         case 6: | ||||
|           DEBUGSR_PRINTLN(F("AR: ES8388 Source")); | ||||
|           audioSource = new ES8388Source(SAMPLE_RATE, BLOCK_SIZE); | ||||
|           delay(100); | ||||
|           if (audioSource) audioSource->initialize(i2swsPin, i2ssdPin, i2sckPin, mclkPin); | ||||
|           break; | ||||
|  | ||||
|         #if  !defined(CONFIG_IDF_TARGET_ESP32S2) && !defined(CONFIG_IDF_TARGET_ESP32C3) && !defined(CONFIG_IDF_TARGET_ESP32S3) | ||||
|         // ADC over I2S is only possible on "classic" ESP32 | ||||
|         case 0: | ||||
| @@ -1738,6 +1745,8 @@ class AudioReactive : public Usermod { | ||||
|     #if  !defined(CONFIG_IDF_TARGET_ESP32S2) && !defined(CONFIG_IDF_TARGET_ESP32C3) | ||||
|       oappend(SET_F("addOption(dd,'Generic I2S PDM',5);")); | ||||
|     #endif | ||||
|     oappend(SET_F("addOption(dd,'ES8388',6);")); | ||||
|      | ||||
|       oappend(SET_F("dd=addDropdown('AudioReactive','config:AGC');")); | ||||
|       oappend(SET_F("addOption(dd,'Off',0);")); | ||||
|       oappend(SET_F("addOption(dd,'Normal',1);")); | ||||
|   | ||||
| @@ -427,6 +427,122 @@ public: | ||||
|     } | ||||
| }; | ||||
|  | ||||
| /* ES8388 Sound Modude | ||||
|    This is an I2S sound processing unit that requires ininitialization over | ||||
|    I2C before I2S data can be received.  | ||||
| */ | ||||
| class ES8388Source : public I2SSource { | ||||
|   private: | ||||
|  | ||||
|     void _es8388I2cWrite(uint8_t reg, uint8_t val) { | ||||
| #ifndef ES8388_ADDR | ||||
|       Wire.beginTransmission(0x10); | ||||
|       #define ES8388_ADDR 0x10   // default address | ||||
| #else | ||||
|       Wire.beginTransmission(ES8388_ADDR); | ||||
| #endif | ||||
|       Wire.write((uint8_t)reg); | ||||
|       Wire.write((uint8_t)val); | ||||
|       uint8_t i2cErr = Wire.endTransmission();  // i2cErr == 0 means OK | ||||
|       if (i2cErr != 0) { | ||||
|         DEBUGSR_PRINTF("AR: ES8388 I2C write failed with error=%d  (addr=0x%X, reg 0x%X, val 0x%X).\n", i2cErr, ES8388_ADDR, reg, val); | ||||
|       } | ||||
|     } | ||||
|  | ||||
|     void _es8388InitAdc() { | ||||
|       // https://dl.radxa.com/rock2/docs/hw/ds/ES8388%20user%20Guide.pdf Section 10.1 | ||||
|       // http://www.everest-semi.com/pdf/ES8388%20DS.pdf Better spec sheet, more clear.  | ||||
|       // https://docs.google.com/spreadsheets/d/1CN3MvhkcPVESuxKyx1xRYqfUit5hOdsG45St9BCUm-g/edit#gid=0 generally | ||||
|       // Sets ADC to around what AudioReactive expects, and loops line-in to line-out/headphone for monitoring. | ||||
|       // Registries are decimal, settings are binary as that's how everything is listed in the docs | ||||
|       // ...which makes it easier to reference the docs. | ||||
|       // | ||||
|       _es8388I2cWrite( 8,0b00000000); // I2S to slave | ||||
|       _es8388I2cWrite( 2,0b11110011); // Power down DEM and STM | ||||
|       _es8388I2cWrite(43,0b10000000); // Set same LRCK | ||||
|       _es8388I2cWrite( 0,0b00000101); // Set chip to Play & Record Mode | ||||
|       _es8388I2cWrite(13,0b00000010); // Set MCLK/LRCK ratio to 256 | ||||
|       _es8388I2cWrite( 1,0b01000000); // Power up analog and lbias | ||||
|       _es8388I2cWrite( 3,0b00000000); // Power up ADC, Analog Input, and Mic Bias | ||||
|       _es8388I2cWrite( 4,0b11111100); // Power down DAC, Turn on LOUT1 and ROUT1 and LOUT2 and ROUT2 power | ||||
|       _es8388I2cWrite( 2,0b01000000); // Power up DEM and STM and undocumented bit for "turn on line-out amp" | ||||
|  | ||||
|       // #define use_es8388_mic | ||||
|  | ||||
|     #ifdef use_es8388_mic | ||||
|       // The mics *and* line-in are BOTH connected to LIN2/RIN2 on the AudioKit | ||||
|       // so there's no way to completely eliminate the mics. It's also hella noisy.  | ||||
|       // Line-in works OK on the AudioKit, generally speaking, as the mics really need | ||||
|       // amplification to be noticable in a quiet room. If you're in a very loud room,  | ||||
|       // the mics on the AudioKit WILL pick up sound even in line-in mode.  | ||||
|       // TL;DR: Don't use the AudioKit for anything, use the LyraT.  | ||||
|       // | ||||
|       // The LyraT does a reasonable job with mic input as configured below. | ||||
|  | ||||
|       // Pick one of these. If you have to use the mics, use a LyraT over an AudioKit if you can: | ||||
|       _es8388I2cWrite(10,0b00000000); // Use Lin1/Rin1 for ADC input (mic on LyraT) | ||||
|       //_es8388I2cWrite(10,0b01010000); // Use Lin2/Rin2 for ADC input (mic *and* line-in on AudioKit) | ||||
|        | ||||
|       _es8388I2cWrite( 9,0b10001000); // Select Analog Input PGA Gain for ADC to +24dB (L+R) | ||||
|       _es8388I2cWrite(16,0b00000000); // Set ADC digital volume attenuation to 0dB (left) | ||||
|       _es8388I2cWrite(17,0b00000000); // Set ADC digital volume attenuation to 0dB (right) | ||||
|       _es8388I2cWrite(38,0b00011011); // Mixer - route LIN1/RIN1 to output after mic gain | ||||
|  | ||||
|       _es8388I2cWrite(39,0b01000000); // Mixer - route LIN to mixL, +6dB gain | ||||
|       _es8388I2cWrite(42,0b01000000); // Mixer - route RIN to mixR, +6dB gain | ||||
|       _es8388I2cWrite(46,0b00100001); // LOUT1VOL - 0b00100001 = +4.5dB | ||||
|       _es8388I2cWrite(47,0b00100001); // ROUT1VOL - 0b00100001 = +4.5dB | ||||
|       _es8388I2cWrite(48,0b00100001); // LOUT2VOL - 0b00100001 = +4.5dB | ||||
|       _es8388I2cWrite(49,0b00100001); // ROUT2VOL - 0b00100001 = +4.5dB | ||||
|  | ||||
|       // Music ALC - the mics like Auto Level Control | ||||
|       // You can also use this for line-in, but it's not really needed. | ||||
|       // | ||||
|       _es8388I2cWrite(18,0b11111000); // ALC: stereo, max gain +35.5dB, min gain -12dB  | ||||
|       _es8388I2cWrite(19,0b00110000); // ALC: target -1.5dB, 0ms hold time | ||||
|       _es8388I2cWrite(20,0b10100110); // ALC: gain ramp up = 420ms/93ms, gain ramp down = check manual for calc | ||||
|       _es8388I2cWrite(21,0b00000110); // ALC: use "ALC" mode, no zero-cross, window 96 samples | ||||
|       _es8388I2cWrite(22,0b01011001); // ALC: noise gate threshold, PGA gain constant, noise gate enabled  | ||||
|     #else | ||||
|       _es8388I2cWrite(10,0b01010000); // Use Lin2/Rin2 for ADC input ("line-in") | ||||
|       _es8388I2cWrite( 9,0b00000000); // Select Analog Input PGA Gain for ADC to 0dB (L+R) | ||||
|       _es8388I2cWrite(16,0b01000000); // Set ADC digital volume attenuation to -32dB (left) | ||||
|       _es8388I2cWrite(17,0b01000000); // Set ADC digital volume attenuation to -32dB (right) | ||||
|       _es8388I2cWrite(38,0b00001001); // Mixer - route LIN2/RIN2 to output | ||||
|  | ||||
|       _es8388I2cWrite(39,0b01010000); // Mixer - route LIN to mixL, 0dB gain | ||||
|       _es8388I2cWrite(42,0b01010000); // Mixer - route RIN to mixR, 0dB gain | ||||
|       _es8388I2cWrite(46,0b00011011); // LOUT1VOL - 0b00011110 = +0dB, 0b00011011 = LyraT balance fix | ||||
|       _es8388I2cWrite(47,0b00011110); // ROUT1VOL - 0b00011110 = +0dB | ||||
|       _es8388I2cWrite(48,0b00011110); // LOUT2VOL - 0b00011110 = +0dB | ||||
|       _es8388I2cWrite(49,0b00011110); // ROUT2VOL - 0b00011110 = +0dB | ||||
|     #endif | ||||
|  | ||||
|     } | ||||
|  | ||||
|   public: | ||||
|     ES8388Source(SRate_t sampleRate, int blockSize, float sampleScale = 1.0f, bool i2sMaster=true) : | ||||
|       I2SSource(sampleRate, blockSize, sampleScale) { | ||||
|       _config.channel_format = I2S_CHANNEL_FMT_ONLY_LEFT; | ||||
|     }; | ||||
|  | ||||
|     void initialize(int8_t i2swsPin, int8_t i2ssdPin, int8_t i2sckPin, int8_t mclkPin) { | ||||
|  | ||||
|       if ((i2sckPin < 0) || (mclkPin < 0)) { | ||||
|         DEBUGSR_PRINTF("\nAR: invalid I2S pin: SCK=%d, MCLK=%d\n", i2sckPin, mclkPin);  | ||||
|         return; | ||||
|       } | ||||
|  | ||||
|       // First route mclk, then configure ADC over I2C, then configure I2S | ||||
|       _es8388InitAdc(); | ||||
|       I2SSource::initialize(i2swsPin, i2ssdPin, i2sckPin, mclkPin); | ||||
|     } | ||||
|  | ||||
|     void deinitialize() { | ||||
|       I2SSource::deinitialize(); | ||||
|     } | ||||
|  | ||||
| }; | ||||
|  | ||||
| #if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(4, 2, 0) | ||||
| #if !defined(SOC_I2S_SUPPORTS_ADC) && !defined(SOC_I2S_SUPPORTS_ADC_DAC) | ||||
|   | ||||
| @@ -45,6 +45,10 @@ | ||||
| #define ENCODER_SW_PIN 19 | ||||
| #endif | ||||
|  | ||||
| #ifndef ENCODER_MAX_DELAY_MS    // max delay between polling encoder pins | ||||
| #define ENCODER_MAX_DELAY_MS 8  // 8 milliseconds => max 120 change impulses in 1 second, for full turn of a 30/30 encoder (4 changes per segment, 30 segments for one turn) | ||||
| #endif | ||||
|  | ||||
| #ifndef USERMOD_USE_PCF8574 | ||||
|   #undef USE_PCF8574 | ||||
|   #define USE_PCF8574 false | ||||
| @@ -539,8 +543,9 @@ void RotaryEncoderUIUsermod::setup() | ||||
|   */ | ||||
| void RotaryEncoderUIUsermod::loop() | ||||
| { | ||||
|   if (!enabled || strip.isUpdating()) return; | ||||
|   if (!enabled) return; | ||||
|   unsigned long currentTime = millis(); // get the current elapsed time | ||||
|   if (strip.isUpdating() && ((currentTime - loopTime) < ENCODER_MAX_DELAY_MS)) return;  // be nice, but not too nice | ||||
|  | ||||
|   // Initialize effectCurrentIndex and effectPaletteIndex to | ||||
|   // current state. We do it here as (at least) effectCurrent | ||||
|   | ||||
							
								
								
									
										22
									
								
								usermods/wireguard/platformio_override.ini
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								usermods/wireguard/platformio_override.ini
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,22 @@ | ||||
| # Example PlatformIO Project Configuration Override for WireGuard | ||||
| # ------------------------------------------------------------------------------ | ||||
| # Copy to platformio_override.ini to activate. | ||||
| # ------------------------------------------------------------------------------ | ||||
| # Please visit documentation: https://docs.platformio.org/page/projectconf.html | ||||
|  | ||||
| [platformio] | ||||
| default_envs = WLED_ESP32-WireGuard | ||||
|  | ||||
| [env:WLED_ESP32-WireGuard] | ||||
| board = esp32dev | ||||
| platform = ${esp32.platform} | ||||
| platform_packages = ${esp32.platform_packages} | ||||
| build_unflags = ${common.build_unflags} | ||||
| build_flags = ${common.build_flags_esp32}  | ||||
|    -D WLED_RELEASE_NAME=ESP32-WireGuard | ||||
|    -D USERMOD_WIREGUARD | ||||
| lib_deps = ${esp32.lib_deps} | ||||
|    https://github.com/kienvu58/WireGuard-ESP32-Arduino.git | ||||
| monitor_filters = esp32_exception_decoder | ||||
| board_build.partitions = ${esp32.default_partitions} | ||||
| upload_speed = 921600 | ||||
							
								
								
									
										19
									
								
								usermods/wireguard/readme.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								usermods/wireguard/readme.md
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,19 @@ | ||||
| # WireGuard VPN | ||||
|  | ||||
| This usermod will connect your WLED instance to a remote WireGuard subnet. | ||||
|  | ||||
| Configuration is performed via the Usermod menu. There are no parameters to set in code! | ||||
|  | ||||
| ## Installation  | ||||
|  | ||||
| Copy the `platformio_override.ini` file to the root project directory, review the build options, and select the `WLED_ESP32-WireGuard` environment. | ||||
|  | ||||
|  | ||||
| ## Author | ||||
|  | ||||
| Aiden Vigue [vigue.me](https://vigue.me) | ||||
| [@acvigue](https://github.com/acvigue) | ||||
| aiden@vigue.me | ||||
|  | ||||
|  | ||||
|  | ||||
							
								
								
									
										127
									
								
								usermods/wireguard/wireguard.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										127
									
								
								usermods/wireguard/wireguard.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,127 @@ | ||||
| #pragma once | ||||
|  | ||||
| #include <WireGuard-ESP32.h> | ||||
|  | ||||
| #include "wled.h" | ||||
|  | ||||
| class WireguardUsermod : public Usermod { | ||||
|    public: | ||||
|     void setup() { configTzTime(posix_tz, ntpServerName); } | ||||
|  | ||||
|     void connected() { | ||||
|         if (wg.is_initialized()) { | ||||
|             wg.end(); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     void loop() { | ||||
|         if (millis() - lastTime > 5000) { | ||||
|             if (is_enabled && WLED_CONNECTED) { | ||||
|                 if (!wg.is_initialized()) { | ||||
|                     struct tm timeinfo; | ||||
|                     if (getLocalTime(&timeinfo, 0)) { | ||||
|                         if (strlen(preshared_key) < 1) { | ||||
|                             wg.begin(local_ip, private_key, endpoint_address, public_key, endpoint_port, NULL); | ||||
|                         } else { | ||||
|                             wg.begin(local_ip, private_key, endpoint_address, public_key, endpoint_port, preshared_key); | ||||
|                         } | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|  | ||||
|             lastTime = millis(); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     void addToJsonInfo(JsonObject& root) { | ||||
|         JsonObject user = root["u"]; | ||||
|         if (user.isNull()) user = root.createNestedObject("u"); | ||||
|  | ||||
|         JsonArray infoArr = user.createNestedArray(F("WireGuard")); | ||||
|         String uiDomString; | ||||
|  | ||||
|         struct tm timeinfo; | ||||
|         if (!getLocalTime(&timeinfo, 0)) { | ||||
|             uiDomString = "Time out of sync!"; | ||||
|         } else { | ||||
|             if (wg.is_initialized()) { | ||||
|                 uiDomString = "netif up!"; | ||||
|             } else { | ||||
|                 uiDomString = "netif down :("; | ||||
|             } | ||||
|         } | ||||
|         if (is_enabled) infoArr.add(uiDomString); | ||||
|     } | ||||
|  | ||||
|     void appendConfigData() { | ||||
|         oappend(SET_F("addInfo('WireGuard:host',1,'Server Hostname');"));           // 0 is field type, 1 is actual field | ||||
|         oappend(SET_F("addInfo('WireGuard:port',1,'Server Port');"));               // 0 is field type, 1 is actual field | ||||
|         oappend(SET_F("addInfo('WireGuard:ip',1,'Device IP');"));                   // 0 is field type, 1 is actual field | ||||
|         oappend(SET_F("addInfo('WireGuard:psk',1,'Pre Shared Key (optional)');"));  // 0 is field type, 1 is actual field | ||||
|         oappend(SET_F("addInfo('WireGuard:pem',1,'Private Key');"));                // 0 is field type, 1 is actual field | ||||
|         oappend(SET_F("addInfo('WireGuard:pub',1,'Public Key');"));                 // 0 is field type, 1 is actual field | ||||
|         oappend(SET_F("addInfo('WireGuard:tz',1,'POSIX timezone string');"));       // 0 is field type, 1 is actual field | ||||
|     } | ||||
|  | ||||
|     void addToConfig(JsonObject& root) { | ||||
|         JsonObject top = root.createNestedObject(F("WireGuard")); | ||||
|         top[F("host")] = endpoint_address; | ||||
|         top[F("port")] = endpoint_port; | ||||
|         top[F("ip")] = local_ip.toString(); | ||||
|         top[F("psk")] = preshared_key; | ||||
|         top[F("pem")] = private_key; | ||||
|         top[F("pub")] = public_key; | ||||
|         top[F("tz")] = posix_tz; | ||||
|     } | ||||
|  | ||||
|     bool readFromConfig(JsonObject& root) { | ||||
|         JsonObject top = root[F("WireGuard")]; | ||||
|  | ||||
|         if (top["host"].isNull() || top["port"].isNull() || top["ip"].isNull() || top["pem"].isNull() || top["pub"].isNull() || top["tz"].isNull()) { | ||||
|             is_enabled = false; | ||||
|             return false; | ||||
|         } else { | ||||
|             const char* host = top["host"]; | ||||
|             strncpy(endpoint_address, host, 100); | ||||
|  | ||||
|             const char* ip_s = top["ip"]; | ||||
|             uint8_t ip[4]; | ||||
|             sscanf(ip_s, "%u.%u.%u.%u", &ip[0], &ip[1], &ip[2], &ip[3]); | ||||
|             local_ip = IPAddress(ip[0], ip[1], ip[2], ip[3]); | ||||
|  | ||||
|             const char* pem = top["pem"]; | ||||
|             strncpy(private_key, pem, 45); | ||||
|  | ||||
|             const char* pub = top["pub"]; | ||||
|             strncpy(public_key, pub, 45); | ||||
|  | ||||
|             const char* tz = top["tz"]; | ||||
|             strncpy(posix_tz, tz, 150); | ||||
|  | ||||
|             endpoint_port = top["port"]; | ||||
|  | ||||
|             if (!top["psk"].isNull()) { | ||||
|                 const char* psk = top["psk"]; | ||||
|                 strncpy(preshared_key, psk, 45); | ||||
|             } | ||||
|  | ||||
|             is_enabled = true; | ||||
|         } | ||||
|  | ||||
|         return is_enabled; | ||||
|     } | ||||
|  | ||||
|     uint16_t getId() { return USERMOD_ID_WIREGUARD; } | ||||
|  | ||||
|    private: | ||||
|     WireGuard wg; | ||||
|     char preshared_key[45]; | ||||
|     char private_key[45]; | ||||
|     IPAddress local_ip; | ||||
|     char public_key[45]; | ||||
|     char endpoint_address[100]; | ||||
|     char posix_tz[150]; | ||||
|     int endpoint_port = 0; | ||||
|     bool is_enabled = false; | ||||
|     unsigned long lastTime = 0; | ||||
| }; | ||||
							
								
								
									
										25
									
								
								wled00.sln
									
									
									
									
									
								
							
							
						
						
									
										25
									
								
								wled00.sln
									
									
									
									
									
								
							| @@ -1,25 +0,0 @@ | ||||
|  | ||||
| Microsoft Visual Studio Solution File, Format Version 12.00 | ||||
| # Visual Studio 15 | ||||
| VisualStudioVersion = 15.0.28010.2046 | ||||
| MinimumVisualStudioVersion = 10.0.40219.1 | ||||
| Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "wled00", "wled00\wled00.vcxproj", "{C5F80730-F44F-4478-BDAE-6634EFC2CA88}" | ||||
| EndProject | ||||
| Global | ||||
| 	GlobalSection(SolutionConfigurationPlatforms) = preSolution | ||||
| 		Debug|x86 = Debug|x86 | ||||
| 		Release|x86 = Release|x86 | ||||
| 	EndGlobalSection | ||||
| 	GlobalSection(ProjectConfigurationPlatforms) = postSolution | ||||
| 		{C5F80730-F44F-4478-BDAE-6634EFC2CA88}.Debug|x86.ActiveCfg = Debug|Win32 | ||||
| 		{C5F80730-F44F-4478-BDAE-6634EFC2CA88}.Debug|x86.Build.0 = Debug|Win32 | ||||
| 		{C5F80730-F44F-4478-BDAE-6634EFC2CA88}.Release|x86.ActiveCfg = Release|Win32 | ||||
| 		{C5F80730-F44F-4478-BDAE-6634EFC2CA88}.Release|x86.Build.0 = Release|Win32 | ||||
| 	EndGlobalSection | ||||
| 	GlobalSection(SolutionProperties) = preSolution | ||||
| 		HideSolutionNode = FALSE | ||||
| 	EndGlobalSection | ||||
| 	GlobalSection(ExtensibilityGlobals) = postSolution | ||||
| 		SolutionGuid = {9A679C2B-61D3-400B-B96F-06E604E9CED2} | ||||
| 	EndGlobalSection | ||||
| EndGlobal | ||||
							
								
								
									
										104
									
								
								wled00/FX.cpp
									
									
									
									
									
								
							
							
						
						
									
										104
									
								
								wled00/FX.cpp
									
									
									
									
									
								
							| @@ -278,7 +278,7 @@ uint16_t mode_random_color(void) { | ||||
|   SEGMENT.fill(color_blend(SEGMENT.color_wheel(SEGENV.aux1), SEGMENT.color_wheel(SEGENV.aux0), fade)); | ||||
|   return FRAMETIME; | ||||
| } | ||||
| static const char _data_FX_MODE_RANDOM_COLOR[] PROGMEM = "Random Colors@!,Fade time;;!"; | ||||
| static const char _data_FX_MODE_RANDOM_COLOR[] PROGMEM = "Random Colors@!,Fade time;;!;01"; | ||||
|  | ||||
|  | ||||
| /* | ||||
| @@ -289,7 +289,6 @@ uint16_t mode_dynamic(void) { | ||||
|   if (!SEGENV.allocateData(SEGLEN)) return mode_static(); //allocation failed | ||||
|  | ||||
|   if(SEGENV.call == 0) { | ||||
|     //SEGMENT.setUpLeds();  //lossless getPixelColor() | ||||
|     //SEGMENT.fill(BLACK); | ||||
|     for (int i = 0; i < SEGLEN; i++) SEGENV.data[i] = random8(); | ||||
|   } | ||||
| @@ -433,7 +432,7 @@ uint16_t mode_rainbow(void) { | ||||
|  | ||||
|   return FRAMETIME; | ||||
| } | ||||
| static const char _data_FX_MODE_RAINBOW[] PROGMEM = "Colorloop@!,Saturation;;!"; | ||||
| static const char _data_FX_MODE_RAINBOW[] PROGMEM = "Colorloop@!,Saturation;;!;01"; | ||||
|  | ||||
|  | ||||
| /* | ||||
| @@ -607,7 +606,6 @@ static const char _data_FX_MODE_TWINKLE[] PROGMEM = "Twinkle@!,!;!,!;!;;m12=0"; | ||||
| uint16_t dissolve(uint32_t color) { | ||||
|   //bool wa = (SEGCOLOR(1) != 0 && strip.getBrightness() < 255); //workaround, can't compare getPixel to color if not full brightness | ||||
|   if (SEGENV.call == 0) { | ||||
|     SEGMENT.setUpLeds();  //lossless getPixelColor() | ||||
|     SEGMENT.fill(SEGCOLOR(1)); | ||||
|   } | ||||
|  | ||||
| @@ -715,7 +713,7 @@ uint16_t mode_hyper_sparkle(void) { | ||||
|  | ||||
|   if (strip.now - SEGENV.aux0 > SEGENV.step) { | ||||
|     if (random8((255-SEGMENT.intensity) >> 4) == 0) { | ||||
|       for (int i = 0; i < MAX(1, SEGLEN/3); i++) { | ||||
|       for (int i = 0; i < max(1, SEGLEN/3); i++) { | ||||
|         SEGMENT.setPixelColor(random16(SEGLEN), SEGCOLOR(1)); | ||||
|       } | ||||
|     } | ||||
| @@ -1206,7 +1204,6 @@ uint16_t mode_fireworks() { | ||||
|   const uint16_t height = SEGMENT.virtualHeight(); | ||||
|  | ||||
|   if (SEGENV.call == 0) { | ||||
|     SEGMENT.setUpLeds();  //lossless getPixelColor() | ||||
|     SEGMENT.fill(SEGCOLOR(1)); | ||||
|     SEGENV.aux0 = UINT16_MAX; | ||||
|     SEGENV.aux1 = UINT16_MAX; | ||||
| @@ -1215,19 +1212,21 @@ uint16_t mode_fireworks() { | ||||
|  | ||||
|   bool valid1 = (SEGENV.aux0 < width*height); | ||||
|   bool valid2 = (SEGENV.aux1 < width*height); | ||||
|   uint8_t x = SEGENV.aux0%width, y = SEGENV.aux0/width; // 2D coordinates stored in upper and lower byte | ||||
|   uint32_t sv1 = 0, sv2 = 0; | ||||
|   if (valid1) sv1 = SEGMENT.is2D() ? SEGMENT.getPixelColorXY(SEGENV.aux0%width, SEGENV.aux0/width) : SEGMENT.getPixelColor(SEGENV.aux0); // get spark color | ||||
|   if (valid2) sv2 = SEGMENT.is2D() ? SEGMENT.getPixelColorXY(SEGENV.aux1%width, SEGENV.aux1/width) : SEGMENT.getPixelColor(SEGENV.aux1); | ||||
|   if (valid1) sv1 = SEGMENT.is2D() ? SEGMENT.getPixelColorXY(x, y) : SEGMENT.getPixelColor(SEGENV.aux0); // get spark color | ||||
|   if (valid2) sv2 = SEGMENT.is2D() ? SEGMENT.getPixelColorXY(x, y) : SEGMENT.getPixelColor(SEGENV.aux1); | ||||
|   if (!SEGENV.step) SEGMENT.blur(16); | ||||
|   if (valid1) { if (SEGMENT.is2D()) SEGMENT.setPixelColorXY(SEGENV.aux0%width, SEGENV.aux0/width, sv1); else SEGMENT.setPixelColor(SEGENV.aux0, sv1); } // restore spark color after blur | ||||
|   if (valid2) { if (SEGMENT.is2D()) SEGMENT.setPixelColorXY(SEGENV.aux1%width, SEGENV.aux1/width, sv2); else SEGMENT.setPixelColor(SEGENV.aux1, sv2); } // restore old spark color after blur | ||||
|   if (valid1) { if (SEGMENT.is2D()) SEGMENT.setPixelColorXY(x, y, sv1); else SEGMENT.setPixelColor(SEGENV.aux0, sv1); } // restore spark color after blur | ||||
|   if (valid2) { if (SEGMENT.is2D()) SEGMENT.setPixelColorXY(x, y, sv2); else SEGMENT.setPixelColor(SEGENV.aux1, sv2); } // restore old spark color after blur | ||||
|  | ||||
|   for (int i=0; i<MAX(1, width/20); i++) { | ||||
|   for (int i=0; i<max(1, width/20); i++) { | ||||
|     if (random8(129 - (SEGMENT.intensity >> 1)) == 0) { | ||||
|       uint16_t index = random16(width*height); | ||||
|       uint16_t j = index % width, k = index / width; | ||||
|       x = index % width; | ||||
|       y = index / width; | ||||
|       uint32_t col = SEGMENT.color_from_palette(random8(), false, false, 0); | ||||
|       if (SEGMENT.is2D()) SEGMENT.setPixelColorXY(j, k, col); | ||||
|       if (SEGMENT.is2D()) SEGMENT.setPixelColorXY(x, y, col); | ||||
|       else                SEGMENT.setPixelColor(index, col); | ||||
|       SEGENV.aux1 = SEGENV.aux0;  // old spark | ||||
|       SEGENV.aux0 = index;        // remember where spark occured | ||||
| @@ -1905,7 +1904,6 @@ static const char _data_FX_MODE_PRIDE_2015[] PROGMEM = "Pride 2015@!;;"; | ||||
| uint16_t mode_juggle(void) { | ||||
|   if (SEGLEN == 1) return mode_static(); | ||||
|   if (SEGENV.call == 0) { | ||||
|     SEGMENT.setUpLeds();  //lossless getPixelColor() | ||||
|     SEGMENT.fill(BLACK); | ||||
|   } | ||||
|  | ||||
| @@ -3025,7 +3023,7 @@ uint16_t candle(bool multi) | ||||
|   if (multi) | ||||
|   { | ||||
|     //allocate segment data | ||||
|     uint16_t dataSize = (SEGLEN -1) *3; //max. 1365 pixels (ESP8266) | ||||
|     uint16_t dataSize = max(1, SEGLEN -1) *3; //max. 1365 pixels (ESP8266) | ||||
|     if (!SEGENV.allocateData(dataSize)) return candle(false); //allocation failed | ||||
|   } | ||||
|  | ||||
| @@ -3158,7 +3156,7 @@ uint16_t mode_starburst(void) { | ||||
|     if (random8((144-(SEGMENT.speed >> 1))) == 0 && stars[j].birth == 0) | ||||
|     { | ||||
|       // Pick a random color and location. | ||||
|       uint16_t startPos = random16(SEGLEN-1); | ||||
|       uint16_t startPos = (SEGLEN > 1) ? random16(SEGLEN-1) : 0; | ||||
|       float multiplier = (float)(random8())/255.0 * 1.0; | ||||
|  | ||||
|       stars[j].color = CRGB(SEGMENT.color_wheel(random8())); | ||||
| @@ -3402,7 +3400,7 @@ uint16_t mode_drip(void) | ||||
|       uint8_t numDrops = 1 + (SEGMENT.intensity >> 6); // 255>>6 = 3 | ||||
|  | ||||
|       float gravity = -0.0005 - (SEGMENT.speed/50000.0); | ||||
|       gravity *= SEGLEN-1; | ||||
|       gravity *= max(1, SEGLEN-1); | ||||
|       int sourcedrop = 12; | ||||
|  | ||||
|       for (int j=0;j<numDrops;j++) { | ||||
| @@ -4586,7 +4584,6 @@ uint16_t mode_2DBlackHole(void) {            // By: Stepko https://editor.soulma | ||||
|  | ||||
|   // initialize on first call | ||||
|   if (SEGENV.call == 0) { | ||||
|     SEGMENT.setUpLeds(); | ||||
|     SEGMENT.fill(BLACK); | ||||
|   } | ||||
|  | ||||
| @@ -4596,22 +4593,22 @@ uint16_t mode_2DBlackHole(void) {            // By: Stepko https://editor.soulma | ||||
|   for (size_t i = 0; i < 8; i++) { | ||||
|     x = beatsin8(SEGMENT.custom1>>3,   0, cols - 1, 0, ((i % 2) ? 128 : 0) + t * i); | ||||
|     y = beatsin8(SEGMENT.intensity>>3, 0, rows - 1, 0, ((i % 2) ? 192 : 64) + t * i); | ||||
|     SEGMENT.addPixelColorXY(x, y, CHSV(i*32, 255, 255)); | ||||
|     SEGMENT.addPixelColorXY(x, y, SEGMENT.color_from_palette(i*32, false, PALETTE_SOLID_WRAP, SEGMENT.check1?0:255)); | ||||
|   } | ||||
|   // inner stars | ||||
|   for (size_t i = 0; i < 4; i++) { | ||||
|     x = beatsin8(SEGMENT.custom2>>3, cols/4, cols - 1 - cols/4, 0, ((i % 2) ? 128 : 0) + t * i); | ||||
|     y = beatsin8(SEGMENT.custom3   , rows/4, rows - 1 - rows/4, 0, ((i % 2) ? 192 : 64) + t * i); | ||||
|     SEGMENT.addPixelColorXY(x, y, CHSV(i*32, 255, 255)); | ||||
|     SEGMENT.addPixelColorXY(x, y, SEGMENT.color_from_palette(255-i*64, false, PALETTE_SOLID_WRAP, SEGMENT.check1?0:255)); | ||||
|   } | ||||
|   // central white dot | ||||
|   SEGMENT.setPixelColorXY(cols/2, rows/2, CHSV(0, 0, 255)); | ||||
|   SEGMENT.setPixelColorXY(cols/2, rows/2, WHITE); | ||||
|   // blur everything a bit | ||||
|   SEGMENT.blur(16); | ||||
|  | ||||
|   return FRAMETIME; | ||||
| } // mode_2DBlackHole() | ||||
| static const char _data_FX_MODE_2DBLACKHOLE[] PROGMEM = "Black Hole@Fade rate,Outer Y freq.,Outer X freq.,Inner X freq.,Inner Y freq.;;;2"; | ||||
| static const char _data_FX_MODE_2DBLACKHOLE[] PROGMEM = "Black Hole@Fade rate,Outer Y freq.,Outer X freq.,Inner X freq.,Inner Y freq.,Solid;!;!;2;pal=11"; | ||||
|  | ||||
|  | ||||
| //////////////////////////// | ||||
| @@ -4624,7 +4621,6 @@ uint16_t mode_2DColoredBursts() {              // By: ldirko   https://editor.so | ||||
|   const uint16_t rows = SEGMENT.virtualHeight(); | ||||
|  | ||||
|   if (SEGENV.call == 0) { | ||||
|     SEGMENT.setUpLeds(); | ||||
|     SEGMENT.fill(BLACK); | ||||
|     SEGENV.aux0 = 0; // start with red hue | ||||
|   } | ||||
| @@ -4678,7 +4674,6 @@ uint16_t mode_2Ddna(void) {         // dna originally by by ldirko at https://pa | ||||
|   const uint16_t rows = SEGMENT.virtualHeight(); | ||||
|  | ||||
|   if (SEGENV.call == 0) { | ||||
|     SEGMENT.setUpLeds(); | ||||
|     SEGMENT.fill(BLACK); | ||||
|   } | ||||
|  | ||||
| @@ -4705,7 +4700,6 @@ uint16_t mode_2DDNASpiral() {               // By: ldirko  https://editor.soulma | ||||
|   const uint16_t rows = SEGMENT.virtualHeight(); | ||||
|  | ||||
|   if (SEGENV.call == 0) { | ||||
|     SEGMENT.setUpLeds(); | ||||
|     SEGMENT.fill(BLACK); | ||||
|   } | ||||
|  | ||||
| @@ -4751,7 +4745,6 @@ uint16_t mode_2DDrift() {              // By: Stepko   https://editor.soulmateli | ||||
|   const uint16_t rows = SEGMENT.virtualHeight(); | ||||
|  | ||||
|   if (SEGENV.call == 0) { | ||||
|     SEGMENT.setUpLeds(); | ||||
|     SEGMENT.fill(BLACK); | ||||
|   } | ||||
|  | ||||
| @@ -4759,11 +4752,12 @@ uint16_t mode_2DDrift() {              // By: Stepko   https://editor.soulmateli | ||||
|  | ||||
|   const uint16_t maxDim = MAX(cols, rows)/2; | ||||
|   unsigned long t = millis() / (32 - (SEGMENT.speed>>3)); | ||||
|   unsigned long t_20 = t/20; // softhack007: pre-calculating this gives about 10% speedup | ||||
|   for (float i = 1; i < maxDim; i += 0.25) { | ||||
|     float angle = radians(t * (maxDim - i)); | ||||
|     uint16_t myX = (cols>>1) + (uint16_t)(sin_t(angle) * i) + (cols%2); | ||||
|     uint16_t myY = (rows>>1) + (uint16_t)(cos_t(angle) * i) + (rows%2); | ||||
|     SEGMENT.setPixelColorXY(myX, myY, ColorFromPalette(SEGPALETTE, (i * 20) + (t / 20), 255, LINEARBLEND)); | ||||
|     SEGMENT.setPixelColorXY(myX, myY, ColorFromPalette(SEGPALETTE, (i * 20) + t_20, 255, LINEARBLEND)); | ||||
|   } | ||||
|   SEGMENT.blur(SEGMENT.intensity>>3); | ||||
|  | ||||
| @@ -4782,7 +4776,6 @@ uint16_t mode_2Dfirenoise(void) {               // firenoise2d. By Andrew Tuline | ||||
|   const uint16_t rows = SEGMENT.virtualHeight(); | ||||
|  | ||||
|   if (SEGENV.call == 0) { | ||||
|     SEGMENT.setUpLeds(); | ||||
|     SEGMENT.fill(BLACK); | ||||
|   } | ||||
|  | ||||
| @@ -4817,7 +4810,6 @@ uint16_t mode_2DFrizzles(void) {                 // By: Stepko https://editor.so | ||||
|   const uint16_t rows = SEGMENT.virtualHeight(); | ||||
|  | ||||
|   if (SEGENV.call == 0) { | ||||
|     SEGMENT.setUpLeds(); | ||||
|     SEGMENT.fill(BLACK); | ||||
|   } | ||||
|  | ||||
| @@ -4856,8 +4848,6 @@ uint16_t mode_2Dgameoflife(void) { // Written by Ewoud Wijma, inspired by https: | ||||
|  | ||||
|   CRGB backgroundColor = SEGCOLOR(1); | ||||
|  | ||||
|   if (SEGENV.call == 0) SEGMENT.setUpLeds(); | ||||
|  | ||||
|   if (SEGENV.call == 0 || strip.now - SEGMENT.step > 3000) { | ||||
|     SEGENV.step = strip.now; | ||||
|     SEGENV.aux0 = 0; | ||||
| @@ -4914,7 +4904,7 @@ uint16_t mode_2Dgameoflife(void) { // Written by Ewoud Wijma, inspired by https: | ||||
|     } // i,j | ||||
|  | ||||
|     // Rules of Life | ||||
|     uint32_t col = prevLeds[XY(x,y)]; | ||||
|     uint32_t col = uint32_t(prevLeds[XY(x,y)]) & 0x00FFFFFF;  // uint32_t operator returns RGBA, we want RGBW -> cut off "alpha" byte | ||||
|     uint32_t bgc = RGBW32(backgroundColor.r, backgroundColor.g, backgroundColor.b, 0); | ||||
|     if      ((col != bgc) && (neighbors <  2)) SEGMENT.setPixelColorXY(x,y, bgc); // Loneliness | ||||
|     else if ((col != bgc) && (neighbors >  3)) SEGMENT.setPixelColorXY(x,y, bgc); // Overpopulation | ||||
| @@ -5123,7 +5113,6 @@ uint16_t mode_2Dmatrix(void) {                  // Matrix2D. By Jeremy Williams. | ||||
|   const uint16_t rows = SEGMENT.virtualHeight(); | ||||
|  | ||||
|   if (SEGENV.call == 0) { | ||||
|     SEGMENT.setUpLeds(); | ||||
|     SEGMENT.fill(BLACK); | ||||
|   } | ||||
|  | ||||
| @@ -5268,13 +5257,12 @@ uint16_t mode_2DPlasmaball(void) {                   // By: Stepko https://edito | ||||
|   const uint16_t rows = SEGMENT.virtualHeight(); | ||||
|  | ||||
|   if (SEGENV.call == 0) { | ||||
|     SEGMENT.setUpLeds(); | ||||
|     SEGMENT.fill(BLACK); | ||||
|   } | ||||
|  | ||||
|   SEGMENT.fadeToBlackBy(SEGMENT.custom1>>2); | ||||
|  | ||||
|   float t = millis() / (33 - SEGMENT.speed/8); | ||||
|   uint_fast32_t t = (millis() * 8) / (256 - SEGMENT.speed);  // optimized to avoid float | ||||
|   for (int i = 0; i < cols; i++) { | ||||
|     uint16_t thisVal = inoise8(i * 30, t, t); | ||||
|     uint16_t thisMax = map(thisVal, 0, 255, 0, cols-1); | ||||
| @@ -5316,7 +5304,6 @@ uint16_t mode_2DPolarLights(void) {        // By: Kostyantyn Matviyevskyy  https | ||||
|   CRGBPalette16 auroraPalette  = {0x000000, 0x003300, 0x006600, 0x009900, 0x00cc00, 0x00ff00, 0x33ff00, 0x66ff00, 0x99ff00, 0xccff00, 0xffff00, 0xffcc00, 0xff9900, 0xff6600, 0xff3300, 0xff0000}; | ||||
|  | ||||
|   if (SEGENV.call == 0) { | ||||
|     SEGMENT.setUpLeds(); | ||||
|     SEGMENT.fill(BLACK); | ||||
|     SEGENV.step = 0; | ||||
|   } | ||||
| @@ -5366,7 +5353,6 @@ uint16_t mode_2DPulser(void) {                       // By: ldirko   https://edi | ||||
|   const uint16_t rows = SEGMENT.virtualHeight(); | ||||
|  | ||||
|   if (SEGENV.call == 0) { | ||||
|     SEGMENT.setUpLeds(); | ||||
|     SEGMENT.fill(BLACK); | ||||
|   } | ||||
|  | ||||
| @@ -5394,7 +5380,6 @@ uint16_t mode_2DSindots(void) {                             // By: ldirko   http | ||||
|   const uint16_t rows = SEGMENT.virtualHeight(); | ||||
|  | ||||
|   if (SEGENV.call == 0) { | ||||
|     SEGMENT.setUpLeds(); | ||||
|     SEGMENT.fill(BLACK); | ||||
|   } | ||||
|  | ||||
| @@ -5426,7 +5411,6 @@ uint16_t mode_2Dsquaredswirl(void) {            // By: Mark Kriegsman. https://g | ||||
|   const uint16_t rows = SEGMENT.virtualHeight(); | ||||
|  | ||||
|   if (SEGENV.call == 0) { | ||||
|     SEGMENT.setUpLeds(); | ||||
|     SEGMENT.fill(BLACK); | ||||
|   } | ||||
|  | ||||
| @@ -5469,7 +5453,6 @@ uint16_t mode_2DSunradiation(void) {                   // By: ldirko https://edi | ||||
|   byte *bump = reinterpret_cast<byte*>(SEGENV.data); | ||||
|  | ||||
|   if (SEGENV.call == 0) { | ||||
|     SEGMENT.setUpLeds(); | ||||
|     SEGMENT.fill(BLACK); | ||||
|   } | ||||
|  | ||||
| @@ -5517,7 +5500,6 @@ uint16_t mode_2Dtartan(void) {          // By: Elliott Kember  https://editor.so | ||||
|   const uint16_t rows = SEGMENT.virtualHeight(); | ||||
|  | ||||
|   if (SEGENV.call == 0) { | ||||
|     SEGMENT.setUpLeds(); | ||||
|     SEGMENT.fill(BLACK); | ||||
|   } | ||||
|  | ||||
| @@ -5557,7 +5539,6 @@ uint16_t mode_2Dspaceships(void) {    //// Space ships by stepko (c)05.02.21 [ht | ||||
|   const uint16_t rows = SEGMENT.virtualHeight(); | ||||
|  | ||||
|   if (SEGENV.call == 0) { | ||||
|     SEGMENT.setUpLeds(); | ||||
|     SEGMENT.fill(BLACK); | ||||
|   } | ||||
|  | ||||
| @@ -5626,7 +5607,6 @@ uint16_t mode_2Dcrazybees(void) { | ||||
|   bee_t *bee = reinterpret_cast<bee_t*>(SEGENV.data); | ||||
|  | ||||
|   if (SEGENV.call == 0) { | ||||
|     SEGMENT.setUpLeds(); | ||||
|     SEGMENT.fill(BLACK); | ||||
|     for (size_t i = 0; i < n; i++) { | ||||
|       bee[i].posX = random8(0, cols); | ||||
| @@ -5696,7 +5676,6 @@ uint16_t mode_2Dghostrider(void) { | ||||
|  | ||||
|   const size_t maxLighters = min(cols + rows, LIGHTERS_AM); | ||||
|  | ||||
|   if (SEGENV.call == 0) SEGMENT.setUpLeds(); | ||||
|   if (SEGENV.aux0 != cols || SEGENV.aux1 != rows) { | ||||
|     SEGENV.aux0 = cols; | ||||
|     SEGENV.aux1 = rows; | ||||
| @@ -5781,7 +5760,6 @@ uint16_t mode_2Dfloatingblobs(void) { | ||||
|   if (!SEGENV.allocateData(sizeof(blob_t))) return mode_static(); //allocation failed | ||||
|   blob_t *blob = reinterpret_cast<blob_t*>(SEGENV.data); | ||||
|  | ||||
|   if (SEGENV.call == 0) SEGMENT.setUpLeds(); | ||||
|   if (SEGENV.aux0 != cols || SEGENV.aux1 != rows) { | ||||
|     SEGENV.aux0 = cols; // re-initialise if virtual size changes | ||||
|     SEGENV.aux1 = rows; | ||||
| @@ -5879,7 +5857,7 @@ uint16_t mode_2Dscrollingtext(void) { | ||||
|   } | ||||
|   const bool zero = SEGMENT.check3; | ||||
|   const int yoffset = map(SEGMENT.intensity, 0, 255, -rows/2, rows/2) + (rows-letterHeight)/2; | ||||
|   char text[33] = {'\0'}; | ||||
|   char text[WLED_MAX_SEGNAME_LEN+1] = {'\0'}; | ||||
|   if (SEGMENT.name) for (size_t i=0,j=0; i<strlen(SEGMENT.name); i++) if (SEGMENT.name[i]>31 && SEGMENT.name[i]<128) text[j++] = SEGMENT.name[i]; | ||||
|  | ||||
|   if (!strlen(text) | ||||
| @@ -5947,7 +5925,6 @@ uint16_t mode_2Ddriftrose(void) { | ||||
|   const float L = min(cols, rows) / 2.f; | ||||
|  | ||||
|   if (SEGENV.call == 0) { | ||||
|     SEGMENT.setUpLeds(); | ||||
|     SEGMENT.fill(BLACK); | ||||
|   } | ||||
|  | ||||
| @@ -6102,7 +6079,6 @@ uint16_t mode_2DSwirl(void) { | ||||
|   const uint16_t rows = SEGMENT.virtualHeight(); | ||||
|  | ||||
|   if (SEGENV.call == 0) { | ||||
|     SEGMENT.setUpLeds(); | ||||
|     SEGMENT.fill(BLACK); | ||||
|   } | ||||
|  | ||||
| @@ -6149,7 +6125,6 @@ uint16_t mode_2DWaverly(void) { | ||||
|   const uint16_t rows = SEGMENT.virtualHeight(); | ||||
|  | ||||
|   if (SEGENV.call == 0) { | ||||
|     SEGMENT.setUpLeds(); | ||||
|     SEGMENT.fill(BLACK); | ||||
|   } | ||||
|  | ||||
| @@ -6378,7 +6353,6 @@ uint16_t mode_matripix(void) {                  // Matripix. By Andrew Tuline. | ||||
|   int16_t volumeRaw    = *(int16_t*)um_data->u_data[1]; | ||||
|  | ||||
|   if (SEGENV.call == 0) { | ||||
|     SEGMENT.setUpLeds(); | ||||
|     SEGMENT.fill(BLACK); | ||||
|   } | ||||
|  | ||||
| @@ -6506,7 +6480,6 @@ uint16_t mode_pixelwave(void) {                 // Pixelwave. By Andrew Tuline. | ||||
|   // even with 1D effect we have to take logic for 2D segments for allocation as fill_solid() fills whole segment | ||||
|  | ||||
|   if (SEGENV.call == 0) { | ||||
|     SEGMENT.setUpLeds(); | ||||
|     SEGMENT.fill(BLACK); | ||||
|   } | ||||
|  | ||||
| @@ -6706,7 +6679,7 @@ uint16_t mode_blurz(void) {                    // Blurz. By Andrew Tuline. | ||||
|   SEGENV.step += FRAMETIME; | ||||
|   if (SEGENV.step > SPEED_FORMULA_L) { | ||||
|     uint16_t segLoc = random16(SEGLEN); | ||||
|     SEGMENT.setPixelColor(segLoc, color_blend(SEGCOLOR(1), SEGMENT.color_from_palette(2*fftResult[SEGENV.aux0%16]*240/(SEGLEN-1), false, PALETTE_SOLID_WRAP, 0), 2*fftResult[SEGENV.aux0%16])); | ||||
|     SEGMENT.setPixelColor(segLoc, color_blend(SEGCOLOR(1), SEGMENT.color_from_palette(2*fftResult[SEGENV.aux0%16]*240/max(1, SEGLEN-1), false, PALETTE_SOLID_WRAP, 0), 2*fftResult[SEGENV.aux0%16])); | ||||
|     ++(SEGENV.aux0) %= 16; // make sure it doesn't cross 16 | ||||
|  | ||||
|     SEGENV.step = 1; | ||||
| @@ -6732,7 +6705,6 @@ uint16_t mode_DJLight(void) {                   // Written by ??? Adapted by Wil | ||||
|   uint8_t *fftResult = (uint8_t*)um_data->u_data[2]; | ||||
|  | ||||
|   if (SEGENV.call == 0) { | ||||
|     SEGMENT.setUpLeds(); | ||||
|     SEGMENT.fill(BLACK); | ||||
|   } | ||||
|  | ||||
| @@ -6801,7 +6773,6 @@ uint16_t mode_freqmatrix(void) {                // Freqmatrix. By Andreas Plesch | ||||
|   float volumeSmth    = *(float*)um_data->u_data[0]; | ||||
|  | ||||
|   if (SEGENV.call == 0) { | ||||
|     SEGMENT.setUpLeds(); | ||||
|     SEGMENT.fill(BLACK); | ||||
|   } | ||||
|  | ||||
| @@ -6840,7 +6811,7 @@ uint16_t mode_freqmatrix(void) {                // Freqmatrix. By Andreas Plesch | ||||
|  | ||||
|   return FRAMETIME; | ||||
| } // mode_freqmatrix() | ||||
| static const char _data_FX_MODE_FREQMATRIX[] PROGMEM = "Freqmatrix@Time delay,Sound effect,Low bin,High bin,Sensivity;;;1f;m12=3,si=0"; // Corner, Beatsin | ||||
| static const char _data_FX_MODE_FREQMATRIX[] PROGMEM = "Freqmatrix@Speed,Sound effect,Low bin,High bin,Sensivity;;;1f;m12=3,si=0"; // Corner, Beatsin | ||||
|  | ||||
|  | ||||
| ////////////////////// | ||||
| @@ -6903,7 +6874,6 @@ uint16_t mode_freqwave(void) {                  // Freqwave. By Andreas Pleschun | ||||
|   float volumeSmth    = *(float*)um_data->u_data[0]; | ||||
|  | ||||
|   if (SEGENV.call == 0) { | ||||
|     SEGMENT.setUpLeds(); | ||||
|     SEGMENT.fill(BLACK); | ||||
|   } | ||||
|  | ||||
| @@ -6944,7 +6914,7 @@ uint16_t mode_freqwave(void) {                  // Freqwave. By Andreas Pleschun | ||||
|  | ||||
|   return FRAMETIME; | ||||
| } // mode_freqwave() | ||||
| static const char _data_FX_MODE_FREQWAVE[] PROGMEM = "Freqwave@Time delay,Sound effect,Low bin,High bin,Pre-amp;;;1f;m12=2,si=0"; // Circle, Beatsin | ||||
| static const char _data_FX_MODE_FREQWAVE[] PROGMEM = "Freqwave@Speed,Sound effect,Low bin,High bin,Pre-amp;;;1f;m12=2,si=0"; // Circle, Beatsin | ||||
|  | ||||
|  | ||||
| /////////////////////// | ||||
| @@ -7088,7 +7058,6 @@ uint16_t mode_waterfall(void) {                   // Waterfall. By: Andrew Tulin | ||||
|   if (FFT_MajorPeak < 1) FFT_MajorPeak = 1;                                         // log10(0) is "forbidden" (throws exception) | ||||
|  | ||||
|   if (SEGENV.call == 0) { | ||||
|     SEGMENT.setUpLeds(); | ||||
|     SEGMENT.fill(BLACK); | ||||
|     SEGENV.aux0 = 255; | ||||
|     SEGMENT.custom1 = *binNum; | ||||
| @@ -7205,7 +7174,6 @@ uint16_t mode_2DFunkyPlank(void) {              // Written by ??? Adapted by Wil | ||||
|   uint8_t *fftResult = (uint8_t*)um_data->u_data[2]; | ||||
|  | ||||
|   if (SEGENV.call == 0) { | ||||
|     SEGMENT.setUpLeds(); | ||||
|     SEGMENT.fill(BLACK); | ||||
|   } | ||||
|  | ||||
| @@ -7418,7 +7386,6 @@ uint16_t mode_2Dsoap() { | ||||
|  | ||||
|   // init | ||||
|   if (SEGENV.call == 0) { | ||||
|     SEGMENT.setUpLeds(); | ||||
|     *noise32_x = random16(); | ||||
|     *noise32_y = random16(); | ||||
|     *noise32_z = random16(); | ||||
| @@ -7452,6 +7419,7 @@ uint16_t mode_2Dsoap() { | ||||
|   int amplitude; | ||||
|   int8_t shiftX = 0; //(SEGMENT.custom1 - 128) / 4; | ||||
|   int8_t shiftY = 0; //(SEGMENT.custom2 - 128) / 4; | ||||
|   CRGB ledsbuff[MAX(cols,rows)]; | ||||
|  | ||||
|   amplitude = (cols >= 16) ? (cols-8)/8 : 1; | ||||
|   for (int y = 0; y < rows; y++) { | ||||
| @@ -7472,9 +7440,9 @@ uint16_t mode_2Dsoap() { | ||||
|       CRGB PixelB = CRGB::Black; | ||||
|       if ((zF >= 0) && (zF < cols)) PixelB = SEGMENT.getPixelColorXY(zF, y); | ||||
|       else                          PixelB = ColorFromPalette(SEGPALETTE, ~noise3d[XY(abs(zF),y)]*3); | ||||
|       CRGB pix = (PixelA.nscale8(ease8InOutApprox(255 - fraction))) + (PixelB.nscale8(ease8InOutApprox(fraction))); | ||||
|       SEGMENT.setPixelColorXY(x, y, pix); | ||||
|       ledsbuff[x] = (PixelA.nscale8(ease8InOutApprox(255 - fraction))) + (PixelB.nscale8(ease8InOutApprox(fraction))); | ||||
|     } | ||||
|     for (int x = 0; x < cols; x++) SEGMENT.setPixelColorXY(x, y, ledsbuff[x]); | ||||
|   } | ||||
|  | ||||
|   amplitude = (rows >= 16) ? (rows-8)/8 : 1; | ||||
| @@ -7496,9 +7464,9 @@ uint16_t mode_2Dsoap() { | ||||
|       CRGB PixelB = CRGB::Black; | ||||
|       if ((zF >= 0) && (zF < rows)) PixelB = SEGMENT.getPixelColorXY(x, zF); | ||||
|       else                          PixelB = ColorFromPalette(SEGPALETTE, ~noise3d[XY(x,abs(zF))]*3); | ||||
|       CRGB pix = (PixelA.nscale8(ease8InOutApprox(255 - fraction))) + (PixelB.nscale8(ease8InOutApprox(fraction))); | ||||
|       SEGMENT.setPixelColorXY(x, y, pix); | ||||
|       ledsbuff[y] = (PixelA.nscale8(ease8InOutApprox(255 - fraction))) + (PixelB.nscale8(ease8InOutApprox(fraction))); | ||||
|     } | ||||
|     for (int y = 0; y < rows; y++) SEGMENT.setPixelColorXY(x, y, ledsbuff[y]); | ||||
|   } | ||||
|  | ||||
|   return FRAMETIME; | ||||
| @@ -7536,12 +7504,12 @@ uint16_t mode_2Doctopus() { | ||||
|     SEGENV.aux1 = rows; | ||||
|     *offsX = SEGMENT.custom1; | ||||
|     *offsY = SEGMENT.custom2; | ||||
|     const uint8_t C_X = cols / 2 + (SEGMENT.custom1 - 128)*cols/255; | ||||
|     const uint8_t C_Y = rows / 2 + (SEGMENT.custom2 - 128)*rows/255; | ||||
|     const int C_X = (cols / 2) + ((SEGMENT.custom1 - 128)*cols)/255; | ||||
|     const int C_Y = (rows / 2) + ((SEGMENT.custom2 - 128)*rows)/255; | ||||
|     for (int x = 0; x < cols; x++) { | ||||
|       for (int y = 0; y < rows; y++) { | ||||
|         rMap[XY(x, y)].angle = 40.7436f * atan2f(y - C_Y, x - C_X); // avoid 128*atan2()/PI | ||||
|         rMap[XY(x, y)].radius = hypotf(x - C_X, y - C_Y) * mapp; //thanks Sutaburosu | ||||
|         rMap[XY(x, y)].angle  = 40.7436f * atan2f((y - C_Y), (x - C_X));  // avoid 128*atan2()/PI | ||||
|         rMap[XY(x, y)].radius = hypotf((x - C_X), (y - C_Y)) * mapp;      //thanks Sutaburosu | ||||
|       } | ||||
|     } | ||||
|   } | ||||
|   | ||||
							
								
								
									
										67
									
								
								wled00/FX.h
									
									
									
									
									
								
							
							
						
						
									
										67
									
								
								wled00/FX.h
									
									
									
									
									
								
							| @@ -329,7 +329,7 @@ typedef enum mapping1D2D { | ||||
|   M12_pCorner = 3 | ||||
| } mapping1D2D_t; | ||||
|  | ||||
| // segment, 72 bytes | ||||
| // segment, 80 bytes | ||||
| typedef struct Segment { | ||||
|   public: | ||||
|     uint16_t start; // start index / start X coordinate 2D (left) | ||||
| @@ -370,7 +370,7 @@ typedef struct Segment { | ||||
|     }; | ||||
|     uint8_t startY;  // start Y coodrinate 2D (top); there should be no more than 255 rows | ||||
|     uint8_t stopY;   // stop Y coordinate 2D (bottom); there should be no more than 255 rows | ||||
|     char *name; | ||||
|     char    *name; | ||||
|  | ||||
|     // runtime data | ||||
|     unsigned long next_time;  // millis() of next update | ||||
| @@ -378,9 +378,7 @@ typedef struct Segment { | ||||
|     uint32_t call;  // call counter | ||||
|     uint16_t aux0;  // custom var | ||||
|     uint16_t aux1;  // custom var | ||||
|     byte* data;     // effect data pointer | ||||
|     CRGB* leds;     // local leds[] array (may be a pointer to global) | ||||
|     static CRGB *_globalLeds;             // global leds[] array | ||||
|     byte     *data; // effect data pointer | ||||
|     static uint16_t maxWidth, maxHeight;  // these define matrix width & height (max. segment dimensions) | ||||
|  | ||||
|   private: | ||||
| @@ -394,10 +392,15 @@ typedef struct Segment { | ||||
|         uint8_t _reserved : 4; | ||||
|       }; | ||||
|     }; | ||||
|     uint16_t _dataLen; | ||||
|     uint16_t        _dataLen; | ||||
|     static uint16_t _usedSegmentData; | ||||
|  | ||||
|     // transition data, valid only if transitional==true, holds values during transition | ||||
|     // perhaps this should be per segment, not static | ||||
|     static CRGBPalette16 _randomPalette; | ||||
|     static CRGBPalette16 _newRandomPalette; | ||||
|     static unsigned long _lastPaletteChange; | ||||
|  | ||||
|     // transition data, valid only if transitional==true, holds values during transition (72 bytes) | ||||
|     struct Transition { | ||||
|       uint32_t      _colorT[NUM_COLORS]; | ||||
|       uint8_t       _briT;        // temporary brightness | ||||
| @@ -408,7 +411,7 @@ typedef struct Segment { | ||||
|       //uint16_t      _aux0, _aux1; // previous mode/effect runtime data | ||||
|       //uint32_t      _step, _call; // previous mode/effect runtime data | ||||
|       //byte         *_data;        // previous mode/effect runtime data | ||||
|       uint32_t      _start; | ||||
|       unsigned long _start;         // must accommodate millis() | ||||
|       uint16_t      _dur; | ||||
|       Transition(uint16_t dur=750) | ||||
|         : _briT(255) | ||||
| @@ -463,7 +466,6 @@ typedef struct Segment { | ||||
|       aux0(0), | ||||
|       aux1(0), | ||||
|       data(nullptr), | ||||
|       leds(nullptr), | ||||
|       _capabilities(0), | ||||
|       _dataLen(0), | ||||
|       _t(nullptr) | ||||
| @@ -484,12 +486,10 @@ typedef struct Segment { | ||||
|       //Serial.print(F("Destroying segment:")); | ||||
|       //if (name) Serial.printf(" %s (%p)", name, name); | ||||
|       //if (data) Serial.printf(" %d (%p)", (int)_dataLen, data); | ||||
|       //if (leds) Serial.printf(" [%u]", length()*sizeof(CRGB)); | ||||
|       //Serial.println(); | ||||
|       //#endif | ||||
|       if (!Segment::_globalLeds && leds) free(leds); | ||||
|       if (name) delete[] name; | ||||
|       if (_t) delete _t; | ||||
|       if (name) { delete[] name; name = nullptr; } | ||||
|       if (_t)   { transitional = false; delete _t; _t = nullptr; } | ||||
|       deallocateData(); | ||||
|     } | ||||
|  | ||||
| @@ -497,7 +497,7 @@ typedef struct Segment { | ||||
|     Segment& operator= (Segment &&orig) noexcept; // move assignment | ||||
|  | ||||
| #ifdef WLED_DEBUG | ||||
|     size_t getSize() const { return sizeof(Segment) + (data?_dataLen:0) + (name?strlen(name):0) + (_t?sizeof(Transition):0) + (!Segment::_globalLeds && leds?sizeof(CRGB)*length():0); } | ||||
|     size_t getSize() const { return sizeof(Segment) + (data?_dataLen:0) + (name?strlen(name):0) + (_t?sizeof(Transition):0); } | ||||
| #endif | ||||
|  | ||||
|     inline bool     getOption(uint8_t n) const { return ((options >> n) & 0x01); } | ||||
| @@ -507,16 +507,17 @@ typedef struct Segment { | ||||
|     inline bool     hasRGB(void)         const { return _isRGB; } | ||||
|     inline bool     hasWhite(void)       const { return _hasW; } | ||||
|     inline bool     isCCT(void)          const { return _isCCT; } | ||||
|     inline uint16_t width(void)          const { return stop - start; }       // segment width in physical pixels (length if 1D) | ||||
|     inline uint16_t height(void)         const { return stopY - startY; }     // segment height (if 2D) in physical pixels | ||||
|     inline uint16_t length(void)         const { return width() * height(); } // segment length (count) in physical pixels | ||||
|     inline uint16_t width(void)          const { return isActive() ? (stop - start) : 0; }  // segment width in physical pixels (length if 1D) | ||||
|     inline uint16_t height(void)         const { return stopY - startY; }                   // segment height (if 2D) in physical pixels (it *is* always >=1) | ||||
|     inline uint16_t length(void)         const { return width() * height(); }               // segment length (count) in physical pixels | ||||
|     inline uint16_t groupLength(void)    const { return grouping + spacing; } | ||||
|     inline uint8_t  getLightCapabilities(void) const { return _capabilities; } | ||||
|  | ||||
|     static uint16_t getUsedSegmentData(void)    { return _usedSegmentData; } | ||||
|     static void     addUsedSegmentData(int len) { _usedSegmentData += len; } | ||||
|     static void     handleRandomPalette(); | ||||
|  | ||||
|     void    setUp(uint16_t i1, uint16_t i2, uint8_t grp=1, uint8_t spc=0, uint16_t ofs=UINT16_MAX, uint16_t i1Y=0, uint16_t i2Y=1); | ||||
|     void    setUp(uint16_t i1, uint16_t i2, uint8_t grp=1, uint8_t spc=0, uint16_t ofs=UINT16_MAX, uint16_t i1Y=0, uint16_t i2Y=1, uint8_t segId = 255); | ||||
|     bool    setColor(uint8_t slot, uint32_t c); //returns true if changed | ||||
|     void    setCCT(uint16_t k); | ||||
|     void    setOpacity(uint8_t o); | ||||
| @@ -538,7 +539,6 @@ typedef struct Segment { | ||||
|       * Safe to call from interrupts and network requests. | ||||
|       */ | ||||
|     inline void markForReset(void) { reset = true; }  // setOption(SEG_OPTION_RESET, true) | ||||
|     void setUpLeds(void);   // set up leds[] array for loseless getPixelColor() | ||||
|  | ||||
|     // transition functions | ||||
|     void     startTransition(uint16_t dur); // transition has to start before actual segment values change | ||||
| @@ -579,7 +579,7 @@ typedef struct Segment { | ||||
|     uint16_t virtualHeight(void) const; | ||||
|     uint16_t nrOfVStrips(void) const; | ||||
|   #ifndef WLED_DISABLE_2D | ||||
|     uint16_t XY(uint16_t x, uint16_t y); // support function to get relative index within segment (for leds[]) | ||||
|     uint16_t XY(uint16_t x, uint16_t y); // support function to get relative index within segment | ||||
|     void setPixelColorXY(int x, int y, uint32_t c); // set relative pixel within segment with color | ||||
|     void setPixelColorXY(int x, int y, byte r, byte g, byte b, byte w = 0) { setPixelColorXY(x, y, RGBW32(r,g,b,w)); } // automatically inline | ||||
|     void setPixelColorXY(int x, int y, CRGB c)                             { setPixelColorXY(x, y, RGBW32(c.r,c.g,c.b,0)); } // automatically inline | ||||
| @@ -692,7 +692,15 @@ class WS2812FX {  // 96 bytes | ||||
|       customMappingSize(0), | ||||
|       _lastShow(0), | ||||
|       _segment_index(0), | ||||
|       _mainSegment(0) | ||||
|       _mainSegment(0), | ||||
|       _queuedChangesSegId(255), | ||||
|       _qStart(0), | ||||
|       _qStop(0), | ||||
|       _qStartY(0), | ||||
|       _qStopY(0), | ||||
|       _qGrouping(0), | ||||
|       _qSpacing(0), | ||||
|       _qOffset(0) | ||||
|     { | ||||
|       WS2812FX::instance = this; | ||||
|       _mode.reserve(_modeCount);     // allocate memory to prevent initial fragmentation (does not increase size()) | ||||
| @@ -710,7 +718,6 @@ class WS2812FX {  // 96 bytes | ||||
|       panel.clear(); | ||||
| #endif | ||||
|       customPalettes.clear(); | ||||
|       if (useLedsArray && Segment::_globalLeds) free(Segment::_globalLeds); | ||||
|     } | ||||
|  | ||||
|     static WS2812FX* getInstance(void) { return instance; } | ||||
| @@ -749,7 +756,7 @@ class WS2812FX {  // 96 bytes | ||||
|     inline void trigger(void) { _triggered = true; } // Forces the next frame to be computed on all active segments. | ||||
|     inline void setShowCallback(show_callback cb) { _callback = cb; } | ||||
|     inline void setTransition(uint16_t t) { _transitionDur = t; } | ||||
|     inline void appendSegment(const Segment &seg = Segment()) { _segments.push_back(seg); } | ||||
|     inline void appendSegment(const Segment &seg = Segment()) { if (_segments.size() < getMaxSegments()) _segments.push_back(seg); } | ||||
|  | ||||
|     bool | ||||
|       checkSegmentAlignment(void), | ||||
| @@ -757,8 +764,7 @@ class WS2812FX {  // 96 bytes | ||||
|       hasCCTBus(void), | ||||
|       // return true if the strip is being sent pixel updates | ||||
|       isUpdating(void), | ||||
|       deserializeMap(uint8_t n=0), | ||||
|       useLedsArray = false; | ||||
|       deserializeMap(uint8_t n=0); | ||||
|  | ||||
|     inline bool isServicing(void) { return _isServicing; } | ||||
|     inline bool hasWhiteChannel(void) {return _hasWhiteChannel;} | ||||
| @@ -900,13 +906,20 @@ class WS2812FX {  // 96 bytes | ||||
|     uint16_t* customMappingTable; | ||||
|     uint16_t  customMappingSize; | ||||
|  | ||||
|     uint32_t _lastShow; | ||||
|     unsigned long _lastShow; | ||||
|  | ||||
|     uint8_t _segment_index; | ||||
|     uint8_t _mainSegment; | ||||
|     uint8_t _queuedChangesSegId; | ||||
|     uint16_t _qStart, _qStop, _qStartY, _qStopY; | ||||
|     uint8_t _qGrouping, _qSpacing; | ||||
|     uint16_t _qOffset; | ||||
|  | ||||
|     uint8_t | ||||
|       estimateCurrentAndLimitBri(void); | ||||
|  | ||||
|     void | ||||
|       estimateCurrentAndLimitBri(void); | ||||
|       setUpSegmentFromQueuedChanges(void); | ||||
| }; | ||||
|  | ||||
| extern const char JSON_mode_names[]; | ||||
|   | ||||
| @@ -189,20 +189,17 @@ uint32_t WS2812FX::getPixelColorXY(uint16_t x, uint16_t y) { | ||||
|  | ||||
| // XY(x,y) - gets pixel index within current segment (often used to reference leds[] array element) | ||||
| uint16_t /*IRAM_ATTR*/ Segment::XY(uint16_t x, uint16_t y) { | ||||
|   uint16_t width  = virtualWidth();   // segment width in logical pixels | ||||
|   uint16_t height = virtualHeight();  // segment height in logical pixels | ||||
|   return (x%width) + (y%height) * width; | ||||
|   uint16_t width  = virtualWidth();   // segment width in logical pixels (can be 0 if segment is inactive) | ||||
|   uint16_t height = virtualHeight();  // segment height in logical pixels (is always >= 1) | ||||
|   return isActive() ? (x%width) + (y%height) * width : 0; | ||||
| } | ||||
|  | ||||
| void /*IRAM_ATTR*/ Segment::setPixelColorXY(int x, int y, uint32_t col) | ||||
| { | ||||
|   if (Segment::maxHeight==1) return; // not a matrix set-up | ||||
|   if (!isActive()) return; // not active | ||||
|   if (x >= virtualWidth() || y >= virtualHeight() || x<0 || y<0) return;  // if pixel would fall out of virtual segment just exit | ||||
|  | ||||
|   if (leds) leds[XY(x,y)] = col; | ||||
|  | ||||
|   uint8_t _bri_t = currentBri(on ? opacity : 0); | ||||
|   if (!_bri_t && !transitional) return; | ||||
|   if (_bri_t < 255) { | ||||
|     byte r = scale8(R(col), _bri_t); | ||||
|     byte g = scale8(G(col), _bri_t); | ||||
| @@ -244,7 +241,7 @@ void /*IRAM_ATTR*/ Segment::setPixelColorXY(int x, int y, uint32_t col) | ||||
| // anti-aliased version of setPixelColorXY() | ||||
| void Segment::setPixelColorXY(float x, float y, uint32_t col, bool aa) | ||||
| { | ||||
|   if (Segment::maxHeight==1) return; // not a matrix set-up | ||||
|   if (!isActive()) return; // not active | ||||
|   if (x<0.0f || x>1.0f || y<0.0f || y>1.0f) return; // not normalized | ||||
|  | ||||
|   const uint16_t cols = virtualWidth(); | ||||
| @@ -287,8 +284,8 @@ void Segment::setPixelColorXY(float x, float y, uint32_t col, bool aa) | ||||
|  | ||||
| // returns RGBW values of pixel | ||||
| uint32_t Segment::getPixelColorXY(uint16_t x, uint16_t y) { | ||||
|   int i = XY(x,y); | ||||
|   if (leds) return RGBW32(leds[i].r, leds[i].g, leds[i].b, 0); | ||||
|   if (!isActive()) return 0; // not active | ||||
|   if (x >= virtualWidth() || y >= virtualHeight() || x<0 || y<0) return 0;  // if pixel would fall out of virtual segment just exit | ||||
|   if (reverse  ) x = virtualWidth()  - x - 1; | ||||
|   if (reverse_y) y = virtualHeight() - y - 1; | ||||
|   if (transpose) { uint16_t t = x; x = y; y = t; } // swap X & Y if segment transposed | ||||
| @@ -305,6 +302,8 @@ void Segment::blendPixelColorXY(uint16_t x, uint16_t y, uint32_t color, uint8_t | ||||
|  | ||||
| // Adds the specified color with the existing pixel color perserving color balance. | ||||
| void Segment::addPixelColorXY(int x, int y, uint32_t color, bool fast) { | ||||
|   if (!isActive()) return; // not active | ||||
|   if (x >= virtualWidth() || y >= virtualHeight() || x<0 || y<0) return;  // if pixel would fall out of virtual segment just exit | ||||
|   uint32_t col = getPixelColorXY(x,y); | ||||
|   uint8_t r = R(col); | ||||
|   uint8_t g = G(col); | ||||
| @@ -323,62 +322,70 @@ void Segment::addPixelColorXY(int x, int y, uint32_t color, bool fast) { | ||||
| } | ||||
|  | ||||
| void Segment::fadePixelColorXY(uint16_t x, uint16_t y, uint8_t fade) { | ||||
|   if (!isActive()) return; // not active | ||||
|   CRGB pix = CRGB(getPixelColorXY(x,y)).nscale8_video(fade); | ||||
|   setPixelColorXY(x, y, pix); | ||||
| } | ||||
|  | ||||
| // blurRow: perform a blur on a row of a rectangular matrix | ||||
| void Segment::blurRow(uint16_t row, fract8 blur_amount) { | ||||
|   const uint16_t cols = virtualWidth(); | ||||
|   const uint16_t rows = virtualHeight(); | ||||
|   if (!isActive()) return; // not active | ||||
|   const uint_fast16_t cols = virtualWidth(); | ||||
|   const uint_fast16_t rows = virtualHeight(); | ||||
|  | ||||
|   if (row >= rows) return; | ||||
|   // blur one row | ||||
|   uint8_t keep = 255 - blur_amount; | ||||
|   uint8_t seep = blur_amount >> 1; | ||||
|   CRGB carryover = CRGB::Black; | ||||
|   for (uint16_t x = 0; x < cols; x++) { | ||||
|   for (uint_fast16_t x = 0; x < cols; x++) { | ||||
|     CRGB cur = getPixelColorXY(x, row); | ||||
|     CRGB before = cur;     // remember color before blur | ||||
|     CRGB part = cur; | ||||
|     part.nscale8(seep); | ||||
|     cur.nscale8(keep); | ||||
|     cur += carryover; | ||||
|     if (x) { | ||||
|     if (x>0) { | ||||
|       CRGB prev = CRGB(getPixelColorXY(x-1, row)) + part; | ||||
|       setPixelColorXY(x-1, row, prev); | ||||
|     } | ||||
|     setPixelColorXY(x, row, cur); | ||||
|     if (before != cur)         // optimization: only set pixel if color has changed | ||||
|       setPixelColorXY(x, row, cur); | ||||
|     carryover = part; | ||||
|   } | ||||
| } | ||||
|  | ||||
| // blurCol: perform a blur on a column of a rectangular matrix | ||||
| void Segment::blurCol(uint16_t col, fract8 blur_amount) { | ||||
|   const uint16_t cols = virtualWidth(); | ||||
|   const uint16_t rows = virtualHeight(); | ||||
|   if (!isActive()) return; // not active | ||||
|   const uint_fast16_t cols = virtualWidth(); | ||||
|   const uint_fast16_t rows = virtualHeight(); | ||||
|  | ||||
|   if (col >= cols) return; | ||||
|   // blur one column | ||||
|   uint8_t keep = 255 - blur_amount; | ||||
|   uint8_t seep = blur_amount >> 1; | ||||
|   CRGB carryover = CRGB::Black; | ||||
|   for (uint16_t i = 0; i < rows; i++) { | ||||
|     CRGB cur = getPixelColorXY(col, i); | ||||
|   for (uint_fast16_t y = 0; y < rows; y++) { | ||||
|     CRGB cur = getPixelColorXY(col, y); | ||||
|     CRGB part = cur; | ||||
|     CRGB before = cur;     // remember color before blur | ||||
|     part.nscale8(seep); | ||||
|     cur.nscale8(keep); | ||||
|     cur += carryover; | ||||
|     if (i) { | ||||
|       CRGB prev = CRGB(getPixelColorXY(col, i-1)) + part; | ||||
|       setPixelColorXY(col, i-1, prev); | ||||
|     if (y>0) { | ||||
|       CRGB prev = CRGB(getPixelColorXY(col, y-1)) + part; | ||||
|       setPixelColorXY(col, y-1, prev); | ||||
|     } | ||||
|     setPixelColorXY(col, i, cur); | ||||
|     if (before != cur)         // optimization: only set pixel if color has changed | ||||
|       setPixelColorXY(col, y, cur); | ||||
|     carryover = part; | ||||
|   } | ||||
| } | ||||
|  | ||||
| // 1D Box blur (with added weight - blur_amount: [0=no blur, 255=max blur]) | ||||
| void Segment::box_blur(uint16_t i, bool vertical, fract8 blur_amount) { | ||||
|   if (!isActive()) return; // not active | ||||
|   const uint16_t cols = virtualWidth(); | ||||
|   const uint16_t rows = virtualHeight(); | ||||
|   const uint16_t dim1 = vertical ? rows : cols; | ||||
| @@ -391,8 +398,8 @@ void Segment::box_blur(uint16_t i, bool vertical, fract8 blur_amount) { | ||||
|   for (uint16_t j = 0; j < dim1; j++) { | ||||
|     uint16_t x = vertical ? i : j; | ||||
|     uint16_t y = vertical ? j : i; | ||||
|     uint16_t xp = vertical ? x : x-1; | ||||
|     uint16_t yp = vertical ? y-1 : y; | ||||
|     int16_t xp = vertical ? x : x-1;  // "signed" to prevent underflow | ||||
|     int16_t yp = vertical ? y-1 : y;  // "signed" to prevent underflow | ||||
|     uint16_t xn = vertical ? x : x+1; | ||||
|     uint16_t yn = vertical ? y+1 : y; | ||||
|     CRGB curr = getPixelColorXY(x,y); | ||||
| @@ -431,6 +438,7 @@ void Segment::blur1d(fract8 blur_amount) { | ||||
| } | ||||
|  | ||||
| void Segment::moveX(int8_t delta, bool wrap) { | ||||
|   if (!isActive()) return; // not active | ||||
|   const uint16_t cols = virtualWidth(); | ||||
|   const uint16_t rows = virtualHeight(); | ||||
|   if (!delta || abs(delta) >= cols) return; | ||||
| @@ -448,6 +456,7 @@ void Segment::moveX(int8_t delta, bool wrap) { | ||||
| } | ||||
|  | ||||
| void Segment::moveY(int8_t delta, bool wrap) { | ||||
|   if (!isActive()) return; // not active | ||||
|   const uint16_t cols = virtualWidth(); | ||||
|   const uint16_t rows = virtualHeight(); | ||||
|   if (!delta || abs(delta) >= rows) return; | ||||
| @@ -483,6 +492,7 @@ void Segment::move(uint8_t dir, uint8_t delta, bool wrap) { | ||||
| } | ||||
|  | ||||
| void Segment::draw_circle(uint16_t cx, uint16_t cy, uint8_t radius, CRGB col) { | ||||
|   if (!isActive()) return; // not active | ||||
|   // Bresenham’s Algorithm | ||||
|   int d = 3 - (2*radius); | ||||
|   int y = radius, x = 0; | ||||
| @@ -507,6 +517,7 @@ void Segment::draw_circle(uint16_t cx, uint16_t cy, uint8_t radius, CRGB col) { | ||||
|  | ||||
| // by stepko, taken from https://editor.soulmatelights.com/gallery/573-blobs | ||||
| void Segment::fill_circle(uint16_t cx, uint16_t cy, uint8_t radius, CRGB col) { | ||||
|   if (!isActive()) return; // not active | ||||
|   const uint16_t cols = virtualWidth(); | ||||
|   const uint16_t rows = virtualHeight(); | ||||
|   for (int16_t y = -radius; y <= radius; y++) { | ||||
| @@ -520,6 +531,7 @@ void Segment::fill_circle(uint16_t cx, uint16_t cy, uint8_t radius, CRGB col) { | ||||
| } | ||||
|  | ||||
| void Segment::nscale8(uint8_t scale) { | ||||
|   if (!isActive()) return; // not active | ||||
|   const uint16_t cols = virtualWidth(); | ||||
|   const uint16_t rows = virtualHeight(); | ||||
|   for(uint16_t y = 0; y < rows; y++) for (uint16_t x = 0; x < cols; x++) { | ||||
| @@ -529,6 +541,7 @@ void Segment::nscale8(uint8_t scale) { | ||||
|  | ||||
| //line function | ||||
| void Segment::drawLine(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1, uint32_t c) { | ||||
|   if (!isActive()) return; // not active | ||||
|   const uint16_t cols = virtualWidth(); | ||||
|   const uint16_t rows = virtualHeight(); | ||||
|   if (x0 >= cols || x1 >= cols || y0 >= rows || y1 >= rows) return; | ||||
| @@ -553,6 +566,7 @@ void Segment::drawLine(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1, uint3 | ||||
| // draws a raster font character on canvas | ||||
| // only supports: 4x6=24, 5x8=40, 5x12=60, 6x8=48 and 7x9=63 fonts ATM | ||||
| void Segment::drawCharacter(unsigned char chr, int16_t x, int16_t y, uint8_t w, uint8_t h, uint32_t color, uint32_t col2) { | ||||
|   if (!isActive()) return; // not active | ||||
|   if (chr < 32 || chr > 126) return; // only ASCII 32-126 supported | ||||
|   chr -= 32; // align with font table entries | ||||
|   const uint16_t cols = virtualWidth(); | ||||
| @@ -588,6 +602,7 @@ void Segment::drawCharacter(unsigned char chr, int16_t x, int16_t y, uint8_t w, | ||||
|  | ||||
| #define WU_WEIGHT(a,b) ((uint8_t) (((a)*(b)+(a)+(b))>>8)) | ||||
| void Segment::wu_pixel(uint32_t x, uint32_t y, CRGB c) {      //awesome wu_pixel procedure by reddit u/sutaburosu | ||||
|   if (!isActive()) return; // not active | ||||
|   // extract the fractional parts and derive their inverses | ||||
|   uint8_t xx = x & 0xff, yy = y & 0xff, ix = 255 - xx, iy = 255 - yy; | ||||
|   // calculate the intensities for each affected pixel | ||||
|   | ||||
| @@ -74,34 +74,36 @@ | ||||
| // Segment class implementation | ||||
| /////////////////////////////////////////////////////////////////////////////// | ||||
| uint16_t Segment::_usedSegmentData = 0U; // amount of RAM all segments use for their data[] | ||||
| CRGB    *Segment::_globalLeds = nullptr; | ||||
| uint16_t Segment::maxWidth = DEFAULT_LED_COUNT; | ||||
| uint16_t Segment::maxHeight = 1; | ||||
|  | ||||
| CRGBPalette16 Segment::_randomPalette = CRGBPalette16(DEFAULT_COLOR); | ||||
| CRGBPalette16 Segment::_newRandomPalette = CRGBPalette16(DEFAULT_COLOR); | ||||
| unsigned long Segment::_lastPaletteChange = 0; // perhaps it should be per segment | ||||
|  | ||||
| // copy constructor | ||||
| Segment::Segment(const Segment &orig) { | ||||
|   //DEBUG_PRINTLN(F("-- Copy segment constructor --")); | ||||
|   memcpy((void*)this, (void*)&orig, sizeof(Segment)); | ||||
|   transitional = false; // copied segment cannot be in transition | ||||
|   name = nullptr; | ||||
|   data = nullptr; | ||||
|   _dataLen = 0; | ||||
|   _t = nullptr; | ||||
|   if (leds && !Segment::_globalLeds) leds = nullptr; | ||||
|   if (orig.name) { name = new char[strlen(orig.name)+1]; if (name) strcpy(name, orig.name); } | ||||
|   if (orig.data) { if (allocateData(orig._dataLen)) memcpy(data, orig.data, orig._dataLen); } | ||||
|   if (orig._t)   { _t = new Transition(orig._t->_dur, orig._t->_briT, orig._t->_cctT, orig._t->_colorT); } | ||||
|   if (orig.leds && !Segment::_globalLeds) { leds = (CRGB*)malloc(sizeof(CRGB)*length()); if (leds) memcpy(leds, orig.leds, sizeof(CRGB)*length()); } | ||||
|   //if (orig._t)   { _t = new Transition(orig._t->_dur, orig._t->_briT, orig._t->_cctT, orig._t->_colorT); } | ||||
| } | ||||
|  | ||||
| // move constructor | ||||
| Segment::Segment(Segment &&orig) noexcept { | ||||
|   //DEBUG_PRINTLN(F("-- Move segment constructor --")); | ||||
|   memcpy((void*)this, (void*)&orig, sizeof(Segment)); | ||||
|   orig.transitional = false; // old segment cannot be in transition any more | ||||
|   orig.name = nullptr; | ||||
|   orig.data = nullptr; | ||||
|   orig._dataLen = 0; | ||||
|   orig._t   = nullptr; | ||||
|   orig.leds = nullptr; | ||||
| } | ||||
|  | ||||
| // copy assignment | ||||
| @@ -109,23 +111,22 @@ Segment& Segment::operator= (const Segment &orig) { | ||||
|   //DEBUG_PRINTLN(F("-- Copying segment --")); | ||||
|   if (this != &orig) { | ||||
|     // clean destination | ||||
|     transitional = false; // copied segment cannot be in transition | ||||
|     if (name) delete[] name; | ||||
|     if (_t)   delete _t; | ||||
|     if (leds && !Segment::_globalLeds) free(leds); | ||||
|     deallocateData(); | ||||
|     // copy source | ||||
|     memcpy((void*)this, (void*)&orig, sizeof(Segment)); | ||||
|     transitional = false; | ||||
|     // erase pointers to allocated data | ||||
|     name = nullptr; | ||||
|     data = nullptr; | ||||
|     _dataLen = 0; | ||||
|     _t = nullptr; | ||||
|     if (!Segment::_globalLeds) leds = nullptr; | ||||
|     // copy source data | ||||
|     if (orig.name) { name = new char[strlen(orig.name)+1]; if (name) strcpy(name, orig.name); } | ||||
|     if (orig.data) { if (allocateData(orig._dataLen)) memcpy(data, orig.data, orig._dataLen); } | ||||
|     if (orig._t)   { _t = new Transition(orig._t->_dur, orig._t->_briT, orig._t->_cctT, orig._t->_colorT); } | ||||
|     if (orig.leds && !Segment::_globalLeds) { leds = (CRGB*)malloc(sizeof(CRGB)*length()); if (leds) memcpy(leds, orig.leds, sizeof(CRGB)*length()); } | ||||
|     //if (orig._t)   { _t = new Transition(orig._t->_dur, orig._t->_briT, orig._t->_cctT, orig._t->_colorT); } | ||||
|   } | ||||
|   return *this; | ||||
| } | ||||
| @@ -134,16 +135,16 @@ Segment& Segment::operator= (const Segment &orig) { | ||||
| Segment& Segment::operator= (Segment &&orig) noexcept { | ||||
|   //DEBUG_PRINTLN(F("-- Moving segment --")); | ||||
|   if (this != &orig) { | ||||
|     if (name) delete[] name; // free old name | ||||
|     transitional = false; // just temporary | ||||
|     if (name) { delete[] name; name = nullptr; } // free old name | ||||
|     deallocateData(); // free old runtime data | ||||
|     if (_t) delete _t; | ||||
|     if (leds && !Segment::_globalLeds) free(leds); | ||||
|     if (_t) { delete _t; _t = nullptr; } | ||||
|     memcpy((void*)this, (void*)&orig, sizeof(Segment)); | ||||
|     orig.transitional = false; // old segment cannot be in transition | ||||
|     orig.name = nullptr; | ||||
|     orig.data = nullptr; | ||||
|     orig._dataLen = 0; | ||||
|     orig._t   = nullptr; | ||||
|     orig.leds = nullptr; | ||||
|   } | ||||
|   return *this; | ||||
| } | ||||
| @@ -153,12 +154,7 @@ bool Segment::allocateData(size_t len) { | ||||
|   deallocateData(); | ||||
|   if (Segment::getUsedSegmentData() + len > MAX_SEGMENT_DATA) return false; //not enough memory | ||||
|   // do not use SPI RAM on ESP32 since it is slow | ||||
|   //#if defined(ARDUINO_ARCH_ESP32) && defined(BOARD_HAS_PSRAM) && defined(WLED_USE_PSRAM) | ||||
|   //if (psramFound()) | ||||
|   //  data = (byte*) ps_malloc(len); | ||||
|   //else | ||||
|   //#endif | ||||
|     data = (byte*) malloc(len); | ||||
|   data = (byte*) malloc(len); | ||||
|   if (!data) return false; //allocation failed | ||||
|   Segment::addUsedSegmentData(len); | ||||
|   _dataLen = len; | ||||
| @@ -182,38 +178,14 @@ void Segment::deallocateData() { | ||||
|   * may free that data buffer. | ||||
|   */ | ||||
| void Segment::resetIfRequired() { | ||||
|   if (reset) { | ||||
|     if (leds && !Segment::_globalLeds) { free(leds); leds = nullptr; } | ||||
|     //if (transitional && _t) { transitional = false; delete _t; _t = nullptr; } | ||||
|     deallocateData(); | ||||
|     next_time = 0; step = 0; call = 0; aux0 = 0; aux1 = 0; | ||||
|     reset = false; // setOption(SEG_OPTION_RESET, false); | ||||
|   } | ||||
| } | ||||
|  | ||||
| void Segment::setUpLeds() { | ||||
|   // deallocation happens in resetIfRequired() as it is called when segment changes or in destructor | ||||
|   if (Segment::_globalLeds) | ||||
|     #ifndef WLED_DISABLE_2D | ||||
|     leds = &Segment::_globalLeds[start + startY*Segment::maxWidth]; | ||||
|     #else | ||||
|     leds = &Segment::_globalLeds[start]; | ||||
|     #endif | ||||
|   else if (leds == nullptr && length() > 0) { //softhack007 quickfix - avoid malloc(0) which is undefined behaviour (should not happen, but i've seen it) | ||||
|     //#if defined(ARDUINO_ARCH_ESP32) && defined(WLED_USE_PSRAM) | ||||
|     //if (psramFound()) | ||||
|     //  leds = (CRGB*)ps_malloc(sizeof(CRGB)*length());   // softhack007 disabled; putting leds into psram leads to horrible slowdown on WROVER boards | ||||
|     //else | ||||
|     //#endif | ||||
|       leds = (CRGB*)malloc(sizeof(CRGB)*length()); | ||||
|   } | ||||
|   if (!reset) return; | ||||
|    | ||||
|   deallocateData(); | ||||
|   next_time = 0; step = 0; call = 0; aux0 = 0; aux1 = 0; | ||||
|   reset = false; | ||||
| } | ||||
|  | ||||
| CRGBPalette16 &Segment::loadPalette(CRGBPalette16 &targetPalette, uint8_t pal) { | ||||
|   static unsigned long _lastPaletteChange = 0; // perhaps it should be per segment | ||||
|   static CRGBPalette16 randomPalette = CRGBPalette16(DEFAULT_COLOR); | ||||
|   static CRGBPalette16 prevRandomPalette = CRGBPalette16(CRGB(BLACK)); | ||||
|   byte tcp[72]; | ||||
|   if (pal < 245 && pal > GRADIENT_PALETTE_COUNT+13) pal = 0; | ||||
|   if (pal > 245 && (strip.customPalettes.size() == 0 || 255U-pal > strip.customPalettes.size()-1)) pal = 0; | ||||
|   //default palette. Differs depending on effect | ||||
| @@ -234,27 +206,18 @@ CRGBPalette16 &Segment::loadPalette(CRGBPalette16 &targetPalette, uint8_t pal) { | ||||
|     case 0: //default palette. Exceptions for specific effects above | ||||
|       targetPalette = PartyColors_p; break; | ||||
|     case 1: {//periodically replace palette with a random one. Transition palette change in 500ms | ||||
|       uint32_t timeSinceLastChange = millis() - _lastPaletteChange; | ||||
|       unsigned long timeSinceLastChange = millis() - _lastPaletteChange; | ||||
|       if (timeSinceLastChange > randomPaletteChangeTime * 1000U) { | ||||
|         prevRandomPalette = randomPalette; | ||||
|         randomPalette = CRGBPalette16( | ||||
|         _randomPalette = _newRandomPalette; | ||||
|         _newRandomPalette = CRGBPalette16( | ||||
|                         CHSV(random8(), random8(160, 255), random8(128, 255)), | ||||
|                         CHSV(random8(), random8(160, 255), random8(128, 255)), | ||||
|                         CHSV(random8(), random8(160, 255), random8(128, 255)), | ||||
|                         CHSV(random8(), random8(160, 255), random8(128, 255))); | ||||
|         _lastPaletteChange = millis(); | ||||
|         timeSinceLastChange = 0; | ||||
|       } | ||||
|       if (timeSinceLastChange <= 250) { | ||||
|         targetPalette = prevRandomPalette; | ||||
|         // there needs to be 255 palette blends (48) for full blend but that is too resource intensive | ||||
|         // so 128 is a compromise (we need to perform full blend of the two palettes as each segment can have random | ||||
|         // palette selected but only 2 static palettes are used) | ||||
|         size_t noOfBlends = ((128U * timeSinceLastChange) / 250U); | ||||
|         for (size_t i=0; i<noOfBlends; i++) nblendPaletteTowardPalette(targetPalette, randomPalette, 48); | ||||
|       } else { | ||||
|         targetPalette = randomPalette; | ||||
|         handleRandomPalette(); // do initial blend | ||||
|       } | ||||
|       targetPalette = _randomPalette; | ||||
|       break;} | ||||
|     case 2: {//primary color only | ||||
|       CRGB prim = gamma32(colors[0]); | ||||
| @@ -296,6 +259,7 @@ CRGBPalette16 &Segment::loadPalette(CRGBPalette16 &targetPalette, uint8_t pal) { | ||||
|       if (pal>245) { | ||||
|         targetPalette = strip.customPalettes[255-pal]; // we checked bounds above | ||||
|       } else { | ||||
|         byte tcp[72]; | ||||
|         memcpy_P(tcp, (byte*)pgm_read_dword(&(gGradientPalettes[pal-13])), 72); | ||||
|         targetPalette.loadDynamicGradientPalette(tcp); | ||||
|       } | ||||
| @@ -305,39 +269,42 @@ CRGBPalette16 &Segment::loadPalette(CRGBPalette16 &targetPalette, uint8_t pal) { | ||||
| } | ||||
|  | ||||
| void Segment::startTransition(uint16_t dur) { | ||||
|   if (transitional || _t) return; // already in transition no need to store anything | ||||
|   if (!dur) { | ||||
|     transitional = false; | ||||
|     if (_t) { | ||||
|       delete _t; | ||||
|       _t = nullptr; | ||||
|     } | ||||
|     return; | ||||
|   } | ||||
|   if (transitional && _t) return; // already in transition no need to store anything | ||||
|  | ||||
|   // starting a transition has to occur before change so we get current values 1st | ||||
|   uint8_t _briT = currentBri(on ? opacity : 0); | ||||
|   uint8_t _cctT = currentBri(cct, true); | ||||
|   CRGBPalette16 _palT = CRGBPalette16(DEFAULT_COLOR); loadPalette(_palT, palette); | ||||
|   uint8_t _modeP = mode; | ||||
|   uint32_t _colorT[NUM_COLORS]; | ||||
|   for (size_t i=0; i<NUM_COLORS; i++) _colorT[i] = currentColor(i, colors[i]); | ||||
|  | ||||
|   if (!_t) _t = new Transition(dur); // no previous transition running | ||||
|   _t = new Transition(dur); // no previous transition running | ||||
|   if (!_t) return; // failed to allocate data | ||||
|   _t->_briT  = _briT; | ||||
|   _t->_cctT  = _cctT; | ||||
|  | ||||
|   CRGBPalette16 _palT = CRGBPalette16(DEFAULT_COLOR); loadPalette(_palT, palette); | ||||
|   _t->_briT  = on ? opacity : 0; | ||||
|   _t->_cctT  = cct; | ||||
|   _t->_palT  = _palT; | ||||
|   _t->_modeP = _modeP; | ||||
|   for (size_t i=0; i<NUM_COLORS; i++) _t->_colorT[i] = _colorT[i]; | ||||
|   _t->_modeP = mode; | ||||
|   for (size_t i=0; i<NUM_COLORS; i++) _t->_colorT[i] = colors[i]; | ||||
|   transitional = true; // setOption(SEG_OPTION_TRANSITIONAL, true); | ||||
| } | ||||
|  | ||||
| // transition progression between 0-65535 | ||||
| uint16_t Segment::progress() { | ||||
|   if (!transitional || !_t) return 0xFFFFU; | ||||
|   uint32_t timeNow = millis(); | ||||
|   unsigned long timeNow = millis(); | ||||
|   if (timeNow - _t->_start > _t->_dur || _t->_dur == 0) return 0xFFFFU; | ||||
|   return (timeNow - _t->_start) * 0xFFFFU / _t->_dur; | ||||
| } | ||||
|  | ||||
| uint8_t Segment::currentBri(uint8_t briNew, bool useCct) { | ||||
|   if (transitional && _t) { | ||||
|     uint32_t prog = progress() + 1; | ||||
|     if (useCct) return ((briNew * prog) + _t->_cctT * (0x10000 - prog)) >> 16; | ||||
|     else        return ((briNew * prog) + _t->_briT * (0x10000 - prog)) >> 16; | ||||
|   uint32_t prog = progress(); | ||||
|   if (transitional && _t && prog < 0xFFFFU) { | ||||
|     if (useCct) return ((briNew * prog) + _t->_cctT * (0xFFFFU - prog)) >> 16; | ||||
|     else        return ((briNew * prog) + _t->_briT * (0xFFFFU - prog)) >> 16; | ||||
|   } else { | ||||
|     return briNew; | ||||
|   } | ||||
| @@ -357,7 +324,7 @@ CRGBPalette16 &Segment::currentPalette(CRGBPalette16 &targetPalette, uint8_t pal | ||||
|     // blend palettes | ||||
|     // there are about 255 blend passes of 48 "blends" to completely blend two palettes (in _dur time) | ||||
|     // minimum blend time is 100ms maximum is 65535ms | ||||
|     uint32_t timeMS = millis() - _t->_start; | ||||
|     unsigned long timeMS = millis() - _t->_start; | ||||
|     uint16_t noOfBlends = (255U * timeMS / _t->_dur) - _t->_prevPaletteBlends; | ||||
|     for (int i=0; i<noOfBlends; i++, _t->_prevPaletteBlends++) nblendPaletteTowardPalette(_t->_palT, targetPalette, 48); | ||||
|     targetPalette = _t->_palT; // copy transitioning/temporary palette | ||||
| @@ -368,18 +335,25 @@ CRGBPalette16 &Segment::currentPalette(CRGBPalette16 &targetPalette, uint8_t pal | ||||
| void Segment::handleTransition() { | ||||
|   if (!transitional) return; | ||||
|   uint16_t _progress = progress(); | ||||
|   if (_progress == 0xFFFFU) transitional = false; // finish transitioning segment | ||||
|   if (_t) { // thanks to @nXm AKA https://github.com/NMeirer | ||||
|     if (_progress >= 32767U && _t->_modeP != mode) markForReset(); | ||||
|     if (_progress == 0xFFFFU) { | ||||
|       delete _t; | ||||
|       _t = nullptr; | ||||
|     } | ||||
|   } | ||||
|   if (_progress == 0xFFFFU) transitional = false; // finish transitioning segment | ||||
| } | ||||
|  | ||||
| void Segment::setUp(uint16_t i1, uint16_t i2, uint8_t grp, uint8_t spc, uint16_t ofs, uint16_t i1Y, uint16_t i2Y) { | ||||
|   //return if neither bounds nor grouping have changed | ||||
| // relies on WS2812FX::service() to call it max every 8ms or more (MIN_SHOW_DELAY) | ||||
| void Segment::handleRandomPalette() { | ||||
|   // just do a blend; if the palettes are identical it will just compare 48 bytes (same as _randomPalette == _newRandomPalette) | ||||
|   // this will slowly blend _newRandomPalette into _randomPalette every 15ms or 8ms (depending on MIN_SHOW_DELAY) | ||||
|   nblendPaletteTowardPalette(_randomPalette, _newRandomPalette, 48); | ||||
| } | ||||
|  | ||||
| // segId is given when called from network callback, changes are queued if that segment is currently in its effect function | ||||
| void Segment::setUp(uint16_t i1, uint16_t i2, uint8_t grp, uint8_t spc, uint16_t ofs, uint16_t i1Y, uint16_t i2Y, uint8_t segId) { | ||||
|   // return if neither bounds nor grouping have changed | ||||
|   bool boundsUnchanged = (start == i1 && stop == i2); | ||||
|   #ifndef WLED_DISABLE_2D | ||||
|   if (Segment::maxHeight>1) boundsUnchanged &= (startY == i1Y && stopY == i2Y); // 2D | ||||
| @@ -388,10 +362,22 @@ void Segment::setUp(uint16_t i1, uint16_t i2, uint8_t grp, uint8_t spc, uint16_t | ||||
|       && (!grp || (grouping == grp && spacing == spc)) | ||||
|       && (ofs == UINT16_MAX || ofs == offset)) return; | ||||
|  | ||||
|   if (stop) fill(BLACK); //turn old segment range off | ||||
|   if (stop) fill(BLACK); // turn old segment range off (clears pixels if changing spacing) | ||||
|   if (grp) { // prevent assignment of 0 | ||||
|     grouping = grp; | ||||
|     spacing = spc; | ||||
|   } else { | ||||
|     grouping = 1; | ||||
|     spacing = 0; | ||||
|   } | ||||
|   if (ofs < UINT16_MAX) offset = ofs; | ||||
|  | ||||
|   markForReset(); | ||||
|   if (boundsUnchanged) return; | ||||
|  | ||||
|   // apply change immediately | ||||
|   if (i2 <= i1) { //disable segment | ||||
|     stop = 0; | ||||
|     markForReset(); | ||||
|     return; | ||||
|   } | ||||
|   if (i1 < Segment::maxWidth || (i1 >= Segment::maxWidth*Segment::maxHeight && i1 < strip.getLengthTotal())) start = i1; // Segment::maxWidth equals strip.getLengthTotal() for 1D | ||||
| @@ -404,13 +390,12 @@ void Segment::setUp(uint16_t i1, uint16_t i2, uint8_t grp, uint8_t spc, uint16_t | ||||
|     stopY = i2Y > Segment::maxHeight ? Segment::maxHeight : MAX(1,i2Y); | ||||
|   } | ||||
|   #endif | ||||
|   if (grp) { | ||||
|     grouping = grp; | ||||
|     spacing = spc; | ||||
|   // safety check | ||||
|   if (start >= stop || startY >= stopY) { | ||||
|     stop = 0; | ||||
|     return; | ||||
|   } | ||||
|   if (ofs < UINT16_MAX) offset = ofs; | ||||
|   markForReset(); | ||||
|   if (!boundsUnchanged) refreshLightCapabilities(); | ||||
|   refreshLightCapabilities(); | ||||
| } | ||||
|  | ||||
|  | ||||
| @@ -457,8 +442,7 @@ void Segment::setMode(uint8_t fx, bool loadDefaults) { | ||||
|   // if we have a valid mode & is not reserved | ||||
|   if (fx < strip.getModeCount() && strncmp_P("RSVD", strip.getModeData(fx), 4)) { | ||||
|     if (fx != mode) { | ||||
|       startTransition(strip.getTransition()); // set effect transitions | ||||
|       //markForReset(); // transition will handle this | ||||
|       if (fadeTransition) startTransition(strip.getTransition()); // set effect transitions | ||||
|       mode = fx; | ||||
|  | ||||
|       // load default values from effect string | ||||
| @@ -480,6 +464,7 @@ void Segment::setMode(uint8_t fx, bool loadDefaults) { | ||||
|         sOpt = extractModeDefaults(fx, "mY");   if (sOpt >= 0) mirror_y  = (bool)sOpt; // NOTE: setting this option is a risky business | ||||
|         sOpt = extractModeDefaults(fx, "pal");  if (sOpt >= 0) setPalette(sOpt); //else setPalette(0); | ||||
|       } | ||||
|       markForReset(); | ||||
|       stateChanged = true; // send UDP/WS broadcast | ||||
|     } | ||||
|   } | ||||
| @@ -543,7 +528,7 @@ uint16_t Segment::virtualLength() const { | ||||
|     return vLen; | ||||
|   } | ||||
| #endif | ||||
|   uint16_t groupLen = groupLength(); | ||||
|   uint16_t groupLen = groupLength(); // is always >= 1 | ||||
|   uint16_t vLength = (length() + groupLen - 1) / groupLen; | ||||
|   if (mirror) vLength = (vLength + 1) /2;  // divide by 2 if mirror, leave at least a single LED | ||||
|   return vLength; | ||||
| @@ -551,6 +536,7 @@ uint16_t Segment::virtualLength() const { | ||||
|  | ||||
| void IRAM_ATTR Segment::setPixelColor(int i, uint32_t col) | ||||
| { | ||||
|   if (!isActive()) return; // not active | ||||
| #ifndef WLED_DISABLE_2D | ||||
|   int vStrip = i>>16; // hack to allow running on virtual strips (2D segment columns/rows) | ||||
| #endif | ||||
| @@ -618,11 +604,8 @@ void IRAM_ATTR Segment::setPixelColor(int i, uint32_t col) | ||||
|   } | ||||
| #endif | ||||
|  | ||||
|   if (leds) leds[i] = col; | ||||
|  | ||||
|   uint16_t len = length(); | ||||
|   uint8_t _bri_t = currentBri(on ? opacity : 0); | ||||
|   if (!_bri_t && !transitional && fadeTransition) return; // if _bri_t == 0 && segment is not transitionig && transitions are enabled then save a few CPU cycles | ||||
|   if (_bri_t < 255) { | ||||
|     byte r = scale8(R(col), _bri_t); | ||||
|     byte g = scale8(G(col), _bri_t); | ||||
| @@ -662,6 +645,7 @@ void IRAM_ATTR Segment::setPixelColor(int i, uint32_t col) | ||||
| // anti-aliased normalized version of setPixelColor() | ||||
| void Segment::setPixelColor(float i, uint32_t col, bool aa) | ||||
| { | ||||
|   if (!isActive()) return; // not active | ||||
|   int vStrip = int(i/10.0f); // hack to allow running on virtual strips (2D segment columns/rows) | ||||
|   i -= int(i); | ||||
|  | ||||
| @@ -693,6 +677,7 @@ void Segment::setPixelColor(float i, uint32_t col, bool aa) | ||||
|  | ||||
| uint32_t Segment::getPixelColor(int i) | ||||
| { | ||||
|   if (!isActive()) return 0; // not active | ||||
| #ifndef WLED_DISABLE_2D | ||||
|   int vStrip = i>>16; | ||||
| #endif | ||||
| @@ -720,14 +705,12 @@ uint32_t Segment::getPixelColor(int i) | ||||
|   } | ||||
| #endif | ||||
|  | ||||
|   if (leds) return RGBW32(leds[i].r, leds[i].g, leds[i].b, 0); | ||||
|  | ||||
|   if (reverse) i = virtualLength() - i - 1; | ||||
|   i *= groupLength(); | ||||
|   i += start; | ||||
|   /* offset/phase */ | ||||
|   i += offset; | ||||
|   if (i >= stop) i -= length(); | ||||
|   if ((i >= stop) && (stop>0)) i -= length(); // avoids negative pixel index (stop = 0 is a possible value) | ||||
|   return strip.getPixelColor(i); | ||||
| } | ||||
|  | ||||
| @@ -762,6 +745,11 @@ void Segment::refreshLightCapabilities() { | ||||
|   uint16_t segStartIdx = 0xFFFFU; | ||||
|   uint16_t segStopIdx  = 0; | ||||
|  | ||||
|   if (!isActive()) { | ||||
|     _capabilities = 0; | ||||
|     return; | ||||
|   } | ||||
|  | ||||
|   if (start < Segment::maxWidth * Segment::maxHeight) { | ||||
|     // we are withing 2D matrix (includes 1D segments) | ||||
|     for (int y = startY; y < stopY; y++) for (int x = start; x < stop; x++) { | ||||
| @@ -806,6 +794,7 @@ void Segment::refreshLightCapabilities() { | ||||
|  * Fills segment with color | ||||
|  */ | ||||
| void Segment::fill(uint32_t c) { | ||||
|   if (!isActive()) return; // not active | ||||
|   const uint16_t cols = is2D() ? virtualWidth() : virtualLength(); | ||||
|   const uint16_t rows = virtualHeight(); // will be 1 for 1D | ||||
|   for(uint16_t y = 0; y < rows; y++) for (uint16_t x = 0; x < cols; x++) { | ||||
| @@ -821,6 +810,7 @@ void Segment::blendPixelColor(int n, uint32_t color, uint8_t blend) { | ||||
|  | ||||
| // Adds the specified color with the existing pixel color perserving color balance. | ||||
| void Segment::addPixelColor(int n, uint32_t color, bool fast) { | ||||
|   if (!isActive()) return; // not active | ||||
|   uint32_t col = getPixelColor(n); | ||||
|   uint8_t r = R(col); | ||||
|   uint8_t g = G(col); | ||||
| @@ -839,6 +829,7 @@ void Segment::addPixelColor(int n, uint32_t color, bool fast) { | ||||
| } | ||||
|  | ||||
| void Segment::fadePixelColor(uint16_t n, uint8_t fade) { | ||||
|   if (!isActive()) return; // not active | ||||
|   CRGB pix = CRGB(getPixelColor(n)).nscale8_video(fade); | ||||
|   setPixelColor(n, pix); | ||||
| } | ||||
| @@ -847,6 +838,7 @@ void Segment::fadePixelColor(uint16_t n, uint8_t fade) { | ||||
|  * fade out function, higher rate = quicker fade | ||||
|  */ | ||||
| void Segment::fade_out(uint8_t rate) { | ||||
|   if (!isActive()) return; // not active | ||||
|   const uint16_t cols = is2D() ? virtualWidth() : virtualLength(); | ||||
|   const uint16_t rows = virtualHeight(); // will be 1 for 1D | ||||
|  | ||||
| @@ -884,6 +876,7 @@ void Segment::fade_out(uint8_t rate) { | ||||
|  | ||||
| // fades all pixels to black using nscale8() | ||||
| void Segment::fadeToBlackBy(uint8_t fadeBy) { | ||||
|   if (!isActive() || fadeBy == 0) return;   // optimization - no scaling to apply | ||||
|   const uint16_t cols = is2D() ? virtualWidth() : virtualLength(); | ||||
|   const uint16_t rows = virtualHeight(); // will be 1 for 1D | ||||
|  | ||||
| @@ -898,23 +891,26 @@ void Segment::fadeToBlackBy(uint8_t fadeBy) { | ||||
|  */ | ||||
| void Segment::blur(uint8_t blur_amount) | ||||
| { | ||||
|   if (!isActive() || blur_amount == 0) return; // optimization: 0 means "don't blur" | ||||
| #ifndef WLED_DISABLE_2D | ||||
|   if (is2D()) { | ||||
|     // compatibility with 2D | ||||
|     const uint16_t cols = virtualWidth(); | ||||
|     const uint16_t rows = virtualHeight(); | ||||
|     for (uint16_t i = 0; i < rows; i++) blurRow(i, blur_amount); // blur all rows | ||||
|     for (uint16_t k = 0; k < cols; k++) blurCol(k, blur_amount); // blur all columns | ||||
|     const uint_fast16_t cols = virtualWidth(); | ||||
|     const uint_fast16_t rows = virtualHeight(); | ||||
|     for (uint_fast16_t i = 0; i < rows; i++) blurRow(i, blur_amount); // blur all rows | ||||
|     for (uint_fast16_t k = 0; k < cols; k++) blurCol(k, blur_amount); // blur all columns | ||||
|     return; | ||||
|   } | ||||
| #endif | ||||
|   uint8_t keep = 255 - blur_amount; | ||||
|   uint8_t seep = blur_amount >> 1; | ||||
|   CRGB carryover = CRGB::Black; | ||||
|   for(uint16_t i = 0; i < virtualLength(); i++) | ||||
|   uint_fast16_t vlength = virtualLength(); | ||||
|   for(uint_fast16_t i = 0; i < vlength; i++) | ||||
|   { | ||||
|     CRGB cur = CRGB(getPixelColor(i)); | ||||
|     CRGB part = cur; | ||||
|     CRGB before = cur; // remember color before blur | ||||
|     part.nscale8(seep); | ||||
|     cur.nscale8(keep); | ||||
|     cur += carryover; | ||||
| @@ -923,9 +919,10 @@ void Segment::blur(uint8_t blur_amount) | ||||
|       uint8_t r = R(c); | ||||
|       uint8_t g = G(c); | ||||
|       uint8_t b = B(c); | ||||
|       setPixelColor(i-1, qadd8(r, part.red), qadd8(g, part.green), qadd8(b, part.blue)); | ||||
|       setPixelColor((uint16_t)(i-1), qadd8(r, part.red), qadd8(g, part.green), qadd8(b, part.blue)); | ||||
|     } | ||||
|     setPixelColor(i,cur.red, cur.green, cur.blue); | ||||
|     if (before != cur)     // optimization: only set pixel if color has changed | ||||
|       setPixelColor((uint16_t)i,cur.red, cur.green, cur.blue); | ||||
|     carryover = part; | ||||
|   } | ||||
| } | ||||
| @@ -1060,24 +1057,6 @@ void WS2812FX::finalizeInit(void) | ||||
|     Segment::maxHeight = 1; | ||||
|   } | ||||
|  | ||||
|   //initialize leds array. TBD: realloc if nr of leds change | ||||
|   if (Segment::_globalLeds) { | ||||
|     purgeSegments(true); | ||||
|     free(Segment::_globalLeds); | ||||
|     Segment::_globalLeds = nullptr; | ||||
|   } | ||||
|   if (useLedsArray) { | ||||
|     size_t arrSize = sizeof(CRGB) * getLengthTotal(); | ||||
|     // softhack007 disabled; putting leds into psram leads to horrible slowdown on WROVER boards (see setUpLeds()) | ||||
|     //#if defined(ARDUINO_ARCH_ESP32) && defined(WLED_USE_PSRAM) | ||||
|     //if (psramFound()) | ||||
|     //  Segment::_globalLeds = (CRGB*) ps_malloc(arrSize); | ||||
|     //else | ||||
|     //#endif | ||||
|       Segment::_globalLeds = (CRGB*) malloc(arrSize); | ||||
|     memset(Segment::_globalLeds, 0, arrSize); | ||||
|   } | ||||
|  | ||||
|   //segments are created in makeAutoSegments(); | ||||
|   DEBUG_PRINTLN(F("Loading custom palettes")); | ||||
|   loadCustomPalettes(); // (re)load all custom palettes | ||||
| @@ -1086,25 +1065,23 @@ void WS2812FX::finalizeInit(void) | ||||
| } | ||||
|  | ||||
| void WS2812FX::service() { | ||||
|   uint32_t nowUp = millis(); // Be aware, millis() rolls over every 49 days | ||||
|   unsigned long nowUp = millis(); // Be aware, millis() rolls over every 49 days | ||||
|   now = nowUp + timebase; | ||||
|   if (nowUp - _lastShow < MIN_SHOW_DELAY) return; | ||||
|   bool doShow = false; | ||||
|  | ||||
|   _isServicing = true; | ||||
|   _segment_index = 0; | ||||
|   Segment::handleRandomPalette(); // move it into for loop when each segment has individual random palette | ||||
|   for (segment &seg : _segments) { | ||||
|     // process transition (mode changes in the middle of transition) | ||||
|     seg.handleTransition(); | ||||
|     // reset the segment runtime data if needed | ||||
|     seg.resetIfRequired(); | ||||
|  | ||||
|     if (!seg.isActive()) continue; | ||||
|  | ||||
|     // last condition ensures all solid segments are updated at the same time | ||||
|     if(nowUp > seg.next_time || _triggered || (doShow && seg.mode == FX_MODE_STATIC)) | ||||
|     if (seg.isActive() && (nowUp > seg.next_time || _triggered || (doShow && seg.mode == FX_MODE_STATIC))) | ||||
|     { | ||||
|       if (seg.grouping == 0) seg.grouping = 1; //sanity check | ||||
|       doShow = true; | ||||
|       uint16_t delay = FRAMETIME; | ||||
|  | ||||
| @@ -1128,16 +1105,24 @@ void WS2812FX::service() { | ||||
|  | ||||
|       seg.next_time = nowUp + delay; | ||||
|     } | ||||
|     if (_segment_index == _queuedChangesSegId) setUpSegmentFromQueuedChanges(); | ||||
|     _segment_index++; | ||||
|   } | ||||
|   _virtualSegmentLength = 0; | ||||
|   busses.setSegmentCCT(-1); | ||||
|   if(doShow) { | ||||
|   _isServicing = false; | ||||
|   _triggered = false; | ||||
|  | ||||
|   #ifdef WLED_DEBUG | ||||
|   if (millis() - nowUp > _frametime) DEBUG_PRINTLN(F("Slow effects.")); | ||||
|   #endif | ||||
|   if (doShow) { | ||||
|     yield(); | ||||
|     show(); | ||||
|   } | ||||
|   _triggered = false; | ||||
|   _isServicing = false; | ||||
|   #ifdef WLED_DEBUG | ||||
|   if (millis() - nowUp > _frametime) DEBUG_PRINTLN(F("Slow strip.")); | ||||
|   #endif | ||||
| } | ||||
|  | ||||
| void IRAM_ATTR WS2812FX::setPixelColor(int i, uint32_t col) | ||||
| @@ -1166,7 +1151,7 @@ uint32_t WS2812FX::getPixelColor(uint16_t i) | ||||
| #define MA_FOR_ESP        100 //how much mA does the ESP use (Wemos D1 about 80mA, ESP32 about 120mA) | ||||
|                               //you can set it to 0 if the ESP is powered by USB and the LEDs by external | ||||
|  | ||||
| void WS2812FX::estimateCurrentAndLimitBri() { | ||||
| uint8_t WS2812FX::estimateCurrentAndLimitBri() { | ||||
|   //power limit calculation | ||||
|   //each LED can draw up 195075 "power units" (approx. 53mA) | ||||
|   //one PU is the power it takes to have 1 channel 1 step brighter per brightness step | ||||
| @@ -1174,35 +1159,28 @@ void WS2812FX::estimateCurrentAndLimitBri() { | ||||
|   bool useWackyWS2815PowerModel = false; | ||||
|   byte actualMilliampsPerLed = milliampsPerLed; | ||||
|  | ||||
|   if(milliampsPerLed == 255) { | ||||
|   if (ablMilliampsMax < 150 || actualMilliampsPerLed == 0) { //0 mA per LED and too low numbers turn off calculation | ||||
|     currentMilliamps = 0; | ||||
|     return _brightness; | ||||
|   } | ||||
|  | ||||
|   if (milliampsPerLed == 255) { | ||||
|     useWackyWS2815PowerModel = true; | ||||
|     actualMilliampsPerLed = 12; // from testing an actual strip | ||||
|   } | ||||
|  | ||||
|   if (ablMilliampsMax < 150 || actualMilliampsPerLed == 0) { //0 mA per LED and too low numbers turn off calculation | ||||
|     currentMilliamps = 0; | ||||
|     busses.setBrightness(_brightness); | ||||
|     return; | ||||
|   } | ||||
|  | ||||
|   uint16_t pLen = getLengthPhysical(); | ||||
|   uint32_t puPerMilliamp = 195075 / actualMilliampsPerLed; | ||||
|   uint32_t powerBudget = (ablMilliampsMax - MA_FOR_ESP) * puPerMilliamp; //100mA for ESP power | ||||
|   if (powerBudget > puPerMilliamp * pLen) { //each LED uses about 1mA in standby, exclude that from power budget | ||||
|     powerBudget -= puPerMilliamp * pLen; | ||||
|   } else { | ||||
|     powerBudget = 0; | ||||
|   } | ||||
|  | ||||
|   uint32_t powerSum = 0; | ||||
|   size_t powerBudget = (ablMilliampsMax - MA_FOR_ESP); //100mA for ESP power | ||||
|  | ||||
|   size_t pLen = 0; //getLengthPhysical(); | ||||
|   size_t powerSum = 0; | ||||
|   for (uint_fast8_t bNum = 0; bNum < busses.getNumBusses(); bNum++) { | ||||
|     Bus *bus = busses.getBus(bNum); | ||||
|     if (bus->getType() >= TYPE_NET_DDP_RGB) continue; //exclude non-physical network busses | ||||
|     if (!IS_DIGITAL(bus->getType())) continue; //exclude non-digital network busses | ||||
|     uint16_t len = bus->getLength(); | ||||
|     pLen += len; | ||||
|     uint32_t busPowerSum = 0; | ||||
|     for (uint_fast16_t i = 0; i < len; i++) { //sum up the usage of each LED | ||||
|       uint32_t c = bus->getPixelColor(i); | ||||
|       uint32_t c = bus->getPixelColor(i); // always returns original or restored color without brightness scaling | ||||
|       byte r = R(c), g = G(c), b = B(c), w = W(c); | ||||
|  | ||||
|       if(useWackyWS2815PowerModel) { //ignore white component on WS2815 power calculation | ||||
| @@ -1214,47 +1192,56 @@ void WS2812FX::estimateCurrentAndLimitBri() { | ||||
|  | ||||
|     if (bus->hasWhite()) { //RGBW led total output with white LEDs enabled is still 50mA, so each channel uses less | ||||
|       busPowerSum *= 3; | ||||
|       busPowerSum = busPowerSum >> 2; //same as /= 4 | ||||
|       busPowerSum >>= 2; //same as /= 4 | ||||
|     } | ||||
|     powerSum += busPowerSum; | ||||
|   } | ||||
|  | ||||
|   uint32_t powerSum0 = powerSum; | ||||
|   powerSum *= _brightness; | ||||
|   if (powerBudget > pLen) { //each LED uses about 1mA in standby, exclude that from power budget | ||||
|     powerBudget -= pLen; | ||||
|   } else { | ||||
|     powerBudget = 0; | ||||
|   } | ||||
|  | ||||
|   if (powerSum > powerBudget) //scale brightness down to stay in current limit | ||||
|   { | ||||
|     float scale = (float)powerBudget / (float)powerSum; | ||||
|   // powerSum has all the values of channels summed (max would be pLen*765 as white is excluded) so convert to milliAmps | ||||
|   powerSum = (powerSum * actualMilliampsPerLed) / 765; | ||||
|  | ||||
|   uint8_t newBri = _brightness; | ||||
|   if (powerSum * _brightness / 255 > powerBudget) { //scale brightness down to stay in current limit | ||||
|     float scale = (float)(powerBudget * 255) / (float)(powerSum * _brightness); | ||||
|     uint16_t scaleI = scale * 255; | ||||
|     uint8_t scaleB = (scaleI > 255) ? 255 : scaleI; | ||||
|     uint8_t newBri = scale8(_brightness, scaleB); | ||||
|     busses.setBrightness(newBri); //to keep brightness uniform, sets virtual busses too | ||||
|     currentMilliamps = (powerSum0 * newBri) / puPerMilliamp; | ||||
|   } else { | ||||
|     currentMilliamps = powerSum / puPerMilliamp; | ||||
|     busses.setBrightness(_brightness); | ||||
|     newBri = scale8(_brightness, scaleB) + 1; | ||||
|   } | ||||
|   currentMilliamps = (powerSum * newBri) / 255; | ||||
|   currentMilliamps += MA_FOR_ESP; //add power of ESP back to estimate | ||||
|   currentMilliamps += pLen; //add standby power back to estimate | ||||
|   currentMilliamps += pLen; //add standby power (1mA/LED) back to estimate | ||||
|   return newBri; | ||||
| } | ||||
|  | ||||
| void WS2812FX::show(void) { | ||||
|  | ||||
|   // avoid race condition, caputre _callback value | ||||
|   show_callback callback = _callback; | ||||
|   if (callback) callback(); | ||||
|  | ||||
|   estimateCurrentAndLimitBri(); | ||||
|   uint8_t newBri = estimateCurrentAndLimitBri(); | ||||
|   busses.setBrightness(newBri); // "repaints" all pixels if brightness changed | ||||
|  | ||||
|   // some buses send asynchronously and this method will return before | ||||
|   // all of the data has been sent. | ||||
|   // See https://github.com/Makuna/NeoPixelBus/wiki/ESP32-NeoMethods#neoesp32rmt-methods | ||||
|   busses.show(); | ||||
|  | ||||
|   // restore bus brightness to its original value | ||||
|   // this is done right after show, so this is only OK if LED updates are completed before show() returns | ||||
|   // or async show has a separate buffer (ESP32 RMT and I2S are ok) | ||||
|   if (newBri < _brightness) busses.setBrightness(_brightness); | ||||
|  | ||||
|   unsigned long now = millis(); | ||||
|   unsigned long diff = now - _lastShow; | ||||
|   uint16_t fpsCurr = 200; | ||||
|   size_t diff = now - _lastShow; | ||||
|   size_t fpsCurr = 200; | ||||
|   if (diff > 0) fpsCurr = 1000 / diff; | ||||
|   _cumulativeFps = (3 * _cumulativeFps + fpsCurr) >> 2; | ||||
|   _cumulativeFps = (3 * _cumulativeFps + fpsCurr +2) >> 2;   // "+2" for proper rounding (2/4 = 0.5) | ||||
|   _lastShow = now; | ||||
| } | ||||
|  | ||||
| @@ -1287,7 +1274,7 @@ void WS2812FX::setMode(uint8_t segid, uint8_t m) { | ||||
|  | ||||
|   if (_segments[segid].mode != m) { | ||||
|     _segments[segid].startTransition(_transitionDur); // set effect transitions | ||||
|     //_segments[segid].markForReset(); | ||||
|     _segments[segid].markForReset(); | ||||
|     _segments[segid].mode = m; | ||||
|   } | ||||
| } | ||||
| @@ -1311,6 +1298,8 @@ void WS2812FX::setCCT(uint16_t k) { | ||||
|   } | ||||
| } | ||||
|  | ||||
| // direct=true either expects the caller to call show() themselves (realtime modes) or be ok waiting for the next frame for the change to apply | ||||
| // direct=false immediately triggers an effect redraw | ||||
| void WS2812FX::setBrightness(uint8_t b, bool direct) { | ||||
|   if (gammaCorrectBri) b = gamma8(b); | ||||
|   if (_brightness == b) return; | ||||
| @@ -1320,12 +1309,12 @@ void WS2812FX::setBrightness(uint8_t b, bool direct) { | ||||
|       seg.freeze = false; | ||||
|     } | ||||
|   } | ||||
|   if (direct) { | ||||
|     // would be dangerous if applied immediately (could exceed ABL), but will not output until the next show() | ||||
|     busses.setBrightness(b); | ||||
|   } else { | ||||
|   // setting brightness with NeoPixelBusLg has no effect on already painted pixels, | ||||
|   // so we need to force an update to existing buffer | ||||
|   busses.setBrightness(b); | ||||
|   if (!direct) { | ||||
|     unsigned long t = millis(); | ||||
|     if (_segments[0].next_time > t + 22 && t - _lastShow > MIN_SHOW_DELAY) show(); //apply brightness change immediately if no refresh soon | ||||
|     if (_segments[0].next_time > t + 22 && t - _lastShow > MIN_SHOW_DELAY) trigger(); //apply brightness change immediately if no refresh soon | ||||
|   } | ||||
| } | ||||
|  | ||||
| @@ -1432,9 +1421,32 @@ Segment& WS2812FX::getSegment(uint8_t id) { | ||||
|   return _segments[id >= _segments.size() ? getMainSegmentId() : id]; // vectors | ||||
| } | ||||
|  | ||||
| void WS2812FX::setSegment(uint8_t n, uint16_t i1, uint16_t i2, uint8_t grouping, uint8_t spacing, uint16_t offset, uint16_t startY, uint16_t stopY) { | ||||
|   if (n >= _segments.size()) return; | ||||
|   _segments[n].setUp(i1, i2, grouping, spacing, offset, startY, stopY); | ||||
| // sets new segment bounds, queues if that segment is currently running | ||||
| void WS2812FX::setSegment(uint8_t segId, uint16_t i1, uint16_t i2, uint8_t grouping, uint8_t spacing, uint16_t offset, uint16_t startY, uint16_t stopY) { | ||||
|   if (segId >= getSegmentsNum()) { | ||||
|     if (i2 <= i1) return; // do not append empty/inactive segments | ||||
|     appendSegment(Segment(0, strip.getLengthTotal())); | ||||
|     segId = getSegmentsNum()-1; // segments are added at the end of list | ||||
|   } | ||||
|  | ||||
|   if (_queuedChangesSegId == segId) _queuedChangesSegId = 255; // cancel queued change if already queued for this segment | ||||
|  | ||||
|   if (segId < getMaxSegments() && segId == getCurrSegmentId() && isServicing()) { // queue change to prevent concurrent access | ||||
|     // queuing a change for a second segment will lead to the loss of the first change if not yet applied | ||||
|     // however this is not a problem as the queued change is applied immediately after the effect function in that segment returns | ||||
|     _qStart  = i1; _qStop   = i2; _qStartY = startY; _qStopY  = stopY; | ||||
|     _qGrouping = grouping; _qSpacing  = spacing; _qOffset   = offset; | ||||
|     _queuedChangesSegId = segId; | ||||
|     return; // queued changes are applied immediately after effect function returns | ||||
|   } | ||||
|    | ||||
|   _segments[segId].setUp(i1, i2, grouping, spacing, offset, startY, stopY); | ||||
| } | ||||
|  | ||||
| void WS2812FX::setUpSegmentFromQueuedChanges() { | ||||
|   if (_queuedChangesSegId >= getSegmentsNum()) return; | ||||
|   getSegment(_queuedChangesSegId).setUp(_qStart, _qStop, _qGrouping, _qSpacing, _qOffset, _qStartY, _qStopY); | ||||
|   _queuedChangesSegId = 255; | ||||
| } | ||||
|  | ||||
| void WS2812FX::restartRuntime() { | ||||
| @@ -1590,7 +1602,7 @@ void WS2812FX::setRange(uint16_t i, uint16_t i2, uint32_t col) { | ||||
| } | ||||
|  | ||||
| void WS2812FX::setTransitionMode(bool t) { | ||||
|   for (segment &seg : _segments) if (!seg.transitional) seg.startTransition(t ? _transitionDur : 0); | ||||
|   for (segment &seg : _segments) seg.startTransition(t ? _transitionDur : 0); | ||||
| } | ||||
|  | ||||
| #ifdef WLED_DEBUG | ||||
| @@ -1602,7 +1614,7 @@ void WS2812FX::printSize() { | ||||
|   DEBUG_PRINTF("Data: %d*%d=%uB\n", sizeof(const char *), _modeData.size(), (_modeData.capacity()*sizeof(const char *))); | ||||
|   DEBUG_PRINTF("Map: %d*%d=%uB\n", sizeof(uint16_t), (int)customMappingSize, customMappingSize*sizeof(uint16_t)); | ||||
|   size = getLengthTotal(); | ||||
|   if (useLedsArray) DEBUG_PRINTF("Buffer: %d*%u=%uB\n", sizeof(CRGB), size, size*sizeof(CRGB)); | ||||
|   if (useGlobalLedBuffer) DEBUG_PRINTF("Buffer: %d*%u=%uB\n", sizeof(CRGB), size, size*sizeof(CRGB)); | ||||
| } | ||||
| #endif | ||||
|  | ||||
|   | ||||
| @@ -9,9 +9,9 @@ | ||||
| #include <IPAddress.h> | ||||
|  | ||||
| #define NODE_TYPE_ID_UNDEFINED        0 | ||||
| #define NODE_TYPE_ID_ESP8266         82 | ||||
| #define NODE_TYPE_ID_ESP32           32 | ||||
| #define NODE_TYPE_ID_ESP32S2         33 | ||||
| #define NODE_TYPE_ID_ESP8266         82 // should be 1 | ||||
| #define NODE_TYPE_ID_ESP32           32 // should be 2 | ||||
| #define NODE_TYPE_ID_ESP32S2         33 // etc | ||||
| #define NODE_TYPE_ID_ESP32S3         34 | ||||
| #define NODE_TYPE_ID_ESP32C3         35 | ||||
|  | ||||
| @@ -23,7 +23,13 @@ struct NodeStruct | ||||
|   String    nodeName; | ||||
|   IPAddress ip; | ||||
|   uint8_t   age; | ||||
|   uint8_t   nodeType; | ||||
|   union { | ||||
|     uint8_t nodeType;   // a waste of space as we only have 5 types | ||||
|     struct { | ||||
|       uint8_t type : 7; // still a waste of space (4 bits would be enough and future-proof) | ||||
|       bool    on   : 1; | ||||
|     }; | ||||
|   }; | ||||
|   uint32_t  build; | ||||
|  | ||||
|   NodeStruct() : age(0), nodeType(0), build(0) | ||||
|   | ||||
| @@ -91,96 +91,168 @@ uint32_t Bus::autoWhiteCalc(uint32_t c) { | ||||
|   return RGBW32(r, g, b, w); | ||||
| } | ||||
|  | ||||
| uint8_t *Bus::allocData(size_t size) { | ||||
|   if (_data) free(_data); // should not happen, but for safety | ||||
|   return _data = (uint8_t *)(size>0 ? calloc(size, sizeof(uint8_t)) : nullptr); | ||||
| } | ||||
|  | ||||
| BusDigital::BusDigital(BusConfig &bc, uint8_t nr, const ColorOrderMap &com) : Bus(bc.type, bc.start, bc.autoWhite), _colorOrderMap(com) { | ||||
|  | ||||
| BusDigital::BusDigital(BusConfig &bc, uint8_t nr, const ColorOrderMap &com) | ||||
| : Bus(bc.type, bc.start, bc.autoWhite, bc.count, bc.reversed, (bc.refreshReq || bc.type == TYPE_TM1814)) | ||||
| , _skip(bc.skipAmount) //sacrificial pixels | ||||
| , _colorOrder(bc.colorOrder) | ||||
| , _colorOrderMap(com) | ||||
| { | ||||
|   if (!IS_DIGITAL(bc.type) || !bc.count) return; | ||||
|   if (!pinManager.allocatePin(bc.pins[0], true, PinOwner::BusDigital)) return; | ||||
|   _frequencykHz = 0U; | ||||
|   _pins[0] = bc.pins[0]; | ||||
|   if (IS_2PIN(bc.type)) { | ||||
|     if (!pinManager.allocatePin(bc.pins[1], true, PinOwner::BusDigital)) { | ||||
|     cleanup(); return; | ||||
|       cleanup(); | ||||
|       return; | ||||
|     } | ||||
|     _pins[1] = bc.pins[1]; | ||||
|     _frequencykHz = bc.frequency ? bc.frequency : 2000U; // 2MHz clock if undefined | ||||
|   } | ||||
|   reversed = bc.reversed; | ||||
|   _needsRefresh = bc.refreshReq || bc.type == TYPE_TM1814; | ||||
|   _skip = bc.skipAmount;    //sacrificial pixels | ||||
|   _len = bc.count + _skip; | ||||
|   _iType = PolyBus::getI(bc.type, _pins, nr); | ||||
|   if (_iType == I_NONE) return; | ||||
|   uint16_t lenToCreate = _len; | ||||
|   if (bc.type == TYPE_WS2812_1CH_X3) lenToCreate = NUM_ICS_WS2812_1CH_3X(_len); // only needs a third of "RGB" LEDs for NeoPixelBus  | ||||
|   _busPtr = PolyBus::create(_iType, _pins, lenToCreate, nr, _frequencykHz); | ||||
|   if (bc.doubleBuffer && !allocData(bc.count * (Bus::hasWhite(_type) + 3*Bus::hasRGB(_type)))) return; //warning: hardcoded channel count | ||||
|   _buffering = bc.doubleBuffer; | ||||
|   uint16_t lenToCreate = bc.count; | ||||
|   if (bc.type == TYPE_WS2812_1CH_X3) lenToCreate = NUM_ICS_WS2812_1CH_3X(bc.count); // only needs a third of "RGB" LEDs for NeoPixelBus | ||||
|   _busPtr = PolyBus::create(_iType, _pins, lenToCreate + _skip, nr, _frequencykHz); | ||||
|   _valid = (_busPtr != nullptr); | ||||
|   _colorOrder = bc.colorOrder; | ||||
|   DEBUG_PRINTF("%successfully inited strip %u (len %u) with type %u and pins %u,%u (itype %u)\n", _valid?"S":"Uns", nr, _len, bc.type, _pins[0],_pins[1],_iType); | ||||
|   DEBUG_PRINTF("%successfully inited strip %u (len %u) with type %u and pins %u,%u (itype %u)\n", _valid?"S":"Uns", nr, bc.count, bc.type, _pins[0], _pins[1], _iType); | ||||
| } | ||||
|  | ||||
| void BusDigital::show() { | ||||
|   PolyBus::show(_busPtr, _iType); | ||||
|   if (!_valid) return; | ||||
|   if (_buffering) { // should be _data != nullptr, but that causes ~20% FPS drop | ||||
|     size_t channels = Bus::hasWhite(_type) + 3*Bus::hasRGB(_type); | ||||
|     for (size_t i=0; i<_len; i++) { | ||||
|       size_t offset = i*channels; | ||||
|       uint8_t co = _colorOrderMap.getPixelColorOrder(i+_start, _colorOrder); | ||||
|       uint32_t c; | ||||
|       if (_type == TYPE_WS2812_1CH_X3) { // map to correct IC, each controls 3 LEDs (_len is always a multiple of 3) | ||||
|         switch (i%3) { | ||||
|           case 0: c = RGBW32(_data[offset]  , _data[offset+1], _data[offset+2], 0); break; | ||||
|           case 1: c = RGBW32(_data[offset-1], _data[offset]  , _data[offset+1], 0); break; | ||||
|           case 2: c = RGBW32(_data[offset-2], _data[offset-1], _data[offset]  , 0); break; | ||||
|         } | ||||
|       } else { | ||||
|         c = RGBW32(_data[offset],_data[offset+1],_data[offset+2],(Bus::hasWhite(_type)?_data[offset+3]:0)); | ||||
|       } | ||||
|       uint16_t pix = i; | ||||
|       if (_reversed) pix  = _len - pix -1; | ||||
|       else           pix += _skip; | ||||
|       PolyBus::setPixelColor(_busPtr, _iType, pix, c, co); | ||||
|     } | ||||
|   } | ||||
|   PolyBus::show(_busPtr, _iType, !_buffering); // faster if buffer consistency is not important | ||||
| } | ||||
|  | ||||
| bool BusDigital::canShow() { | ||||
|   if (!_valid) return true; | ||||
|   return PolyBus::canShow(_busPtr, _iType); | ||||
| } | ||||
|  | ||||
| void BusDigital::setBrightness(uint8_t b) { | ||||
|   if (_bri == b) return; | ||||
|   //Fix for turning off onboard LED breaking bus | ||||
|   #ifdef LED_BUILTIN | ||||
|   if (_bri == 0 && b > 0) { | ||||
|     if (_pins[0] == LED_BUILTIN || _pins[1] == LED_BUILTIN) PolyBus::begin(_busPtr, _iType, _pins); | ||||
|   if (_bri == 0) { // && b > 0, covered by guard if above | ||||
|     if (_pins[0] == LED_BUILTIN || _pins[1] == LED_BUILTIN) reinit(); | ||||
|   } | ||||
|   #endif | ||||
|   uint8_t prevBri = _bri; | ||||
|   Bus::setBrightness(b); | ||||
|   PolyBus::setBrightness(_busPtr, _iType, b); | ||||
|  | ||||
|   if (_buffering) return; | ||||
|  | ||||
|   // must update/repaint every LED in the NeoPixelBus buffer to the new brightness | ||||
|   // the only case where repainting is unnecessary is when all pixels are set after the brightness change but before the next show | ||||
|   // (which we can't rely on) | ||||
|   uint16_t hwLen = _len; | ||||
|   if (_type == TYPE_WS2812_1CH_X3) hwLen = NUM_ICS_WS2812_1CH_3X(_len); // only needs a third of "RGB" LEDs for NeoPixelBus | ||||
|   for (uint_fast16_t i = 0; i < hwLen; i++) { | ||||
|     // use 0 as color order, actual order does not matter here as we just update the channel values as-is | ||||
|     uint32_t c = restoreColorLossy(PolyBus::getPixelColor(_busPtr, _iType, i, 0),prevBri); | ||||
|     PolyBus::setPixelColor(_busPtr, _iType, i, c, 0); | ||||
|   } | ||||
| } | ||||
|  | ||||
| //If LEDs are skipped, it is possible to use the first as a status LED. | ||||
| //TODO only show if no new show due in the next 50ms | ||||
| void BusDigital::setStatusPixel(uint32_t c) { | ||||
|   if (_skip && canShow()) { | ||||
|   if (_valid && _skip) { | ||||
|     PolyBus::setPixelColor(_busPtr, _iType, 0, c, _colorOrderMap.getPixelColorOrder(_start, _colorOrder)); | ||||
|     PolyBus::show(_busPtr, _iType); | ||||
|     if (canShow()) PolyBus::show(_busPtr, _iType); | ||||
|   } | ||||
| } | ||||
|  | ||||
| void IRAM_ATTR BusDigital::setPixelColor(uint16_t pix, uint32_t c) { | ||||
|   if (_type == TYPE_SK6812_RGBW || _type == TYPE_TM1814 || _type == TYPE_WS2812_1CH_X3) c = autoWhiteCalc(c); | ||||
|   if (!_valid) return; | ||||
|   if (Bus::hasWhite(_type)) c = autoWhiteCalc(c); | ||||
|   if (_cct >= 1900) c = colorBalanceFromKelvin(_cct, c); //color correction from CCT | ||||
|   if (reversed) pix = _len - pix -1; | ||||
|   else pix += _skip; | ||||
|   uint8_t co = _colorOrderMap.getPixelColorOrder(pix+_start, _colorOrder); | ||||
|   if (_type == TYPE_WS2812_1CH_X3) { // map to correct IC, each controls 3 LEDs | ||||
|     uint16_t pOld = pix; | ||||
|     pix = IC_INDEX_WS2812_1CH_3X(pix); | ||||
|     uint32_t cOld = PolyBus::getPixelColor(_busPtr, _iType, pix, co); | ||||
|     switch (pOld % 3) { // change only the single channel (TODO: this can cause loss because of get/set) | ||||
|       case 0: c = RGBW32(R(cOld), W(c)   , B(cOld), 0); break; | ||||
|       case 1: c = RGBW32(W(c)   , G(cOld), B(cOld), 0); break; | ||||
|       case 2: c = RGBW32(R(cOld), G(cOld), W(c)   , 0); break; | ||||
|   if (_buffering) { // should be _data != nullptr, but that causes ~20% FPS drop | ||||
|     size_t channels = Bus::hasWhite(_type) + 3*Bus::hasRGB(_type); | ||||
|     size_t offset = pix*channels; | ||||
|     if (Bus::hasRGB(_type)) { | ||||
|       _data[offset++] = R(c); | ||||
|       _data[offset++] = G(c); | ||||
|       _data[offset++] = B(c); | ||||
|     } | ||||
|     if (Bus::hasWhite(_type)) _data[offset] = W(c); | ||||
|   } else { | ||||
|     if (_reversed) pix  = _len - pix -1; | ||||
|     else           pix += _skip; | ||||
|     uint8_t co = _colorOrderMap.getPixelColorOrder(pix+_start, _colorOrder); | ||||
|     if (_type == TYPE_WS2812_1CH_X3) { // map to correct IC, each controls 3 LEDs | ||||
|       uint16_t pOld = pix; | ||||
|       pix = IC_INDEX_WS2812_1CH_3X(pix); | ||||
|       uint32_t cOld = restoreColorLossy(PolyBus::getPixelColor(_busPtr, _iType, pix, co),_bri); | ||||
|       switch (pOld % 3) { // change only the single channel (TODO: this can cause loss because of get/set) | ||||
|         case 0: c = RGBW32(R(cOld), W(c)   , B(cOld), 0); break; | ||||
|         case 1: c = RGBW32(W(c)   , G(cOld), B(cOld), 0); break; | ||||
|         case 2: c = RGBW32(R(cOld), G(cOld), W(c)   , 0); break; | ||||
|       } | ||||
|     } | ||||
|     PolyBus::setPixelColor(_busPtr, _iType, pix, c, co); | ||||
|   } | ||||
|   PolyBus::setPixelColor(_busPtr, _iType, pix, c, co); | ||||
| } | ||||
|  | ||||
| // returns original color if global buffering is enabled, else returns lossly restored color from bus | ||||
| uint32_t BusDigital::getPixelColor(uint16_t pix) { | ||||
|   if (reversed) pix = _len - pix -1; | ||||
|   else pix += _skip; | ||||
|   uint8_t co = _colorOrderMap.getPixelColorOrder(pix+_start, _colorOrder); | ||||
|   if (_type == TYPE_WS2812_1CH_X3) { // map to correct IC, each controls 3 LEDs | ||||
|     uint16_t pOld = pix; | ||||
|     pix = IC_INDEX_WS2812_1CH_3X(pix); | ||||
|     uint32_t c = PolyBus::getPixelColor(_busPtr, _iType, pix, co); | ||||
|     switch (pOld % 3) { // get only the single channel | ||||
|       case 0: c = RGBW32(G(c), G(c), G(c), G(c)); break; | ||||
|       case 1: c = RGBW32(R(c), R(c), R(c), R(c)); break; | ||||
|       case 2: c = RGBW32(B(c), B(c), B(c), B(c)); break; | ||||
|   if (!_valid) return 0; | ||||
|   if (_buffering) { // should be _data != nullptr, but that causes ~20% FPS drop | ||||
|     size_t channels = Bus::hasWhite(_type) + 3*Bus::hasRGB(_type); | ||||
|     size_t offset = pix*channels; | ||||
|     uint32_t c; | ||||
|     if (!Bus::hasRGB(_type)) { | ||||
|       c = RGBW32(_data[offset], _data[offset], _data[offset], _data[offset]); | ||||
|     } else { | ||||
|       c = RGBW32(_data[offset], _data[offset+1], _data[offset+2], Bus::hasWhite(_type) ? _data[offset+3] : 0); | ||||
|     } | ||||
|     return c; | ||||
|   } else { | ||||
|     if (_reversed) pix  = _len - pix -1; | ||||
|     else           pix += _skip; | ||||
|     uint8_t co = _colorOrderMap.getPixelColorOrder(pix+_start, _colorOrder); | ||||
|     uint32_t c = restoreColorLossy(PolyBus::getPixelColor(_busPtr, _iType, (_type==TYPE_WS2812_1CH_X3) ? IC_INDEX_WS2812_1CH_3X(pix) : pix, co),_bri); | ||||
|     if (_type == TYPE_WS2812_1CH_X3) { // map to correct IC, each controls 3 LEDs | ||||
|       uint8_t r = R(c); | ||||
|       uint8_t g = _reversed ? B(c) : G(c); // should G and B be switched if _reversed? | ||||
|       uint8_t b = _reversed ? G(c) : B(c); | ||||
|       switch (pix % 3) { // get only the single channel | ||||
|         case 0: c = RGBW32(g, g, g, g); break; | ||||
|         case 1: c = RGBW32(r, r, r, r); break; | ||||
|         case 2: c = RGBW32(b, b, b, b); break; | ||||
|       } | ||||
|     } | ||||
|     return c; | ||||
|   } | ||||
|   return PolyBus::getPixelColor(_busPtr, _iType, pix, co); | ||||
| } | ||||
|  | ||||
| uint8_t BusDigital::getPins(uint8_t* pinArray) { | ||||
| @@ -196,6 +268,7 @@ void BusDigital::setColorOrder(uint8_t colorOrder) { | ||||
| } | ||||
|  | ||||
| void BusDigital::reinit() { | ||||
|   if (!_valid) return; | ||||
|   PolyBus::begin(_busPtr, _iType, _pins); | ||||
| } | ||||
|  | ||||
| @@ -205,13 +278,15 @@ void BusDigital::cleanup() { | ||||
|   _iType = I_NONE; | ||||
|   _valid = false; | ||||
|   _busPtr = nullptr; | ||||
|   if (_data != nullptr) freeData(); | ||||
|   pinManager.deallocatePin(_pins[1], PinOwner::BusDigital); | ||||
|   pinManager.deallocatePin(_pins[0], PinOwner::BusDigital); | ||||
| } | ||||
|  | ||||
|  | ||||
| BusPwm::BusPwm(BusConfig &bc) : Bus(bc.type, bc.start, bc.autoWhite) { | ||||
|   _valid = false; | ||||
| BusPwm::BusPwm(BusConfig &bc) | ||||
| : Bus(bc.type, bc.start, bc.autoWhite, 1, bc.reversed) | ||||
| { | ||||
|   if (!IS_PWM(bc.type)) return; | ||||
|   uint8_t numPins = NUM_PWM_PINS(bc.type); | ||||
|   _frequency = bc.frequency ? bc.frequency : WLED_PWM_FREQ; | ||||
| @@ -229,7 +304,7 @@ BusPwm::BusPwm(BusConfig &bc) : Bus(bc.type, bc.start, bc.autoWhite) { | ||||
|   for (uint8_t i = 0; i < numPins; i++) { | ||||
|     uint8_t currentPin = bc.pins[i]; | ||||
|     if (!pinManager.allocatePin(currentPin, true, PinOwner::BusPwm)) { | ||||
|     deallocatePins(); return; | ||||
|       deallocatePins(); return; | ||||
|     } | ||||
|     _pins[i] = currentPin; //store only after allocatePin() succeeds | ||||
|     #ifdef ESP8266 | ||||
| @@ -239,7 +314,7 @@ BusPwm::BusPwm(BusConfig &bc) : Bus(bc.type, bc.start, bc.autoWhite) { | ||||
|     ledcAttachPin(_pins[i], _ledcStart + i); | ||||
|     #endif | ||||
|   } | ||||
|   reversed = bc.reversed; | ||||
|   _data = _pwmdata; // avoid malloc() and use stack | ||||
|   _valid = true; | ||||
| } | ||||
|  | ||||
| @@ -307,7 +382,7 @@ void BusPwm::show() { | ||||
|   uint8_t numPins = NUM_PWM_PINS(_type); | ||||
|   for (uint8_t i = 0; i < numPins; i++) { | ||||
|     uint8_t scaled = (_data[i] * _bri) / 255; | ||||
|     if (reversed) scaled = 255 - scaled; | ||||
|     if (_reversed) scaled = 255 - scaled; | ||||
|     #ifdef ESP8266 | ||||
|     analogWrite(_pins[i], scaled); | ||||
|     #else | ||||
| @@ -342,8 +417,10 @@ void BusPwm::deallocatePins() { | ||||
| } | ||||
|  | ||||
|  | ||||
| BusOnOff::BusOnOff(BusConfig &bc) : Bus(bc.type, bc.start, bc.autoWhite) { | ||||
|   _valid = false; | ||||
| BusOnOff::BusOnOff(BusConfig &bc) | ||||
| : Bus(bc.type, bc.start, bc.autoWhite, 1, bc.reversed) | ||||
| , _onoffdata(0) | ||||
| { | ||||
|   if (bc.type != TYPE_ONOFF) return; | ||||
|  | ||||
|   uint8_t currentPin = bc.pins[0]; | ||||
| @@ -352,7 +429,7 @@ BusOnOff::BusOnOff(BusConfig &bc) : Bus(bc.type, bc.start, bc.autoWhite) { | ||||
|   } | ||||
|   _pin = currentPin; //store only after allocatePin() succeeds | ||||
|   pinMode(_pin, OUTPUT); | ||||
|   reversed = bc.reversed; | ||||
|   _data = &_onoffdata; // avoid malloc() and use stack | ||||
|   _valid = true; | ||||
| } | ||||
|  | ||||
| @@ -363,18 +440,17 @@ void BusOnOff::setPixelColor(uint16_t pix, uint32_t c) { | ||||
|   uint8_t g = G(c); | ||||
|   uint8_t b = B(c); | ||||
|   uint8_t w = W(c); | ||||
|  | ||||
|   _data = bool(r|g|b|w) && bool(_bri) ? 0xFF : 0; | ||||
|   _data[0] = bool(r|g|b|w) && bool(_bri) ? 0xFF : 0; | ||||
| } | ||||
|  | ||||
| uint32_t BusOnOff::getPixelColor(uint16_t pix) { | ||||
|   if (!_valid) return 0; | ||||
|   return RGBW32(_data, _data, _data, _data); | ||||
|   return RGBW32(_data[0], _data[0], _data[0], _data[0]); | ||||
| } | ||||
|  | ||||
| void BusOnOff::show() { | ||||
|   if (!_valid) return; | ||||
|   digitalWrite(_pin, reversed ? !(bool)_data : (bool)_data); | ||||
|   digitalWrite(_pin, _reversed ? !(bool)_data[0] : (bool)_data[0]); | ||||
| } | ||||
|  | ||||
| uint8_t BusOnOff::getPins(uint8_t* pinArray) { | ||||
| @@ -384,8 +460,10 @@ uint8_t BusOnOff::getPins(uint8_t* pinArray) { | ||||
| } | ||||
|  | ||||
|  | ||||
| BusNetwork::BusNetwork(BusConfig &bc) : Bus(bc.type, bc.start, bc.autoWhite) { | ||||
|   _valid = false; | ||||
| BusNetwork::BusNetwork(BusConfig &bc) | ||||
| : Bus(bc.type, bc.start, bc.autoWhite, bc.count) | ||||
| , _broadcastLock(false) | ||||
| { | ||||
|   switch (bc.type) { | ||||
|     case TYPE_NET_ARTNET_RGB: | ||||
|       _rgbw = false; | ||||
| @@ -401,18 +479,13 @@ BusNetwork::BusNetwork(BusConfig &bc) : Bus(bc.type, bc.start, bc.autoWhite) { | ||||
|       break; | ||||
|   } | ||||
|   _UDPchannels = _rgbw ? 4 : 3; | ||||
|   _data = (byte *)malloc(bc.count * _UDPchannels); | ||||
|   if (_data == nullptr) return; | ||||
|   memset(_data, 0, bc.count * _UDPchannels); | ||||
|   _len = bc.count; | ||||
|   _client = IPAddress(bc.pins[0],bc.pins[1],bc.pins[2],bc.pins[3]); | ||||
|   _broadcastLock = false; | ||||
|   _valid = true; | ||||
|   _valid = (allocData(_len * _UDPchannels) != nullptr); | ||||
| } | ||||
|  | ||||
| void BusNetwork::setPixelColor(uint16_t pix, uint32_t c) { | ||||
|   if (!_valid || pix >= _len) return; | ||||
|   if (hasWhite()) c = autoWhiteCalc(c); | ||||
|   if (_rgbw) c = autoWhiteCalc(c); | ||||
|   if (_cct >= 1900) c = colorBalanceFromKelvin(_cct, c); //color correction from CCT | ||||
|   uint16_t offset = pix * _UDPchannels; | ||||
|   _data[offset]   = R(c); | ||||
| @@ -424,7 +497,7 @@ void BusNetwork::setPixelColor(uint16_t pix, uint32_t c) { | ||||
| uint32_t BusNetwork::getPixelColor(uint16_t pix) { | ||||
|   if (!_valid || pix >= _len) return 0; | ||||
|   uint16_t offset = pix * _UDPchannels; | ||||
|   return RGBW32(_data[offset], _data[offset+1], _data[offset+2], _rgbw ? (_data[offset+3] << 24) : 0); | ||||
|   return RGBW32(_data[offset], _data[offset+1], _data[offset+2], (_rgbw ? _data[offset+3] : 0)); | ||||
| } | ||||
|  | ||||
| void BusNetwork::show() { | ||||
| @@ -444,8 +517,7 @@ uint8_t BusNetwork::getPins(uint8_t* pinArray) { | ||||
| void BusNetwork::cleanup() { | ||||
|   _type = I_NONE; | ||||
|   _valid = false; | ||||
|   if (_data != nullptr) free(_data); | ||||
|   _data = nullptr; | ||||
|   freeData(); | ||||
| } | ||||
|  | ||||
|  | ||||
| @@ -506,7 +578,7 @@ void BusManager::setStatusPixel(uint32_t c) { | ||||
|   } | ||||
| } | ||||
|  | ||||
| void IRAM_ATTR BusManager::setPixelColor(uint16_t pix, uint32_t c, int16_t cct) { | ||||
| void IRAM_ATTR BusManager::setPixelColor(uint16_t pix, uint32_t c) { | ||||
|   for (uint8_t i = 0; i < numBusses; i++) { | ||||
|     Bus* b = busses[i]; | ||||
|     uint16_t bstart = b->getStart(); | ||||
|   | ||||
| @@ -18,6 +18,10 @@ | ||||
| #define IC_INDEX_WS2812_2CH_3X(i)  ((i)*2/3) | ||||
| #define WS2812_2CH_3X_SPANS_2_ICS(i) ((i)&0x01)    // every other LED zone is on two different ICs | ||||
|  | ||||
| // flag for using double buffering in BusDigital | ||||
| extern bool useGlobalLedBuffer; | ||||
|  | ||||
|  | ||||
| //temporary struct for passing bus configuration to bus | ||||
| struct BusConfig { | ||||
|   uint8_t type; | ||||
| @@ -30,15 +34,25 @@ struct BusConfig { | ||||
|   uint8_t autoWhite; | ||||
|   uint8_t pins[5] = {LEDPIN, 255, 255, 255, 255}; | ||||
|   uint16_t frequency; | ||||
|   BusConfig(uint8_t busType, uint8_t* ppins, uint16_t pstart, uint16_t len = 1, uint8_t pcolorOrder = COL_ORDER_GRB, bool rev = false, uint8_t skip = 0, byte aw=RGBW_MODE_MANUAL_ONLY, uint16_t clock_kHz=0U) { | ||||
|   bool doubleBuffer; | ||||
|  | ||||
|   BusConfig(uint8_t busType, uint8_t* ppins, uint16_t pstart, uint16_t len = 1, uint8_t pcolorOrder = COL_ORDER_GRB, bool rev = false, uint8_t skip = 0, byte aw=RGBW_MODE_MANUAL_ONLY, uint16_t clock_kHz=0U, bool dblBfr=false) | ||||
|   : count(len) | ||||
|   , start(pstart) | ||||
|   , colorOrder(pcolorOrder) | ||||
|   , reversed(rev) | ||||
|   , skipAmount(skip) | ||||
|   , autoWhite(aw) | ||||
|   , frequency(clock_kHz) | ||||
|   , doubleBuffer(dblBfr) | ||||
|   { | ||||
|     refreshReq = (bool) GET_BIT(busType,7); | ||||
|     type = busType & 0x7F;  // bit 7 may be/is hacked to include refresh info (1=refresh in off state, 0=no refresh) | ||||
|     count = len; start = pstart; colorOrder = pcolorOrder; reversed = rev; skipAmount = skip; autoWhite = aw; frequency = clock_kHz; | ||||
|     uint8_t nPins = 1; | ||||
|     size_t nPins = 1; | ||||
|     if (type >= TYPE_NET_DDP_RGB && type < 96) nPins = 4; //virtual network bus. 4 "pins" store IP address | ||||
|     else if (type > 47) nPins = 2; | ||||
|     else if (type > 40 && type < 46) nPins = NUM_PWM_PINS(type); | ||||
|     for (uint8_t i = 0; i < nPins; i++) pins[i] = ppins[i]; | ||||
|     for (size_t i = 0; i < nPins; i++) pins[i] = ppins[i]; | ||||
|   } | ||||
|  | ||||
|   //validates start and length and extends total if needed | ||||
| @@ -54,6 +68,7 @@ struct BusConfig { | ||||
|   } | ||||
| }; | ||||
|  | ||||
|  | ||||
| // Defines an LED Strip and its color ordering. | ||||
| struct ColorOrderMapEntry { | ||||
|   uint16_t start; | ||||
| @@ -64,9 +79,7 @@ struct ColorOrderMapEntry { | ||||
| struct ColorOrderMap { | ||||
|     void add(uint16_t start, uint16_t len, uint8_t colorOrder); | ||||
|  | ||||
|     uint8_t count() const { | ||||
|       return _count; | ||||
|     } | ||||
|     uint8_t count() const { return _count; } | ||||
|  | ||||
|     void reset() { | ||||
|       _count = 0; | ||||
| @@ -87,56 +100,63 @@ struct ColorOrderMap { | ||||
|     ColorOrderMapEntry _mappings[WLED_MAX_COLOR_ORDER_MAPPINGS]; | ||||
| }; | ||||
|  | ||||
|  | ||||
| //parent class of BusDigital, BusPwm, and BusNetwork | ||||
| class Bus { | ||||
|   public: | ||||
|     Bus(uint8_t type, uint16_t start, uint8_t aw) | ||||
|     : _bri(255) | ||||
|     , _len(1) | ||||
|     Bus(uint8_t type, uint16_t start, uint8_t aw, uint16_t len = 1, bool reversed = false, bool refresh = false) | ||||
|     : _type(type) | ||||
|     , _bri(255) | ||||
|     , _start(start) | ||||
|     , _len(len) | ||||
|     , _reversed(reversed) | ||||
|     , _valid(false) | ||||
|     , _needsRefresh(false) | ||||
|     , _needsRefresh(refresh) | ||||
|     , _data(nullptr) // keep data access consistent across all types of buses | ||||
|     { | ||||
|       _type = type; | ||||
|       _start = start; | ||||
|       _autoWhiteMode = Bus::hasWhite(_type) ? aw : RGBW_MODE_MANUAL_ONLY; | ||||
|     }; | ||||
|  | ||||
|     virtual ~Bus() {} //throw the bus under the bus | ||||
|  | ||||
|     virtual void     show() = 0; | ||||
|     virtual bool     canShow() { return true; } | ||||
|     virtual void     setStatusPixel(uint32_t c) {} | ||||
|     virtual bool     canShow()                   { return true; } | ||||
|     virtual void     setStatusPixel(uint32_t c)  {} | ||||
|     virtual void     setPixelColor(uint16_t pix, uint32_t c) = 0; | ||||
|     virtual uint32_t getPixelColor(uint16_t pix) { return 0; } | ||||
|     virtual void     setBrightness(uint8_t b) { _bri = b; }; | ||||
|     virtual void     setBrightness(uint8_t b)    { _bri = b; }; | ||||
|     virtual void     cleanup() = 0; | ||||
|     virtual uint8_t  getPins(uint8_t* pinArray) { return 0; } | ||||
|     virtual uint16_t getLength() { return _len; } | ||||
|     virtual void     setColorOrder() {} | ||||
|     virtual uint8_t  getColorOrder() { return COL_ORDER_RGB; } | ||||
|     virtual uint8_t  skippedLeds() { return 0; } | ||||
|     virtual uint16_t getFrequency() { return 0U; } | ||||
|     inline  uint16_t getStart() { return _start; } | ||||
|     inline  void     setStart(uint16_t start) { _start = start; } | ||||
|     inline  uint8_t  getType() { return _type; } | ||||
|     inline  bool     isOk() { return _valid; } | ||||
|     inline  bool     isOffRefreshRequired() { return _needsRefresh; } | ||||
|     virtual uint8_t  getPins(uint8_t* pinArray)  { return 0; } | ||||
|     virtual uint16_t getLength()                 { return _len; } | ||||
|     virtual void     setColorOrder()             {} | ||||
|     virtual uint8_t  getColorOrder()             { return COL_ORDER_RGB; } | ||||
|     virtual uint8_t  skippedLeds()               { return 0; } | ||||
|     virtual uint16_t getFrequency()              { return 0U; } | ||||
|     inline  void     setReversed(bool reversed)  { _reversed = reversed; } | ||||
|     inline  uint16_t getStart()                  { return _start; } | ||||
|     inline  void     setStart(uint16_t start)    { _start = start; } | ||||
|     inline  uint8_t  getType()                   { return _type; } | ||||
|     inline  bool     isOk()                      { return _valid; } | ||||
|     inline  bool     isReversed()                { return _reversed; } | ||||
|     inline  bool     isOffRefreshRequired()      { return _needsRefresh; } | ||||
|             bool     containsPixel(uint16_t pix) { return pix >= _start && pix < _start+_len; } | ||||
|  | ||||
|     virtual bool hasRGB() { | ||||
|       if ((_type >= TYPE_WS2812_1CH && _type <= TYPE_WS2812_WWA) || _type == TYPE_ANALOG_1CH || _type == TYPE_ANALOG_2CH || _type == TYPE_ONOFF) return false; | ||||
|     virtual bool hasRGB(void) { return Bus::hasRGB(_type); } | ||||
|     static  bool hasRGB(uint8_t type) { | ||||
|       if ((type >= TYPE_WS2812_1CH && type <= TYPE_WS2812_WWA) || type == TYPE_ANALOG_1CH || type == TYPE_ANALOG_2CH || type == TYPE_ONOFF) return false; | ||||
|       return true; | ||||
|     } | ||||
|     virtual bool hasWhite() { return Bus::hasWhite(_type); } | ||||
|     virtual bool hasWhite(void) { return Bus::hasWhite(_type); } | ||||
|     static  bool hasWhite(uint8_t type) { | ||||
|       if ((type >= TYPE_WS2812_1CH && type <= TYPE_WS2812_WWA) || type == TYPE_SK6812_RGBW || type == TYPE_TM1814) return true; // digital types with white channel | ||||
|       if (type > TYPE_ONOFF && type <= TYPE_ANALOG_5CH && type != TYPE_ANALOG_3CH) return true; // analog types with white channel | ||||
|       if (type == TYPE_NET_DDP_RGBW) return true; // network types with white channel | ||||
|       return false; | ||||
|     } | ||||
|     virtual bool hasCCT() { | ||||
|       if (_type == TYPE_WS2812_2CH_X3 || _type == TYPE_WS2812_WWA || | ||||
|           _type == TYPE_ANALOG_2CH    || _type == TYPE_ANALOG_5CH) return true; | ||||
|     virtual bool hasCCT(void) { return Bus::hasCCT(_type); } | ||||
|     static  bool hasCCT(uint8_t type) { | ||||
|       if (type == TYPE_WS2812_2CH_X3 || type == TYPE_WS2812_WWA || | ||||
|           type == TYPE_ANALOG_2CH    || type == TYPE_ANALOG_5CH) return true; | ||||
|       return false; | ||||
|     } | ||||
|     static void setCCT(uint16_t cct) { | ||||
| @@ -155,107 +175,87 @@ class Bus { | ||||
|     inline static void    setGlobalAWMode(uint8_t m)  { if (m < 5) _gAWM = m; else _gAWM = AW_GLOBAL_DISABLED; } | ||||
|     inline static uint8_t getGlobalAWMode()           { return _gAWM; } | ||||
|  | ||||
|     bool reversed = false; | ||||
|  | ||||
|   protected: | ||||
|     uint8_t  _type; | ||||
|     uint8_t  _bri; | ||||
|     uint16_t _start; | ||||
|     uint16_t _len; | ||||
|     bool     _reversed; | ||||
|     bool     _valid; | ||||
|     bool     _needsRefresh; | ||||
|     uint8_t  _autoWhiteMode; | ||||
|     uint8_t  *_data; | ||||
|     static uint8_t _gAWM; | ||||
|     static int16_t _cct; | ||||
|     static uint8_t _cctBlend; | ||||
|  | ||||
|     uint32_t autoWhiteCalc(uint32_t c); | ||||
|     uint8_t *allocData(size_t size = 1); | ||||
|     void     freeData() { if (_data != nullptr) free(_data); _data = nullptr; } | ||||
| }; | ||||
|  | ||||
|  | ||||
| class BusDigital : public Bus { | ||||
|   public: | ||||
|     BusDigital(BusConfig &bc, uint8_t nr, const ColorOrderMap &com); | ||||
|     ~BusDigital() { cleanup(); } | ||||
|  | ||||
|     inline void show(); | ||||
|  | ||||
|     void show(); | ||||
|     bool canShow(); | ||||
|  | ||||
|     void setBrightness(uint8_t b); | ||||
|  | ||||
|     void setStatusPixel(uint32_t c); | ||||
|  | ||||
|     void setPixelColor(uint16_t pix, uint32_t c); | ||||
|  | ||||
|     uint32_t getPixelColor(uint16_t pix); | ||||
|  | ||||
|     uint8_t getColorOrder() { | ||||
|       return _colorOrder; | ||||
|     } | ||||
|  | ||||
|     uint16_t getLength() { | ||||
|       return _len - _skip; | ||||
|     } | ||||
|  | ||||
|     uint8_t getPins(uint8_t* pinArray); | ||||
|  | ||||
|     void setColorOrder(uint8_t colorOrder); | ||||
|  | ||||
|     uint8_t skippedLeds() { | ||||
|       return _skip; | ||||
|     } | ||||
|  | ||||
|     uint16_t getFrequency() { return _frequencykHz; } | ||||
|  | ||||
|     uint32_t getPixelColor(uint16_t pix); | ||||
|     uint8_t  getColorOrder() { return _colorOrder; } | ||||
|     uint8_t  getPins(uint8_t* pinArray); | ||||
|     uint8_t  skippedLeds()   { return _skip; } | ||||
|     uint16_t getFrequency()  { return _frequencykHz; } | ||||
|     void reinit(); | ||||
|  | ||||
|     void cleanup(); | ||||
|  | ||||
|     ~BusDigital() { | ||||
|       cleanup(); | ||||
|     } | ||||
|  | ||||
|   private: | ||||
|     uint8_t _colorOrder = COL_ORDER_GRB; | ||||
|     uint8_t _pins[2] = {255, 255}; | ||||
|     uint8_t _iType = 0; //I_NONE; | ||||
|     uint8_t _skip = 0; | ||||
|     uint16_t _frequencykHz = 0U; | ||||
|     void * _busPtr = nullptr; | ||||
|     uint8_t _skip; | ||||
|     uint8_t _colorOrder; | ||||
|     uint8_t _pins[2]; | ||||
|     uint8_t _iType; | ||||
|     uint16_t _frequencykHz; | ||||
|     void * _busPtr; | ||||
|     const ColorOrderMap &_colorOrderMap; | ||||
|     bool _buffering; // temporary until we figure out why comparison "_data != nullptr" causes severe FPS drop | ||||
|  | ||||
|     inline uint32_t restoreColorLossy(uint32_t c, uint8_t restoreBri) { | ||||
|       if (restoreBri < 255) { | ||||
|         uint8_t* chan = (uint8_t*) &c; | ||||
|         for (uint_fast8_t i=0; i<4; i++) { | ||||
|           uint_fast16_t val = chan[i]; | ||||
|           chan[i] = ((val << 8) + restoreBri) / (restoreBri + 1); //adding _bri slighly improves recovery / stops degradation on re-scale | ||||
|         } | ||||
|       } | ||||
|       return c; | ||||
|     } | ||||
| }; | ||||
|  | ||||
|  | ||||
| class BusPwm : public Bus { | ||||
|   public: | ||||
|     BusPwm(BusConfig &bc); | ||||
|     ~BusPwm() { cleanup(); } | ||||
|  | ||||
|     void setPixelColor(uint16_t pix, uint32_t c); | ||||
|  | ||||
|     //does no index check | ||||
|     uint32_t getPixelColor(uint16_t pix); | ||||
|  | ||||
|     void show(); | ||||
|  | ||||
|     uint8_t getPins(uint8_t* pinArray); | ||||
|  | ||||
|     uint32_t getPixelColor(uint16_t pix); //does no index check | ||||
|     uint8_t  getPins(uint8_t* pinArray); | ||||
|     uint16_t getFrequency() { return _frequency; } | ||||
|  | ||||
|     void cleanup() { | ||||
|       deallocatePins(); | ||||
|     } | ||||
|  | ||||
|     ~BusPwm() { | ||||
|       cleanup(); | ||||
|     } | ||||
|     void show(); | ||||
|     void cleanup() { deallocatePins(); } | ||||
|  | ||||
|   private: | ||||
|     uint8_t _pins[5] = {255, 255, 255, 255, 255}; | ||||
|     uint8_t _data[5] = {0}; | ||||
|     uint8_t _pins[5]; | ||||
|     uint8_t _pwmdata[5]; | ||||
|     #ifdef ARDUINO_ARCH_ESP32 | ||||
|     uint8_t _ledcStart = 255; | ||||
|     uint8_t _ledcStart; | ||||
|     #endif | ||||
|     uint16_t _frequency = 0U; | ||||
|     uint16_t _frequency; | ||||
|  | ||||
|     void deallocatePins(); | ||||
| }; | ||||
| @@ -264,72 +264,46 @@ class BusPwm : public Bus { | ||||
| class BusOnOff : public Bus { | ||||
|   public: | ||||
|     BusOnOff(BusConfig &bc); | ||||
|     ~BusOnOff() { cleanup(); } | ||||
|  | ||||
|     void setPixelColor(uint16_t pix, uint32_t c); | ||||
|  | ||||
|     uint32_t getPixelColor(uint16_t pix); | ||||
|  | ||||
|     uint8_t  getPins(uint8_t* pinArray); | ||||
|     void show(); | ||||
|  | ||||
|     uint8_t getPins(uint8_t* pinArray); | ||||
|  | ||||
|     void cleanup() { | ||||
|       pinManager.deallocatePin(_pin, PinOwner::BusOnOff); | ||||
|     } | ||||
|  | ||||
|     ~BusOnOff() { | ||||
|       cleanup(); | ||||
|     } | ||||
|     void cleanup() { pinManager.deallocatePin(_pin, PinOwner::BusOnOff); } | ||||
|  | ||||
|   private: | ||||
|     uint8_t _pin = 255; | ||||
|     uint8_t _data = 0; | ||||
|     uint8_t _pin; | ||||
|     uint8_t _onoffdata; | ||||
| }; | ||||
|  | ||||
|  | ||||
| class BusNetwork : public Bus { | ||||
|   public: | ||||
|     BusNetwork(BusConfig &bc); | ||||
|     ~BusNetwork() { cleanup(); } | ||||
|  | ||||
|     bool hasRGB() { return true; } | ||||
|     bool hasRGB()   { return true; } | ||||
|     bool hasWhite() { return _rgbw; } | ||||
|  | ||||
|     bool canShow()  { return !_broadcastLock; } // this should be a return value from UDP routine if it is still sending data out | ||||
|     void setPixelColor(uint16_t pix, uint32_t c); | ||||
|  | ||||
|     uint32_t getPixelColor(uint16_t pix); | ||||
|  | ||||
|     uint8_t  getPins(uint8_t* pinArray); | ||||
|     void show(); | ||||
|  | ||||
|     bool canShow() { | ||||
|       // this should be a return value from UDP routine if it is still sending data out | ||||
|       return !_broadcastLock; | ||||
|     } | ||||
|  | ||||
|     uint8_t getPins(uint8_t* pinArray); | ||||
|  | ||||
|     uint16_t getLength() { | ||||
|       return _len; | ||||
|     } | ||||
|  | ||||
|     void cleanup(); | ||||
|  | ||||
|     ~BusNetwork() { | ||||
|       cleanup(); | ||||
|     } | ||||
|  | ||||
|   private: | ||||
|     IPAddress _client; | ||||
|     uint8_t   _UDPtype; | ||||
|     uint8_t   _UDPchannels; | ||||
|     bool      _rgbw; | ||||
|     bool      _broadcastLock; | ||||
|     byte     *_data; | ||||
| }; | ||||
|  | ||||
|  | ||||
| class BusManager { | ||||
|   public: | ||||
|     BusManager() {}; | ||||
|     BusManager() : numBusses(0) {}; | ||||
|  | ||||
|     //utility to get the approx. memory usage of a given BusConfig | ||||
|     static uint32_t memUsage(BusConfig &bc); | ||||
| @@ -340,38 +314,24 @@ class BusManager { | ||||
|     void removeAll(); | ||||
|  | ||||
|     void show(); | ||||
|  | ||||
|     void setStatusPixel(uint32_t c); | ||||
|  | ||||
|     void setPixelColor(uint16_t pix, uint32_t c, int16_t cct=-1); | ||||
|  | ||||
|     void setBrightness(uint8_t b); | ||||
|  | ||||
|     void setSegmentCCT(int16_t cct, bool allowWBCorrection = false); | ||||
|  | ||||
|     uint32_t getPixelColor(uint16_t pix); | ||||
|  | ||||
|     bool canAllShow(); | ||||
|     void setStatusPixel(uint32_t c); | ||||
|     void setPixelColor(uint16_t pix, uint32_t c); | ||||
|     void setBrightness(uint8_t b); | ||||
|     void setSegmentCCT(int16_t cct, bool allowWBCorrection = false); | ||||
|     uint32_t getPixelColor(uint16_t pix); | ||||
|  | ||||
|     Bus* getBus(uint8_t busNr); | ||||
|  | ||||
|     //semi-duplicate of strip.getLengthTotal() (though that just returns strip._length, calculated in finalizeInit()) | ||||
|     uint16_t getTotalLength(); | ||||
|     inline uint8_t getNumBusses() const { return numBusses; } | ||||
|  | ||||
|     inline void updateColorOrderMap(const ColorOrderMap &com) { | ||||
|       memcpy(&colorOrderMap, &com, sizeof(ColorOrderMap)); | ||||
|     } | ||||
|  | ||||
|     inline const ColorOrderMap& getColorOrderMap() const { | ||||
|       return colorOrderMap; | ||||
|     } | ||||
|  | ||||
|     inline uint8_t getNumBusses() { | ||||
|       return numBusses; | ||||
|     } | ||||
|     inline void                 updateColorOrderMap(const ColorOrderMap &com) { memcpy(&colorOrderMap, &com, sizeof(ColorOrderMap)); } | ||||
|     inline const ColorOrderMap& getColorOrderMap() const { return colorOrderMap; } | ||||
|  | ||||
|   private: | ||||
|     uint8_t numBusses = 0; | ||||
|     uint8_t numBusses; | ||||
|     Bus* busses[WLED_MAX_BUSSES+WLED_MIN_VIRTUAL_BUSSES]; | ||||
|     ColorOrderMap colorOrderMap; | ||||
|  | ||||
| @@ -381,4 +341,4 @@ class BusManager { | ||||
|       return j; | ||||
|     } | ||||
| }; | ||||
| #endif | ||||
| #endif | ||||
|   | ||||
| @@ -280,6 +280,7 @@ class PolyBus { | ||||
|     #endif | ||||
|     if (clock_kHz) dotStar_strip->SetMethodSettings(NeoSpiSettings((uint32_t)clock_kHz*1000)); | ||||
|   } | ||||
|  | ||||
|   // Begin & initialize the PixelSettings for TM1814 strips. | ||||
|   template <class T> | ||||
|   static void beginTM1814(void* busPtr) { | ||||
| @@ -288,6 +289,7 @@ class PolyBus { | ||||
|     // Max current for each LED (22.5 mA). | ||||
|     tm1814_strip->SetPixelSettings(NeoTm1814Settings(/*R*/225, /*G*/225, /*B*/225, /*W*/225)); | ||||
|   } | ||||
|  | ||||
|   static void begin(void* busPtr, uint8_t busType, uint8_t* pins, uint16_t clock_kHz = 0U) { | ||||
|     switch (busType) { | ||||
|       case I_NONE: break; | ||||
| @@ -390,7 +392,8 @@ class PolyBus { | ||||
|       case I_SS_WS1_3: (static_cast<B_SS_WS1_3*>(busPtr))->Begin(); break; | ||||
|       case I_SS_P98_3: (static_cast<B_SS_P98_3*>(busPtr))->Begin(); break; | ||||
|     } | ||||
|   }; | ||||
|   } | ||||
|  | ||||
|   static void* create(uint8_t busType, uint8_t* pins, uint16_t len, uint8_t channel, uint16_t clock_kHz = 0U) { | ||||
|     void* busPtr = nullptr; | ||||
|     switch (busType) { | ||||
| @@ -491,104 +494,106 @@ class PolyBus { | ||||
|     } | ||||
|     begin(busPtr, busType, pins, clock_kHz); | ||||
|     return busPtr; | ||||
|   }; | ||||
|   static void show(void* busPtr, uint8_t busType) { | ||||
|   } | ||||
|  | ||||
|   static void show(void* busPtr, uint8_t busType, bool consistent = true) { | ||||
|     switch (busType) { | ||||
|       case I_NONE: break; | ||||
|     #ifdef ESP8266 | ||||
|       case I_8266_U0_NEO_3: (static_cast<B_8266_U0_NEO_3*>(busPtr))->Show(); break; | ||||
|       case I_8266_U1_NEO_3: (static_cast<B_8266_U1_NEO_3*>(busPtr))->Show(); break; | ||||
|       case I_8266_DM_NEO_3: (static_cast<B_8266_DM_NEO_3*>(busPtr))->Show(); break; | ||||
|       case I_8266_BB_NEO_3: (static_cast<B_8266_BB_NEO_3*>(busPtr))->Show(); break; | ||||
|       case I_8266_U0_NEO_4: (static_cast<B_8266_U0_NEO_4*>(busPtr))->Show(); break; | ||||
|       case I_8266_U1_NEO_4: (static_cast<B_8266_U1_NEO_4*>(busPtr))->Show(); break; | ||||
|       case I_8266_DM_NEO_4: (static_cast<B_8266_DM_NEO_4*>(busPtr))->Show(); break; | ||||
|       case I_8266_BB_NEO_4: (static_cast<B_8266_BB_NEO_4*>(busPtr))->Show(); break; | ||||
|       case I_8266_U0_400_3: (static_cast<B_8266_U0_400_3*>(busPtr))->Show(); break; | ||||
|       case I_8266_U1_400_3: (static_cast<B_8266_U1_400_3*>(busPtr))->Show(); break; | ||||
|       case I_8266_DM_400_3: (static_cast<B_8266_DM_400_3*>(busPtr))->Show(); break; | ||||
|       case I_8266_BB_400_3: (static_cast<B_8266_BB_400_3*>(busPtr))->Show(); break; | ||||
|       case I_8266_U0_TM1_4: (static_cast<B_8266_U0_TM1_4*>(busPtr))->Show(); break; | ||||
|       case I_8266_U1_TM1_4: (static_cast<B_8266_U1_TM1_4*>(busPtr))->Show(); break; | ||||
|       case I_8266_DM_TM1_4: (static_cast<B_8266_DM_TM1_4*>(busPtr))->Show(); break; | ||||
|       case I_8266_BB_TM1_4: (static_cast<B_8266_BB_TM1_4*>(busPtr))->Show(); break; | ||||
|       case I_8266_U0_TM2_3: (static_cast<B_8266_U0_TM2_4*>(busPtr))->Show(); break; | ||||
|       case I_8266_U1_TM2_3: (static_cast<B_8266_U1_TM2_4*>(busPtr))->Show(); break; | ||||
|       case I_8266_DM_TM2_3: (static_cast<B_8266_DM_TM2_4*>(busPtr))->Show(); break; | ||||
|       case I_8266_BB_TM2_3: (static_cast<B_8266_BB_TM2_4*>(busPtr))->Show(); break; | ||||
|       case I_8266_U0_UCS_3: (static_cast<B_8266_U0_UCS_3*>(busPtr))->Show(); break; | ||||
|       case I_8266_U1_UCS_3: (static_cast<B_8266_U1_UCS_3*>(busPtr))->Show(); break; | ||||
|       case I_8266_DM_UCS_3: (static_cast<B_8266_DM_UCS_3*>(busPtr))->Show(); break; | ||||
|       case I_8266_BB_UCS_3: (static_cast<B_8266_BB_UCS_3*>(busPtr))->Show(); break; | ||||
|       case I_8266_U0_UCS_4: (static_cast<B_8266_U0_UCS_4*>(busPtr))->Show(); break; | ||||
|       case I_8266_U1_UCS_4: (static_cast<B_8266_U1_UCS_4*>(busPtr))->Show(); break; | ||||
|       case I_8266_DM_UCS_4: (static_cast<B_8266_DM_UCS_4*>(busPtr))->Show(); break; | ||||
|       case I_8266_BB_UCS_4: (static_cast<B_8266_BB_UCS_4*>(busPtr))->Show(); break; | ||||
|       case I_8266_U0_NEO_3: (static_cast<B_8266_U0_NEO_3*>(busPtr))->Show(consistent); break; | ||||
|       case I_8266_U1_NEO_3: (static_cast<B_8266_U1_NEO_3*>(busPtr))->Show(consistent); break; | ||||
|       case I_8266_DM_NEO_3: (static_cast<B_8266_DM_NEO_3*>(busPtr))->Show(consistent); break; | ||||
|       case I_8266_BB_NEO_3: (static_cast<B_8266_BB_NEO_3*>(busPtr))->Show(consistent); break; | ||||
|       case I_8266_U0_NEO_4: (static_cast<B_8266_U0_NEO_4*>(busPtr))->Show(consistent); break; | ||||
|       case I_8266_U1_NEO_4: (static_cast<B_8266_U1_NEO_4*>(busPtr))->Show(consistent); break; | ||||
|       case I_8266_DM_NEO_4: (static_cast<B_8266_DM_NEO_4*>(busPtr))->Show(consistent); break; | ||||
|       case I_8266_BB_NEO_4: (static_cast<B_8266_BB_NEO_4*>(busPtr))->Show(consistent); break; | ||||
|       case I_8266_U0_400_3: (static_cast<B_8266_U0_400_3*>(busPtr))->Show(consistent); break; | ||||
|       case I_8266_U1_400_3: (static_cast<B_8266_U1_400_3*>(busPtr))->Show(consistent); break; | ||||
|       case I_8266_DM_400_3: (static_cast<B_8266_DM_400_3*>(busPtr))->Show(consistent); break; | ||||
|       case I_8266_BB_400_3: (static_cast<B_8266_BB_400_3*>(busPtr))->Show(consistent); break; | ||||
|       case I_8266_U0_TM1_4: (static_cast<B_8266_U0_TM1_4*>(busPtr))->Show(consistent); break; | ||||
|       case I_8266_U1_TM1_4: (static_cast<B_8266_U1_TM1_4*>(busPtr))->Show(consistent); break; | ||||
|       case I_8266_DM_TM1_4: (static_cast<B_8266_DM_TM1_4*>(busPtr))->Show(consistent); break; | ||||
|       case I_8266_BB_TM1_4: (static_cast<B_8266_BB_TM1_4*>(busPtr))->Show(consistent); break; | ||||
|       case I_8266_U0_TM2_3: (static_cast<B_8266_U0_TM2_4*>(busPtr))->Show(consistent); break; | ||||
|       case I_8266_U1_TM2_3: (static_cast<B_8266_U1_TM2_4*>(busPtr))->Show(consistent); break; | ||||
|       case I_8266_DM_TM2_3: (static_cast<B_8266_DM_TM2_4*>(busPtr))->Show(consistent); break; | ||||
|       case I_8266_BB_TM2_3: (static_cast<B_8266_BB_TM2_4*>(busPtr))->Show(consistent); break; | ||||
|       case I_8266_U0_UCS_3: (static_cast<B_8266_U0_UCS_3*>(busPtr))->Show(consistent); break; | ||||
|       case I_8266_U1_UCS_3: (static_cast<B_8266_U1_UCS_3*>(busPtr))->Show(consistent); break; | ||||
|       case I_8266_DM_UCS_3: (static_cast<B_8266_DM_UCS_3*>(busPtr))->Show(consistent); break; | ||||
|       case I_8266_BB_UCS_3: (static_cast<B_8266_BB_UCS_3*>(busPtr))->Show(consistent); break; | ||||
|       case I_8266_U0_UCS_4: (static_cast<B_8266_U0_UCS_4*>(busPtr))->Show(consistent); break; | ||||
|       case I_8266_U1_UCS_4: (static_cast<B_8266_U1_UCS_4*>(busPtr))->Show(consistent); break; | ||||
|       case I_8266_DM_UCS_4: (static_cast<B_8266_DM_UCS_4*>(busPtr))->Show(consistent); break; | ||||
|       case I_8266_BB_UCS_4: (static_cast<B_8266_BB_UCS_4*>(busPtr))->Show(consistent); break; | ||||
|     #endif | ||||
|     #ifdef ARDUINO_ARCH_ESP32 | ||||
|       case I_32_RN_NEO_3: (static_cast<B_32_RN_NEO_3*>(busPtr))->Show(); break; | ||||
|       case I_32_RN_NEO_3: (static_cast<B_32_RN_NEO_3*>(busPtr))->Show(consistent); break; | ||||
|       #ifndef WLED_NO_I2S0_PIXELBUS | ||||
|       case I_32_I0_NEO_3: (static_cast<B_32_I0_NEO_3*>(busPtr))->Show(); break; | ||||
|       case I_32_I0_NEO_3: (static_cast<B_32_I0_NEO_3*>(busPtr))->Show(consistent); break; | ||||
|       #endif | ||||
|       #ifndef WLED_NO_I2S1_PIXELBUS | ||||
|       case I_32_I1_NEO_3: (static_cast<B_32_I1_NEO_3*>(busPtr))->Show(); break; | ||||
|       case I_32_I1_NEO_3: (static_cast<B_32_I1_NEO_3*>(busPtr))->Show(consistent); break; | ||||
|       #endif | ||||
| //      case I_32_BB_NEO_3: (static_cast<B_32_BB_NEO_3*>(busPtr))->Show(); break; | ||||
|       case I_32_RN_NEO_4: (static_cast<B_32_RN_NEO_4*>(busPtr))->Show(); break; | ||||
| //      case I_32_BB_NEO_3: (static_cast<B_32_BB_NEO_3*>(busPtr))->Show(consistent); break; | ||||
|       case I_32_RN_NEO_4: (static_cast<B_32_RN_NEO_4*>(busPtr))->Show(consistent); break; | ||||
|       #ifndef WLED_NO_I2S0_PIXELBUS | ||||
|       case I_32_I0_NEO_4: (static_cast<B_32_I0_NEO_4*>(busPtr))->Show(); break; | ||||
|       case I_32_I0_NEO_4: (static_cast<B_32_I0_NEO_4*>(busPtr))->Show(consistent); break; | ||||
|       #endif | ||||
|       #ifndef WLED_NO_I2S1_PIXELBUS | ||||
|       case I_32_I1_NEO_4: (static_cast<B_32_I1_NEO_4*>(busPtr))->Show(); break; | ||||
|       case I_32_I1_NEO_4: (static_cast<B_32_I1_NEO_4*>(busPtr))->Show(consistent); break; | ||||
|       #endif | ||||
| //      case I_32_BB_NEO_4: (static_cast<B_32_BB_NEO_4*>(busPtr))->Show(); break; | ||||
|       case I_32_RN_400_3: (static_cast<B_32_RN_400_3*>(busPtr))->Show(); break; | ||||
| //      case I_32_BB_NEO_4: (static_cast<B_32_BB_NEO_4*>(busPtr))->Show(consistent); break; | ||||
|       case I_32_RN_400_3: (static_cast<B_32_RN_400_3*>(busPtr))->Show(consistent); break; | ||||
|       #ifndef WLED_NO_I2S0_PIXELBUS | ||||
|       case I_32_I0_400_3: (static_cast<B_32_I0_400_3*>(busPtr))->Show(); break; | ||||
|       case I_32_I0_400_3: (static_cast<B_32_I0_400_3*>(busPtr))->Show(consistent); break; | ||||
|       #endif | ||||
|       #ifndef WLED_NO_I2S1_PIXELBUS | ||||
|       case I_32_I1_400_3: (static_cast<B_32_I1_400_3*>(busPtr))->Show(); break; | ||||
|       case I_32_I1_400_3: (static_cast<B_32_I1_400_3*>(busPtr))->Show(consistent); break; | ||||
|       #endif | ||||
| //      case I_32_BB_400_3: (static_cast<B_32_BB_400_3*>(busPtr))->Show(); break; | ||||
|       case I_32_RN_TM1_4: (static_cast<B_32_RN_TM1_4*>(busPtr))->Show(); break; | ||||
|       case I_32_RN_TM2_3: (static_cast<B_32_RN_TM2_3*>(busPtr))->Show(); break; | ||||
| //      case I_32_BB_400_3: (static_cast<B_32_BB_400_3*>(busPtr))->Show(consistent); break; | ||||
|       case I_32_RN_TM1_4: (static_cast<B_32_RN_TM1_4*>(busPtr))->Show(consistent); break; | ||||
|       case I_32_RN_TM2_3: (static_cast<B_32_RN_TM2_3*>(busPtr))->Show(consistent); break; | ||||
|       #ifndef WLED_NO_I2S0_PIXELBUS | ||||
|       case I_32_I0_TM1_4: (static_cast<B_32_I0_TM1_4*>(busPtr))->Show(); break; | ||||
|       case I_32_I0_TM2_3: (static_cast<B_32_I0_TM2_3*>(busPtr))->Show(); break; | ||||
|       case I_32_I0_TM1_4: (static_cast<B_32_I0_TM1_4*>(busPtr))->Show(consistent); break; | ||||
|       case I_32_I0_TM2_3: (static_cast<B_32_I0_TM2_3*>(busPtr))->Show(consistent); break; | ||||
|       #endif | ||||
|       #ifndef WLED_NO_I2S1_PIXELBUS | ||||
|       case I_32_I1_TM1_4: (static_cast<B_32_I1_TM1_4*>(busPtr))->Show(); break; | ||||
|       case I_32_I1_TM2_3: (static_cast<B_32_I1_TM2_3*>(busPtr))->Show(); break; | ||||
|       case I_32_I1_TM1_4: (static_cast<B_32_I1_TM1_4*>(busPtr))->Show(consistent); break; | ||||
|       case I_32_I1_TM2_3: (static_cast<B_32_I1_TM2_3*>(busPtr))->Show(consistent); break; | ||||
|       #endif | ||||
|       case I_32_RN_UCS_3: (static_cast<B_32_RN_UCS_3*>(busPtr))->Show(); break; | ||||
|       case I_32_RN_UCS_3: (static_cast<B_32_RN_UCS_3*>(busPtr))->Show(consistent); break; | ||||
|       #ifndef WLED_NO_I2S0_PIXELBUS | ||||
|       case I_32_I0_UCS_3: (static_cast<B_32_I0_UCS_3*>(busPtr))->Show(); break; | ||||
|       case I_32_I0_UCS_3: (static_cast<B_32_I0_UCS_3*>(busPtr))->Show(consistent); break; | ||||
|       #endif | ||||
|       #ifndef WLED_NO_I2S1_PIXELBUS | ||||
|       case I_32_I1_UCS_3: (static_cast<B_32_I1_UCS_3*>(busPtr))->Show(); break; | ||||
|       case I_32_I1_UCS_3: (static_cast<B_32_I1_UCS_3*>(busPtr))->Show(consistent); break; | ||||
|       #endif | ||||
| //      case I_32_BB_UCS_3: (static_cast<B_32_BB_NEO_3*>(busPtr))->Show(); break; | ||||
|       case I_32_RN_UCS_4: (static_cast<B_32_RN_UCS_4*>(busPtr))->Show(); break; | ||||
| //      case I_32_BB_UCS_3: (static_cast<B_32_BB_NEO_3*>(busPtr))->Show(consistent); break; | ||||
|       case I_32_RN_UCS_4: (static_cast<B_32_RN_UCS_4*>(busPtr))->Show(consistent); break; | ||||
|       #ifndef WLED_NO_I2S0_PIXELBUS | ||||
|       case I_32_I0_UCS_4: (static_cast<B_32_I0_UCS_4*>(busPtr))->Show(); break; | ||||
|       case I_32_I0_UCS_4: (static_cast<B_32_I0_UCS_4*>(busPtr))->Show(consistent); break; | ||||
|       #endif | ||||
|       #ifndef WLED_NO_I2S1_PIXELBUS | ||||
|       case I_32_I1_UCS_4: (static_cast<B_32_I1_UCS_4*>(busPtr))->Show(); break; | ||||
|       case I_32_I1_UCS_4: (static_cast<B_32_I1_UCS_4*>(busPtr))->Show(consistent); break; | ||||
|       #endif | ||||
| //      case I_32_BB_UCS_4: (static_cast<B_32_BB_UCS_4*>(busPtr))->Show(); break; | ||||
| //      case I_32_BB_UCS_4: (static_cast<B_32_BB_UCS_4*>(busPtr))->Show(consistent); break; | ||||
|     #endif | ||||
|       case I_HS_DOT_3: (static_cast<B_HS_DOT_3*>(busPtr))->Show(); break; | ||||
|       case I_SS_DOT_3: (static_cast<B_SS_DOT_3*>(busPtr))->Show(); break; | ||||
|       case I_HS_LPD_3: (static_cast<B_HS_LPD_3*>(busPtr))->Show(); break; | ||||
|       case I_SS_LPD_3: (static_cast<B_SS_LPD_3*>(busPtr))->Show(); break; | ||||
|       case I_HS_LPO_3: (static_cast<B_HS_LPO_3*>(busPtr))->Show(); break; | ||||
|       case I_SS_LPO_3: (static_cast<B_SS_LPO_3*>(busPtr))->Show(); break; | ||||
|       case I_HS_WS1_3: (static_cast<B_HS_WS1_3*>(busPtr))->Show(); break; | ||||
|       case I_SS_WS1_3: (static_cast<B_SS_WS1_3*>(busPtr))->Show(); break; | ||||
|       case I_HS_P98_3: (static_cast<B_HS_P98_3*>(busPtr))->Show(); break; | ||||
|       case I_SS_P98_3: (static_cast<B_SS_P98_3*>(busPtr))->Show(); break; | ||||
|       case I_HS_DOT_3: (static_cast<B_HS_DOT_3*>(busPtr))->Show(consistent); break; | ||||
|       case I_SS_DOT_3: (static_cast<B_SS_DOT_3*>(busPtr))->Show(consistent); break; | ||||
|       case I_HS_LPD_3: (static_cast<B_HS_LPD_3*>(busPtr))->Show(consistent); break; | ||||
|       case I_SS_LPD_3: (static_cast<B_SS_LPD_3*>(busPtr))->Show(consistent); break; | ||||
|       case I_HS_LPO_3: (static_cast<B_HS_LPO_3*>(busPtr))->Show(consistent); break; | ||||
|       case I_SS_LPO_3: (static_cast<B_SS_LPO_3*>(busPtr))->Show(consistent); break; | ||||
|       case I_HS_WS1_3: (static_cast<B_HS_WS1_3*>(busPtr))->Show(consistent); break; | ||||
|       case I_SS_WS1_3: (static_cast<B_SS_WS1_3*>(busPtr))->Show(consistent); break; | ||||
|       case I_HS_P98_3: (static_cast<B_HS_P98_3*>(busPtr))->Show(consistent); break; | ||||
|       case I_SS_P98_3: (static_cast<B_SS_P98_3*>(busPtr))->Show(consistent); break; | ||||
|     } | ||||
|   }; | ||||
|   } | ||||
|  | ||||
|   static bool canShow(void* busPtr, uint8_t busType) { | ||||
|     switch (busType) { | ||||
|       case I_NONE: return true; | ||||
| @@ -685,7 +690,8 @@ class PolyBus { | ||||
|       case I_SS_P98_3: return (static_cast<B_SS_P98_3*>(busPtr))->CanShow(); break; | ||||
|     } | ||||
|     return true; | ||||
|   }; | ||||
|   } | ||||
|  | ||||
|   static void setPixelColor(void* busPtr, uint8_t busType, uint16_t pix, uint32_t c, uint8_t co) { | ||||
|     uint8_t r = c >> 16; | ||||
|     uint8_t g = c >> 8; | ||||
| @@ -805,7 +811,8 @@ class PolyBus { | ||||
|       case I_HS_P98_3: (static_cast<B_HS_P98_3*>(busPtr))->SetPixelColor(pix, RgbColor(col)); break; | ||||
|       case I_SS_P98_3: (static_cast<B_SS_P98_3*>(busPtr))->SetPixelColor(pix, RgbColor(col)); break; | ||||
|     } | ||||
|   }; | ||||
|   } | ||||
|  | ||||
|   static void setBrightness(void* busPtr, uint8_t busType, uint8_t b) { | ||||
|     switch (busType) { | ||||
|       case I_NONE: break; | ||||
| @@ -902,7 +909,8 @@ class PolyBus { | ||||
|       case I_HS_P98_3: (static_cast<B_HS_P98_3*>(busPtr))->SetLuminance(b); break; | ||||
|       case I_SS_P98_3: (static_cast<B_SS_P98_3*>(busPtr))->SetLuminance(b); break; | ||||
|     } | ||||
|   }; | ||||
|   } | ||||
|  | ||||
|   static uint32_t getPixelColor(void* busPtr, uint8_t busType, uint16_t pix, uint8_t co) { | ||||
|     RgbwColor col(0,0,0,0); | ||||
|     switch (busType) { | ||||
| @@ -1209,4 +1217,4 @@ class PolyBus { | ||||
|   } | ||||
| }; | ||||
|  | ||||
| #endif | ||||
| #endif | ||||
| @@ -90,7 +90,7 @@ bool deserializeConfig(JsonObject doc, bool fromFS) { | ||||
|   CJSON(strip.cctBlending, hw_led[F("cb")]); | ||||
|   Bus::setCCTBlend(strip.cctBlending); | ||||
|   strip.setTargetFps(hw_led["fps"]); //NOP if 0, default 42 FPS | ||||
|   CJSON(strip.useLedsArray, hw_led[F("ld")]); | ||||
|   CJSON(useGlobalLedBuffer, hw_led[F("ld")]); | ||||
|  | ||||
|   #ifndef WLED_DISABLE_2D | ||||
|   // 2D Matrix Settings | ||||
| @@ -134,7 +134,8 @@ bool deserializeConfig(JsonObject doc, bool fromFS) { | ||||
|   if (fromFS || !ins.isNull()) { | ||||
|     uint8_t s = 0;  // bus iterator | ||||
|     if (fromFS) busses.removeAll(); // can't safely manipulate busses directly in network callback | ||||
|     uint32_t mem = 0; | ||||
|     uint32_t mem = 0, globalBufMem = 0; | ||||
|     uint16_t maxlen = 0; | ||||
|     bool busesChanged = false; | ||||
|     for (JsonObject elm : ins) { | ||||
|       if (s >= WLED_MAX_BUSSES+WLED_MIN_VIRTUAL_BUSSES) break; | ||||
| @@ -160,12 +161,16 @@ bool deserializeConfig(JsonObject doc, bool fromFS) { | ||||
|       ledType |= refresh << 7; // hack bit 7 to indicate strip requires off refresh | ||||
|       uint8_t AWmode = elm[F("rgbwm")] | autoWhiteMode; | ||||
|       if (fromFS) { | ||||
|         BusConfig bc = BusConfig(ledType, pins, start, length, colorOrder, reversed, skipFirst, AWmode, freqkHz); | ||||
|         BusConfig bc = BusConfig(ledType, pins, start, length, colorOrder, reversed, skipFirst, AWmode, freqkHz, useGlobalLedBuffer); | ||||
|         mem += BusManager::memUsage(bc); | ||||
|         if (mem <= MAX_LED_MEMORY) if (busses.add(bc) == -1) break;  // finalization will be done in WLED::beginStrip() | ||||
|         if (useGlobalLedBuffer && start + length > maxlen) { | ||||
|           maxlen = start + length; | ||||
|           globalBufMem = maxlen * 4; | ||||
|         } | ||||
|         if (mem + globalBufMem <= MAX_LED_MEMORY) if (busses.add(bc) == -1) break;  // finalization will be done in WLED::beginStrip() | ||||
|       } else { | ||||
|         if (busConfigs[s] != nullptr) delete busConfigs[s]; | ||||
|         busConfigs[s] = new BusConfig(ledType, pins, start, length, colorOrder, reversed, skipFirst, AWmode); | ||||
|         busConfigs[s] = new BusConfig(ledType, pins, start, length, colorOrder, reversed, skipFirst, AWmode, freqkHz, useGlobalLedBuffer); | ||||
|         busesChanged = true; | ||||
|       } | ||||
|       s++; | ||||
| @@ -173,7 +178,7 @@ bool deserializeConfig(JsonObject doc, bool fromFS) { | ||||
|     doInitBusses = busesChanged; | ||||
|     // finalization done in beginStrip() | ||||
|   } | ||||
|   if (hw_led["rev"]) busses.getBus(0)->reversed = true; //set 0.11 global reversed setting for first bus | ||||
|   if (hw_led["rev"]) busses.getBus(0)->setReversed(true); //set 0.11 global reversed setting for first bus | ||||
|  | ||||
|   // read color order map configuration | ||||
|   JsonArray hw_com = hw[F("com")]; | ||||
| @@ -197,6 +202,9 @@ bool deserializeConfig(JsonObject doc, bool fromFS) { | ||||
|   disablePullUp = !pull; | ||||
|   JsonArray hw_btn_ins = btn_obj[F("ins")]; | ||||
|   if (!hw_btn_ins.isNull()) { | ||||
|     for (uint8_t b = 0; b < WLED_MAX_BUTTONS; b++) { // deallocate existing button pins | ||||
|       pinManager.deallocatePin(btnPin[b], PinOwner::Button); // does nothing if trying to deallocate a pin with PinOwner != Button | ||||
|     } | ||||
|     uint8_t s = 0; | ||||
|     for (JsonObject btn : hw_btn_ins) { | ||||
|       CJSON(buttonType[s], btn["type"]); | ||||
| @@ -264,6 +272,7 @@ bool deserializeConfig(JsonObject doc, bool fromFS) { | ||||
|  | ||||
|   int hw_ir_pin = hw["ir"]["pin"] | -2; // 4 | ||||
|   if (hw_ir_pin > -2) { | ||||
|     pinManager.deallocatePin(irPin, PinOwner::IR); | ||||
|     if (pinManager.allocatePin(hw_ir_pin, false, PinOwner::IR)) { | ||||
|       irPin = hw_ir_pin; | ||||
|     } else { | ||||
| @@ -276,6 +285,7 @@ bool deserializeConfig(JsonObject doc, bool fromFS) { | ||||
|   JsonObject relay = hw[F("relay")]; | ||||
|   int hw_relay_pin = relay["pin"] | -2; | ||||
|   if (hw_relay_pin > -2) { | ||||
|     pinManager.deallocatePin(rlyPin, PinOwner::Relay); | ||||
|     if (pinManager.allocatePin(hw_relay_pin,true, PinOwner::Relay)) { | ||||
|       rlyPin = hw_relay_pin; | ||||
|       pinMode(rlyPin, OUTPUT); | ||||
| @@ -443,6 +453,13 @@ bool deserializeConfig(JsonObject doc, bool fromFS) { | ||||
|   CJSON(retainMqttMsg, if_mqtt[F("rtn")]); | ||||
| #endif | ||||
|  | ||||
| #ifndef WLED_DISABLE_ESPNOW | ||||
|   JsonObject remote = doc["remote"]; | ||||
|   CJSON(enable_espnow_remote, remote[F("remote_enabled")]); | ||||
|   getStringFromJson(linked_remote, remote[F("linked_remote")], 13); | ||||
| #endif | ||||
|  | ||||
|  | ||||
| #ifndef WLED_DISABLE_HUESYNC | ||||
|   JsonObject if_hue = interfaces["hue"]; | ||||
|   CJSON(huePollingEnabled, if_hue["en"]); | ||||
| @@ -699,7 +716,7 @@ void serializeConfig() { | ||||
|   hw_led[F("cb")] = strip.cctBlending; | ||||
|   hw_led["fps"] = strip.getTargetFps(); | ||||
|   hw_led[F("rgbwm")] = Bus::getGlobalAWMode(); // global auto white mode override | ||||
|   hw_led[F("ld")] = strip.useLedsArray; | ||||
|   hw_led[F("ld")] = useGlobalLedBuffer; | ||||
|  | ||||
|   #ifndef WLED_DISABLE_2D | ||||
|   // 2D Matrix Settings | ||||
| @@ -734,7 +751,7 @@ void serializeConfig() { | ||||
|     uint8_t nPins = bus->getPins(pins); | ||||
|     for (uint8_t i = 0; i < nPins; i++) ins_pin.add(pins[i]); | ||||
|     ins[F("order")] = bus->getColorOrder(); | ||||
|     ins["rev"] = bus->reversed; | ||||
|     ins["rev"] = bus->isReversed(); | ||||
|     ins[F("skip")] = bus->skippedLeds(); | ||||
|     ins["type"] = bus->getType() & 0x7F; | ||||
|     ins["ref"] = bus->isOffRefreshRequired(); | ||||
| @@ -895,6 +912,13 @@ void serializeConfig() { | ||||
|   if_mqtt_topics[F("group")] = mqttGroupTopic; | ||||
| #endif | ||||
|  | ||||
| #ifndef WLED_DISABLE_ESPNOW | ||||
|   JsonObject remote = doc.createNestedObject(F("remote")); | ||||
|   remote[F("remote_enabled")] = enable_espnow_remote; | ||||
|   remote[F("linked_remote")] = linked_remote; | ||||
| #endif | ||||
|  | ||||
|  | ||||
| #ifndef WLED_DISABLE_HUESYNC | ||||
|   JsonObject if_hue = interfaces.createNestedObject("hue"); | ||||
|   if_hue["en"] = huePollingEnabled; | ||||
|   | ||||
| @@ -91,6 +91,21 @@ | ||||
|   #endif | ||||
| #endif | ||||
|  | ||||
| #ifndef WLED_MAX_SEGNAME_LEN | ||||
|   #ifdef ESP8266 | ||||
|     #define WLED_MAX_SEGNAME_LEN 32 | ||||
|   #else | ||||
|     #define WLED_MAX_SEGNAME_LEN 64 | ||||
|   #endif | ||||
| #else | ||||
|   #if WLED_MAX_SEGNAME_LEN<32 | ||||
|     #undef WLED_MAX_SEGNAME_LEN | ||||
|     #define WLED_MAX_SEGNAME_LEN 32 | ||||
|   #else | ||||
|     #warning WLED UI does not support modified maximum segment name length! | ||||
|   #endif | ||||
| #endif | ||||
|  | ||||
| //Usermod IDs | ||||
| #define USERMOD_ID_RESERVED               0     //Unused. Might indicate no usermod present | ||||
| #define USERMOD_ID_UNSPECIFIED            1     //Default value for a general user mod that does not specify a custom ID | ||||
| @@ -133,6 +148,7 @@ | ||||
| #define USERMOD_ID_PWM_OUTPUTS           38     //Usermod "usermod_pwm_outputs.h | ||||
| #define USERMOD_ID_SHT                   39     //Usermod "usermod_sht.h | ||||
| #define USERMOD_ID_KLIPPER               40     // Usermod Klipper percentage | ||||
| #define USERMOD_ID_WIREGUARD             41     //Usermod "wireguard.h" | ||||
|  | ||||
| //Access point behavior | ||||
| #define AP_BEHAVIOR_BOOT_NO_CONN          0     //Open AP when no connection after boot | ||||
| @@ -388,7 +404,7 @@ | ||||
| #ifdef ESP8266 | ||||
| #define SETTINGS_STACK_BUF_SIZE 2048 | ||||
| #else | ||||
| #define SETTINGS_STACK_BUF_SIZE 3096 | ||||
| #define SETTINGS_STACK_BUF_SIZE 3608  // warning: quite a large value for stack | ||||
| #endif | ||||
|  | ||||
| #ifdef WLED_USE_ETHERNET | ||||
|   | ||||
| @@ -42,6 +42,6 @@ | ||||
| 		<img alt="" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAbUExURQAAAAB81gCU/zKq/////9bW1oCAgGhoaAAAAGPLX8AAAAAJdFJOU///////////AFNPeBIAAAAJcEhZcwAADsAAAA7AAWrWiQkAAACdSURBVDhPxc9bDoUgEANQebP/FUuHMjBGY/B+3EYR7RH0qC/ZBc6HwCljgHO+xZIVSI2sYgHaG7EBWh8jWoxTrCBFdDJ+BD4lbIHxAcz8APAVLTsrZE4eQD5qzt3cAFTYokC4YCN9Gybgu4yAQtBFLQXHuHABA7JMeOEC/E0W5uy9gv4vo5QHK2i7yq2C8UABM4HmL+CSTXCTF1DrCX6+Gp9zB5dsAAAAAElFTkSuQmCC"> | ||||
| 		<h1>404 Not Found</h1> | ||||
| 		<b>Akemi does not know where you are headed...</b><br><br> | ||||
| 		<button onclick="window.location.href='../sliders'">Back to controls</button> | ||||
| 		<button onclick="window.location.href='../?sliders'">Back to controls</button> | ||||
| 	</body> | ||||
| </html> | ||||
| @@ -134,7 +134,7 @@ button { | ||||
|  | ||||
| .off { | ||||
| 	color: var(--c-6) !important; | ||||
| 	cursor: default !important; | ||||
| 	/* cursor: default !important; */ | ||||
| } | ||||
|  | ||||
| .top .icons, .bot .icons { | ||||
| @@ -1010,7 +1010,7 @@ textarea { | ||||
| 	width: 50px !important; | ||||
| } | ||||
|  | ||||
| .segname, .pname { | ||||
| .segname, .pname, .bname { | ||||
| 	white-space: nowrap; | ||||
| 	text-align: center; | ||||
| 	overflow: hidden; | ||||
| @@ -1020,6 +1020,9 @@ textarea { | ||||
| 	max-width: 170px; | ||||
| 	position: relative; | ||||
| } | ||||
| .bname { | ||||
| 	padding: 0 24px; | ||||
| } | ||||
|  | ||||
| .segname .flr, .pname .flr { | ||||
| 	transform: rotate(0deg); | ||||
|   | ||||
| @@ -379,8 +379,8 @@ | ||||
| 	</div>	 | ||||
| </div> | ||||
|  | ||||
| <div id="mliveview2D" class="modal"> | ||||
| 	<div id="kliveview2D" style="width:100%; height:100%">Loading...</div><br> | ||||
| <div id="mlv2D" class="modal"> | ||||
| 	<div id="klv2D" style="width:100%; height:100%">Loading...</div> | ||||
| </div> | ||||
|  | ||||
| <div id="rover" class="modal"> | ||||
|   | ||||
| @@ -22,7 +22,7 @@ var pN = "", pI = 0, pNum = 0; | ||||
| var pmt = 1, pmtLS = 0, pmtLast = 0; | ||||
| var lastinfo = {}; | ||||
| var isM = false, mw = 0, mh=0; | ||||
| var ws, cpick, ranges; | ||||
| var ws, cpick, ranges, wsRpt=0; | ||||
| var cfg = { | ||||
| 	theme:{base:"dark", bg:{url:""}, alpha:{bg:0.6,tab:0.8}, color:{bg:""}}, | ||||
| 	comp :{colors:{picker: true, rgb: false, quick: true, hex: false}, | ||||
| @@ -217,6 +217,7 @@ function onLoad() | ||||
| 		// detect reverse proxy and/or HTTPS | ||||
| 		let pathn = l.pathname; | ||||
| 		let paths = pathn.slice(1,pathn.endsWith('/')?-1:undefined).split("/"); | ||||
| 		//if (paths[0]==="sliders") paths.shift(); | ||||
| 		//while (paths[0]==="") paths.shift(); | ||||
| 		locproto = l.protocol; | ||||
| 		locip = l.hostname + (l.port ? ":" + l.port : ""); | ||||
| @@ -772,7 +773,7 @@ function populateSegments(s) | ||||
| 				`<i class="icons e-icon flr" id="sege${i}" onclick="expand(${i})"></i>`+ | ||||
| 				(cfg.comp.segpwr ? segp : '') + | ||||
| 				`<div class="segin" id="seg${i}in">`+ | ||||
| 					`<input type="text" class="ptxt" id="seg${i}t" autocomplete="off" maxlength=32 value="${inst.n?inst.n:""}" placeholder="Enter name..."/>`+ | ||||
| 					`<input type="text" class="ptxt" id="seg${i}t" autocomplete="off" maxlength=${li.arch=="esp8266"?32:64} value="${inst.n?inst.n:""}" placeholder="Enter name..."/>`+ | ||||
| 					`<table class="infot segt">`+ | ||||
| 					`<tr>`+ | ||||
| 						`<td>${isMSeg?'Start X':'Start LED'}</td>`+ | ||||
| @@ -825,6 +826,7 @@ function populateSegments(s) | ||||
| 	resetUtil(noNewSegs); | ||||
| 	if (gId('selall')) gId('selall').checked = true; | ||||
| 	for (var i = 0; i <= lSeg; i++) { | ||||
| 		if (!gId(`seg${i}`)) continue; | ||||
| 		updateLen(i); | ||||
| 		updateTrail(gId(`seg${i}bri`)); | ||||
| 		gId(`segr${i}`).classList.add("hide"); | ||||
| @@ -1003,10 +1005,15 @@ function generateListItemHtml(listName, id, name, clickAction, extraHtml = '', e | ||||
| function btype(b) | ||||
| { | ||||
| 	switch (b) { | ||||
| 		case 2: | ||||
| 		case 32: return "ESP32"; | ||||
| 		case 3: | ||||
| 		case 33: return "ESP32-S2"; | ||||
| 		case 4: | ||||
| 		case 34: return "ESP32-S3"; | ||||
| 		case 5: | ||||
| 		case 35: return "ESP32-C3"; | ||||
| 		case 1: | ||||
| 		case 82: return "ESP8266"; | ||||
| 	} | ||||
| 	return "?"; | ||||
| @@ -1027,8 +1034,9 @@ function populateNodes(i,n) | ||||
| 		n.nodes.sort((a,b) => (a.name).localeCompare(b.name)); | ||||
| 		for (var o of n.nodes) { | ||||
| 			if (o.name) { | ||||
| 				var url = `<button class="btn" title="${o.ip}" onclick="location.assign('http://${o.ip}');">${bname(o)}</button>`; | ||||
| 				urows += inforow(url,`${btype(o.type)}<br><i>${o.vid==0?"N/A":o.vid}</i>`); | ||||
| 				let onoff = `<i class="icons e-icon flr ${o.type&0x80?'':'off'}" onclick="rmtTgl('${o.ip}',this);""></i>`; | ||||
| 				var url = `<button class="btn" title="${o.ip}" onclick="location.assign('http://${o.ip}');"><div class="bname">${bname(o)}</div>${o.vid<2307130?'':onoff}</button>`; | ||||
| 				urows += inforow(url,`${btype(o.type&0x7F)}<br><i>${o.vid==0?"N/A":o.vid}</i>`); | ||||
| 				nnodes++; | ||||
| 			} | ||||
| 		} | ||||
| @@ -1330,11 +1338,12 @@ function makeWS() { | ||||
| 	}; | ||||
| 	ws.onclose = (e)=>{ | ||||
| 		gId('connind').style.backgroundColor = "var(--c-r)"; | ||||
| 		setTimeout(makeWS,1500); // retry WS connection | ||||
| 		if (wsRpt++ < 5) setTimeout(makeWS,1500); // retry WS connection | ||||
| 		ws = null; | ||||
| 	} | ||||
| 	ws.onopen = (e)=>{ | ||||
| 		//ws.send("{'v':true}"); // unnecessary (https://github.com/Aircoookie/WLED/blob/master/wled00/ws.cpp#L18) | ||||
| 		wsRpt = 0; | ||||
| 		reqsLegal = true; | ||||
| 	} | ||||
| } | ||||
| @@ -1636,6 +1645,7 @@ function requestJson(command=null) | ||||
| 		//load presets and open websocket sequentially | ||||
| 		if (!pJson || isEmpty(pJson)) setTimeout(()=>{ | ||||
| 			loadPresets(()=>{ | ||||
| 				wsRpt = 0; | ||||
| 				if (!(ws && ws.readyState === WebSocket.OPEN)) makeWS(); | ||||
| 			}); | ||||
| 		},25); | ||||
| @@ -1683,27 +1693,22 @@ function toggleSync() | ||||
|  | ||||
| function toggleLiveview() | ||||
| { | ||||
| 	//WLEDSR adding liveview2D support | ||||
| 	if (isInfo && isM) toggleInfo(); | ||||
| 	if (isNodes && isM) toggleNodes(); | ||||
| 	isLv = !isLv; | ||||
| 	let wsOn = ws && ws.readyState === WebSocket.OPEN; | ||||
|  | ||||
| 	var lvID = "liveview"; | ||||
| 	if (isM) {    | ||||
| 		lvID = "liveview2D" | ||||
| 		if (isLv) { | ||||
| 		var cn = '<iframe id="liveview2D" src="about:blank"></iframe>'; | ||||
| 		d.getElementById('kliveview2D').innerHTML = cn; | ||||
| 		} | ||||
|  | ||||
| 		gId('mliveview2D').style.transform = (isLv) ? "translateY(0px)":"translateY(100%)"; | ||||
| 	if (isM && wsOn) {    | ||||
| 		lvID += "2D"; | ||||
| 		if (isLv) gId('klv2D').innerHTML = `<iframe id="${lvID}" src="about:blank"></iframe>`; | ||||
| 		gId('mlv2D').style.transform = (isLv) ? "translateY(0px)":"translateY(100%)"; | ||||
| 	} | ||||
|  | ||||
| 	gId(lvID).style.display = (isLv) ? "block":"none"; | ||||
| 	var url = getURL("/" + lvID); | ||||
| 	gId(lvID).src = (isLv) ? url:"about:blank"; | ||||
| 	gId('buttonSr').className = (isLv) ? "active":""; | ||||
| 	if (!isLv && ws && ws.readyState === WebSocket.OPEN) ws.send('{"lv":false}'); | ||||
| 	gId(lvID).src = (isLv) ? getURL("/" + lvID + ((wsOn) ? "?ws":"")):"about:blank"; | ||||
| 	gId('buttonSr').classList.toggle("active"); | ||||
| 	if (!isLv && wsOn) ws.send('{"lv":false}'); | ||||
| 	size(); | ||||
| } | ||||
|  | ||||
| @@ -2047,14 +2052,14 @@ function tglSegn(s) | ||||
| function selSegAll(o) | ||||
| { | ||||
| 	var obj = {"seg":[]}; | ||||
| 	for (let i=0; i<=lSeg; i++) obj.seg.push({"id":i,"sel":o.checked}); | ||||
| 	for (let i=0; i<=lSeg; i++) if (gId(`seg${i}`)) obj.seg.push({"id":i,"sel":o.checked}); | ||||
| 	requestJson(obj); | ||||
| } | ||||
|  | ||||
| function selSegEx(s) | ||||
| { | ||||
| 	var obj = {"seg":[]}; | ||||
| 	for (let i=0; i<=lSeg; i++) obj.seg.push({"id":i,"sel":(i==s)}); | ||||
| 	for (let i=0; i<=lSeg; i++) if (gId(`seg${i}`)) obj.seg.push({"id":i,"sel":(i==s)}); | ||||
| 	obj.mainseg = s; | ||||
| 	requestJson(obj); | ||||
| } | ||||
| @@ -2072,7 +2077,7 @@ function selGrp(g) | ||||
| 	event.stopPropagation(); | ||||
| 	var sel = gId(`segcont`).querySelectorAll(`div[data-set="${g}"]`); | ||||
| 	var obj = {"seg":[]}; | ||||
| 	for (let i=0; i<=lSeg; i++) obj.seg.push({"id":i,"sel":false}); | ||||
| 	for (let i=0; i<=lSeg; i++) if (gId(`seg${i}`)) obj.seg.push({"id":i,"sel":false}); | ||||
| 	if (sel) for (let s of sel||[]) { | ||||
| 		let i = parseInt(s.id.substring(3)); | ||||
| 		obj.seg[i] = {"id":i,"sel":true}; | ||||
| @@ -2573,6 +2578,24 @@ function setBalance(b) | ||||
| 	requestJson(obj); | ||||
| } | ||||
|  | ||||
| function rmtTgl(ip,i) { | ||||
| 	event.preventDefault(); | ||||
| 	event.stopPropagation(); | ||||
| 	fetch(`http://${ip}/win&T=2`, {method: 'get'}) | ||||
| 	.then((r)=>{ | ||||
| 		return r.text(); | ||||
| 	}) | ||||
| 	.then((t)=>{ | ||||
| 		let c = (new window.DOMParser()).parseFromString(t, "text/xml"); | ||||
| 		// perhaps just i.classList.toggle("off"); would be enough | ||||
| 		if (c.getElementsByTagName('ac')[0].textContent === "0") { | ||||
| 			i.classList.add("off"); | ||||
| 		} else { | ||||
| 			i.classList.remove("off"); | ||||
| 		} | ||||
| 	}); | ||||
| } | ||||
|  | ||||
| var hc = 0; | ||||
| setInterval(()=>{ | ||||
| 	if (!isInfo) return; | ||||
|   | ||||
| @@ -17,14 +17,10 @@ | ||||
|     position: absolute; | ||||
|   } | ||||
|   </style> | ||||
| </head> | ||||
| <body> | ||||
|   <div id="canv" /> | ||||
|   <script> | ||||
|     update(); | ||||
|      | ||||
|     var ws; | ||||
|     var tmout = null; | ||||
|     function update() | ||||
|     function update() // via HTTP (/json/live) | ||||
|     { | ||||
|       if (document.hidden) { | ||||
|         clearTimeout(tmout); | ||||
| @@ -57,8 +53,57 @@ | ||||
|         clearTimeout(tmout); | ||||
|         tmout = setTimeout(update, 2500); | ||||
|       }) | ||||
|     } | ||||
|     function S() { // Startup function (onload) | ||||
|       let wsOn = (window.location.href.indexOf("?ws") > 0); | ||||
|       if (!wsOn) {update(); return;} | ||||
|  | ||||
|       // Initialize WebSocket connection | ||||
|       try { | ||||
|         ws = top.window.ws; | ||||
|       } catch (e) {} | ||||
|       if (ws && ws.readyState === WebSocket.OPEN) { | ||||
|         //console.info("Peek uses top WS"); | ||||
|         ws.send("{'lv':true}"); | ||||
|       } else { | ||||
|         //console.info("Peek WS opening"); | ||||
|         let l = window.location; | ||||
|         let pathn = l.pathname; | ||||
|         let paths = pathn.slice(1,pathn.endsWith('/')?-1:undefined).split("/"); | ||||
|         let url = l.origin.replace("http","ws"); | ||||
|         if (paths.length > 1) { | ||||
|           url +=  "/" + paths[0]; | ||||
|         } | ||||
|         ws = new WebSocket(url+"/ws"); | ||||
|         ws.onopen = function () { | ||||
|           //console.info("Peek WS open"); | ||||
|           ws.send("{'lv':true}"); | ||||
|         } | ||||
|       } | ||||
|       ws.binaryType = "arraybuffer"; | ||||
|       ws.addEventListener('message', (e) => { | ||||
|         try { | ||||
|           if (toString.call(e.data) === '[object ArrayBuffer]') { | ||||
|             let leds = new Uint8Array(event.data); | ||||
|             if (leds[0] != 76) return; //'L' | ||||
|             let str = "linear-gradient(90deg,"; | ||||
|             let len = leds.length; | ||||
|             let start = leds[1]==2 ? 4 : 2; // 1 = 1D, 2 = 1D/2D (leds[2]=w, leds[3]=h) | ||||
|             for (i = start; i < len; i+=3) { | ||||
|               str += `rgb(${leds[i]},${leds[i+1]},${leds[i+2]})`; | ||||
|               if (i < len -3) str += "," | ||||
|             } | ||||
|             str += ")"; | ||||
|             document.getElementById("canv").style.background = str; | ||||
|           } | ||||
|         } catch (err) { | ||||
|           console.error("Peek WS error:",err); | ||||
|         }  | ||||
|       }); | ||||
|     } | ||||
|   </script> | ||||
| </head> | ||||
| <body onload="S()"> | ||||
|   <div id="canv"></div> | ||||
| </body> | ||||
| </html> | ||||
| @@ -1,68 +0,0 @@ | ||||
| <!DOCTYPE html> | ||||
| <html> | ||||
| <head> | ||||
|   <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1"> | ||||
|   <meta charset="utf-8"> | ||||
|   <meta name="theme-color" content="#222222"> | ||||
|   <title>WLED Live Preview</title> | ||||
|   <style> | ||||
|   body { | ||||
|     margin: 0; | ||||
|   } | ||||
|   #canv { | ||||
|     background: black; | ||||
|     filter: brightness(175%); | ||||
|     width: 100%; | ||||
|     height: 100%; | ||||
|     position: absolute; | ||||
|   } | ||||
|   </style> | ||||
| </head> | ||||
| <body> | ||||
|   <div id="canv"></div> | ||||
|   <script> | ||||
|     var ws; | ||||
|     try { | ||||
|       ws = top.window.ws; | ||||
|     } catch (e) {} | ||||
|     if (ws && ws.readyState === WebSocket.OPEN) { | ||||
|       //console.info("Peek uses top WS"); | ||||
|       ws.send("{'lv':true}"); | ||||
|     } else { | ||||
|       //console.info("Peek WS opening"); | ||||
|       let l = window.location; | ||||
|       let pathn = l.pathname; | ||||
|       let paths = pathn.slice(1,pathn.endsWith('/')?-1:undefined).split("/"); | ||||
|       let url = l.origin.replace("http","ws"); | ||||
|       if (paths.length > 1) { | ||||
|         url +=  "/" + paths[0]; | ||||
|       } | ||||
|       ws = new WebSocket(url+"/ws"); | ||||
|       ws.onopen = function () { | ||||
|         //console.info("Peek WS open"); | ||||
|         ws.send("{'lv':true}"); | ||||
|       } | ||||
|     } | ||||
|     ws.binaryType = "arraybuffer"; | ||||
|     ws.addEventListener('message', (e) => { | ||||
|       try { | ||||
|         if (toString.call(e.data) === '[object ArrayBuffer]') { | ||||
|           let leds = new Uint8Array(event.data); | ||||
|           if (leds[0] != 76) return; //'L' | ||||
|           let str = "linear-gradient(90deg,"; | ||||
|           let len = leds.length; | ||||
|           let start = leds[1]==2 ? 4 : 2; // 1 = 1D, 2 = 1D/2D (leds[2]=w, leds[3]=h) | ||||
|           for (i = start; i < len; i+=3) { | ||||
|             str += `rgb(${leds[i]},${leds[i+1]},${leds[i+2]})`; | ||||
|             if (i < len -3) str += "," | ||||
|           } | ||||
|           str += ")"; | ||||
|           document.getElementById("canv").style.background = str; | ||||
|         } | ||||
|       } catch (err) { | ||||
|         console.error("Peek WS error:",err); | ||||
|       }  | ||||
|     }); | ||||
|   </script> | ||||
| </body> | ||||
| </html> | ||||
							
								
								
									
										2026
									
								
								wled00/data/pxmagic/pxmagic.htm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2026
									
								
								wled00/data/pxmagic/pxmagic.htm
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -141,7 +141,7 @@ | ||||
| 			let len = parseInt(d.getElementsByName("LC"+n)[0].value); | ||||
| 			len += parseInt(d.getElementsByName("SL"+n)[0].value); // skipped LEDs are allocated too | ||||
| 			let dbl = 0; | ||||
| 			if (d.Sf.LD.checked) dbl = len * 3;	// double buffering | ||||
| 			if (d.Sf.LD.checked) dbl = len * 4;	// double buffering | ||||
| 			if (t < 32) { | ||||
| 				if (t==26 || t==29) len *= 2; // 16 bit LEDs | ||||
| 				if (maxM < 10000 && d.getElementsByName("L0"+n)[0].value == 3) { //8266 DMA uses 5x the mem | ||||
|   | ||||
| @@ -193,6 +193,17 @@ | ||||
| 		Disable WiFi sleep: <input type="checkbox" name="WS"><br> | ||||
| 		<i>Can help with connectivity issues.<br> | ||||
| 		Do not enable if WiFi is working correctly, increases power consumption.</i> | ||||
|  | ||||
| 		<div id="remd"> | ||||
| 			<h3>Wireless Remote</h3> | ||||
| 			<i>Listen for events over ESP-NOW<br> | ||||
| 			Keep disabled if not using a remote, increases power consumption.<br></i> | ||||
| 		 | ||||
| 			Enable Remote: <input type="checkbox" name="RE"><br> | ||||
| 			Hardware MAC: <input type="text" name="RMAC"><br> | ||||
| 			Last Seen: <span class="rlid">None</span> <br> | ||||
| 		</div> | ||||
|  | ||||
| 		<div id="ethd"> | ||||
| 			<h3>Ethernet Type</h3> | ||||
| 			<select name="ETH"> | ||||
|   | ||||
| @@ -171,6 +171,7 @@ async function onLoad() | ||||
| 		// detect reverse proxy and/or HTTPS | ||||
| 		let pathn = l.pathname; | ||||
| 		let paths = pathn.slice(1,pathn.endsWith('/')?-1:undefined).split("/"); | ||||
| 		if (paths[0]==="sliders") paths.shift(); | ||||
| 		//while (paths[0]==="") paths.shift(); | ||||
| 		locproto = l.protocol; | ||||
| 		locip = l.hostname + (l.port ? ":" + l.port : ""); | ||||
|   | ||||
| @@ -57,7 +57,7 @@ | ||||
| 			Connect the module to your local WiFi here!<br> | ||||
| 			<button onclick="window.location.href='./settings/wifi'">WiFi settings</button><br> | ||||
| 			<i>Just trying this out in AP mode?</i><br> | ||||
| 			<button onclick="window.location.href='./sliders'">To the controls!</button><br> | ||||
| 			<button onclick="window.location.href='./?sliders'">To the controls!</button><br> | ||||
| 		</div> | ||||
| 	</body> | ||||
| </html> | ||||
| @@ -104,10 +104,20 @@ void sendHuePoll(); | ||||
| void onHueData(void* arg, AsyncClient* client, void *data, size_t len); | ||||
|  | ||||
| //improv.cpp | ||||
| enum ImprovRPCType { | ||||
|   Command_Wifi = 0x01, | ||||
|   Request_State = 0x02, | ||||
|   Request_Info = 0x03, | ||||
|   Request_Scan = 0x04 | ||||
| }; | ||||
|  | ||||
| void handleImprovPacket(); | ||||
| void sendImprovRPCResult(ImprovRPCType type, uint8_t n_strings = 0, const char **strings = nullptr); | ||||
| void sendImprovStateResponse(uint8_t state, bool error = false); | ||||
| void sendImprovInfoResponse(); | ||||
| void sendImprovRPCResponse(byte commandId); | ||||
| void startImprovWifiScan(); | ||||
| void handleImprovWifiScan(); | ||||
| void sendImprovIPRPCResult(ImprovRPCType type); | ||||
|  | ||||
| //ir.cpp | ||||
| void applyRepeatActions(); | ||||
| @@ -200,12 +210,16 @@ void serializePlaylist(JsonObject obj); | ||||
| void initPresetsFile(); | ||||
| void handlePresets(); | ||||
| bool applyPreset(byte index, byte callMode = CALL_MODE_DIRECT_CHANGE); | ||||
| void applyPresetWithFallback(uint8_t presetID, uint8_t callMode, uint8_t effectID = 0, uint8_t paletteID = 0); | ||||
| inline bool applyTemporaryPreset() {return applyPreset(255);}; | ||||
| void savePreset(byte index, const char* pname = nullptr, JsonObject saveobj = JsonObject()); | ||||
| inline void saveTemporaryPreset() {savePreset(255);}; | ||||
| void deletePreset(byte index); | ||||
| bool getPresetName(byte index, String& name); | ||||
|  | ||||
| //remote.cpp | ||||
| void handleRemote(); | ||||
|  | ||||
| //set.cpp | ||||
| bool isAsterisksOnly(const char* str, byte maxLen); | ||||
| void handleSettingsSet(AsyncWebServerRequest *request, byte subPage); | ||||
|   | ||||
							
								
								
									
										1911
									
								
								wled00/html_other.h
									
									
									
									
									
								
							
							
						
						
									
										1911
									
								
								wled00/html_other.h
									
									
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										549
									
								
								wled00/html_pxmagic.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										549
									
								
								wled00/html_pxmagic.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,549 @@ | ||||
| /* | ||||
|  * Binary array for the Web UI. | ||||
|  * gzip is used for smaller size and improved speeds. | ||||
|  *  | ||||
|  * Please see https://kno.wled.ge/advanced/custom-features/#changing-web-ui | ||||
|  * to find out how to easily modify the web UI source! | ||||
|  */ | ||||
|   | ||||
| // Autogenerated from wled00/data/pxmagic/pxmagic.htm, do not edit!! | ||||
| const uint16_t PAGE_pxmagic_L = 8581; | ||||
| const uint8_t PAGE_pxmagic[] PROGMEM = { | ||||
|   0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0a, 0xbd, 0x7d, 0xdb, 0x76, 0xdb, 0x46, | ||||
|   0xb2, 0xe8, 0x3b, 0xbf, 0x02, 0x86, 0x3d, 0x0e, 0x61, 0x81, 0x20, 0xa9, 0x5b, 0x14, 0x50, 0x90, | ||||
|   0x26, 0xb1, 0x9d, 0x89, 0xf7, 0xf2, 0x24, 0x39, 0xb1, 0x66, 0xf6, 0x64, 0x69, 0x6b, 0xc5, 0x4d, | ||||
|   0xa2, 0x49, 0x22, 0x06, 0xd1, 0x1c, 0x00, 0xd4, 0x25, 0x14, 0x3e, 0xe8, 0x3c, 0x9f, 0x4f, 0xd8, | ||||
|   0x3f, 0x76, 0xaa, 0xaa, 0xbb, 0x81, 0xc6, 0x85, 0xb2, 0x14, 0xef, 0xb5, 0x3d, 0x33, 0x02, 0xd0, | ||||
|   0xe8, 0x4b, 0x75, 0xdd, 0xab, 0xba, 0xc0, 0x39, 0x7d, 0xf6, 0xe6, 0xa7, 0xd7, 0x17, 0xbf, 0xfe, | ||||
|   0xfc, 0xd6, 0x5a, 0xe6, 0xab, 0xf8, 0xcc, 0x3a, 0xc5, 0x8b, 0x15, 0xb3, 0x64, 0x11, 0xd8, 0x3c, | ||||
|   0xb1, 0xb1, 0x81, 0xb3, 0x10, 0x2e, 0x2b, 0x9e, 0x33, 0x6b, 0xb6, 0x64, 0x69, 0xc6, 0xf3, 0xc0, | ||||
|   0xfe, 0xc7, 0xc5, 0xf7, 0x83, 0x13, 0x5b, 0x37, 0xf7, 0x12, 0xb6, 0xe2, 0x81, 0x7d, 0x1d, 0xf1, | ||||
|   0x9b, 0xb5, 0x48, 0x73, 0xdb, 0x9a, 0x89, 0x24, 0xe7, 0x09, 0xf4, 0xbb, 0x89, 0xc2, 0x7c, 0x19, | ||||
|   0x84, 0xfc, 0x3a, 0x9a, 0xf1, 0x01, 0x3d, 0xb8, 0x51, 0x12, 0xe5, 0x11, 0x8b, 0x07, 0xd9, 0x8c, | ||||
|   0xc5, 0x3c, 0x18, 0x37, 0x27, 0x61, 0x9b, 0x7c, 0x29, 0x52, 0x63, 0x8a, 0xbf, 0xb2, 0xdf, 0x45, | ||||
|   0xce, 0x92, 0x19, 0x76, 0xcc, 0xa3, 0x3c, 0xe6, 0x67, 0x3f, 0x47, 0xb7, 0x3c, 0xb6, 0xfe, 0xce, | ||||
|   0x16, 0xd1, 0xcc, 0xba, 0x10, 0x22, 0x3e, 0x1d, 0xca, 0x76, 0xeb, 0x34, 0xcb, 0xef, 0xe0, 0xda, | ||||
|   0xf3, 0x53, 0x21, 0xf2, 0xed, 0x60, 0x20, 0xae, 0x79, 0x1a, 0xb3, 0x3b, 0x3f, 0x5d, 0x4c, 0x59, | ||||
|   0x7f, 0xe4, 0x5a, 0xea, 0xbf, 0xde, 0x91, 0x33, 0x19, 0x0c, 0xa6, 0x6c, 0xf6, 0x69, 0x91, 0x8a, | ||||
|   0x4d, 0x12, 0xfa, 0xcf, 0xc7, 0xe3, 0x31, 0xb4, 0xe4, 0xfc, 0x36, 0xf7, 0x9f, 0x4f, 0xa7, 0x53, | ||||
|   0xb8, 0x5f, 0xa4, 0xec, 0x6e, 0x10, 0xb2, 0xf4, 0x93, 0xff, 0x7c, 0x7f, 0x7f, 0x5f, 0x37, 0xac, | ||||
|   0x78, 0x18, 0x6d, 0x56, 0xfe, 0xf3, 0x83, 0x83, 0x03, 0xdd, 0x14, 0x47, 0x8b, 0x25, 0x8c, 0xe2, | ||||
|   0xf4, 0x0f, 0xa7, 0x8d, 0x37, 0x5c, 0x0f, 0x3c, 0x39, 0x3c, 0x38, 0xda, 0xd7, 0x6d, 0xe5, 0xd8, | ||||
|   0xe9, 0xd7, 0xa3, 0x93, 0xa9, 0x6e, 0x55, 0xc3, 0x0f, 0x4f, 0x18, 0xb4, 0x64, 0x9b, 0xd9, 0x8c, | ||||
|   0x67, 0x99, 0x1a, 0x3e, 0x3a, 0x38, 0x3c, 0x1c, 0xcd, 0x8c, 0x66, 0x3d, 0xc3, 0xd1, 0xe1, 0xc9, | ||||
|   0x6c, 0x7f, 0x6e, 0xbc, 0x50, 0x93, 0x9c, 0xb0, 0xd9, 0x37, 0xfb, 0xc7, 0xd0, 0xce, 0xd3, 0x54, | ||||
|   0xa4, 0x6a, 0x16, 0x76, 0x32, 0x62, 0x23, 0x56, 0x36, 0xea, 0x39, 0xb0, 0xe7, 0xfe, 0xb4, 0x6c, | ||||
|   0x56, 0x33, 0xcc, 0xe7, 0x47, 0xdf, 0x1c, 0xe1, 0x2e, 0x6e, 0x58, 0x9a, 0x44, 0xc9, 0x42, 0xcd, | ||||
|   0x11, 0xc2, 0x72, 0xa3, 0x7d, 0xa3, 0x59, 0xcf, 0xc2, 0x4f, 0x8e, 0xc2, 0xd1, 0xa1, 0xf1, 0x42, | ||||
|   0xcf, 0x03, 0x10, 0x8e, 0x8e, 0x0b, 0xdf, 0xcf, 0x78, 0xcc, 0x67, 0x79, 0x24, 0x92, 0xad, 0x81, | ||||
|   0xee, 0x6b, 0x96, 0xf6, 0xcd, 0xed, 0x3b, 0xc5, 0xab, 0xed, 0x1c, 0xc8, 0x3d, 0x98, 0xb3, 0x55, | ||||
|   0x14, 0xdf, 0xf9, 0x3f, 0xf0, 0xf8, 0x9a, 0xe7, 0xd1, 0x8c, 0xb9, 0xff, 0xe4, 0x69, 0xc8, 0x12, | ||||
|   0xe6, 0x66, 0x2c, 0xc9, 0x06, 0x19, 0x4f, 0xa3, 0xf9, 0x64, 0x2a, 0x6e, 0x07, 0x59, 0xf4, 0x07, | ||||
|   0x2c, 0xe6, 0x4f, 0x45, 0x1a, 0xf2, 0x74, 0x00, 0x2d, 0x93, 0x15, 0x4b, 0x17, 0x51, 0xe2, 0x8f, | ||||
|   0x26, 0x6b, 0x16, 0x86, 0xf8, 0x6e, 0x54, 0x4c, 0x45, 0x78, 0xb7, 0x0d, 0xa3, 0x6c, 0x8d, 0x1c, | ||||
|   0x30, 0x8f, 0xf9, 0xed, 0xe4, 0xf7, 0x4d, 0x96, 0x47, 0xf3, 0xbb, 0x81, 0x62, 0x2d, 0x7f, 0x06, | ||||
|   0x7f, 0x78, 0x3a, 0x61, 0x00, 0x44, 0x32, 0x88, 0x72, 0xbe, 0xca, 0x74, 0xd3, 0x2a, 0x4a, 0x06, | ||||
|   0x4b, 0x4e, 0x7b, 0x19, 0x8f, 0x46, 0xd7, 0xcb, 0x49, 0x1b, 0xfa, 0xb2, 0xc1, 0x29, 0x66, 0x2c, | ||||
|   0xb9, 0x66, 0xd9, 0x96, 0xd8, 0x1b, 0xfb, 0xff, 0xa5, 0x98, 0x8b, 0x74, 0xb5, 0x95, 0x30, 0x01, | ||||
|   0x78, 0x79, 0x2e, 0x56, 0xfe, 0xfe, 0x68, 0x7d, 0x5b, 0x64, 0x2b, 0x16, 0xc7, 0x25, 0x50, 0xd3, | ||||
|   0x58, 0xcc, 0x3e, 0x4d, 0x68, 0xe7, 0x37, 0x72, 0xb1, 0xc3, 0xd1, 0x48, 0x6f, 0x65, 0x7f, 0x7d, | ||||
|   0x6b, 0x8d, 0xac, 0xa3, 0xf5, 0xed, 0x64, 0x26, 0x62, 0x91, 0xaa, 0x65, 0x91, 0x45, 0x1d, 0x39, | ||||
|   0x04, 0x90, 0xc0, 0xfd, 0x31, 0x74, 0x83, 0xd5, 0x04, 0x00, 0x6d, 0xac, 0x5f, 0xa2, 0xc3, 0x02, | ||||
|   0x69, 0x12, 0x16, 0x2e, 0x3d, 0xa9, 0x2f, 0x8a, 0xf3, 0x0c, 0x68, 0xe3, 0x6a, 0xcb, 0x05, 0xdb, | ||||
|   0x52, 0x5b, 0xc8, 0x67, 0x22, 0x65, 0x48, 0x31, 0x3f, 0x11, 0x09, 0xaf, 0x2d, 0x6e, 0x50, 0xac, | ||||
|   0x01, 0x42, 0x6d, 0x13, 0xc7, 0xa3, 0x51, 0xe1, 0x47, 0x59, 0x9f, 0xf9, 0x4b, 0x14, 0x40, 0x97, | ||||
|   0xf9, 0x73, 0x31, 0xdb, 0x64, 0x70, 0x65, 0xc0, 0x0a, 0xd7, 0xdc, 0xd9, 0xb6, 0x26, 0x95, 0xfc, | ||||
|   0xe4, 0x14, 0xde, 0x6a, 0xf0, 0x07, 0x4f, 0xc5, 0x56, 0xc3, 0xff, 0x2c, 0x5a, 0xa1, 0x42, 0x61, | ||||
|   0x49, 0x8e, 0xaf, 0x24, 0x26, 0x1b, 0x78, 0x1d, 0xc3, 0xe6, 0xea, 0xdd, 0x72, 0xb1, 0xd6, 0x7d, | ||||
|   0xe0, 0xb6, 0xd5, 0x01, 0xa9, 0xcf, 0xa2, 0xa4, 0x8e, 0xb0, 0x1a, 0x9f, 0x74, 0x30, 0xc4, 0x0e, | ||||
|   0xd6, 0xc1, 0xee, 0x83, 0x30, 0x4a, 0x25, 0x8f, 0xfb, 0xb0, 0xaf, 0xcd, 0x2a, 0x91, 0x4b, 0x40, | ||||
|   0x07, 0xb5, 0x00, 0xe8, 0xb9, 0x59, 0x1f, 0x57, 0xb1, 0x06, 0xd6, 0x21, 0x00, 0xe3, 0x00, 0x79, | ||||
|   0x6e, 0xa5, 0x32, 0xf4, 0xbf, 0x3e, 0x3e, 0x59, 0x97, 0xdc, 0x4b, 0x2c, 0xe2, 0xa5, 0xe2, 0xa6, | ||||
|   0xce, 0xb6, 0xb4, 0xc8, 0x4d, 0xca, 0xd6, 0x40, 0x11, 0xbc, 0xb4, 0x80, 0xc9, 0xd6, 0x0c, 0xb4, | ||||
|   0xeb, 0x94, 0xe7, 0x37, 0x9c, 0x27, 0xe6, 0x64, 0xc0, 0x40, 0x23, 0x84, 0x06, 0xa1, 0xda, 0xd2, | ||||
|   0x34, 0x53, 0x96, 0x45, 0x99, 0x84, 0xe8, 0x88, 0x00, 0x1a, 0x13, 0x40, 0x6b, 0x91, 0x45, 0xb4, | ||||
|   0x83, 0x94, 0xc7, 0x0c, 0x69, 0x54, 0xc9, 0x11, 0xb2, 0xa0, 0x9e, 0x63, 0x30, 0xdf, 0x00, 0xfb, | ||||
|   0x1a, 0x13, 0x11, 0xee, 0x3e, 0x37, 0x38, 0x66, 0x53, 0xde, 0x64, 0xfa, 0x3a, 0x0d, 0x8f, 0x1a, | ||||
|   0x1c, 0xf4, 0x35, 0x88, 0x41, 0x8b, 0xeb, 0x8b, 0x28, 0x59, 0x6f, 0xf2, 0xcb, 0xfc, 0x6e, 0xcd, | ||||
|   0x83, 0x64, 0xb3, 0x9a, 0xf2, 0xf4, 0xca, 0x35, 0x9a, 0xb0, 0xcf, 0x95, 0x2b, 0xf5, 0x8d, 0x8b, | ||||
|   0x0f, 0x2c, 0xe5, 0xcc, 0x24, 0xb1, 0x06, 0x0a, 0x77, 0x3c, 0x51, 0xaa, 0x23, 0x65, 0xc0, 0x77, | ||||
|   0x99, 0x7f, 0x44, 0x4d, 0xa5, 0x44, 0x0f, 0xcc, 0xb5, 0x0d, 0xbd, 0xef, 0xa8, 0x61, 0xfe, 0x18, | ||||
|   0x50, 0x9b, 0x89, 0x38, 0x0a, 0xad, 0x8e, 0x3e, 0x62, 0x93, 0xc7, 0xc0, 0x5e, 0x7e, 0x7d, 0x0b, | ||||
|   0x95, 0xad, 0xa8, 0xc9, 0xce, 0x21, 0xe0, 0xc7, 0xd8, 0x04, 0x8d, 0xb8, 0x52, 0x50, 0x1f, 0xa0, | ||||
|   0x60, 0x29, 0x2d, 0x44, 0xf7, 0xb3, 0x4d, 0x9a, 0xc1, 0x84, 0x6b, 0x11, 0x11, 0xf3, 0x55, 0x58, | ||||
|   0x06, 0x78, 0xaa, 0x65, 0x0b, 0x8f, 0x26, 0x1c, 0xe0, 0x5e, 0xd6, 0x7f, 0x52, 0x01, 0xd6, 0xe6, | ||||
|   0xb0, 0xe8, 0x1e, 0x98, 0x2f, 0xef, 0x4b, 0x28, 0x53, 0xf0, 0x0e, 0xf8, 0x95, 0xb3, 0xad, 0x23, | ||||
|   0xf1, 0x44, 0xf2, 0x9b, 0x75, 0x82, 0xfc, 0x62, 0x0e, 0x57, 0x0f, 0x21, 0xcf, 0x66, 0x69, 0xb4, | ||||
|   0x26, 0x63, 0xa0, 0x36, 0x78, 0x62, 0x6c, 0x10, 0xef, 0x4d, 0x12, 0x59, 0x1d, 0xf8, 0x43, 0x6b, | ||||
|   0xe4, 0xb4, 0x75, 0xb1, 0x89, 0xdb, 0x3a, 0x4c, 0xc4, 0x80, 0xf4, 0xbf, 0xd1, 0x83, 0xb4, 0xab, | ||||
|   0x0f, 0x8e, 0xf9, 0x3c, 0x07, 0xf2, 0xb5, 0x74, 0x64, 0x83, 0x70, 0x13, 0xc4, 0x77, 0x69, 0x26, | ||||
|   0x8e, 0x3b, 0xb4, 0x60, 0x1d, 0x0d, 0xd9, 0xbf, 0x37, 0xc0, 0x93, 0x6d, 0xac, 0x55, 0xca, 0x49, | ||||
|   0x8b, 0x05, 0x01, 0x80, 0x48, 0x28, 0x4a, 0x46, 0x4e, 0x39, 0xad, 0x0b, 0xfa, 0x14, 0x0d, 0x63, | ||||
|   0x6c, 0x5a, 0xa8, 0xfd, 0x51, 0x9b, 0xa3, 0x89, 0x08, 0xa0, 0x74, 0x41, 0xba, 0x06, 0x52, 0x26, | ||||
|   0xb6, 0x2d, 0x31, 0x6d, 0x74, 0xb0, 0x54, 0x3f, 0xb6, 0x5e, 0x73, 0x06, 0x24, 0x9e, 0x71, 0x69, | ||||
|   0x01, 0x60, 0x43, 0xd3, 0x4f, 0x11, 0x60, 0xa2, 0xd9, 0xbe, 0x12, 0x7f, 0xb4, 0x1a, 0x0d, 0x21, | ||||
|   0x8a, 0x56, 0x6c, 0xa1, 0x5a, 0x15, 0x5d, 0x07, 0xa9, 0x82, 0xb7, 0xc5, 0xcb, 0x4d, 0x50, 0x48, | ||||
|   0x65, 0xf8, 0x3e, 0x9b, 0xa3, 0x5d, 0xd3, 0xdc, 0x6a, 0xdb, 0x95, 0xaa, 0x61, 0x53, 0xa0, 0xe1, | ||||
|   0x26, 0xe7, 0x13, 0xd4, 0xf0, 0xa5, 0x3a, 0xdb, 0xb3, 0x8e, 0x51, 0x9b, 0xa5, 0x15, 0x45, 0x72, | ||||
|   0x80, 0x2d, 0x43, 0x6b, 0x0c, 0x2e, 0x61, 0xce, 0x72, 0xde, 0x1f, 0x1f, 0x1c, 0x85, 0x7c, 0xe1, | ||||
|   0x4c, 0x24, 0x07, 0x1e, 0x57, 0x0c, 0x78, 0x5c, 0xe1, 0x10, 0xe7, 0xdc, 0xff, 0x3c, 0x9b, 0xa8, | ||||
|   0xdd, 0x3c, 0xd0, 0x51, 0xed, 0x6e, 0xc0, 0xaf, 0x01, 0xfe, 0x8c, 0x70, 0x51, 0x78, 0x61, 0x2a, | ||||
|   0xd6, 0x7f, 0xc0, 0x9d, 0xa9, 0x9b, 0x0c, 0xde, 0x0c, 0x59, 0xb6, 0xe4, 0x9d, 0xab, 0x3e, 0xa0, | ||||
|   0x9f, 0xa4, 0x60, 0xec, 0xd2, 0x37, 0x6d, 0x46, 0xd6, 0x82, 0x86, 0xe6, 0xc8, 0x1a, 0x77, 0xb2, | ||||
|   0x4f, 0xd3, 0x8e, 0x48, 0x54, 0x2a, 0xec, 0xc7, 0xb1, 0xe5, 0x1d, 0x65, 0x16, 0x67, 0x19, 0x1f, | ||||
|   0x00, 0x23, 0x82, 0xee, 0xa9, 0xf6, 0x25, 0xad, 0xfe, 0xb6, 0xa1, 0xac, 0x3e, 0x2b, 0xcb, 0x83, | ||||
|   0x5d, 0xd0, 0x2b, 0xc8, 0xba, 0x27, 0xa8, 0x96, 0x85, 0x1b, 0xb6, 0xa0, 0x95, 0x1f, 0xa1, 0xc8, | ||||
|   0xc1, 0xca, 0xa2, 0x0e, 0x1b, 0x64, 0x40, 0x37, 0x18, 0xf1, 0x00, 0x17, 0xef, 0x82, 0x4a, 0x71, | ||||
|   0x0d, 0x22, 0xaa, 0x45, 0x47, 0x8d, 0x45, 0x42, 0x6c, 0x65, 0x0e, 0x14, 0x42, 0x91, 0x2f, 0xd1, | ||||
|   0x2c, 0x9b, 0x10, 0xf8, 0xbe, 0x96, 0x32, 0xf9, 0x3c, 0xc8, 0x97, 0x60, 0xe1, 0x5a, 0x70, 0x99, | ||||
|   0xba, 0x46, 0xad, 0x7a, 0xfc, 0x19, 0xcb, 0xa5, 0xd0, 0xdc, 0x30, 0x77, 0x7f, 0x69, 0xda, 0x12, | ||||
|   0xc5, 0x80, 0x00, 0x56, 0x76, 0x13, 0xe5, 0xb3, 0x65, 0x5b, 0x5b, 0x94, 0x2e, 0x52, 0x94, 0x90, | ||||
|   0xde, 0x93, 0x76, 0xbc, 0xad, 0xc8, 0xa5, 0x13, 0x23, 0x67, 0x91, 0x96, 0x63, 0x5b, 0xa1, 0x40, | ||||
|   0xcf, 0x21, 0x25, 0x41, 0x76, 0xd2, 0x44, 0x68, 0xcb, 0x76, 0x03, 0x46, 0x14, 0xcb, 0xd1, 0x44, | ||||
|   0x29, 0x67, 0x29, 0x7c, 0xa8, 0xd5, 0xc9, 0x83, 0x18, 0x3d, 0xc1, 0x7c, 0x6b, 0x34, 0x1c, 0x1c, | ||||
|   0x6a, 0x05, 0x21, 0xd7, 0xf5, 0x0e, 0xb3, 0x06, 0x4c, 0xfe, 0x94, 0x83, 0xee, 0xe0, 0x5d, 0xa0, | ||||
|   0x55, 0x3a, 0x49, 0x13, 0xe5, 0xb0, 0x22, 0x0a, 0x19, 0x07, 0x84, 0xf3, 0x80, 0x24, 0x8b, 0x20, | ||||
|   0x3c, 0xe8, 0x22, 0x14, 0x04, 0x5c, 0xf3, 0x0e, 0xe2, 0x34, 0x80, 0x92, 0xf6, 0x77, 0xb6, 0xe4, | ||||
|   0xb3, 0x4f, 0x3c, 0xdc, 0x6b, 0xa0, 0x6d, 0xc7, 0xbe, 0xcd, 0xe8, 0x4a, 0x8e, 0x27, 0x27, 0xbc, | ||||
|   0x35, 0x1a, 0xa3, 0xa9, 0x25, 0x0b, 0xc5, 0x8d, 0x8f, 0xb6, 0x1b, 0x15, 0xd0, 0xae, 0xf1, 0xdd, | ||||
|   0xeb, 0x6b, 0x14, 0x55, 0x8a, 0x96, 0xee, 0x80, 0x67, 0xf8, 0xbf, 0xfa, 0x63, 0xe0, 0x0b, 0xa7, | ||||
|   0x78, 0x9e, 0x0b, 0x96, 0xe5, 0x83, 0xca, 0xef, 0x2e, 0xd1, 0x39, 0x87, 0x40, 0x3e, 0x9c, 0x18, | ||||
|   0x01, 0xd2, 0xc4, 0xb0, 0x10, 0x7f, 0x80, 0x66, 0x09, 0xf9, 0xad, 0xff, 0x0d, 0xfc, 0x2b, 0x3c, | ||||
|   0x9a, 0x63, 0xfb, 0x39, 0x37, 0x5d, 0xe2, 0x1f, 0x83, 0x9e, 0x52, 0xc5, 0xa1, 0xb4, 0x51, 0x88, | ||||
|   0xa2, 0xc5, 0x4f, 0xeb, 0xb3, 0xb6, 0xc6, 0xeb, 0xd8, 0xc3, 0xaf, 0xfd, 0x03, 0x72, 0x90, 0x05, | ||||
|   0xb8, 0xd8, 0x51, 0x7e, 0x07, 0x7c, 0x76, 0x1d, 0x65, 0xd1, 0x34, 0x8a, 0xf1, 0x61, 0x19, 0x85, | ||||
|   0x21, 0x4f, 0x14, 0x6c, 0x96, 0xbc, 0x0c, 0x28, 0xec, 0xd4, 0x8b, 0x93, 0x4f, 0xd4, 0x74, 0x0b, | ||||
|   0x3a, 0x02, 0xba, 0x98, 0xe7, 0x68, 0x27, 0xd0, 0x91, 0xc7, 0x61, 0x1e, 0xf9, 0xdc, 0x34, 0x9f, | ||||
|   0xa7, 0x62, 0xfc, 0x5d, 0x74, 0xae, 0xe7, 0x06, 0x1c, 0x3d, 0x8a, 0xa2, 0xfa, 0x5d, 0x63, 0x8c, | ||||
|   0x90, 0xbf, 0x1c, 0xa0, 0x02, 0xf8, 0x5d, 0x43, 0x6a, 0xf1, 0xbd, 0x1e, 0x34, 0x58, 0xa7, 0x62, | ||||
|   0x91, 0x22, 0x70, 0x6d, 0x01, 0x21, 0xf6, 0x3f, 0xac, 0xd8, 0xbf, 0x92, 0x0e, 0x33, 0x1c, 0x42, | ||||
|   0xfe, 0x28, 0x3d, 0xc0, 0x1a, 0x05, 0x28, 0x3b, 0xf4, 0xaf, 0xfe, 0xc8, 0xa9, 0xda, 0x06, 0x02, | ||||
|   0xb8, 0x03, 0x28, 0x88, 0x53, 0x37, 0xa8, 0x17, 0x25, 0x4b, 0x9e, 0x46, 0x79, 0x03, 0x67, 0x56, | ||||
|   0x13, 0x4c, 0xc3, 0x73, 0x44, 0x85, 0xc4, 0x52, 0x54, 0x0f, 0x61, 0x04, 0xbc, 0xd3, 0x87, 0x30, | ||||
|   0x99, 0x78, 0xcf, 0xad, 0xa3, 0x55, 0xee, 0xd7, 0xed, 0xc4, 0x75, 0x1d, 0xd9, 0x5f, 0xb0, 0x98, | ||||
|   0x49, 0x8f, 0x5a, 0x53, 0x73, 0x21, 0x45, 0x85, 0x2f, 0x58, 0xaa, 0x4e, 0xc7, 0x46, 0x63, 0xb5, | ||||
|   0x1c, 0xe6, 0xfc, 0x40, 0x50, 0xdb, 0x61, 0x68, 0x33, 0xd6, 0xed, 0x12, 0xc2, 0x2a, 0x2e, 0x19, | ||||
|   0x59, 0xd2, 0x1a, 0xc8, 0xe9, 0x2c, 0x6f, 0x0a, 0xa4, 0x0c, 0xeb, 0x79, 0x0a, 0x1d, 0x08, 0x4b, | ||||
|   0x27, 0xb6, 0xca, 0xb9, 0xfc, 0xa5, 0x91, 0xb0, 0xa8, 0x6c, 0x48, 0x65, 0xaa, 0x66, 0x0c, 0xf6, | ||||
|   0x9c, 0x19, 0xb1, 0x25, 0xc1, 0x69, 0xce, 0x61, 0x2c, 0xd5, 0x72, 0x38, 0xd5, 0x60, 0x2b, 0x5a, | ||||
|   0x2d, 0x1a, 0xc1, 0xa9, 0x31, 0xca, 0x9c, 0x4c, 0x39, 0xe7, 0x86, 0x8a, 0x6a, 0x83, 0x82, 0xb3, | ||||
|   0xf9, 0x31, 0xa9, 0xbb, 0x65, 0x14, 0x87, 0xdb, 0xda, 0x18, 0xe8, 0x37, 0xdd, 0x80, 0x34, 0x24, | ||||
|   0x1d, 0xae, 0xdf, 0xa8, 0x1e, 0xfc, 0xa0, 0xe6, 0xec, 0x0a, 0x52, 0xdb, 0xaa, 0xa3, 0x61, 0x24, | ||||
|   0xcb, 0xcc, 0xcf, 0x48, 0xf9, 0x75, 0x9d, 0xc1, 0xd2, 0x63, 0xe2, 0x59, 0xe9, 0x39, 0x3c, 0xec, | ||||
|   0xf5, 0x35, 0x23, 0xa2, 0x56, 0x00, 0x24, 0xf7, 0xab, 0x5c, 0xc2, 0x6e, 0x58, 0x4c, 0x0f, 0xe5, | ||||
|   0xc1, 0xc8, 0xba, 0x9c, 0xad, 0x8d, 0x5f, 0xed, 0x05, 0xe8, 0x2e, 0xd9, 0x63, 0x58, 0xd7, 0xc8, | ||||
|   0xd7, 0x3d, 0x57, 0x99, 0xe2, 0xa6, 0x69, 0xaa, 0xb9, 0x1c, 0x3b, 0xd8, 0x62, 0x87, 0xc6, 0x54, | ||||
|   0x33, 0x3a, 0x75, 0x9f, 0x47, 0x2f, 0xe4, 0xc5, 0x82, 0x11, 0xb5, 0xdb, 0x31, 0x4e, 0x9d, 0x17, | ||||
|   0x3f, 0x13, 0xf1, 0x0c, 0xac, 0xf1, 0x37, 0xa8, 0x43, 0x09, 0xc4, 0x56, 0xab, 0x12, 0x2d, 0x23, | ||||
|   0xca, 0xd9, 0xaf, 0xc2, 0x1c, 0xb2, 0x8c, 0x9f, 0x09, 0x71, 0x60, 0xad, 0xc7, 0xbb, 0x94, 0x2c, | ||||
|   0x81, 0x90, 0x8f, 0x60, 0xcd, 0xd6, 0x51, 0x62, 0x8d, 0x33, 0x4b, 0x2a, 0x23, 0xf0, 0x02, 0xe7, | ||||
|   0x98, 0xf4, 0x87, 0xdd, 0x03, 0x05, 0x20, 0x98, 0xcd, 0x79, 0xf8, 0x0e, 0x83, 0xc3, 0x6d, 0x2d, | ||||
|   0xc4, 0xc0, 0x68, 0xf9, 0x1a, 0xd4, 0x49, 0xb8, 0xdd, 0xc1, 0x0b, 0x55, 0x56, 0xdb, 0x31, 0xf3, | ||||
|   0x79, 0x5a, 0x55, 0x66, 0x19, 0x4e, 0x59, 0xc7, 0x5e, 0xdb, 0xea, 0x49, 0xe0, 0xcb, 0xf8, 0xa7, | ||||
|   0xd3, 0x3e, 0x37, 0xd2, 0xab, 0x7f, 0x45, 0xfe, 0x63, 0x56, 0xdf, 0xcc, 0xda, 0x7d, 0x0d, 0xe8, | ||||
|   0xdd, 0x6a, 0x35, 0xa9, 0xc3, 0xdb, 0x8a, 0x0b, 0x31, 0x87, 0x57, 0xa5, 0xed, 0x28, 0x69, 0xd7, | ||||
|   0xcd, 0x83, 0x5a, 0x5c, 0x75, 0x86, 0xcd, 0x7d, 0x30, 0xd3, 0xd6, 0x0c, 0xc9, 0xaa, 0x64, 0x77, | ||||
|   0xf1, 0xd7, 0x4f, 0xfc, 0x6e, 0x9e, 0x32, 0x40, 0x83, 0x85, 0xd8, 0xdf, 0xe6, 0x62, 0xdb, 0x8a, | ||||
|   0x7d, 0x0f, 0x8e, 0x47, 0x18, 0xfb, 0xd6, 0x3a, 0x97, 0x36, 0xa4, 0x36, 0x40, 0x59, 0xdf, 0x71, | ||||
|   0xbd, 0xef, 0x1c, 0x76, 0xfb, 0x2e, 0xd9, 0x1e, 0xfd, 0x65, 0xab, 0xdd, 0xa1, 0xb1, 0xe9, 0x0e, | ||||
|   0xd1, 0x6d, 0xcc, 0xbb, 0xdd, 0xa8, 0x91, 0x53, 0x7c, 0x53, 0x1b, 0xb8, 0xab, 0x57, 0xd1, 0x3b, | ||||
|   0x1d, 0xca, 0x63, 0x1c, 0xeb, 0x74, 0xa8, 0xce, 0x9e, 0xd0, 0xa7, 0x82, 0x4b, 0x18, 0x5d, 0x5b, | ||||
|   0x33, 0x10, 0xfe, 0x2c, 0xb0, 0x4b, 0x67, 0xd2, 0x6e, 0xb7, 0x83, 0x1c, 0x61, 0x2b, 0xce, 0x6d, | ||||
|   0xf5, 0xa2, 0x30, 0xb0, 0xf1, 0xee, 0x6f, 0x1c, 0x3a, 0xc3, 0x1a, 0xb6, 0x95, 0x08, 0xe2, 0x32, | ||||
|   0xb8, 0xaf, 0x0f, 0x95, 0xc4, 0xc4, 0x91, 0xd9, 0xf5, 0x42, 0x37, 0x92, 0xc5, 0xb2, 0xad, 0xde, | ||||
|   0xed, 0x2a, 0x4e, 0xb0, 0x4f, 0x9e, 0xaf, 0xfd, 0xe1, 0xf0, 0xe6, 0xe6, 0xc6, 0xbb, 0x39, 0xf0, | ||||
|   0x44, 0xba, 0x18, 0x82, 0xdd, 0x1a, 0x0d, 0x61, 0x80, 0x6d, 0xc9, 0xa3, 0x2e, 0x1b, 0x1a, 0x6c, | ||||
|   0x4b, 0x4a, 0x5b, 0x60, 0x8f, 0x0f, 0xe0, 0xa1, 0x87, 0xe7, 0x62, 0xdf, 0x89, 0xdb, 0xc0, 0x96, | ||||
|   0x16, 0x11, 0x34, 0x33, 0x34, 0x9f, 0x9d, 0x52, 0x82, 0x64, 0xe7, 0xb0, 0xe1, 0xd9, 0x29, 0xce, | ||||
|   0x8b, 0x58, 0x00, 0x20, 0x15, 0xa8, 0x3d, 0x05, 0x16, 0xf0, 0x57, 0x6b, 0xe3, 0xc8, 0x36, 0xb6, | ||||
|   0x65, 0xec, 0x8d, 0x92, 0x28, 0x16, 0x6c, 0x1e, 0xe0, 0x16, 0x59, 0x8e, 0xc7, 0x6b, 0xf6, 0xd9, | ||||
|   0x0f, 0xea, 0x0e, 0xb0, 0x4c, 0xef, 0xa1, 0x1f, 0xb9, 0xf7, 0x16, 0x65, 0xf6, 0x6c, 0xb4, 0x29, | ||||
|   0x80, 0x22, 0x3a, 0x89, 0x2b, 0x07, 0x59, 0x88, 0xc4, 0xea, 0x29, 0xe5, 0xff, 0xde, 0x00, 0x1f, | ||||
|   0x87, 0xdd, 0xa0, 0x3d, 0x0c, 0x88, 0x04, 0xe2, 0x67, 0xe0, 0x38, 0x9e, 0x5b, 0x3f, 0xc2, 0x43, | ||||
|   0x13, 0x8c, 0x5e, 0x1b, 0x8e, 0x0a, 0x06, 0x79, 0x07, 0x33, 0x6f, 0xa0, 0xf9, 0x47, 0x7e, 0x63, | ||||
|   0xc9, 0x89, 0xba, 0x40, 0x92, 0x97, 0x9e, 0x89, 0xa2, 0x47, 0x21, 0xcd, 0x7c, 0x6b, 0xa6, 0xa4, | ||||
|   0x6c, 0x9c, 0xcc, 0xd8, 0xc8, 0x9a, 0xa1, 0xc7, 0x9e, 0xc0, 0x5e, 0xe4, 0x4d, 0xb5, 0x0f, 0x95, | ||||
|   0xc2, 0x92, 0xb0, 0xeb, 0x6e, 0x04, 0x7e, 0xf9, 0xd0, 0x33, 0xe0, 0x15, 0x94, 0x11, 0x95, 0x9b, | ||||
|   0x3a, 0xfb, 0x20, 0xc7, 0xe2, 0x41, 0xab, 0x88, 0x66, 0x80, 0x1c, 0xf9, 0xb6, 0xd1, 0x0d, 0x18, | ||||
|   0x04, 0xe6, 0xa0, 0x33, 0xcf, 0xc0, 0xbe, 0xfc, 0x6a, 0x4e, 0xff, 0xbe, 0xba, 0xb2, 0x55, 0x06, | ||||
|   0x8f, 0xc3, 0x52, 0xfa, 0x0e, 0xc0, 0x7e, 0x97, 0xc0, 0x9e, 0xa2, 0x70, 0xc3, 0x62, 0x6b, 0xe7, | ||||
|   0x7c, 0xfb, 0xc6, 0x7c, 0x23, 0xd7, 0xaa, 0xa6, 0x3c, 0x7b, 0x87, 0x31, 0xd8, 0xce, 0x71, 0x07, | ||||
|   0xb6, 0x65, 0x0c, 0x3b, 0xaa, 0x8d, 0xec, 0xfd, 0x82, 0x09, 0x0e, 0x63, 0xe8, 0x50, 0x02, 0xd5, | ||||
|   0xa4, 0xd1, 0x23, 0x08, 0xd2, 0xdb, 0x41, 0x11, 0x93, 0x20, 0xe0, 0x8d, 0x00, 0xff, 0xd8, 0x67, | ||||
|   0x3f, 0xd1, 0x75, 0x07, 0x39, 0x54, 0x27, 0xa9, 0x16, 0xf4, 0xc3, 0x9f, 0x26, 0x46, 0x4f, 0x61, | ||||
|   0xe1, 0xf7, 0x4c, 0x24, 0xdd, 0xc8, 0xff, 0xcf, 0xf7, 0x6f, 0xdf, 0x58, 0xff, 0xf1, 0xe1, 0xa7, | ||||
|   0x1f, 0x77, 0x62, 0x70, 0xc9, 0x00, 0x53, 0x3f, 0x88, 0x15, 0xb7, 0xbe, 0xcd, 0x40, 0xcf, 0xa3, | ||||
|   0x49, 0xdb, 0xd9, 0x17, 0x5c, 0xbd, 0xd8, 0x3e, 0x7b, 0xfd, 0x8f, 0x5f, 0xde, 0x3f, 0x80, 0xd5, | ||||
|   0xde, 0x6e, 0xec, 0x82, 0x00, 0x58, 0x7a, 0xd3, 0xa4, 0x62, 0x03, 0xdb, 0x74, 0x4e, 0x76, 0x08, | ||||
|   0x47, 0xaf, 0x5b, 0x92, 0xe5, 0x99, 0xbe, 0x7d, 0xf6, 0x86, 0xae, 0x9f, 0xd7, 0x26, 0xaa, 0xbf, | ||||
|   0x44, 0xbd, 0x7e, 0xe8, 0x56, 0x25, 0x9f, 0xd3, 0x24, 0x3d, 0x02, 0x60, 0x93, 0x44, 0xff, 0xde, | ||||
|   0xf0, 0x77, 0x80, 0xe5, 0x7f, 0xd0, 0x9d, 0xf5, 0x2e, 0xfc, 0x3c, 0x14, 0xe5, 0x20, 0x09, 0x47, | ||||
|   0xf5, 0xf8, 0x25, 0x90, 0xcc, 0x53, 0x08, 0xb5, 0xc2, 0xf8, 0xee, 0x47, 0x52, 0x6e, 0xdf, 0xab, | ||||
|   0xa7, 0x4e, 0xf5, 0xd6, 0x86, 0xa8, 0x36, 0x58, 0xd9, 0xab, 0x5a, 0xd3, 0x2e, 0xdd, 0xf6, 0x38, | ||||
|   0xd5, 0xd6, 0x7b, 0x9c, 0x6e, 0x33, 0x29, 0x9b, 0xf1, 0xc5, 0x0a, 0xf3, 0xd5, 0x36, 0x48, 0x00, | ||||
|   0xdd, 0x99, 0x98, 0xed, 0xd5, 0x05, 0xaa, 0xec, 0x4b, 0x0a, 0xae, 0x1a, 0xd9, 0x64, 0x5d, 0x30, | ||||
|   0x6e, 0x00, 0x04, 0x1b, 0x28, 0x6b, 0x37, 0x3e, 0x06, 0xc8, 0xa8, 0xa1, 0x34, 0x79, 0xc7, 0x30, | ||||
|   0x48, 0xaf, 0x37, 0xb2, 0x1e, 0xa9, 0x36, 0x1e, 0x67, 0x74, 0xa6, 0x14, 0x7e, 0x25, 0xe0, 0xe5, | ||||
|   0xd8, 0x67, 0xdf, 0x95, 0xf7, 0x15, 0x69, 0xcc, 0x99, 0x8c, 0x13, 0x1b, 0xbb, 0x41, 0x35, 0x4a, | ||||
|   0xd8, 0x6a, 0xb2, 0x19, 0x73, 0xd2, 0xd6, 0xcd, 0xe7, 0xde, 0x2a, 0x4a, 0x68, 0xcb, 0xe0, 0x31, | ||||
|   0x82, 0x6e, 0x3d, 0x3a, 0x2a, 0x6d, 0xd6, 0x78, 0xff, 0xc4, 0x2e, 0x69, 0x66, 0xe4, 0x7f, 0xed, | ||||
|   0x4e, 0x06, 0xe9, 0xd5, 0x27, 0xfe, 0x27, 0xce, 0x51, 0x0e, 0x6f, 0x1d, 0xaa, 0x59, 0xf2, 0x7c, | ||||
|   0xa9, 0xb6, 0x56, 0x03, 0x69, 0xbd, 0xa7, 0xf1, 0x4e, 0x37, 0x36, 0x4b, 0x37, 0x1f, 0x14, 0xd7, | ||||
|   0xb7, 0xfa, 0xbe, 0x42, 0xa6, 0xec, 0xa9, 0x66, 0x92, 0xa9, 0xc2, 0xe6, 0xee, 0x28, 0x93, 0x38, | ||||
|   0x15, 0xb7, 0x76, 0x59, 0xf3, 0x53, 0x4e, 0x49, 0xb8, 0x34, 0x56, 0x00, 0xfd, 0xbd, 0x66, 0x49, | ||||
|   0x7d, 0xba, 0x12, 0x67, 0xc0, 0x1a, 0xf0, 0x12, 0x37, 0x57, 0x32, 0xe7, 0x13, 0x64, 0x97, 0x36, | ||||
|   0x43, 0xbe, 0xe7, 0x1a, 0xd0, 0x96, 0xe4, 0x14, 0x92, 0xc0, 0x9e, 0x2e, 0xaa, 0x26, 0x8b, 0xda, | ||||
|   0xbe, 0x6c, 0x6f, 0xad, 0x15, 0x68, 0x8b, 0xed, 0x75, 0x1f, 0xdc, 0x69, 0xaf, 0xb5, 0xd5, 0x27, | ||||
|   0xef, 0x54, 0x1e, 0x20, 0xea, 0x4d, 0xfe, 0x42, 0x4f, 0xff, 0x13, 0xfb, 0x33, 0xe7, 0xa5, 0xad, | ||||
|   0xd5, 0x16, 0x7a, 0x14, 0xfd, 0x7a, 0xad, 0x5d, 0x75, 0xdb, 0xae, 0xda, 0x52, 0x0f, 0x18, 0xb0, | ||||
|   0xc7, 0x69, 0x05, 0x52, 0x45, 0x60, 0xa2, 0xf1, 0xd2, 0xad, 0xa6, 0x65, 0x95, 0x41, 0xb9, 0x53, | ||||
|   0x39, 0x80, 0xf6, 0xa8, 0x6e, 0xb5, 0xa4, 0x1d, 0xdb, 0x7f, 0xc6, 0x6c, 0x48, 0xd5, 0x07, 0x2e, | ||||
|   0x39, 0x5d, 0x1f, 0x06, 0x41, 0x79, 0xe4, 0x72, 0x84, 0xf4, 0xc7, 0xd5, 0x7d, 0xaf, 0x0b, 0x88, | ||||
|   0x6e, 0xfc, 0x19, 0x62, 0xf6, 0xc5, 0xd8, 0x93, 0x21, 0x21, 0x5a, 0x3b, 0xbc, 0xee, 0xf0, 0xe2, | ||||
|   0xeb, 0xd0, 0xab, 0x21, 0x96, 0x34, 0x71, 0xf2, 0x5e, 0x01, 0x7f, 0xf8, 0x30, 0x02, 0x77, 0xb9, | ||||
|   0x20, 0x9b, 0x54, 0xa9, 0x89, 0x37, 0xea, 0xae, 0xae, 0xd3, 0x3b, 0x55, 0x7a, 0xef, 0x01, 0xfc, | ||||
|   0x96, 0x13, 0x12, 0x8c, 0xd5, 0x93, 0x36, 0x62, 0xde, 0x91, 0xe1, 0xbb, 0x23, 0xa7, 0xcb, 0x3b, | ||||
|   0x50, 0xf4, 0x4a, 0xe1, 0x67, 0x39, 0x5f, 0x63, 0x3f, 0xf0, 0xcf, 0x69, 0x95, 0x95, 0x08, 0xe5, | ||||
|   0x22, 0x3c, 0x8d, 0x66, 0x76, 0xa7, 0xa9, 0x31, 0x34, 0xb8, 0x7d, 0x96, 0xf1, 0x59, 0x83, 0x84, | ||||
|   0x8f, 0xe1, 0xaa, 0x5e, 0x4b, 0xa3, 0x45, 0x72, 0xba, 0x8b, 0xf2, 0xfe, 0x11, 0x88, 0x79, 0x88, | ||||
|   0x74, 0xc6, 0xa4, 0x95, 0xfa, 0x8a, 0x1a, 0xc8, 0xd9, 0xaf, 0x7c, 0x15, 0x13, 0x37, 0xbd, 0x27, | ||||
|   0x21, 0xe7, 0x11, 0xb8, 0xe9, 0x59, 0x9f, 0xc5, 0x11, 0x72, 0x7b, 0x5b, 0xf1, 0x76, 0x33, 0x7d, | ||||
|   0xaf, 0x8d, 0x5c, 0xca, 0xbe, 0xec, 0xe2, 0x7c, 0xca, 0x29, 0x81, 0x1b, 0xbe, 0x14, 0x22, 0xe3, | ||||
|   0x18, 0x1d, 0xe0, 0xb3, 0xe9, 0x1f, 0x61, 0x8d, 0xdf, 0x99, 0xf5, 0x1a, 0x9b, 0xad, 0x7c, 0xc9, | ||||
|   0x72, 0x08, 0xf1, 0xe3, 0x18, 0x50, 0x03, 0x8b, 0xce, 0x38, 0xb4, 0x70, 0xac, 0x53, 0x4d, 0x45, | ||||
|   0xb2, 0x38, 0x33, 0x40, 0xb4, 0xd6, 0x58, 0xd4, 0x9a, 0x61, 0xee, 0x83, 0x5e, 0xf5, 0x00, 0x47, | ||||
|   0xd4, 0x57, 0x66, 0x09, 0xa0, 0x5d, 0x4e, 0x5b, 0x57, 0xc6, 0x04, 0x8a, 0xa2, 0x91, 0x7a, 0x40, | ||||
|   0xf2, 0xa8, 0x5b, 0xad, 0x1a, 0x54, 0x71, 0xaa, 0xfd, 0x67, 0x3c, 0x48, 0x85, 0x8a, 0x3f, 0xe1, | ||||
|   0x46, 0x12, 0xe0, 0xa0, 0x21, 0x08, 0xf9, 0x59, 0x33, 0x20, 0xeb, 0x29, 0xa8, 0x55, 0x2f, 0x02, | ||||
|   0x5b, 0xdf, 0x3f, 0x39, 0x20, 0xeb, 0x35, 0xbc, 0xcd, 0xcd, 0x1a, 0xd3, 0xab, 0x10, 0x18, 0xd0, | ||||
|   0xf5, 0x21, 0x5f, 0x52, 0x62, 0xb5, 0x27, 0x0d, 0x61, 0x66, 0xc9, 0x81, 0x3c, 0xb4, 0x72, 0x61, | ||||
|   0x9d, 0x32, 0xa9, 0xea, 0x63, 0x1e, 0xbe, 0x0d, 0x23, 0xd0, 0xb4, 0xcb, 0x94, 0xcf, 0xcb, 0x14, | ||||
|   0xd0, 0x25, 0xb6, 0x0f, 0xa2, 0xf5, 0xd5, 0x90, 0xd3, 0xcb, 0x5e, 0xce, 0xd2, 0x05, 0x56, 0x46, | ||||
|   0xff, 0x36, 0x8d, 0x59, 0xf2, 0x89, 0x2c, 0x9f, 0xa4, 0x24, 0xc6, 0x80, 0x25, 0x59, 0x61, 0x61, | ||||
|   0x76, 0x66, 0x01, 0x63, 0xc8, 0x95, 0x5a, 0xd4, 0x6d, 0xc4, 0x70, 0x88, 0x6a, 0x52, 0x45, 0xaa, | ||||
|   0xc8, 0xa1, 0xf4, 0xfe, 0xaa, 0x06, 0x4d, 0x98, 0x5d, 0x2a, 0x7d, 0xad, 0x22, 0x2e, 0x35, 0xe0, | ||||
|   0x3d, 0x52, 0x01, 0xda, 0xdf, 0xa4, 0x6c, 0x01, 0x06, 0x21, 0xb4, 0xf0, 0x05, 0xa0, 0x74, 0x1e, | ||||
|   0xc5, 0xdc, 0x5a, 0xf2, 0x94, 0x23, 0x70, 0xb3, 0x38, 0x9a, 0x7d, 0x42, 0x1c, 0x64, 0x1a, 0xe3, | ||||
|   0xf4, 0xfa, 0x74, 0xb8, 0x6e, 0xea, 0x4f, 0x6c, 0xd7, 0x0c, 0x98, 0x89, 0x4d, 0x3a, 0x53, 0x4e, | ||||
|   0x80, 0xbe, 0xef, 0xb1, 0xd9, 0x8c, 0xaf, 0x73, 0x45, 0xdb, 0xe1, 0xef, 0xeb, 0x85, 0xab, 0xef, | ||||
|   0xb8, 0xbe, 0x5d, 0x27, 0xfa, 0x6e, 0x11, 0xcd, 0x77, 0x9a, 0xa6, 0x27, 0x24, 0x74, 0x24, 0xcf, | ||||
|   0x62, 0xde, 0x90, 0x0e, 0x03, 0x14, 0xa8, 0xf2, 0xc1, 0x2e, 0xd5, 0xaf, 0x7e, 0x26, 0x27, 0x3b, | ||||
|   0x4f, 0xca, 0x04, 0xe1, 0x99, 0xa5, 0x6f, 0x61, 0x51, 0xd9, 0xa9, 0x25, 0x38, 0x43, 0x4c, 0x29, | ||||
|   0x6a, 0x75, 0x4e, 0xa9, 0x9d, 0x94, 0x63, 0x96, 0xef, 0x41, 0xc3, 0x2a, 0x9d, 0x23, 0x33, 0x01, | ||||
|   0x8e, 0x2e, 0x90, 0x9c, 0x50, 0xd7, 0x79, 0x19, 0x5e, 0xd5, 0x5a, 0x24, 0x59, 0xe5, 0x52, 0xa9, | ||||
|   0x27, 0xe8, 0x12, 0x8a, 0x24, 0xbe, 0xc3, 0x36, 0x79, 0x87, 0x1a, 0xcc, 0x2a, 0xff, 0x9d, 0x0e, | ||||
|   0xf5, 0x4c, 0x75, 0xc4, 0xa8, 0x63, 0x11, 0x7b, 0xa7, 0xd0, 0x37, 0xac, 0xfe, 0x2e, 0xe4, 0x75, | ||||
|   0xe3, 0xee, 0xb5, 0x58, 0xdf, 0x5d, 0x88, 0xd7, 0x71, 0xb4, 0x9e, 0x0a, 0x96, 0x82, 0xe0, 0xf5, | ||||
|   0x2c, 0x6c, 0x42, 0x0e, 0x2a, 0x1b, 0x3b, 0x90, 0xd9, 0x36, 0x6a, 0x4f, 0xa4, 0xd9, 0x07, 0x76, | ||||
|   0x0d, 0x38, 0xc4, 0xbf, 0x4f, 0x9b, 0xbc, 0xf7, 0x98, 0x4d, 0xbd, 0x11, 0x37, 0x09, 0xca, 0xa8, | ||||
|   0xca, 0x31, 0x82, 0xc8, 0xa8, 0x86, 0xf6, 0x4e, 0x7a, 0x3b, 0x14, 0xaa, 0x14, 0x85, 0x68, 0xb5, | ||||
|   0x89, 0x29, 0xf3, 0xfc, 0x68, 0xa7, 0xeb, 0x61, 0x06, 0x6e, 0x80, 0xdb, 0xd3, 0xc8, 0x50, 0xeb, | ||||
|   0x94, 0xf0, 0xea, 0x86, 0x07, 0xd8, 0xb8, 0xe3, 0xd2, 0x3b, 0x95, 0xe5, 0xe4, 0x67, 0xa8, 0x00, | ||||
|   0x2b, 0x95, 0x97, 0x81, 0xce, 0x5b, 0x44, 0xf9, 0x72, 0x33, 0xf5, 0x66, 0x62, 0x35, 0x54, 0xdf, | ||||
|   0x64, 0x0c, 0xe9, 0x53, 0x0c, 0xfa, 0x12, 0x03, 0x3f, 0xc4, 0xb0, 0xad, 0xa6, 0x16, 0xec, 0x59, | ||||
|   0x7f, 0xa3, 0x41, 0xd6, 0xcb, 0x19, 0x30, 0xc4, 0xc4, 0x6a, 0x7e, 0xba, 0x21, 0xf5, 0x21, 0xca, | ||||
|   0x93, 0x5a, 0xb3, 0xa1, 0xf8, 0x1a, 0xa5, 0x23, 0x14, 0x09, 0xd5, 0x7b, 0xa8, 0x03, 0xb5, 0x4a, | ||||
|   0x94, 0x86, 0xea, 0xb4, 0x40, 0xba, 0x0e, 0x67, 0x3d, 0x18, 0x9c, 0xe5, 0x56, 0x18, 0x84, 0x62, | ||||
|   0xb6, 0xc1, 0xec, 0x82, 0x0b, 0x06, 0x97, 0xad, 0xb2, 0x20, 0xe1, 0x37, 0xd6, 0x3f, 0x7e, 0x79, | ||||
|   0xff, 0x81, 0xb3, 0x74, 0xb6, 0xfc, 0x99, 0xda, 0xfa, 0x37, 0x51, 0x12, 0x8a, 0x1b, 0x2f, 0x16, | ||||
|   0x33, 0xf2, 0xfc, 0xbc, 0x8c, 0x5e, 0x3a, 0x2e, 0x26, 0xbf, 0x03, 0x39, 0xce, 0x83, 0xfd, 0xf5, | ||||
|   0xed, 0x65, 0x62, 0x3b, 0xe7, 0xcd, 0x06, 0xbf, 0x39, 0x1c, 0x87, 0x9d, 0x77, 0x35, 0xfa, 0xe0, | ||||
|   0x06, 0xd1, 0x7f, 0x6c, 0x77, 0x9d, 0x8a, 0x5c, 0x00, 0xd9, 0xa5, 0x2e, 0xf5, 0xed, 0x20, 0x08, | ||||
|   0x9a, 0x23, 0x74, 0x97, 0x73, 0x69, 0x7c, 0x6c, 0x7f, 0x57, 0x07, 0xac, 0x23, 0xb1, 0xd0, 0xde, | ||||
|   0xfc, 0x06, 0x1b, 0x0b, 0x3e, 0xbe, 0xd8, 0xea, 0x17, 0xc5, 0x70, 0xf8, 0x62, 0x8b, 0x0b, 0x17, | ||||
|   0x1f, 0x27, 0x12, 0x1f, 0x3a, 0x9d, 0x1f, 0x80, 0x86, 0x47, 0xac, 0xf4, 0xab, 0x04, 0xbf, 0x33, | ||||
|   0xd1, 0xb7, 0x9e, 0xb4, 0xa7, 0xf8, 0xe8, 0x96, 0x6d, 0x2c, 0x0c, 0xdf, 0x62, 0x3d, 0xe3, 0xfb, | ||||
|   0x08, 0x1c, 0x3a, 0xa0, 0x49, 0x1f, 0x62, 0x42, 0xca, 0x8c, 0xb8, 0x2c, 0xbb, 0x4b, 0x66, 0x7d, | ||||
|   0x27, 0x38, 0xdb, 0x3e, 0x08, 0x43, 0x35, 0x73, 0xf1, 0xd1, 0x65, 0x37, 0x2c, 0xc2, 0xd2, 0x53, | ||||
|   0x99, 0x38, 0xea, 0x3b, 0xaa, 0x41, 0xba, 0x02, 0x7d, 0xa7, 0x5c, 0x96, 0xec, 0x56, 0xdf, 0x29, | ||||
|   0xa8, 0x56, 0xc6, 0xc2, 0x8c, 0x2b, 0x8a, 0x3d, 0xae, 0x13, 0x5c, 0x5e, 0xb9, 0xf4, 0xcc, 0x93, | ||||
|   0x90, 0x9e, 0xb7, 0xc5, 0x64, 0xbe, 0x49, 0xe8, 0x98, 0xcd, 0xd2, 0xbb, 0xe3, 0xce, 0x36, 0xe5, | ||||
|   0xf9, 0x26, 0x4d, 0xac, 0x10, 0xe9, 0xf5, 0x56, 0x36, 0x7f, 0x77, 0xf7, 0x2e, 0x84, 0x57, 0x45, | ||||
|   0xd9, 0xbd, 0xb1, 0xda, 0x56, 0xe2, 0xca, 0x40, 0x52, 0xe9, 0x0d, 0x38, 0x13, 0xee, 0x91, 0x74, | ||||
|   0xc8, 0x8b, 0xa7, 0xdc, 0xbb, 0xbe, 0x5d, 0x3a, 0x06, 0xb6, 0x5b, 0xdf, 0xac, 0x53, 0x10, 0x7e, | ||||
|   0xac, 0x72, 0x31, 0x54, 0x02, 0x31, 0x20, 0x51, 0xaf, 0xb3, 0xa5, 0x6e, 0x3e, 0x2f, 0xaa, 0xe5, | ||||
|   0xca, 0x10, 0xc4, 0x71, 0xd5, 0xdb, 0xdc, 0x78, 0x6b, 0x78, 0xe1, 0xe5, 0xfb, 0xc4, 0x78, 0x2f, | ||||
|   0xa9, 0xe9, 0xb2, 0x40, 0x93, 0x63, 0xcf, 0x1e, 0xae, 0x49, 0x3b, 0x64, 0x1e, 0xe5, 0xac, 0xdd, | ||||
|   0xcc, 0x7c, 0x45, 0x4d, 0x93, 0x3c, 0xbd, 0x53, 0xdb, 0x16, 0x81, 0xa4, 0xc5, 0x9c, 0x43, 0xd0, | ||||
|   0xde, 0x67, 0x8e, 0x1b, 0xab, 0x06, 0x41, 0xa3, 0x81, 0x38, 0x51, 0xf0, 0xd3, 0xf4, 0x77, 0x70, | ||||
|   0x10, 0xbc, 0x4f, 0xfc, 0x2e, 0xeb, 0xc7, 0x8e, 0x9b, 0x06, 0x91, 0x07, 0x6c, 0x0c, 0xa2, 0xdc, | ||||
|   0xe7, 0xc1, 0x99, 0x2d, 0xe8, 0x2d, 0xb0, 0x34, 0x2a, 0x30, 0x31, 0xb7, 0xe2, 0x4b, 0x7e, 0xf5, | ||||
|   0xf2, 0xe5, 0x33, 0xbc, 0x78, 0x7a, 0xf7, 0x2f, 0x5f, 0xd2, 0x63, 0xa2, 0xaf, 0x5e, 0x06, 0x3a, | ||||
|   0x24, 0xcf, 0xfe, 0x13, 0xd4, 0x46, 0x3f, 0x71, 0x1c, 0x77, 0x46, 0x53, 0x26, 0xe1, 0x03, 0x13, | ||||
|   0x3e, 0x38, 0x1f, 0xc8, 0x53, 0xe2, 0xdc, 0xdf, 0xaf, 0xf1, 0xc3, 0xb5, 0x77, 0x80, 0x95, 0xc8, | ||||
|   0x5b, 0x8b, 0x75, 0xdf, 0x71, 0xf6, 0xc6, 0x6e, 0x18, 0x6c, 0xd7, 0x19, 0x70, 0x91, 0x5f, 0xbe, | ||||
|   0x9c, 0x39, 0x6e, 0xe2, 0x27, 0xae, 0x48, 0xfc, 0x67, 0x23, 0x57, 0xf8, 0xcf, 0xc6, 0xae, 0x9e, | ||||
|   0xd6, 0x87, 0xae, 0x7e, 0xea, 0x02, 0x41, 0xfc, 0x6f, 0xd3, 0x94, 0xdd, 0x79, 0xf3, 0x54, 0xac, | ||||
|   0xfa, 0xdb, 0x98, 0x27, 0x8b, 0x7c, 0xe9, 0xa7, 0x9e, 0xbc, 0x29, 0x5c, 0x64, 0xff, 0xf1, 0xe8, | ||||
|   0x15, 0x77, 0x5c, 0xa3, 0x72, 0xe2, 0x31, 0x23, 0x72, 0xc0, 0x1e, 0x5f, 0x83, 0x6f, 0xe0, 0x8f, | ||||
|   0x5c, 0xe0, 0x64, 0x3c, 0xd3, 0x75, 0x57, 0xc1, 0x76, 0xc5, 0xf3, 0xa5, 0x08, 0x7d, 0xfb, 0xe7, | ||||
|   0x9f, 0x3e, 0x5c, 0xd8, 0x2e, 0xaa, 0x36, 0x1f, 0xcf, 0x13, 0x00, 0x4b, 0x69, 0x94, 0x80, 0xbf, | ||||
|   0x74, 0xd7, 0x0f, 0x9d, 0xc2, 0x20, 0x1a, 0xaf, 0x11, 0x2d, 0x73, 0x57, 0xc0, 0x19, 0xaa, 0x6e, | ||||
|   0x09, 0x79, 0x47, 0xbe, 0xe4, 0x8a, 0x80, 0x13, 0xc0, 0x16, 0x69, 0xd8, 0xfe, 0xc7, 0x9f, 0xd5, | ||||
|   0x3e, 0x2d, 0xfb, 0xc5, 0x36, 0x29, 0xc0, 0x56, 0x01, 0x5e, 0x2c, 0x35, 0x10, 0xad, 0xd1, 0xdd, | ||||
|   0x47, 0xfc, 0xce, 0x09, 0xe7, 0x04, 0x51, 0x92, 0x63, 0xec, 0xb7, 0x54, 0xf7, 0x04, 0x3d, 0xb1, | ||||
|   0x26, 0x49, 0x32, 0x96, 0x6f, 0xd9, 0x7b, 0xdc, 0xb5, 0xe9, 0xac, 0xdd, 0x76, 0x8a, 0xe6, 0x10, | ||||
|   0xf3, 0x55, 0x43, 0x1a, 0x22, 0xf0, 0x6f, 0x52, 0xec, 0x91, 0x07, 0x80, 0xf6, 0x24, 0x38, 0xe2, | ||||
|   0x07, 0x5a, 0xfe, 0x9e, 0xc6, 0xc0, 0xa8, 0x1f, 0x44, 0x30, 0x9a, 0x64, 0x4b, 0x71, 0xd3, 0x77, | ||||
|   0x94, 0xba, 0x8b, 0x41, 0x4e, 0x57, 0x6c, 0xdd, 0x97, 0x8b, 0x02, 0x2b, 0x25, 0x74, 0x7a, 0x28, | ||||
|   0x56, 0x51, 0xc6, 0xfb, 0xfd, 0xdc, 0x8d, 0x51, 0x6b, 0xc1, 0xbc, 0x17, 0xd1, 0x8a, 0x8b, 0x4d, | ||||
|   0xde, 0xaf, 0x54, 0x59, 0x85, 0xda, 0xa4, 0x29, 0x0f, 0x5a, 0x40, 0x12, 0x2d, 0x0f, 0x71, 0x4d, | ||||
|   0x1e, 0x04, 0x0a, 0x48, 0x2c, 0x99, 0x37, 0xef, 0x60, 0x5e, 0x71, 0x99, 0xa3, 0x34, 0xe0, 0xc5, | ||||
|   0xe0, 0x5e, 0x7a, 0x44, 0xae, 0xe5, 0x5e, 0x8d, 0x6f, 0xe3, 0x8a, 0x6f, 0x53, 0xbd, 0x0c, 0xf8, | ||||
|   0x01, 0xd1, 0x22, 0x01, 0x9c, 0x35, 0xf9, 0x38, 0x02, 0x45, 0x09, 0x92, 0xf3, 0x08, 0xee, 0x49, | ||||
|   0x6b, 0xdc, 0x93, 0x37, 0xb8, 0x67, 0x66, 0x70, 0x4f, 0xa2, 0xb9, 0x27, 0xd7, 0xdc, 0x93, 0x54, | ||||
|   0xdc, 0x23, 0x0f, 0x74, 0x81, 0x77, 0x00, 0xea, 0xff, 0x0d, 0xee, 0x01, 0xa4, 0x42, 0xc0, 0x74, | ||||
|   0xb7, 0x05, 0xe5, 0x09, 0x72, 0x92, 0xbc, 0x12, 0x7b, 0x7b, 0xb0, 0x65, 0x67, 0x22, 0x21, 0x54, | ||||
|   0x84, 0xf5, 0xa0, 0x0b, 0x6a, 0xa5, 0xfc, 0xbc, 0x93, 0xb2, 0xb2, 0x6f, 0xa5, 0x85, 0x3d, 0x08, | ||||
|   0xb7, 0x93, 0x3e, 0xbd, 0x5a, 0x46, 0x21, 0x47, 0x63, 0xe3, 0xa9, 0x75, 0xea, 0xad, 0xb0, 0xa0, | ||||
|   0xe3, 0xab, 0x87, 0x26, 0x17, 0x2b, 0xbb, 0x55, 0x4a, 0xa3, 0xc1, 0x9e, 0x18, 0x28, 0x9e, 0xe3, | ||||
|   0x52, 0xc1, 0xd0, 0x06, 0x2e, 0x2f, 0xd5, 0xb4, 0x0a, 0x7b, 0x1d, 0xcd, 0xb1, 0xbb, 0x38, 0x8e, | ||||
|   0xa3, 0x2a, 0x6f, 0x70, 0x5c, 0x16, 0x5c, 0xda, 0x18, 0x4a, 0xd9, 0x2e, 0x5c, 0xf0, 0x2f, 0x04, | ||||
|   0x53, 0xf0, 0x17, 0x03, 0xa9, 0x2b, 0xe4, 0x4f, 0x43, 0x1b, 0x2b, 0x23, 0x83, 0x46, 0x81, 0xac, | ||||
|   0x88, 0x7b, 0x99, 0xb8, 0xec, 0x2a, 0xc8, 0x3d, 0xf0, 0x46, 0x23, 0x00, 0xc3, 0x03, 0x08, 0x94, | ||||
|   0x8d, 0x04, 0x22, 0xa2, 0x6b, 0x90, 0x57, 0x56, 0x0d, 0x20, 0xb6, 0xc1, 0x94, 0x64, 0x5e, 0x94, | ||||
|   0xcc, 0xe2, 0x4d, 0x08, 0x5b, 0x64, 0xc8, 0x62, 0x71, 0x70, 0x49, 0x9f, 0x0d, 0xfa, 0x76, 0x23, | ||||
|   0x36, 0xb7, 0x5d, 0x69, 0x8e, 0x6c, 0xbb, 0x70, 0x55, 0x0f, 0x19, 0x8c, 0x97, 0x2f, 0x54, 0x8c, | ||||
|   0x5e, 0x5c, 0x4d, 0xc4, 0xcb, 0x97, 0xc8, 0xdd, 0x9b, 0x6c, 0xd9, 0xf7, 0x3c, 0x4f, 0x90, 0x9c, | ||||
|   0xf6, 0x25, 0x9c, 0xbc, 0x00, 0xbc, 0xf7, 0xe5, 0x04, 0x5c, 0x8d, 0x04, 0x97, 0x42, 0x23, 0xb5, | ||||
|   0x00, 0x8f, 0x02, 0x9c, 0x08, 0x20, 0x3c, 0x10, 0x19, 0x40, 0x03, 0x6f, 0xe4, 0x87, 0x8b, 0xbf, | ||||
|   0xbf, 0x0f, 0x6c, 0xdb, 0x05, 0xb9, 0x13, 0xe9, 0x5b, 0x06, 0x68, 0x6b, 0x0c, 0x4f, 0x70, 0xca, | ||||
|   0x52, 0xb1, 0xa0, 0x1a, 0xf8, 0x89, 0xb2, 0x03, 0xc0, 0x5d, 0x09, 0xe0, 0xde, 0xc3, 0x9a, 0xfb, | ||||
|   0x24, 0x7c, 0x8d, 0xd5, 0x65, 0xb4, 0x47, 0xe7, 0x11, 0x5c, 0xa8, 0x78, 0xa1, 0xc9, 0x0c, 0x95, | ||||
|   0x57, 0xd3, 0x76, 0x24, 0xca, 0xa3, 0x32, 0xc7, 0x64, 0x05, 0x5d, 0x21, 0x00, 0x66, 0xc8, 0xf0, | ||||
|   0x39, 0x28, 0xd9, 0x8c, 0xc4, 0xaf, 0x7c, 0x35, 0x99, 0xfc, 0xed, 0x60, 0x99, 0x96, 0x42, 0x1c, | ||||
|   0x66, 0x58, 0xfb, 0x63, 0xbb, 0x75, 0x6b, 0x9e, 0xa1, 0x60, 0xf3, 0x85, 0x1f, 0x17, 0x6d, 0x9b, | ||||
|   0x5e, 0x91, 0x54, 0x9e, 0xc6, 0xbd, 0xe1, 0x73, 0xb6, 0x89, 0x73, 0x4d, 0xb9, 0x91, 0xab, 0x3f, | ||||
|   0x3d, 0x70, 0xcb, 0xef, 0x11, 0x80, 0x8a, 0x31, 0x50, 0x31, 0x22, 0x5e, 0x02, 0x7e, 0x19, 0xc1, | ||||
|   0x3c, 0x25, 0x45, 0x63, 0x45, 0xd1, 0x28, 0x04, 0x22, 0x24, 0x7e, 0xee, 0x92, 0x85, 0x07, 0x33, | ||||
|   0x9b, 0x61, 0x29, 0x1b, 0x93, 0x8f, 0xbf, 0xfa, 0x19, 0x3d, 0xff, 0xea, 0x0b, 0x83, 0xe6, 0xf9, | ||||
|   0xfd, 0x7d, 0x09, 0x06, 0xaa, 0x06, 0xe5, 0x21, 0x29, 0x08, 0xd8, 0x20, 0xd1, 0x20, 0x88, 0x41, | ||||
|   0x86, 0x5c, 0xe0, 0xb8, 0xbc, 0xce, 0x06, 0x51, 0x93, 0x0d, 0x32, 0x35, 0x87, 0x50, 0x73, 0xc4, | ||||
|   0x7a, 0x86, 0xa8, 0x70, 0xd3, 0x8a, 0x33, 0x66, 0x26, 0x67, 0x64, 0xae, 0x00, 0x3b, 0xe2, 0xe1, | ||||
|   0x79, 0x25, 0x28, 0x12, 0x4f, 0x9e, 0x61, 0xc6, 0x6e, 0xd5, 0xa2, 0x0e, 0x31, 0x23, 0x77, 0x04, | ||||
|   0x7a, 0x3b, 0x05, 0x44, 0xcc, 0xbc, 0xb2, 0x1a, 0x00, 0x1c, 0x89, 0x44, 0xf9, 0xd1, 0xb1, 0xcb, | ||||
|   0xd4, 0x5d, 0x04, 0xec, 0xaa, 0xda, 0x5e, 0x45, 0x67, 0x47, 0xe3, 0xfd, 0xf3, 0x03, 0x7f, 0x8c, | ||||
|   0xc0, 0x83, 0x73, 0x0d, 0x4e, 0x48, 0xf1, 0x14, 0xa6, 0x7b, 0x56, 0xe7, 0x3a, 0x60, 0xb6, 0xa7, | ||||
|   0xfa, 0xd4, 0xa5, 0x95, 0xd4, 0x49, 0x22, 0xc3, 0x01, 0xd5, 0x79, 0x26, 0x90, 0x7d, 0x4a, 0xe9, | ||||
|   0x18, 0x1c, 0x2c, 0x53, 0x3c, 0x4e, 0xe5, 0x6c, 0xa3, 0x40, 0x53, 0x5e, 0xc3, 0x70, 0xb7, 0x1b, | ||||
|   0x76, 0x36, 0x69, 0x0a, 0x1f, 0xf5, 0x9f, 0xb0, 0x8e, 0xa8, 0x42, 0x6a, 0x8b, 0xbe, 0xb1, 0xaf, | ||||
|   0x5c, 0x0a, 0xa4, 0xdb, 0xd5, 0x5b, 0x62, 0xa7, 0xd6, 0x3d, 0xe9, 0xe3, 0x02, 0x64, 0x66, 0xb4, | ||||
|   0xb5, 0x51, 0x55, 0x97, 0x12, 0x15, 0xb6, 0xa3, 0x66, 0xcb, 0xd2, 0x59, 0x00, 0x9a, 0xa6, 0x29, | ||||
|   0xbe, 0x0b, 0x95, 0x06, 0xea, 0x14, 0x5f, 0xb5, 0x79, 0xd4, 0xaf, 0x3c, 0xbb, 0x1c, 0x5d, 0x75, | ||||
|   0xf9, 0xe7, 0x5a, 0xb1, 0x77, 0xf9, 0xe6, 0xaa, 0x0e, 0xa3, 0x43, 0x82, 0x0d, 0x31, 0x2f, 0xf3, | ||||
|   0x3e, 0xa8, 0xe8, 0x8d, 0xd6, 0x5a, 0x0e, 0x09, 0xfd, 0x10, 0xad, 0x4d, 0x81, 0xfd, 0xf2, 0x73, | ||||
|   0x90, 0x7d, 0x4f, 0xf6, 0x90, 0x6e, 0x02, 0x3c, 0x03, 0x41, 0x40, 0xee, 0xb4, 0xff, 0x5e, 0xd1, | ||||
|   0x09, 0x5c, 0x94, 0xad, 0xfc, 0x7a, 0xdd, 0x8f, 0xdc, 0x69, 0x1a, 0x81, 0x87, 0x0b, 0x52, 0x3a, | ||||
|   0x73, 0x23, 0x3f, 0x2c, 0x02, 0xbd, 0x0e, 0x98, 0x50, 0x65, 0x57, 0x4d, 0x62, 0xa2, 0x45, 0xa9, | ||||
|   0xbb, 0x21, 0x66, 0x10, 0xe6, 0x6e, 0xa5, 0x0f, 0x2d, 0xe7, 0x44, 0x4d, 0xb3, 0x2d, 0x27, 0x06, | ||||
|   0xbb, 0x41, 0x66, 0x54, 0x31, 0xdd, 0x2a, 0xc0, 0x64, 0x1a, 0xcb, 0x65, 0xe1, 0x4e, 0x3f, 0x71, | ||||
|   0x1b, 0x1e, 0x8a, 0x39, 0x2d, 0x5a, 0x78, 0x25, 0x38, 0x2b, 0x30, 0x46, 0xa6, 0xae, 0x8e, 0xbe, | ||||
|   0x40, 0x51, 0x6b, 0x4a, 0x97, 0xc7, 0xd9, 0x8f, 0x23, 0x79, 0x87, 0x0d, 0x37, 0xf5, 0xb6, 0x41, | ||||
|   0x3d, 0xc5, 0x00, 0xac, 0x1d, 0x9c, 0xa9, 0x37, 0x99, 0xf1, 0x46, 0x9d, 0x8d, 0x95, 0xef, 0x44, | ||||
|   0x07, 0xdb, 0xe8, 0x77, 0xf1, 0x8e, 0x60, 0x91, 0x74, 0x5d, 0xa4, 0x74, 0x5d, 0x5a, 0xa0, 0x95, | ||||
|   0x57, 0x0a, 0x49, 0xea, 0x34, 0x84, 0xbf, 0xcd, 0x7a, 0x39, 0x89, 0xe4, 0xf7, 0x40, 0x8e, 0x37, | ||||
|   0xa0, 0xd9, 0x26, 0xd1, 0xbc, 0x6f, 0x30, 0x56, 0xea, 0x68, 0xe3, 0xa8, 0xb6, 0x6b, 0xbb, 0x1c, | ||||
|   0xa2, 0xe0, 0x38, 0xe3, 0x9d, 0xa1, 0x47, 0x8a, 0xb8, 0xd0, 0xe1, 0xc6, 0x34, 0x16, 0x53, 0xd4, | ||||
|   0x43, 0x72, 0x7e, 0xc0, 0x5f, 0xff, 0x32, 0xb9, 0x72, 0x23, 0x80, 0x13, 0x5c, 0x61, 0x3f, 0xf1, | ||||
|   0xf0, 0x52, 0x54, 0xd6, 0xb7, 0x5c, 0x00, 0xe4, 0x5d, 0xeb, 0x63, 0x73, 0xee, 0x32, 0x23, 0x45, | ||||
|   0x87, 0x26, 0x2b, 0xcc, 0x26, 0xe5, 0x42, 0xc4, 0xde, 0x35, 0x07, 0x0a, 0xc5, 0x38, 0xc9, 0x90, | ||||
|   0xad, 0xa3, 0x21, 0x46, 0xe2, 0x43, 0x89, 0xcd, 0x73, 0xb6, 0x12, 0x1b, 0xfc, 0x35, 0x91, 0xbd, | ||||
|   0xcc, 0xed, 0xf2, 0x8a, 0x73, 0x60, 0xca, 0xad, 0xaa, 0x21, 0xf6, 0x43, 0x57, 0x0e, 0xf2, 0x57, | ||||
|   0xda, 0x3a, 0xce, 0xb4, 0xcb, 0x0b, 0x28, 0x79, 0x36, 0xf3, 0xc4, 0x27, 0x47, 0xa9, 0xb7, 0x6b, | ||||
|   0x11, 0xe1, 0x61, 0x01, 0xb2, 0x5b, 0x58, 0xb2, 0xdb, 0xa4, 0x91, 0x9e, 0x50, 0x8c, 0xbe, 0xc1, | ||||
|   0x4c, 0xc5, 0x1a, 0xff, 0x2c, 0x83, 0x31, 0x3f, 0x78, 0x15, 0xbb, 0x8b, 0x60, 0x55, 0x45, 0x25, | ||||
|   0x18, 0xfa, 0x54, 0xda, 0x31, 0x69, 0xc9, 0x2a, 0xaf, 0x64, 0x35, 0x23, 0xb9, 0x12, 0x28, 0xab, | ||||
|   0x31, 0x88, 0x54, 0x64, 0xc8, 0x6a, 0x82, 0x41, 0xb8, 0x21, 0x7c, 0xa2, 0x14, 0x3e, 0xd9, 0xb3, | ||||
|   0x80, 0xb0, 0x00, 0x3c, 0x28, 0x56, 0x58, 0x2f, 0xb6, 0xf9, 0xde, 0xb8, 0xf8, 0x38, 0xd9, 0x48, | ||||
|   0x43, 0x0d, 0x8d, 0xb3, 0xe2, 0xfe, 0xc5, 0xb6, 0x1d, 0x1f, 0x7c, 0x74, 0xdc, 0xb5, 0xec, 0x03, | ||||
|   0x5e, 0x83, 0xb9, 0x35, 0xd9, 0x58, 0x57, 0x02, 0xa9, 0xbb, 0x4d, 0x40, 0xce, 0x21, 0x76, 0x1e, | ||||
|   0xa1, 0xef, 0xd4, 0xe5, 0x91, 0x2f, 0xb4, 0xe4, 0xdf, 0x05, 0x1b, 0xda, 0x7e, 0xe9, 0x9c, 0x5e, | ||||
|   0x82, 0x81, 0xb8, 0x82, 0xc0, 0x47, 0x79, 0xa4, 0xf7, 0xe4, 0xf4, 0xd4, 0xb4, 0x83, 0x40, 0x27, | ||||
|   0x4d, 0xe2, 0x1e, 0x00, 0xbe, 0xc4, 0xf2, 0x39, 0x57, 0xd6, 0xc5, 0x5d, 0x55, 0xae, 0xa9, 0x70, | ||||
|   0xce, 0xed, 0xe7, 0xb6, 0x6f, 0x0f, 0x87, 0x36, 0x6d, 0xb3, 0xf8, 0xaf, 0x04, 0x77, 0x0c, 0x7e, | ||||
|   0xe2, 0x44, 0x9b, 0xe2, 0x3b, 0xef, 0x77, 0x11, 0x25, 0x7d, 0xfb, 0xbf, 0x50, 0x5a, 0x14, 0xfd, | ||||
|   0x20, 0x62, 0x52, 0x5f, 0x71, 0xb4, 0x74, 0xac, 0xbb, 0x76, 0x97, 0x4f, 0xd1, 0x2f, 0xa5, 0x66, | ||||
|   0x29, 0xe9, 0xc2, 0xeb, 0x49, 0x1e, 0xd3, 0x4c, 0x54, 0x4e, 0x5f, 0x87, 0x9d, 0x30, 0xfc, 0xc4, | ||||
|   0x0e, 0x25, 0x62, 0x54, 0x1d, 0x75, 0xaa, 0x12, 0xed, 0x3a, 0x76, 0x68, 0x12, 0xed, 0x42, 0x02, | ||||
|   0x53, 0xc9, 0x0f, 0xfb, 0x6a, 0xba, 0xc4, 0x2c, 0xb5, 0x40, 0x8e, 0x2a, 0x23, 0xcb, 0x0c, 0xe3, | ||||
|   0xca, 0xf2, 0x09, 0xed, 0x87, 0xf4, 0xa3, 0x42, 0xed, 0x47, 0xad, 0x3a, 0x81, 0xef, 0x50, 0x3f, | ||||
|   0xda, 0x7b, 0x72, 0x37, 0xd5, 0x7c, 0x40, 0x83, 0x75, 0xf5, 0xb4, 0x02, 0x57, 0x05, 0xc3, 0x60, | ||||
|   0x06, 0xe4, 0x66, 0x31, 0x15, 0x6a, 0x80, 0xc8, 0x94, 0x0d, 0xb2, 0x6e, 0xc2, 0xbd, 0x0b, 0xe2, | ||||
|   0xf3, 0xd4, 0x5f, 0xba, 0x73, 0xb8, 0xce, 0xfc, 0x85, 0x7b, 0x0d, 0xd7, 0x8d, 0x7f, 0xe7, 0xde, | ||||
|   0xc0, 0x75, 0xed, 0xcf, 0xdd, 0xf7, 0xc1, 0xdf, 0x59, 0xbe, 0xf4, 0xe6, 0xb1, 0x00, 0x3f, 0xa0, | ||||
|   0xbf, 0x19, 0xdc, 0x39, 0xc3, 0x7d, 0xc7, 0x7d, 0x5b, 0x6b, 0x5d, 0x0f, 0xe6, 0xd4, 0x3a, 0x0d, | ||||
|   0x0e, 0x4f, 0x5e, 0x5d, 0xbb, 0xbf, 0xe3, 0xe5, 0xc6, 0xbd, 0x0d, 0xa6, 0xa7, 0xc1, 0xd7, 0xc7, | ||||
|   0x27, 0xe7, 0xe3, 0x43, 0x7f, 0x7c, 0xe2, 0x7e, 0x40, 0xd1, 0xdd, 0xce, 0xf2, 0x5b, 0xff, 0xa2, | ||||
|   0x08, 0x24, 0x59, 0x5f, 0x93, 0x3c, 0xf6, 0xef, 0xdc, 0xb9, 0x33, 0xb9, 0xc0, 0x2f, 0x90, 0x6f, | ||||
|   0x94, 0xac, 0xba, 0x23, 0xf8, 0x0f, 0x35, 0x4b, 0x56, 0x7f, 0x13, 0x5c, 0x60, 0xde, 0x91, 0xde, | ||||
|   0xa2, 0x6e, 0xed, 0xeb, 0xf7, 0x84, 0x85, 0x52, 0xb0, 0x5f, 0xb8, 0x38, 0xfd, 0xa7, 0xc6, 0xf4, | ||||
|   0x53, 0xf7, 0x77, 0x67, 0xf2, 0x09, 0xed, 0x4e, 0xfc, 0x41, 0x1e, 0x21, 0x3c, 0x1f, 0xd1, 0x3f, | ||||
|   0xdb, 0x95, 0xad, 0xbf, 0x00, 0x6a, 0x69, 0x46, 0xea, 0x09, 0x02, 0xd3, 0xc7, 0x24, 0x08, 0x0f, | ||||
|   0x46, 0x13, 0x7e, 0x7a, 0x33, 0xe1, 0x10, 0x1b, 0xeb, 0xb6, 0x1c, 0xda, 0xf2, 0xd3, 0xeb, 0x49, | ||||
|   0x0e, 0x6d, 0x5b, 0x6c, 0x00, 0x7b, 0xf5, 0xea, 0x7a, 0x0f, 0x34, 0x01, 0x48, 0x1a, 0x6c, 0x1a, | ||||
|   0x9c, 0x73, 0xbc, 0x70, 0xf0, 0x29, 0xf2, 0xc1, 0x7b, 0x08, 0x06, 0xf8, 0xe0, 0x2d, 0x90, 0xdf, | ||||
|   0x56, 0xeb, 0xa1, 0xfe, 0x03, 0x47, 0x5f, 0x9c, 0x05, 0x23, 0xf8, 0x7b, 0x7a, 0xf7, 0xf2, 0x65, | ||||
|   0x44, 0xb7, 0xd1, 0xe9, 0xfc, 0xfe, 0xfe, 0x19, 0xbc, 0xc9, 0xb1, 0x8d, 0x9f, 0xce, 0xf5, 0xe4, | ||||
|   0xf1, 0x79, 0xf4, 0xea, 0x6e, 0x4f, 0xf8, 0x1c, 0xfe, 0xe6, 0x13, 0xe0, 0x23, 0x54, 0xd8, 0x74, | ||||
|   0x34, 0xde, 0x7f, 0x73, 0x79, 0xf8, 0x0a, 0x8c, 0x00, 0x5d, 0xf6, 0xc6, 0xfa, 0x66, 0x5f, 0xdf, | ||||
|   0x1c, 0x5c, 0x51, 0xaa, 0x77, 0x9b, 0x82, 0x36, 0x59, 0x00, 0x7b, 0x4d, 0x91, 0xb3, 0x96, 0xfc, | ||||
|   0xf6, 0x42, 0xfc, 0xb2, 0x98, 0x82, 0x5a, 0x9a, 0x7c, 0x90, 0xea, 0x07, 0xec, 0x8c, 0x89, 0x9a, | ||||
|   0x8f, 0x29, 0xbc, 0x45, 0x55, 0xe6, 0x82, 0xe4, 0x87, 0xf4, 0x77, 0x55, 0x38, 0x1f, 0x4d, 0x44, | ||||
|   0x41, 0xc4, 0xe1, 0x1e, 0x9e, 0xc0, 0x7f, 0x9d, 0x02, 0xad, 0x97, 0xa5, 0x26, 0xd2, 0x7b, 0x44, | ||||
|   0x54, 0xe3, 0x87, 0x2b, 0xc4, 0x6f, 0xc1, 0x18, 0x46, 0xe2, 0xd9, 0xed, 0x27, 0xae, 0x51, 0x3f, | ||||
|   0xa6, 0x7f, 0x76, 0xd9, 0xde, 0x98, 0x93, 0xf2, 0x4f, 0x60, 0xae, 0xf6, 0xf6, 0x0f, 0xdd, 0x30, | ||||
|   0xc8, 0xe0, 0x82, 0xa4, 0x13, 0x60, 0x7b, 0x6e, 0xf7, 0xec, 0xf5, 0xad, 0xf5, 0x6d, 0x1a, 0xb1, | ||||
|   0xd8, 0xae, 0xc1, 0xac, 0x57, 0x46, 0x23, 0x7b, 0x5e, 0x9e, 0xd6, 0xfb, 0xe6, 0x52, 0x68, 0xcf, | ||||
|   0xbf, 0xc5, 0x4f, 0xed, 0x02, 0x5b, 0x7e, 0x65, 0xa7, 0x1b, 0xbf, 0x03, 0x11, 0x42, 0x68, 0x03, | ||||
|   0x7b, 0x15, 0x85, 0x61, 0xcc, 0xf5, 0xcc, 0x17, 0xf0, 0x0e, 0x7c, 0xa9, 0x99, 0x1b, 0x3a, 0x85, | ||||
|   0x2c, 0xbb, 0xea, 0xe7, 0xa0, 0x82, 0xa0, 0xb7, 0x3d, 0xb6, 0xfd, 0x28, 0xf8, 0x30, 0x99, 0x02, | ||||
|   0x8b, 0x7d, 0x9a, 0x50, 0xcb, 0x3e, 0xb6, 0xd0, 0xd7, 0xb6, 0xfd, 0x0f, 0x8e, 0xf9, 0xe2, 0x00, | ||||
|   0x5f, 0x50, 0xa1, 0x22, 0xbc, 0x28, 0xa4, 0xde, 0xad, 0x78, 0x15, 0xed, 0x4b, 0x29, 0xac, 0xcc, | ||||
|   0x41, 0x73, 0x54, 0x3e, 0x82, 0x1d, 0x22, 0x73, 0x53, 0x69, 0x42, 0x9a, 0x85, 0x4b, 0xc6, 0x00, | ||||
|   0x36, 0x04, 0xef, 0x60, 0x84, 0x21, 0x2d, 0x3a, 0x52, 0x19, 0x1a, 0x49, 0x5e, 0x85, 0x6a, 0xc0, | ||||
|   0x7e, 0x68, 0x09, 0x81, 0xd9, 0xf8, 0xb3, 0x20, 0x60, 0xe0, 0xca, 0x07, 0x62, 0x32, 0x0e, 0x82, | ||||
|   0x64, 0x90, 0x9f, 0x67, 0x92, 0x5a, 0xcc, 0xf1, 0xd5, 0x1d, 0xd8, 0x0c, 0xf0, 0x13, 0xc0, 0x19, | ||||
|   0x13, 0x05, 0x43, 0x37, 0x5e, 0x27, 0x31, 0xc6, 0x94, 0x43, 0x93, 0x59, 0xd6, 0xee, 0x71, 0xfa, | ||||
|   0x2d, 0x0e, 0xcf, 0x2a, 0x48, 0x0d, 0x1e, 0x05, 0x93, 0x4c, 0xb3, 0x2b, 0xdd, 0xad, 0x35, 0x65, | ||||
|   0xd6, 0x4c, 0xc2, 0x9b, 0x65, 0x26, 0x9d, 0xda, 0x56, 0x56, 0x64, 0x94, 0xb0, 0x61, 0x9c, 0xc8, | ||||
|   0xce, 0xb3, 0x73, 0x51, 0x65, 0x58, 0x9e, 0x53, 0x86, 0xc5, 0xcb, 0xc5, 0x7b, 0x71, 0xc3, 0xd3, | ||||
|   0xd7, 0x80, 0xfd, 0xbe, 0x83, 0x3f, 0x5c, 0x76, 0x21, 0x7e, 0x00, 0xb2, 0xec, 0x1f, 0x1d, 0xb9, | ||||
|   0xea, 0x7f, 0x46, 0x2b, 0x81, 0x67, 0x1e, 0x5f, 0x68, 0xf1, 0x00, 0x34, 0x1f, 0xc0, 0x12, 0x60, | ||||
|   0x59, 0x79, 0x73, 0x05, 0x47, 0x6d, 0x1a, 0xa2, 0x54, 0xf3, 0xed, 0xb0, 0xef, 0x39, 0xc3, 0x85, | ||||
|   0x6b, 0xbf, 0x18, 0xbf, 0x18, 0x43, 0xa7, 0x49, 0x69, 0x8f, 0x31, 0x47, 0x84, 0xb9, 0x53, 0xe4, | ||||
|   0xa0, 0xa1, 0xb7, 0xdd, 0x2f, 0x86, 0x0b, 0x47, 0x5b, 0xed, 0x92, 0xda, 0xdc, 0x1d, 0x1f, 0x3b, | ||||
|   0x7a, 0x77, 0x20, 0xb2, 0x39, 0x88, 0x6c, 0x02, 0x22, 0xcb, 0x4c, 0x06, 0xa8, 0x43, 0xad, 0x02, | ||||
|   0xc4, 0x52, 0xec, 0xf6, 0xfa, 0xfc, 0xf4, 0x74, 0x7c, 0x7c, 0x9f, 0x9f, 0x9e, 0x9e, 0xdc, 0x27, | ||||
|   0x88, 0x88, 0x0f, 0xe4, 0x84, 0xf4, 0x71, 0x66, 0x2f, 0xa3, 0xb4, 0xc2, 0xe0, 0xd8, 0xd8, 0xac, | ||||
|   0xe4, 0x57, 0x6d, 0x57, 0x81, 0xa5, 0x80, 0x87, 0xca, 0xfc, 0x95, 0xc1, 0x4a, 0x14, 0x72, 0xe6, | ||||
|   0x92, 0xe6, 0x09, 0xb8, 0xac, 0xe0, 0xe9, 0xe5, 0xd5, 0x2c, 0x35, 0x45, 0x8b, 0x1e, 0x58, 0xe9, | ||||
|   0x7f, 0x85, 0x2a, 0x88, 0x7a, 0x5b, 0xd2, 0x90, 0x3a, 0xd9, 0xe8, 0x44, 0xc8, 0x14, 0x00, 0xcc, | ||||
|   0xad, 0x43, 0xff, 0x7c, 0x52, 0x06, 0xb5, 0xa8, 0xe7, 0x5f, 0xe3, 0x67, 0x48, 0x20, 0x80, 0xf6, | ||||
|   0x3e, 0x84, 0xb0, 0xdb, 0x1b, 0xd2, 0x3c, 0x2c, 0xfc, 0x1e, 0x0b, 0x5b, 0x60, 0xaa, 0xf8, 0x8e, | ||||
|   0xbc, 0x23, 0x0d, 0x2d, 0xf3, 0xc8, 0xdb, 0xfd, 0xb0, 0x12, 0x22, 0x5f, 0xc2, 0x8e, 0xff, 0xcf, | ||||
|   0x86, 0xe1, 0xf7, 0x54, 0x81, 0xbd, 0x84, 0xa9, 0xc1, 0x07, 0x6e, 0xbc, 0x7e, 0x9b, 0xb0, 0x69, | ||||
|   0x8c, 0x89, 0x85, 0x71, 0x69, 0x36, 0x12, 0x32, 0x1b, 0x26, 0xb2, 0x6b, 0x4e, 0x13, 0x6d, 0x4b, | ||||
|   0x2e, 0x86, 0x0e, 0x13, 0xca, 0xc5, 0xf9, 0x1d, 0x5b, 0xc5, 0xa0, 0x11, 0x7c, 0xe9, 0x3c, 0x51, | ||||
|   0x13, 0xde, 0x61, 0x93, 0x81, 0x9d, 0x50, 0x1d, 0x79, 0x93, 0xcb, 0xae, 0xe8, 0x86, 0xf2, 0x0b, | ||||
|   0xea, 0x6e, 0xa2, 0xb4, 0x4a, 0xa2, 0xb4, 0x0a, 0x25, 0xdf, 0x7d, 0x16, 0xd8, 0xe0, 0x7d, 0x03, | ||||
|   0xb1, 0x28, 0x12, 0x19, 0xea, 0x24, 0xbd, 0x7c, 0x6b, 0x6a, 0x16, 0x80, 0xa3, 0xd9, 0xf9, 0x76, | ||||
|   0x80, 0x40, 0x51, 0x77, 0xba, 0x31, 0xbb, 0x13, 0x94, 0x38, 0x00, 0xd1, 0x3a, 0x04, 0x96, 0x8d, | ||||
|   0xe4, 0xbc, 0xf9, 0x6d, 0x6e, 0x17, 0xfa, 0xb8, 0x0a, 0x83, 0x8b, 0xef, 0x30, 0xd2, 0xb8, 0xe4, | ||||
|   0x57, 0x2a, 0xb4, 0x60, 0x94, 0xa4, 0xec, 0x8a, 0x88, 0x29, 0x3b, 0xdf, 0xa2, 0x31, 0x03, 0xf2, | ||||
|   0x46, 0xf2, 0x60, 0x0f, 0xfc, 0x65, 0x4f, 0xef, 0x1f, 0x5d, 0xe6, 0xbc, 0xf0, 0x5e, 0x6c, 0xb3, | ||||
|   0xe2, 0x23, 0x34, 0x53, 0x7d, 0x0c, 0xc4, 0x33, 0x38, 0x6f, 0xca, 0xaf, 0xc1, 0x08, 0x54, 0xf3, | ||||
|   0xc6, 0x06, 0x8b, 0x12, 0x92, 0x1f, 0xf0, 0xfc, 0xd4, 0x67, 0x10, 0x9d, 0x8e, 0x5f, 0xed, 0x23, | ||||
|   0x80, 0x4e, 0xe7, 0xaf, 0xfc, 0x78, 0xa1, 0xd3, 0xf5, 0x33, 0x8e, 0x73, 0x41, 0x8f, 0x96, 0x0c, | ||||
|   0x80, 0xbf, 0xab, 0x88, 0x3f, 0x22, 0x74, 0x21, 0x7e, 0x45, 0xe0, 0xb6, 0x92, 0x8a, 0x10, 0xeb, | ||||
|   0x6c, 0x2f, 0xf3, 0x2b, 0x7f, 0xab, 0x57, 0xfd, 0x8d, 0xd2, 0xaf, 0x89, 0x2b, 0xd7, 0xf8, 0x0d, | ||||
|   0x34, 0x3b, 0x73, 0x67, 0x62, 0xb5, 0x62, 0x49, 0xf8, 0x1b, 0x04, 0x17, 0x1f, 0x91, 0x1e, 0xd6, | ||||
|   0xe0, 0x5f, 0x16, 0x86, 0x50, 0x96, 0xae, 0x89, 0x42, 0xf4, 0x98, 0x39, 0x47, 0x6b, 0x10, 0x5a, | ||||
|   0x5f, 0x61, 0x86, 0xf6, 0x2b, 0x6b, 0xf0, 0x83, 0x65, 0xbf, 0x96, 0xdf, 0xe6, 0x0d, 0x2e, 0x90, | ||||
|   0x30, 0x56, 0x8b, 0x4d, 0x3e, 0x56, 0x0b, 0xcc, 0xe7, 0x4f, 0x59, 0x61, 0x6b, 0x23, 0xe7, 0xcd, | ||||
|   0x19, 0xd8, 0xf2, 0x47, 0xae, 0x54, 0x14, 0x85, 0xe9, 0xa4, 0x13, 0xe3, 0x3f, 0x40, 0x26, 0x03, | ||||
|   0x95, 0x2a, 0xf4, 0xd8, 0x01, 0x5c, 0xfe, 0x25, 0xdb, 0x37, 0xe0, 0xa9, 0x91, 0x08, 0x00, 0x2b, | ||||
|   0xdf, 0xa0, 0x2c, 0x83, 0xdd, 0xac, 0x0e, 0xc6, 0x6c, 0xcb, 0xb2, 0x3d, 0x79, 0x6e, 0xd8, 0x2f, | ||||
|   0x23, 0x23, 0x4b, 0x85, 0x64, 0xb0, 0x1a, 0x90, 0x13, 0xd4, 0x9a, 0x54, 0xd8, 0x20, 0x16, 0x6e, | ||||
|   0x76, 0xe5, 0x54, 0x27, 0x51, 0xcf, 0xf4, 0x49, 0x54, 0x76, 0x7f, 0x2f, 0x8f, 0x28, 0xa3, 0x8c, | ||||
|   0xae, 0xe0, 0xe5, 0x9f, 0x53, 0x90, 0x88, 0xd0, 0xfb, 0xe0, 0x42, 0x95, 0x59, 0x35, 0x5e, 0x69, | ||||
|   0xee, 0xd6, 0x2c, 0xbc, 0x39, 0x0b, 0x77, 0xce, 0x01, 0x91, 0x38, 0x66, 0x6f, 0xec, 0x14, 0xfd, | ||||
|   0x0c, 0x6d, 0xd5, 0x47, 0xbf, 0x9a, 0x18, 0xc3, 0xb2, 0x1c, 0x9b, 0xf1, 0xf5, 0x47, 0xc7, 0x08, | ||||
|   0xc9, 0x94, 0xab, 0x81, 0xfb, 0x35, 0xc4, 0x49, 0x87, 0x5d, 0x10, 0xc6, 0xab, 0xb3, 0x25, 0x1b, | ||||
|   0xb0, 0xb1, 0xcf, 0x0f, 0xc0, 0x8f, 0x28, 0x2b, 0xb0, 0x9c, 0x32, 0x11, 0xae, 0xe9, 0x47, 0x27, | ||||
|   0x75, 0x2d, 0x49, 0x0f, 0xa3, 0x6b, 0xa0, 0xa7, 0xf0, 0xa8, 0x28, 0xc7, 0x2b, 0x4b, 0xa3, 0x03, | ||||
|   0x5b, 0x7e, 0xe5, 0x6a, 0xbb, 0xad, 0x57, 0xba, 0xc8, 0x38, 0x00, 0x78, 0x47, 0xa3, 0x3d, 0x7b, | ||||
|   0x95, 0x75, 0x74, 0xba, 0x88, 0x56, 0xa0, 0xa3, 0xbf, 0x57, 0x20, 0x07, 0xb6, 0xfc, 0x04, 0x1a, | ||||
|   0x3b, 0x52, 0xd9, 0x0e, 0x26, 0x2c, 0x29, 0xc9, 0x2b, 0x2b, 0x5b, 0x6c, 0x37, 0xaf, 0x4e, 0x28, | ||||
|   0x5b, 0x20, 0x62, 0x75, 0x3c, 0xc0, 0x18, 0x77, 0x0e, 0xa5, 0x1f, 0x1a, 0x01, 0xd1, 0x8f, 0xc9, | ||||
|   0x0d, 0x54, 0xcc, 0x05, 0x26, 0x49, 0xd4, 0xb2, 0x62, 0xb1, 0x9e, 0x3e, 0xda, 0x85, 0x81, 0xa8, | ||||
|   0x7b, 0x76, 0xfd, 0x5d, 0xb0, 0x8d, 0x99, 0xfc, 0x16, 0x8e, 0xca, 0xb7, 0xed, 0x97, 0x5d, 0x58, | ||||
|   0x6a, 0x77, 0xe2, 0x31, 0x03, 0x03, 0x37, 0x22, 0x0c, 0xd6, 0xb3, 0x78, 0x6e, 0xe5, 0x59, 0x35, | ||||
|   0x6a, 0x7f, 0x9c, 0x5a, 0x4f, 0xd0, 0xdf, 0xc6, 0xa9, 0x1e, 0x9d, 0xcf, 0x69, 0x62, 0xa8, 0x8f, | ||||
|   0x8c, 0xc1, 0xbf, 0x6c, 0xf7, 0x48, 0xf9, 0x4a, 0x5c, 0x63, 0x8c, 0xee, 0x02, 0x74, 0x74, 0x92, | ||||
|   0xa7, 0xa3, 0x78, 0xcc, 0x9d, 0x82, 0x53, 0x94, 0xa9, 0x49, 0x54, 0x95, 0x56, 0x60, 0x53, 0x99, | ||||
|   0x96, 0xc1, 0x85, 0x65, 0x92, 0x80, 0xec, 0x61, 0x70, 0x80, 0xe7, 0xd4, 0x64, 0x13, 0x83, 0xd1, | ||||
|   0x44, 0xb3, 0xde, 0x0e, 0x5c, 0x67, 0x4d, 0x5c, 0xeb, 0xb9, 0x30, 0x09, 0x61, 0xfa, 0x2c, 0x94, | ||||
|   0x08, 0xca, 0xd1, 0x49, 0xbc, 0xbf, 0xef, 0xf3, 0x6e, 0x88, 0x1a, 0xf9, 0x4f, 0x5e, 0x65, 0x54, | ||||
|   0x45, 0x50, 0x95, 0xbd, 0x50, 0x38, 0x12, 0x57, 0x39, 0xfa, 0x08, 0x53, 0x9b, 0x31, 0xb0, 0xa4, | ||||
|   0xc6, 0x4b, 0x8c, 0x06, 0xb2, 0x89, 0xa7, 0xfc, 0x92, 0x5d, 0x75, 0xae, 0xea, 0xb2, 0xbd, 0x3d, | ||||
|   0x97, 0x9d, 0x05, 0x79, 0xe5, 0x45, 0xc2, 0xbe, 0x01, 0xfa, 0x8e, 0x01, 0xf4, 0x09, 0x3e, 0x10, | ||||
|   0x1f, 0x0c, 0x25, 0xf9, 0xbb, 0x2f, 0x5f, 0x02, 0x6e, 0x67, 0xa9, 0x80, 0xe0, 0x44, 0x60, 0xb4, | ||||
|   0x4a, 0xd8, 0x2f, 0x44, 0xfd, 0xc0, 0xa6, 0xce, 0x0e, 0x99, 0x43, 0xc3, 0xb3, 0x8e, 0x84, 0xff, | ||||
|   0x0a, 0x11, 0x87, 0xc5, 0x5f, 0x36, 0x55, 0x50, 0x34, 0x37, 0x55, 0x3c, 0x34, 0x6a, 0x93, 0xab, | ||||
|   0x41, 0x11, 0x1d, 0xe7, 0x56, 0x07, 0x76, 0x94, 0x10, 0x6d, 0xa7, 0x7e, 0x75, 0x8d, 0x19, 0x16, | ||||
|   0xfd, 0x34, 0x28, 0xa8, 0x4e, 0x14, 0x6c, 0x3c, 0xbc, 0xe9, 0xde, 0xbf, 0x6e, 0x97, 0x3f, 0xd4, | ||||
|   0x81, 0x78, 0xc4, 0x1f, 0x63, 0x8b, 0xc1, 0xcb, 0x07, 0xdf, 0x30, 0xf4, 0x50, 0x8c, 0x35, 0xdf, | ||||
|   0xc2, 0x32, 0x73, 0x78, 0x81, 0x9e, 0x1f, 0xfe, 0xb2, 0x90, 0x6d, 0x78, 0xf6, 0x94, 0x58, 0x7a, | ||||
|   0x2c, 0x64, 0x8a, 0xc9, 0x1f, 0x02, 0x4e, 0x52, 0xb3, 0x09, 0x5b, 0xa8, 0x8f, 0xfa, 0x76, 0xc0, | ||||
|   0x85, 0xbf, 0xac, 0x64, 0x40, 0xa5, 0x6b, 0x8f, 0xd1, 0x46, 0x71, 0x0f, 0x35, 0x30, 0x00, 0xa5, | ||||
|   0x8e, 0x0b, 0xcb, 0x43, 0x25, 0x23, 0x4b, 0x5e, 0xfb, 0x10, 0xdf, 0xf1, 0xc0, 0xb3, 0x48, 0xef, | ||||
|   0xe4, 0xc1, 0xb1, 0x48, 0xbf, 0x8d, 0xe3, 0xbe, 0x2c, 0xfb, 0x77, 0x55, 0xd9, 0xb1, 0x6b, 0xe9, | ||||
|   0x5a, 0x56, 0x5b, 0xb2, 0x71, 0x12, 0x3c, 0x1b, 0x95, 0x7e, 0xb6, 0xbd, 0x06, 0x15, 0x48, 0x52, | ||||
|   0xdb, 0x4f, 0xd8, 0x75, 0xb4, 0x60, 0x30, 0x87, 0x87, 0xbf, 0x5b, 0xbd, 0x01, 0x67, 0xf9, 0xfe, | ||||
|   0xbe, 0x6a, 0x03, 0x82, 0xa7, 0xef, 0x55, 0xbb, 0x73, 0x6e, 0xbf, 0x05, 0x56, 0x00, 0x19, 0x5e, | ||||
|   0xad, 0x85, 0xf5, 0xdf, 0xff, 0xd7, 0x12, 0x98, 0x41, 0x63, 0xf9, 0x7f, 0xff, 0xbf, 0x34, 0x12, | ||||
|   0x10, 0x71, 0x5f, 0x2c, 0xa3, 0xcc, 0x9a, 0x47, 0x3c, 0x0e, 0x2d, 0xb8, 0x29, 0xbf, 0x61, 0xd0, | ||||
|   0x76, 0xb5, 0x92, 0xd1, 0x32, 0x65, 0x89, 0xdb, 0x03, 0xcc, 0x8b, 0x8c, 0x63, 0x4d, 0xc3, 0xa5, | ||||
|   0xc6, 0xc8, 0x95, 0x74, 0xbb, 0x9e, 0xe5, 0x2a, 0x51, 0x4c, 0xf0, 0x67, 0x78, 0x18, 0x28, 0x82, | ||||
|   0x9c, 0x32, 0x34, 0x13, 0x01, 0xa1, 0xad, 0x44, 0xf3, 0xa4, 0x22, 0xac, 0xaa, 0xec, 0xa3, 0x10, | ||||
|   0x62, 0x05, 0xb8, 0xe0, 0x21, 0xa5, 0x08, 0x40, 0xdb, 0x51, 0x36, 0x9e, 0xa8, 0x46, 0x71, 0xad, | ||||
|   0x22, 0xe4, 0xfd, 0xbd, 0xe6, 0x15, 0xb3, 0xd5, 0xd9, 0xc2, 0x52, 0x63, 0xe9, 0x3f, 0x17, 0x22, | ||||
|   0x10, 0x9e, 0x8c, 0x4f, 0x7f, 0x14, 0x21, 0x2f, 0x60, 0x9a, 0x0c, 0xa4, 0xf6, 0x19, 0x40, 0x8d, | ||||
|   0xd1, 0xec, 0x3f, 0x11, 0x60, 0x50, 0x96, 0x7d, 0x07, 0xa6, 0xa2, 0x6a, 0x6e, 0x9a, 0x08, 0x4d, | ||||
|   0xfa, 0xcb, 0x97, 0x23, 0xba, 0xa7, 0xf3, 0x0e, 0x25, 0xef, 0x0e, 0x12, 0xba, 0x21, 0x02, 0xea, | ||||
|   0x67, 0x3b, 0x6c, 0xa7, 0x54, 0x7f, 0xbc, 0x3c, 0x19, 0x25, 0xd5, 0xfa, 0x77, 0x99, 0x57, 0xbf, | ||||
|   0xbf, 0xa7, 0x4a, 0x38, 0xc4, 0x0f, 0x30, 0x4f, 0xd9, 0xc8, 0x54, 0xc5, 0x4e, 0x5e, 0xe7, 0x87, | ||||
|   0xbe, 0x5d, 0xff, 0x65, 0x0f, 0x34, 0xd6, 0xa0, 0x0c, 0x77, 0x59, 0xf2, 0xb6, 0x81, 0x6d, 0x8c, | ||||
|   0x76, 0xf3, 0x86, 0xf9, 0xc0, 0x21, 0xa4, 0x7a, 0x30, 0x55, 0x12, 0x80, 0x17, 0x02, 0x28, 0xa3, | ||||
|   0x84, 0xd0, 0xb6, 0x4b, 0x94, 0x9a, 0x9b, 0x4c, 0x1e, 0x01, 0x2f, 0xd6, 0xc7, 0xa8, 0x09, 0xe4, | ||||
|   0xa2, 0xa0, 0xee, 0x40, 0x2f, 0x25, 0x45, 0xf9, 0x9b, 0x85, 0x6d, 0x05, 0xa5, 0x7f, 0xc5, 0x10, | ||||
|   0x64, 0x13, 0x58, 0xac, 0x2d, 0x54, 0x30, 0xfe, 0xc1, 0xd1, 0x62, 0xbd, 0x6b, 0x64, 0x5b, 0x1c, | ||||
|   0xeb, 0xdf, 0x04, 0x80, 0x79, 0xa2, 0x13, 0x2e, 0x49, 0x6f, 0x45, 0x43, 0xfa, 0x82, 0x68, 0xce, | ||||
|   0x53, 0xd9, 0x38, 0x31, 0x4a, 0x48, 0x20, 0x56, 0x31, 0xfb, 0xe3, 0x79, 0x52, 0x5e, 0x73, 0x45, | ||||
|   0x3e, 0x52, 0x3a, 0xc4, 0xc2, 0x72, 0xb2, 0xf2, 0xdb, 0xf8, 0x67, 0x1f, 0x5d, 0x43, 0x67, 0x3c, | ||||
|   0xbc, 0x17, 0x0a, 0xb2, 0x94, 0x9e, 0x56, 0x2b, 0xa9, 0xb8, 0xab, 0xd0, 0x87, 0xd1, 0x0f, 0xd4, | ||||
|   0xa2, 0xd6, 0x04, 0x74, 0xc7, 0x86, 0xcd, 0xb0, 0xcb, 0x93, 0x95, 0xcb, 0x28, 0x65, 0x89, 0xb3, | ||||
|   0xad, 0xef, 0x53, 0xbf, 0x7c, 0xda, 0x4e, 0x65, 0x72, 0xb1, 0xde, 0xd3, 0xfe, 0x13, 0x9f, 0x5d, | ||||
|   0xd8, 0x93, 0x3a, 0xca, 0xaa, 0xe4, 0x7f, 0xab, 0xe6, 0xdb, 0xd9, 0x8d, 0xc6, 0xaa, 0xec, 0xa9, | ||||
|   0xa3, 0x32, 0xc9, 0xac, 0x13, 0xc9, 0x1f, 0x53, 0x35, 0x56, 0x3b, 0x93, 0x2d, 0x3e, 0x5b, 0xb8, | ||||
|   0x04, 0xfe, 0x4c, 0x55, 0x47, 0xc6, 0x8a, 0x46, 0x11, 0xd3, 0x84, 0xe9, 0x3a, 0x32, 0xfb, 0x83, | ||||
|   0x51, 0x32, 0x66, 0xe9, 0xc2, 0xf9, 0x50, 0x55, 0x87, 0xd9, 0x4f, 0x39, 0x81, 0x69, 0xe0, 0x09, | ||||
|   0x3f, 0x14, 0x78, 0x3c, 0x76, 0xca, 0x44, 0x9f, 0x59, 0x8b, 0x5b, 0x7d, 0x3d, 0xd9, 0x59, 0x8c, | ||||
|   0xab, 0x02, 0x44, 0x7e, 0xae, 0x8a, 0x2d, 0x64, 0x39, 0xa3, 0x79, 0x5c, 0xe6, 0x3e, 0x1b, 0x39, | ||||
|   0x7e, 0xad, 0xc5, 0x28, 0x97, 0xf9, 0xdc, 0xb9, 0xda, 0xb6, 0x70, 0xeb, 0xe7, 0xeb, 0x58, 0x48, | ||||
|   0x83, 0x15, 0xaa, 0x54, 0xc2, 0xb0, 0x6b, 0x49, 0xa7, 0xc9, 0x30, 0xcd, 0x2f, 0x35, 0x9e, 0xc4, | ||||
|   0x31, 0x1d, 0x27, 0xdb, 0xe0, 0x76, 0x48, 0x66, 0x55, 0xe4, 0x57, 0x94, 0x2d, 0x8d, 0xef, 0x4c, | ||||
|   0xaf, 0xe4, 0xdd, 0xa4, 0x51, 0xce, 0x29, 0x2b, 0xad, 0xeb, 0xa1, 0xd5, 0xb9, 0x9b, 0x8d, 0x8d, | ||||
|   0x10, 0xf3, 0xae, 0x23, 0xf9, 0xdd, 0xd5, 0xac, 0x02, 0xce, 0xa0, 0x77, 0x39, 0x77, 0xe8, 0xf1, | ||||
|   0x5b, 0x3e, 0x7b, 0x2d, 0x53, 0x05, 0x98, 0x58, 0x5d, 0xdf, 0xd9, 0x4f, 0x9b, 0xaa, 0x55, 0x89, | ||||
|   0xda, 0xc0, 0x51, 0xe3, 0xc3, 0x0f, 0xe7, 0x33, 0xba, 0x69, 0x57, 0xed, 0x76, 0xfb, 0xf8, 0x3f, | ||||
|   0xef, 0xaa, 0xff, 0x68, 0xa4, 0xd8, 0x6c, 0x12, 0x4b, 0x7b, 0x8f, 0x6a, 0x57, 0xde, 0x00, 0xf7, | ||||
|   0x3b, 0xe8, 0x0c, 0xa0, 0x5f, 0x0b, 0x7e, 0x70, 0x5e, 0x23, 0xa7, 0x71, 0xba, 0xf6, 0x44, 0x3d, | ||||
|   0xa8, 0x8f, 0x05, 0x93, 0xae, 0xe3, 0x40, 0x55, 0x5b, 0xa5, 0xcf, 0xf3, 0x32, 0x43, 0xff, 0xed, | ||||
|   0x3e, 0xc4, 0x9b, 0xe8, 0x7a, 0x26, 0x56, 0x56, 0x3b, 0x65, 0x26, 0xac, 0x7a, 0xbb, 0x8f, 0x84, | ||||
|   0xd4, 0x2c, 0xd2, 0xcf, 0xbe, 0xbb, 0x7b, 0x8d, 0xe6, 0x18, 0x13, 0x61, 0xed, 0x02, 0x88, 0xe4, | ||||
|   0x41, 0xf0, 0x26, 0x46, 0xe5, 0x75, 0xee, 0x54, 0x11, 0x56, 0x95, 0xcf, 0x40, 0x7f, 0xa6, 0xe1, | ||||
|   0x1a, 0xcb, 0x14, 0x69, 0x72, 0x6e, 0xe3, 0xcf, 0x6f, 0x81, 0x53, 0x48, 0x4e, 0x57, 0xd1, 0x10, | ||||
|   0xa5, 0xc6, 0xaf, 0x32, 0x74, 0x6d, 0x8c, 0x9c, 0xd9, 0x1d, 0x14, 0xe8, 0x3a, 0xb8, 0x35, 0xcd, | ||||
|   0x90, 0x0c, 0x28, 0x93, 0xd3, 0x60, 0xff, 0xe8, 0xe8, 0x3c, 0xf1, 0xe1, 0xaf, 0x81, 0xe1, 0x72, | ||||
|   0xc3, 0xaa, 0xa1, 0x1b, 0xb0, 0x2f, 0x80, 0x49, 0xed, 0xa9, 0x0b, 0x30, 0xbd, 0x68, 0x62, 0x2e, | ||||
|   0xaa, 0xab, 0x5f, 0xfe, 0xac, 0x3d, 0x7e, 0x34, 0x39, 0xeb, 0x15, 0x29, 0x49, 0x47, 0x40, 0xd4, | ||||
|   0x34, 0xf1, 0x49, 0x47, 0xc1, 0x1a, 0xff, 0x72, 0x9b, 0x5c, 0x72, 0x39, 0x84, 0xac, 0x79, 0x77, | ||||
|   0xe0, 0xa7, 0xed, 0x7f, 0x57, 0xe0, 0x65, 0x22, 0xaf, 0x7d, 0x80, 0xf4, 0xc5, 0x42, 0xd2, 0x75, | ||||
|   0x26, 0xa5, 0x4d, 0x9a, 0x49, 0xcc, 0x3f, 0x21, 0x1d, 0x0f, 0x8b, 0x45, 0xad, 0x6c, 0xe0, 0x8b, | ||||
|   0xb7, 0x51, 0x2f, 0x42, 0x48, 0x3a, 0x2b, 0x26, 0xf4, 0xb6, 0xd8, 0xd3, 0xb6, 0xc5, 0xce, 0xfb, | ||||
|   0x9a, 0x82, 0x07, 0xed, 0xe0, 0x98, 0x76, 0x08, 0xb6, 0x5a, 0x77, 0x19, 0xef, 0x88, 0x9f, 0x9d, | ||||
|   0xc6, 0xf6, 0x0d, 0x17, 0xe1, 0x8b, 0x37, 0x6f, 0xba, 0x1b, 0x9d, 0x5b, 0x67, 0x6d, 0xce, 0x76, | ||||
|   0x6b, 0x27, 0x94, 0x4f, 0x40, 0x47, 0x76, 0xde, 0x97, 0x66, 0xf1, 0xab, 0x77, 0x73, 0xeb, 0x4e, | ||||
|   0x6c, 0xac, 0x1b, 0x96, 0x00, 0xaf, 0xc7, 0xb1, 0xa5, 0x7e, 0xfa, 0xcf, 0xfc, 0x18, 0x1d, 0xe3, | ||||
|   0x73, 0xf0, 0x36, 0x72, 0x94, 0x0a, 0x7b, 0x64, 0x7f, 0xe5, 0xda, 0xea, 0x07, 0x64, 0x6d, 0x17, | ||||
|   0x3f, 0xda, 0xc0, 0x82, 0x4a, 0x9e, 0x7f, 0x9b, 0x83, 0xb3, 0x38, 0x85, 0x00, 0x16, 0x76, 0x42, | ||||
|   0x9f, 0x00, 0xdb, 0xae, 0x5d, 0x7d, 0xe4, 0xeb, 0xec, 0xc0, 0x79, 0x29, 0x56, 0x07, 0x80, 0xfd, | ||||
|   0xcf, 0xcc, 0xf3, 0x88, 0x6f, 0x89, 0x77, 0xe6, 0x3d, 0x4a, 0xc2, 0x36, 0x29, 0x68, 0x7e, 0x08, | ||||
|   0xfc, 0x39, 0xdf, 0xc8, 0xe2, 0x2d, 0x7f, 0x31, 0xdf, 0xe1, 0x2f, 0x9a, 0x04, 0xd4, 0x79, 0x6a, | ||||
|   0x97, 0x3d, 0x50, 0xd2, 0x69, 0x94, 0x7b, 0x96, 0xdf, 0x8f, 0x3a, 0x66, 0x20, 0x00, 0x21, 0xfc, | ||||
|   0x0e, 0x4f, 0x32, 0xd9, 0x91, 0x87, 0x62, 0xf5, 0x44, 0x5b, 0x7e, 0xbe, 0x23, 0xd5, 0xa9, 0xbc, | ||||
|   0xc9, 0x8e, 0x9a, 0x48, 0xa0, 0x49, 0xd6, 0x4d, 0xb6, 0xfa, 0x10, 0xe8, 0x09, 0x48, 0xc5, 0xdf, | ||||
|   0xac, 0x91, 0x9f, 0x60, 0xe2, 0x0f, 0x39, 0xd2, 0xff, 0xb9, 0xd8, 0xff, 0x07, 0xff, 0x03, 0x8d, | ||||
|   0x05, 0x6d, 0x6c, 0x00, 0x00 | ||||
| }; | ||||
| @@ -8,7 +8,7 @@ | ||||
| // Autogenerated from wled00/data/style.css, do not edit!! | ||||
| const uint16_t PAGE_settingsCss_length = 888; | ||||
| const uint8_t PAGE_settingsCss[] PROGMEM = { | ||||
|   0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x13, 0xad, 0x56, 0x51, 0x8b, 0xab, 0x38, | ||||
|   0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0a, 0xad, 0x56, 0x51, 0x8b, 0xab, 0x38, | ||||
|   0x14, 0xfe, 0x2b, 0x2e, 0x65, 0x60, 0x2e, 0x54, 0x51, 0xab, 0x9d, 0xde, 0xc8, 0xc2, 0xb2, 0xef, | ||||
|   0xf7, 0x6d, 0x58, 0x16, 0x96, 0x79, 0x88, 0xe6, 0x58, 0x43, 0x63, 0x22, 0x49, 0xbc, 0xb5, 0x23, | ||||
|   0xfe, 0xf7, 0x4d, 0xa2, 0x8e, 0xb6, 0x23, 0x73, 0x5f, 0x2e, 0xa5, 0x25, 0xe6, 0xc4, 0xe4, 0x3b, | ||||
| @@ -70,7 +70,7 @@ const uint8_t PAGE_settingsCss[] PROGMEM = { | ||||
| // Autogenerated from wled00/data/settings.htm, do not edit!! | ||||
| const uint16_t PAGE_settings_length = 1115; | ||||
| const uint8_t PAGE_settings[] PROGMEM = { | ||||
|   0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x13, 0xb5, 0x56, 0xdb, 0x52, 0xe3, 0x46, | ||||
|   0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0a, 0xb5, 0x56, 0xdb, 0x52, 0xe3, 0x46, | ||||
|   0x10, 0x7d, 0xf7, 0x57, 0x0c, 0xb3, 0x15, 0x56, 0x2a, 0x64, 0xf9, 0x42, 0x2a, 0x95, 0xc8, 0x96, | ||||
|   0xa9, 0x2c, 0x97, 0x8d, 0x53, 0x50, 0x4b, 0x05, 0x58, 0x92, 0x4a, 0xf2, 0x30, 0xd6, 0xb4, 0xac, | ||||
|   0x59, 0xa4, 0x19, 0xd5, 0x4c, 0xcb, 0xe0, 0xb0, 0xfc, 0x7b, 0x7a, 0x64, 0x63, 0x60, 0xe1, 0x21, | ||||
| @@ -144,157 +144,165 @@ const uint8_t PAGE_settings[] PROGMEM = { | ||||
|  | ||||
|  | ||||
| // Autogenerated from wled00/data/settings_wifi.htm, do not edit!! | ||||
| const uint16_t PAGE_settings_wifi_length = 2269; | ||||
| const uint16_t PAGE_settings_wifi_length = 2387; | ||||
| const uint8_t PAGE_settings_wifi[] PROGMEM = { | ||||
|   0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x13, 0xb5, 0x58, 0x6d, 0x73, 0xdb, 0xb8, | ||||
|   0x11, 0xfe, 0xae, 0x5f, 0x01, 0xa3, 0x1d, 0x0f, 0x39, 0xa6, 0x29, 0xc9, 0x4a, 0x72, 0xa9, 0x2c, | ||||
|   0x2a, 0xf5, 0x8b, 0x2e, 0x76, 0xeb, 0x73, 0xd4, 0xca, 0xbd, 0x4c, 0x27, 0xcd, 0xdc, 0xd1, 0xe4, | ||||
|   0x4a, 0x42, 0x4c, 0x01, 0x2c, 0x01, 0x4a, 0xf6, 0xd8, 0xfe, 0xef, 0xdd, 0x05, 0x48, 0xbd, 0xd9, | ||||
|   0x4e, 0x3b, 0x19, 0x77, 0x32, 0x49, 0x48, 0x60, 0xb1, 0xfb, 0xec, 0xdb, 0x83, 0xa5, 0x7a, 0x3b, | ||||
|   0xa7, 0x9f, 0x4e, 0xae, 0xfe, 0x39, 0x1c, 0xb0, 0xa9, 0x99, 0x65, 0xfd, 0x1e, 0xfd, 0xcb, 0xb2, | ||||
|   0x58, 0x4e, 0x22, 0x0e, 0x92, 0xe3, 0x3b, 0xc4, 0x69, 0xbf, 0x37, 0x03, 0x13, 0xb3, 0x64, 0x1a, | ||||
|   0x17, 0x1a, 0x4c, 0xc4, 0x4b, 0x33, 0xde, 0x7f, 0xcf, 0xab, 0xd5, 0x86, 0x8c, 0x67, 0x10, 0xf1, | ||||
|   0xb9, 0x80, 0x45, 0xae, 0x0a, 0xc3, 0x59, 0xa2, 0xa4, 0x01, 0x89, 0x62, 0x0b, 0x91, 0x9a, 0x69, | ||||
|   0xf4, 0xb6, 0xd5, 0x5a, 0x8a, 0x6e, 0x6d, 0xa5, 0x30, 0x17, 0x09, 0xec, 0xdb, 0x97, 0x40, 0x48, | ||||
|   0x61, 0x44, 0x9c, 0xed, 0xeb, 0x24, 0xce, 0x20, 0x6a, 0x07, 0xb3, 0xf8, 0x56, 0xcc, 0xca, 0xd9, | ||||
|   0xf2, 0xbd, 0xd4, 0x50, 0xd8, 0x97, 0xf8, 0x1a, 0xdf, 0xa5, 0xe2, 0x4f, 0x2c, 0xf7, 0x7b, 0x46, | ||||
|   0x98, 0x0c, 0xfa, 0x9f, 0xc5, 0xcf, 0x82, 0x8d, 0xc0, 0x18, 0x21, 0x27, 0xba, 0xd7, 0x74, 0x8b, | ||||
|   0x3d, 0x9d, 0x14, 0x22, 0x37, 0xfd, 0xc6, 0x3c, 0x2e, 0x58, 0xa6, 0x12, 0x91, 0x07, 0x69, 0x94, | ||||
|   0xaa, 0xa4, 0x9c, 0x21, 0xa0, 0x00, 0x17, 0xa2, 0x9d, 0x36, 0xfd, 0x97, 0x17, 0xca, 0xa8, 0x88, | ||||
|   0x4f, 0x8d, 0xc9, 0xbb, 0x3c, 0x40, 0x7b, 0xf2, 0x42, 0xa9, 0x5c, 0x47, 0xad, 0x20, 0x2f, 0x60, | ||||
|   0x84, 0xaf, 0xa3, 0xd1, 0xf9, 0x69, 0xc4, 0xf9, 0xe1, 0xb8, 0x94, 0x89, 0x11, 0x4a, 0xb2, 0xc9, | ||||
|   0x79, 0xea, 0x19, 0xff, 0xbe, 0x00, 0x53, 0x16, 0x92, 0xa5, 0xe1, 0x04, 0xcc, 0x20, 0x03, 0x52, | ||||
|   0x7b, 0x7c, 0x67, 0xb7, 0x1e, 0x97, 0xa2, 0xc9, 0x60, 0x43, 0x32, 0x29, 0x20, 0x36, 0x50, 0x09, | ||||
|   0x6f, 0x08, 0x9e, 0x79, 0xfe, 0xfd, 0x42, 0xc8, 0x54, 0x2d, 0x42, 0x95, 0x83, 0xf4, 0x2c, 0x1e, | ||||
|   0xdd, 0x6d, 0x36, 0x6f, 0xa4, 0x0a, 0x17, 0x19, 0x90, 0x95, 0xe6, 0x18, 0x4f, 0x97, 0x05, 0xe8, | ||||
|   0xa6, 0xae, 0x7c, 0x6d, 0xfe, 0x61, 0x21, 0xc6, 0x62, 0xbf, 0x7e, 0xe5, 0x6b, 0x0a, 0x8f, 0xb7, | ||||
|   0x14, 0x22, 0xc8, 0x7f, 0xfc, 0xfd, 0xc2, 0xe3, 0xcd, 0x95, 0x70, 0xc0, 0x7f, 0xd3, 0x90, 0x8d, | ||||
|   0xd7, 0x4f, 0x5d, 0xe2, 0x29, 0xcc, 0x99, 0x36, 0xcc, 0x44, 0xe4, 0x26, 0xa7, 0x78, 0x70, 0xff, | ||||
|   0xd0, 0x84, 0xa9, 0xd0, 0x94, 0x87, 0x34, 0xda, 0x69, 0x05, 0x26, 0x34, 0x70, 0x6b, 0x4e, 0xea, | ||||
|   0xdc, 0x52, 0x90, 0x24, 0xaa, 0x0c, 0xc3, 0x90, 0x07, 0x63, 0x30, 0xc9, 0x74, 0x65, 0xed, 0x9b, | ||||
|   0x56, 0xb2, 0x29, 0xc1, 0x70, 0xdf, 0x0f, 0xcd, 0x14, 0x71, 0x98, 0xa8, 0x6f, 0x42, 0x5a, 0xf5, | ||||
|   0xd6, 0x56, 0x3e, 0x5d, 0x7f, 0x83, 0xc4, 0x84, 0xb1, 0xd6, 0x62, 0x22, 0xbd, 0xfb, 0xc7, 0xe0, | ||||
|   0x1e, 0x8f, 0x2c, 0x54, 0x71, 0xa3, 0xbb, 0x5f, 0xbe, 0x3e, 0x06, 0xc6, 0x0f, 0xeb, 0xf7, 0x50, | ||||
|   0x63, 0xe2, 0x3d, 0xcf, 0x04, 0xe0, 0x47, 0x7d, 0x08, 0x0b, 0x3c, 0xb1, 0x6f, 0xec, 0x7f, 0x7e, | ||||
|   0x58, 0x40, 0x5a, 0x26, 0x50, 0x6f, 0x7a, 0x06, 0x65, 0x67, 0xe0, 0x0c, 0xe2, 0x7e, 0x1a, 0x45, | ||||
|   0x11, 0xd8, 0x07, 0xff, 0xe1, 0xc1, 0x84, 0x79, 0xa9, 0xa7, 0x1e, 0xf8, 0xa8, 0x3b, 0xf8, 0xf2, | ||||
|   0xb5, 0x86, 0x02, 0x51, 0xff, 0x5e, 0x8c, 0xbd, 0x96, 0x15, 0xcd, 0x40, 0x4e, 0xcc, 0x74, 0x77, | ||||
|   0x77, 0x59, 0x12, 0xbd, 0x76, 0xcb, 0xaf, 0x52, 0xb9, 0x5c, 0xdb, 0xdb, 0x0b, 0xe6, 0x4a, 0xa4, | ||||
|   0x0c, 0xa3, 0x7a, 0x25, 0x66, 0xa0, 0x4a, 0xe3, 0x5d, 0x06, 0x6d, 0xe8, 0xf8, 0x87, 0x6b, 0x95, | ||||
|   0x74, 0x98, 0x81, 0x61, 0xd2, 0x05, 0xf4, 0x64, 0x84, 0xe1, 0x44, 0x1b, 0xd2, 0xbf, 0xa7, 0x55, | ||||
|   0x13, 0x61, 0x89, 0x70, 0x4c, 0x03, 0xfa, 0x6f, 0xe3, 0x8c, 0x8a, 0x8e, 0x8c, 0x29, 0xc4, 0x75, | ||||
|   0x69, 0xc0, 0xe3, 0x22, 0xe5, 0x81, 0x3d, 0x12, 0x6c, 0xef, 0x50, 0x2b, 0xbc, 0xb4, 0xa7, 0x24, | ||||
|   0x76, 0xae, 0x9c, 0xd0, 0xfe, 0x95, 0xe7, 0xa3, 0xc0, 0x7a, 0x25, 0xcb, 0x70, 0x1e, 0x67, 0x25, | ||||
|   0x1c, 0x8e, 0x55, 0xe1, 0x11, 0x02, 0x40, 0x7c, 0xd0, 0x33, 0x61, 0x32, 0x15, 0x59, 0x5a, 0x80, | ||||
|   0xac, 0xfc, 0x3e, 0x84, 0xbd, 0x3d, 0x1f, 0x23, 0x0b, 0x33, 0x35, 0x87, 0x13, 0xda, 0xf3, 0x56, | ||||
|   0x32, 0x5f, 0xe0, 0xab, 0xbf, 0x54, 0xa0, 0x50, 0x81, 0xea, 0xd5, 0xf1, 0x3a, 0x54, 0x78, 0xae, | ||||
|   0xaa, 0x21, 0x61, 0x9d, 0x53, 0x39, 0x95, 0x16, 0x79, 0xbd, 0x05, 0xd3, 0xe2, 0xe0, 0x01, 0x7c, | ||||
|   0x51, 0x5f, 0x5d, 0x5e, 0x02, 0xb1, 0x51, 0x58, 0xbf, 0xff, 0xf1, 0x7e, 0xb9, 0xf7, 0xc8, 0xbc, | ||||
|   0xea, 0x8d, 0x72, 0xfd, 0xc8, 0xd2, 0xe3, 0x99, 0xff, 0xfb, 0xea, 0x28, 0x26, 0xac, 0xf2, 0x6b, | ||||
|   0x77, 0x77, 0xdb, 0x8c, 0x0b, 0x2e, 0x50, 0x24, 0x97, 0x8f, 0x14, 0xb3, 0x38, 0xc7, 0xbe, 0x48, | ||||
|   0x9d, 0x6b, 0xc2, 0x7f, 0x74, 0x90, 0xd5, 0x26, 0x64, 0xf5, 0x3c, 0x64, 0xbe, 0x73, 0x42, 0xfd, | ||||
|   0xa3, 0x36, 0xfb, 0xe0, 0x13, 0xd6, 0x50, 0xc1, 0xaa, 0x4a, 0xb5, 0xcd, 0xb0, 0x69, 0x44, 0xf9, | ||||
|   0x81, 0xc4, 0x80, 0xe6, 0x59, 0x9c, 0xc0, 0x67, 0x61, 0xa6, 0x44, 0x00, 0xeb, 0x8d, 0xd5, 0x7e, | ||||
|   0xae, 0xb1, 0xf8, 0xe3, 0x5a, 0x7b, 0x62, 0x36, 0xab, 0xaa, 0xd9, 0xa8, 0xa5, 0x1d, 0xf3, 0xf0, | ||||
|   0x60, 0x21, 0xed, 0x44, 0xc6, 0x45, 0xa1, 0xaa, 0xd3, 0x43, 0x97, 0x60, 0x72, 0x49, 0xc8, 0xbc, | ||||
|   0xa4, 0x0a, 0x83, 0xd0, 0xdc, 0xe5, 0x48, 0xa2, 0x64, 0x08, 0x63, 0x1f, 0x62, 0xec, 0x48, 0x0f, | ||||
|   0x3e, 0x39, 0x72, 0x75, 0xcf, 0x9b, 0x5e, 0x23, 0x33, 0xbb, 0xe4, 0xf2, 0xa0, 0x73, 0xe0, 0xe3, | ||||
|   0xb6, 0xb5, 0x11, 0xad, 0x55, 0x55, 0x60, 0x36, 0x1c, 0x83, 0x35, 0xcc, 0x99, 0x8a, 0xd3, 0xbf, | ||||
|   0x8c, 0xa8, 0x29, 0x91, 0x3a, 0x1c, 0x7c, 0xe9, 0x8a, 0xde, 0xf2, 0x33, 0x42, 0x92, 0xdb, 0x09, | ||||
|   0x2b, 0x12, 0x4e, 0x7d, 0xb9, 0xbd, 0x4e, 0xc0, 0x31, 0xf6, 0x84, 0xbc, 0xf9, 0x2d, 0x9e, 0xc7, | ||||
|   0xb5, 0x82, 0x27, 0x82, 0xb1, 0xbe, 0x93, 0xa8, 0x02, 0xbb, 0x3b, 0x0d, 0xaf, 0x55, 0x7a, 0xb7, | ||||
|   0x91, 0x05, 0x49, 0xf2, 0x71, 0x9a, 0x0e, 0xe6, 0x18, 0xe3, 0x0b, 0xa1, 0x31, 0xd4, 0x50, 0x78, | ||||
|   0x9c, 0x60, 0xf2, 0xc0, 0x43, 0xe2, 0xb8, 0xff, 0x08, 0xe6, 0x57, 0xcf, 0x7f, 0x7c, 0x5e, 0x0e, | ||||
|   0x8a, 0x42, 0x15, 0x08, 0x0f, 0xe5, 0xa8, 0x62, 0x54, 0x86, 0x85, 0xaf, 0x26, 0x1e, 0x1f, 0xd0, | ||||
|   0x3a, 0xab, 0xfc, 0x45, 0x32, 0x64, 0x63, 0x91, 0x81, 0x75, 0x03, 0x6f, 0x33, 0xa4, 0x2c, 0x7e, | ||||
|   0x51, 0xad, 0xab, 0x31, 0x5d, 0x98, 0x63, 0x31, 0x29, 0x8b, 0xd8, 0x06, 0xc8, 0xb9, 0xc1, 0xc6, | ||||
|   0xb1, 0x20, 0x9a, 0xff, 0x97, 0x3c, 0x97, 0x89, 0x9a, 0xe5, 0x18, 0x27, 0x60, 0x79, 0x3c, 0x01, | ||||
|   0x96, 0xc6, 0x26, 0xde, 0x41, 0x92, 0x5e, 0x8b, 0xe9, 0x68, 0x59, 0x07, 0x15, 0xc5, 0xe3, 0x3d, | ||||
|   0x66, 0x95, 0x51, 0x35, 0x70, 0xb2, 0xdc, 0xe5, 0x11, 0xd6, 0x82, 0xbd, 0xdb, 0x12, 0x95, 0xf9, | ||||
|   0xf6, 0xba, 0x6b, 0x05, 0x9e, 0xbd, 0x07, 0x23, 0x92, 0xce, 0x46, 0x46, 0x15, 0xa8, 0x9e, 0x6e, | ||||
|   0xaf, 0x73, 0x03, 0x33, 0x8a, 0x40, 0x72, 0x9e, 0x23, 0x4f, 0x3f, 0x3c, 0x54, 0x62, 0x78, 0x7a, | ||||
|   0x96, 0x23, 0xf2, 0x9f, 0x51, 0x1f, 0xfb, 0x45, 0xa5, 0x10, 0xb2, 0x61, 0x06, 0xb1, 0x06, 0x86, | ||||
|   0x11, 0xc1, 0x4a, 0xff, 0x7c, 0x31, 0x38, 0x65, 0xe7, 0x43, 0xc4, 0x16, 0x6c, 0x68, 0xd4, 0x9b, | ||||
|   0x1a, 0x03, 0xab, 0xcd, 0xc7, 0xd2, 0xcb, 0x34, 0xdc, 0xbb, 0x8a, 0x44, 0x68, 0xb1, 0x99, 0x52, | ||||
|   0xc5, 0x05, 0x92, 0x58, 0x39, 0xc3, 0xb1, 0xc0, 0x6b, 0x63, 0x65, 0x61, 0x9a, 0xb4, 0x2d, 0x21, | ||||
|   0xde, 0xe4, 0xfe, 0x87, 0xfd, 0x76, 0xd7, 0xb2, 0x6b, 0xcb, 0x0f, 0x75, 0x9e, 0x09, 0x63, 0x57, | ||||
|   0x0f, 0x6b, 0x8a, 0xea, 0x1f, 0xec, 0xee, 0x7a, 0xcb, 0x1b, 0x7c, 0xe5, 0x6d, 0x50, 0x79, 0xeb, | ||||
|   0xbc, 0x30, 0xe1, 0x54, 0x69, 0x43, 0xa6, 0xf6, 0x90, 0xc1, 0x68, 0x6e, 0xf8, 0xc0, 0xbb, 0x7c, | ||||
|   0xcf, 0x3d, 0x76, 0x39, 0xf7, 0xf7, 0x50, 0xe9, 0x9e, 0xfc, 0xd2, 0xfa, 0xea, 0x3f, 0x56, 0xb5, | ||||
|   0xfa, 0xe4, 0xae, 0x6c, 0x6a, 0xbc, 0xb2, 0x3e, 0xe4, 0x51, 0x1b, 0x5d, 0xdd, 0x69, 0x5b, 0x77, | ||||
|   0xd1, 0x74, 0x1a, 0x8e, 0xc6, 0x61, 0x6c, 0x33, 0x12, 0x3d, 0x3d, 0x42, 0x37, 0x33, 0x46, 0x73, | ||||
|   0x95, 0xb4, 0x4a, 0x64, 0x39, 0x0f, 0x10, 0xf4, 0x0f, 0x35, 0x7c, 0x04, 0x81, 0x28, 0x2c, 0x62, | ||||
|   0x8b, 0xc9, 0x3c, 0x36, 0x7a, 0xcd, 0x6a, 0x82, 0xe9, 0x69, 0x73, 0x87, 0x03, 0xcd, 0x9f, 0xc5, | ||||
|   0x8c, 0x20, 0xb3, 0xb2, 0xc8, 0xb0, 0x47, 0x68, 0x29, 0x4c, 0x34, 0xd2, 0xd0, 0x21, 0x0a, 0x5a, | ||||
|   0x81, 0x5e, 0xd3, 0xcd, 0x6e, 0x54, 0xf2, 0x58, 0x89, 0xe4, 0x0c, 0x72, 0x08, 0x5e, 0x00, 0xfd, | ||||
|   0x1e, 0x72, 0xf5, 0xac, 0xc1, 0xa8, 0xd7, 0xe9, 0xe9, 0x37, 0xcd, 0x99, 0xeb, 0xf6, 0xd1, 0x98, | ||||
|   0x33, 0x9c, 0xd4, 0xa6, 0x0a, 0x77, 0x72, 0x0c, 0x13, 0x8a, 0xa6, 0x62, 0xce, 0x92, 0x0c, 0xaf, | ||||
|   0x62, 0xe4, 0x08, 0x85, 0xd8, 0x16, 0x9b, 0x6b, 0x53, 0xc8, 0xf2, 0x63, 0xde, 0x6f, 0xf4, 0xb0, | ||||
|   0xd5, 0x0c, 0x7a, 0xe5, 0xd8, 0xc4, 0xbd, 0x70, 0xb4, 0x9a, 0x60, 0x2a, 0x6f, 0x22, 0x7e, 0x46, | ||||
|   0x66, 0x3f, 0xf4, 0x9a, 0x6e, 0x03, 0xa1, 0xa1, 0x8a, 0xfe, 0xf3, 0x67, 0x1a, 0xcb, 0x43, 0xc7, | ||||
|   0x74, 0xe8, 0x38, 0x4e, 0x6e, 0x56, 0xe7, 0x36, 0x4e, 0xe8, 0xf2, 0x7a, 0x26, 0x10, 0xe3, 0x28, | ||||
|   0x9e, 0x03, 0xdb, 0x65, 0xc8, 0x93, 0x12, 0xe9, 0x7c, 0x25, 0x3c, 0x2d, 0x10, 0x97, 0xb3, 0x34, | ||||
|   0x3d, 0x70, 0x53, 0x21, 0xa6, 0xa3, 0xcc, 0x31, 0x30, 0x07, 0xb8, 0xd4, 0xe9, 0x57, 0x27, 0x98, | ||||
|   0x51, 0x0c, 0x6e, 0xb1, 0xa5, 0xa9, 0x1f, 0x2b, 0xbe, 0x46, 0x99, 0xce, 0xd2, 0x5c, 0x63, 0x13, | ||||
|   0x21, 0xc5, 0xcd, 0x0e, 0x42, 0x2b, 0xff, 0x2e, 0x09, 0x2a, 0xb1, 0xdf, 0x1a, 0x54, 0xb4, 0x7e, | ||||
|   0xe9, 0x94, 0xd9, 0xe8, 0x32, 0xcf, 0x32, 0x23, 0x03, 0x6c, 0xa2, 0x3b, 0x32, 0x29, 0x95, 0xa1, | ||||
|   0xd6, 0x27, 0x04, 0x7e, 0x97, 0xc4, 0x7b, 0x96, 0x94, 0xd9, 0x1a, 0x21, 0xb3, 0x8a, 0x8e, 0xeb, | ||||
|   0x51, 0x97, 0x1e, 0x97, 0xec, 0x1b, 0xf1, 0xce, 0x01, 0xb7, 0x76, 0x6a, 0x33, 0x39, 0xa6, 0x04, | ||||
|   0x1f, 0xd2, 0xa7, 0xda, 0xea, 0x9d, 0x95, 0xa6, 0xe1, 0x86, 0xa6, 0x77, 0x1d, 0xa7, 0x69, 0x64, | ||||
|   0x90, 0x37, 0x12, 0xec, 0x62, 0x86, 0x77, 0x39, 0x85, 0x35, 0x36, 0xac, 0x15, 0xda, 0x3f, 0x0c, | ||||
|   0x4b, 0x85, 0x9d, 0x9e, 0x9d, 0x0c, 0x37, 0xc0, 0x56, 0xea, 0xce, 0x5b, 0xbc, 0xb2, 0x24, 0xcb, | ||||
|   0xd9, 0x35, 0x14, 0xbc, 0xae, 0x0f, 0x2c, 0xad, 0x99, 0x90, 0x11, 0x6f, 0x59, 0x73, 0x11, 0x3f, | ||||
|   0x78, 0xfb, 0x96, 0xb3, 0x02, 0xfe, 0x5d, 0x0a, 0x1c, 0xcf, 0xfa, 0x2c, 0x64, 0x5b, 0x7a, 0xda, | ||||
|   0xaf, 0xa4, 0xe7, 0xe0, 0x95, 0xf4, 0x74, 0x7e, 0x48, 0xcf, 0x5a, 0x28, 0x27, 0x38, 0xe1, 0x2f, | ||||
|   0xe2, 0xbb, 0x6e, 0x63, 0x2d, 0x68, 0x4e, 0xf7, 0xc7, 0x1f, 0x8e, 0x59, 0x63, 0x53, 0xcf, 0x2b, | ||||
|   0xc5, 0xec, 0xe3, 0x2b, 0xc5, 0xec, 0xe3, 0x8f, 0xc7, 0xac, 0x51, 0x05, 0x0d, 0x3b, 0x1b, 0xfb, | ||||
|   0x10, 0xa5, 0xf4, 0x4d, 0xf7, 0x49, 0xdc, 0x46, 0xff, 0x43, 0xdc, 0x1a, 0xdf, 0x05, 0x5a, 0xe9, | ||||
|   0x69, 0xbf, 0x92, 0x9e, 0x83, 0x57, 0xd2, 0xd3, 0xf9, 0x31, 0x3d, 0x14, 0xa0, 0xd9, 0xe9, 0xe5, | ||||
|   0x88, 0xe1, 0x74, 0x82, 0x5f, 0x83, 0xba, 0x6e, 0x5d, 0x47, 0x34, 0xd4, 0xb5, 0x52, 0x31, 0x12, | ||||
|   0x70, 0x8d, 0x6b, 0xbf, 0x6c, 0x9b, 0xcd, 0xca, 0x76, 0x63, 0x83, 0x6e, 0x2a, 0x6e, 0xf8, 0xe5, | ||||
|   0x09, 0xcb, 0x30, 0x3b, 0x52, 0x64, 0x74, 0xfe, 0x24, 0x13, 0x78, 0xdf, 0x23, 0x45, 0x74, 0x59, | ||||
|   0x4f, 0xe7, 0xb1, 0x5c, 0xa2, 0x14, 0x39, 0xde, 0x03, 0x97, 0x2b, 0x52, 0x83, 0x14, 0x6f, 0x22, | ||||
|   0x14, 0xb0, 0x00, 0x2b, 0xba, 0xb5, 0x73, 0x0e, 0xb0, 0xa3, 0x24, 0x21, 0xa0, 0x43, 0x25, 0xa4, | ||||
|   0xb1, 0x4c, 0xdb, 0x38, 0x1a, 0x32, 0xa2, 0xc7, 0x67, 0xb1, 0x1f, 0x0d, 0x5f, 0xe4, 0x47, 0x07, | ||||
|   0xf8, 0xe8, 0x29, 0x2d, 0xda, 0x76, 0x3b, 0x13, 0x29, 0xda, 0x1a, 0x5a, 0xa9, 0x2e, 0xdb, 0x38, | ||||
|   0x9e, 0x4c, 0x21, 0xb9, 0xb9, 0x56, 0xb7, 0x4b, 0x15, 0x67, 0x8e, 0x00, 0x09, 0x48, 0x4d, 0x96, | ||||
|   0x4f, 0xc1, 0xd0, 0xa7, 0xb3, 0xff, 0x3d, 0x76, 0xad, 0x94, 0x0d, 0x5d, 0xa6, 0xd6, 0xd8, 0x15, | ||||
|   0x95, 0x1a, 0x1c, 0x92, 0x30, 0x8b, 0x5e, 0x78, 0xff, 0x3e, 0x78, 0xd7, 0x79, 0xf4, 0x1f, 0xf0, | ||||
|   0xce, 0x60, 0xf6, 0xc7, 0x89, 0x88, 0x0f, 0xac, 0x09, 0xb4, 0x80, 0x89, 0x0e, 0xd9, 0x7b, 0xfb, | ||||
|   0x53, 0x0b, 0x8e, 0x12, 0x50, 0xe8, 0x1a, 0xd6, 0x5a, 0xc4, 0x98, 0xbd, 0xca, 0xe8, 0x9b, 0x4e, | ||||
|   0x42, 0xd6, 0xdd, 0x2c, 0xa2, 0xa3, 0x93, 0x17, 0x8a, 0xe8, 0xb6, 0xae, 0xa2, 0x76, 0x5d, 0x45, | ||||
|   0xed, 0xce, 0x56, 0x11, 0xa1, 0xeb, 0xe4, 0xa0, 0xa6, 0xc4, 0xda, 0x2f, 0xa3, 0x5a, 0x27, 0x5e, | ||||
|   0xf0, 0x3d, 0xf7, 0x0d, 0xc4, 0xdc, 0xa8, 0x8f, 0xa5, 0x48, 0xa9, 0xae, 0x33, 0x4d, 0x1b, 0xf1, | ||||
|   0x98, 0x66, 0xc0, 0x6b, 0xa5, 0x30, 0xa1, 0x4e, 0x76, 0xfb, 0x4c, 0x9b, 0xf7, 0x4f, 0x85, 0x5e, | ||||
|   0x2b, 0x8e, 0x2d, 0xb1, 0x46, 0x25, 0x87, 0xd9, 0x3b, 0xca, 0x90, 0x32, 0xf5, 0x4b, 0x8a, 0xf0, | ||||
|   0xae, 0xba, 0x84, 0x39, 0x5a, 0xf3, 0xe8, 0x0a, 0x2d, 0x00, 0xe7, 0xe3, 0x19, 0x0e, 0x8a, 0x90, | ||||
|   0xfa, 0xcb, 0x13, 0x34, 0x2d, 0x59, 0x17, 0x6a, 0xc7, 0x9e, 0x2f, 0x57, 0xaa, 0x56, 0x9a, 0xd8, | ||||
|   0xe6, 0xb0, 0x55, 0xaa, 0x83, 0xdb, 0x1c, 0x0a, 0x41, 0x3f, 0xcb, 0x60, 0xd1, 0xdb, 0x02, 0x3d, | ||||
|   0x75, 0xdf, 0x65, 0x2e, 0xf6, 0x3a, 0x03, 0xc8, 0xff, 0x4b, 0x45, 0x7d, 0x1e, 0xb9, 0xd4, 0xf5, | ||||
|   0x44, 0xbf, 0x71, 0x82, 0x76, 0x69, 0x52, 0x62, 0x0b, 0x9c, 0x65, 0x97, 0x51, 0x9b, 0x0b, 0xcc, | ||||
|   0xb9, 0xd0, 0xba, 0x04, 0x1d, 0xda, 0x24, 0x9f, 0xba, 0xa1, 0x00, 0xa4, 0xb5, 0x24, 0xc6, 0xce, | ||||
|   0x98, 0xd0, 0x8c, 0x6e, 0x77, 0x1a, 0x4e, 0x12, 0x55, 0xa0, 0xbb, 0x26, 0xbb, 0x0b, 0x98, 0x90, | ||||
|   0xf4, 0xeb, 0x91, 0x06, 0xcd, 0x72, 0xb5, 0xc0, 0x58, 0xd0, 0xd7, 0x47, 0x39, 0xb3, 0xde, 0x87, | ||||
|   0xbd, 0xa6, 0xb0, 0x43, 0x9a, 0x1b, 0xf1, 0x70, 0x9e, 0x4b, 0xb9, 0xf3, 0x8a, 0xbe, 0x48, 0x89, | ||||
|   0x58, 0xaf, 0x10, 0xb1, 0x9b, 0x70, 0x36, 0x12, 0x3d, 0xb8, 0x3a, 0x7b, 0x2e, 0xd3, 0x97, 0x4a, | ||||
|   0x42, 0xe3, 0xa5, 0x64, 0xfc, 0x09, 0xb3, 0x75, 0x7c, 0xb2, 0xe3, 0xa6, 0xff, 0x5f, 0xdf, 0x74, | ||||
|   0x70, 0x10, 0xa3, 0xef, 0x15, 0xa4, 0x71, 0xf4, 0xe1, 0xa5, 0x43, 0xd4, 0xa0, 0x83, 0xd1, 0xb0, | ||||
|   0x73, 0xb0, 0x3f, 0xfc, 0x34, 0x78, 0x49, 0xe8, 0x1d, 0xef, 0x5b, 0x99, 0x53, 0x28, 0x6f, 0x5f, | ||||
|   0x92, 0xf9, 0x89, 0xf7, 0xff, 0x7a, 0x7e, 0xb5, 0xff, 0xeb, 0xe0, 0x45, 0x7c, 0xef, 0x79, 0xff, | ||||
|   0x6f, 0xa5, 0x90, 0x88, 0x6e, 0xff, 0x54, 0x4c, 0xf6, 0x3f, 0x25, 0x26, 0x46, 0x88, 0x57, 0xfb, | ||||
|   0xe8, 0xeb, 0xb3, 0xc6, 0xeb, 0x2a, 0x7c, 0xb3, 0x3a, 0x67, 0x51, 0xbc, 0x58, 0xd5, 0x18, 0xa0, | ||||
|   0x11, 0x14, 0x93, 0x9f, 0xde, 0x90, 0xca, 0x67, 0xe4, 0x6a, 0x85, 0x6f, 0x79, 0xff, 0x6a, 0x21, | ||||
|   0x32, 0x31, 0x99, 0x9a, 0x0b, 0xe4, 0x8a, 0xef, 0x6b, 0xc5, 0x12, 0xff, 0xfc, 0xbc, 0x40, 0x63, | ||||
|   0xd5, 0x4d, 0x9f, 0xaf, 0x30, 0x80, 0x68, 0xb4, 0xd5, 0x5e, 0x49, 0xad, 0x97, 0xbd, 0xfd, 0x5b, | ||||
|   0xcd, 0xbf, 0xc5, 0xff, 0x7d, 0xda, 0x6e, 0xd2, 0xa7, 0x04, 0x35, 0x1e, 0x7d, 0x6f, 0xd0, 0xc7, | ||||
|   0x07, 0xfd, 0x9c, 0xfc, 0x1f, 0x82, 0xf2, 0xab, 0x04, 0x5e, 0x16, 0x00, 0x00 | ||||
|   0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0a, 0xb5, 0x58, 0xff, 0x53, 0xdb, 0x3a, | ||||
|   0x12, 0xff, 0x3d, 0x7f, 0x85, 0xd0, 0xdd, 0x30, 0xf6, 0xe0, 0x38, 0x09, 0x69, 0xfb, 0x7a, 0x21, | ||||
|   0x4e, 0x0f, 0x42, 0x5e, 0xe1, 0x1e, 0x85, 0x5c, 0xc3, 0x95, 0xb9, 0xe1, 0x3a, 0xef, 0x19, 0x5b, | ||||
|   0x49, 0x54, 0x1c, 0xc9, 0xcf, 0x92, 0x13, 0x18, 0xc8, 0xff, 0x7e, 0xbb, 0x92, 0x9d, 0xc4, 0x01, | ||||
|   0xda, 0x9b, 0x0e, 0x37, 0x9d, 0x29, 0xb6, 0xb5, 0xda, 0xfd, 0xec, 0xb7, 0x8f, 0x56, 0xe9, 0xee, | ||||
|   0x1c, 0x5f, 0xf4, 0x2f, 0xff, 0x3d, 0x1c, 0x90, 0xa9, 0x9e, 0x25, 0xbd, 0x2e, 0xfe, 0x4f, 0x92, | ||||
|   0x50, 0x4c, 0x02, 0xca, 0x04, 0x85, 0x77, 0x16, 0xc6, 0xbd, 0xee, 0x8c, 0xe9, 0x90, 0x44, 0xd3, | ||||
|   0x30, 0x53, 0x4c, 0x07, 0x34, 0xd7, 0xe3, 0xfa, 0x7b, 0x5a, 0x7c, 0xad, 0x89, 0x70, 0xc6, 0x02, | ||||
|   0x3a, 0xe7, 0x6c, 0x91, 0xca, 0x4c, 0x53, 0x12, 0x49, 0xa1, 0x99, 0x00, 0xb1, 0x05, 0x8f, 0xf5, | ||||
|   0x34, 0x78, 0xdb, 0x6c, 0xae, 0x44, 0xb7, 0x96, 0x62, 0x36, 0xe7, 0x11, 0xab, 0x9b, 0x17, 0x8f, | ||||
|   0x0b, 0xae, 0x79, 0x98, 0xd4, 0x55, 0x14, 0x26, 0x2c, 0x68, 0x79, 0xb3, 0xf0, 0x8e, 0xcf, 0xf2, | ||||
|   0xd9, 0xea, 0x3d, 0x57, 0x2c, 0x33, 0x2f, 0xe1, 0x0d, 0xbc, 0x0b, 0x49, 0x9f, 0x58, 0xee, 0x75, | ||||
|   0x35, 0xd7, 0x09, 0xeb, 0x5d, 0xf1, 0x5f, 0x39, 0x19, 0x31, 0xad, 0xb9, 0x98, 0xa8, 0x6e, 0xc3, | ||||
|   0x7e, 0xec, 0xaa, 0x28, 0xe3, 0xa9, 0xee, 0xd5, 0xe6, 0x61, 0x46, 0x12, 0x19, 0xf1, 0xd4, 0x8b, | ||||
|   0x83, 0x58, 0x46, 0xf9, 0x0c, 0x00, 0x79, 0xf0, 0x21, 0xd8, 0x69, 0xe1, 0x9f, 0x34, 0x93, 0x5a, | ||||
|   0x06, 0x74, 0xaa, 0x75, 0xda, 0xa1, 0x1e, 0xd8, 0x13, 0x67, 0x52, 0xa6, 0x2a, 0x68, 0x7a, 0x69, | ||||
|   0xc6, 0x46, 0xf0, 0x3a, 0x1a, 0x9d, 0x1e, 0x07, 0x94, 0x1e, 0x8c, 0x73, 0x11, 0x69, 0x2e, 0x05, | ||||
|   0x99, 0x9c, 0xc6, 0x8e, 0x76, 0x1f, 0x32, 0xa6, 0xf3, 0x4c, 0x90, 0xd8, 0x9f, 0x30, 0x3d, 0x48, | ||||
|   0x18, 0xaa, 0x3d, 0xba, 0x37, 0x4b, 0xcb, 0x95, 0x68, 0x34, 0xa8, 0x48, 0x46, 0x19, 0x0b, 0x35, | ||||
|   0x2b, 0x84, 0x2b, 0x82, 0x27, 0x8e, 0xfb, 0xb0, 0xe0, 0x22, 0x96, 0x0b, 0x5f, 0xa6, 0x4c, 0x38, | ||||
|   0x06, 0x8f, 0xea, 0x34, 0x1a, 0xb7, 0x42, 0xfa, 0x8b, 0x84, 0xa1, 0x95, 0xc6, 0x18, 0x76, 0xe7, | ||||
|   0x19, 0x53, 0x0d, 0x55, 0xf8, 0xda, 0xf8, 0xcb, 0x82, 0x8f, 0x79, 0xbd, 0x7c, 0xa5, 0x1b, 0x0a, | ||||
|   0x8f, 0xb6, 0x14, 0x02, 0xc8, 0x7f, 0x7d, 0x3e, 0x73, 0x68, 0x63, 0x2d, 0xec, 0xd1, 0xdf, 0x15, | ||||
|   0x4b, 0xc6, 0x9b, 0xbb, 0xce, 0x61, 0x17, 0xe4, 0x4c, 0x69, 0xa2, 0x03, 0x74, 0x93, 0x62, 0x3c, | ||||
|   0xa8, 0x7b, 0xa0, 0xfd, 0x98, 0x2b, 0xcc, 0x43, 0x1c, 0xec, 0x34, 0x3d, 0xed, 0x6b, 0x76, 0xa7, | ||||
|   0xfb, 0x65, 0x6e, 0x31, 0x48, 0x02, 0x54, 0xfa, 0xbe, 0x4f, 0xbd, 0x31, 0xd3, 0xd1, 0x74, 0x6d, | ||||
|   0xed, 0x9b, 0x92, 0xa2, 0x21, 0x98, 0xa6, 0xae, 0xeb, 0xeb, 0x29, 0xe0, 0xd0, 0x41, 0x4f, 0xfb, | ||||
|   0xf8, 0xd5, 0xd9, 0xf8, 0x72, 0x71, 0xf3, 0x8d, 0x45, 0xda, 0x0f, 0x95, 0xe2, 0x13, 0xe1, 0x3c, | ||||
|   0x2c, 0xbd, 0x07, 0xd8, 0xb2, 0x90, 0xd9, 0xad, 0xea, 0x5c, 0x7f, 0x5d, 0x7a, 0xda, 0xf5, 0xcb, | ||||
|   0x77, 0x5f, 0x41, 0xe2, 0x1d, 0x47, 0x7b, 0xcc, 0x0d, 0x7a, 0xcc, 0xcf, 0x60, 0x47, 0x5d, 0x9b, | ||||
|   0x3f, 0xae, 0x9f, 0xb1, 0x38, 0x8f, 0x58, 0xb9, 0xe8, 0x68, 0x90, 0x9d, 0x31, 0x6b, 0x10, 0xd6, | ||||
|   0xe3, 0x20, 0x08, 0x98, 0x79, 0x70, 0x1f, 0x1f, 0xb5, 0x9f, 0xe6, 0x6a, 0xea, 0x30, 0x17, 0x74, | ||||
|   0x7b, 0xd7, 0x5f, 0x4b, 0x28, 0x2c, 0xe8, 0x3d, 0xf0, 0xb1, 0xd3, 0x34, 0xa2, 0x09, 0x13, 0x13, | ||||
|   0x3d, 0xdd, 0xdd, 0x5d, 0x95, 0x44, 0xb7, 0xd5, 0x74, 0x8b, 0x54, 0xae, 0xbe, 0xed, 0xed, 0x79, | ||||
|   0x73, 0xc9, 0x63, 0x02, 0x51, 0xbd, 0xe4, 0x33, 0x26, 0x73, 0xed, 0x9c, 0x7b, 0x2d, 0xd6, 0x76, | ||||
|   0x0f, 0x36, 0x2a, 0xe9, 0x20, 0x61, 0x9a, 0x08, 0x1b, 0xd0, 0xfe, 0x08, 0xc2, 0x09, 0x36, 0x84, | ||||
|   0xfb, 0x80, 0x5f, 0x75, 0x00, 0x25, 0x42, 0x21, 0x0d, 0xe0, 0xbf, 0x89, 0x33, 0x28, 0x3a, 0xd4, | ||||
|   0x3a, 0xe3, 0x37, 0xb9, 0x66, 0x0e, 0xe5, 0x31, 0xf5, 0xcc, 0x16, 0x6f, 0x7b, 0x05, 0x5b, 0xe1, | ||||
|   0xa5, 0x35, 0x29, 0xa0, 0x73, 0xc5, 0x04, 0xd7, 0x2f, 0x1d, 0x17, 0x04, 0x36, 0x2b, 0x59, 0xf8, | ||||
|   0xf3, 0x30, 0xc9, 0xd9, 0xc1, 0x58, 0x66, 0x0e, 0x22, 0x60, 0x80, 0x8f, 0x75, 0xb5, 0x1f, 0x4d, | ||||
|   0x79, 0x12, 0x67, 0x4c, 0x14, 0x7e, 0x1f, 0xb0, 0xbd, 0x3d, 0x17, 0x22, 0xcb, 0x66, 0x72, 0xce, | ||||
|   0xfa, 0xb8, 0xe6, 0xac, 0x65, 0xae, 0xd9, 0x57, 0x77, 0xa5, 0x40, 0x82, 0x02, 0xd9, 0x2d, 0xe3, | ||||
|   0x75, 0x20, 0x61, 0x5f, 0x51, 0x43, 0xdc, 0x38, 0x27, 0x53, 0x2c, 0x2d, 0xf4, 0x7a, 0x0b, 0xa6, | ||||
|   0xc1, 0x41, 0x3d, 0x76, 0x2d, 0xbf, 0xda, 0xbc, 0x78, 0xbc, 0x52, 0x58, 0x7f, 0xfc, 0xf5, 0x61, | ||||
|   0xb5, 0xb6, 0x24, 0x4e, 0xf1, 0x86, 0xb9, 0x5e, 0x92, 0xf8, 0x68, 0xe6, 0xfe, 0xb1, 0xde, 0x0a, | ||||
|   0x09, 0x2b, 0xfc, 0xda, 0xdd, 0xdd, 0x36, 0x63, 0x83, 0xcb, 0x30, 0x92, 0xab, 0x47, 0x8c, 0x59, | ||||
|   0x98, 0x42, 0x5f, 0xc4, 0xd6, 0x35, 0xee, 0x2e, 0x2d, 0x64, 0x59, 0x85, 0x2c, 0x9f, 0x87, 0x4c, | ||||
|   0x77, 0xfa, 0xd8, 0x3f, 0xb2, 0xda, 0x07, 0x17, 0x50, 0x43, 0x19, 0x29, 0x2a, 0xd5, 0x34, 0x43, | ||||
|   0xd5, 0x88, 0x74, 0x3d, 0x01, 0x01, 0x4d, 0x93, 0x30, 0x62, 0x57, 0x5c, 0x4f, 0x91, 0x00, 0x36, | ||||
|   0x1b, 0xab, 0xf5, 0x5c, 0x63, 0xd1, 0xe5, 0x46, 0x7b, 0x42, 0x36, 0x8b, 0xaa, 0xa9, 0xd4, 0xd2, | ||||
|   0x8e, 0x7e, 0x7c, 0x34, 0x90, 0x76, 0x02, 0x6d, 0xa3, 0x50, 0xd4, 0xe9, 0x81, 0x4d, 0x30, 0xba, | ||||
|   0xc4, 0x45, 0x9a, 0x63, 0x85, 0x31, 0x5f, 0xdf, 0xa7, 0x40, 0xa2, 0x68, 0x08, 0x62, 0xef, 0x43, | ||||
|   0xec, 0x50, 0x0f, 0x3c, 0x59, 0x72, 0xb5, 0xcf, 0x55, 0xaf, 0x81, 0x99, 0x6d, 0x72, 0xa9, 0xd7, | ||||
|   0xde, 0x77, 0x61, 0xd9, 0xd8, 0x08, 0x36, 0xaa, 0xca, 0xd3, 0x15, 0xc7, 0xd8, 0x06, 0xe6, 0x44, | ||||
|   0x86, 0xf1, 0x3f, 0x46, 0xd8, 0x94, 0x40, 0x1d, 0x16, 0xbe, 0xb0, 0x45, 0x6f, 0xf8, 0x19, 0x20, | ||||
|   0x89, 0xed, 0x84, 0x65, 0x11, 0xc5, 0xbe, 0xdc, 0xfe, 0x8e, 0xc0, 0x21, 0xf6, 0x88, 0xbc, 0xf1, | ||||
|   0x2d, 0x9c, 0x87, 0xa5, 0x82, 0x27, 0x82, 0xa1, 0xba, 0x17, 0xa0, 0x02, 0xba, 0x3b, 0xf6, 0x6f, | ||||
|   0x64, 0x7c, 0x5f, 0xc9, 0x82, 0x40, 0xf9, 0x30, 0x8e, 0x07, 0x73, 0x88, 0xf1, 0x19, 0x57, 0x10, | ||||
|   0x6a, 0x96, 0x39, 0x14, 0x61, 0x52, 0xcf, 0x01, 0xe2, 0x78, 0xf8, 0xc8, 0xf4, 0x17, 0xc7, 0x5d, | ||||
|   0x3e, 0x2f, 0xc7, 0xb2, 0x4c, 0x66, 0x00, 0x0f, 0xe4, 0xb0, 0x62, 0x64, 0x02, 0x85, 0x2f, 0x27, | ||||
|   0x0e, 0x1d, 0xe0, 0x77, 0x52, 0xf8, 0x0b, 0x64, 0x48, 0xc6, 0x3c, 0x61, 0xc6, 0x0d, 0x38, 0xcd, | ||||
|   0x80, 0xb2, 0xe8, 0x59, 0xf1, 0x5d, 0x8e, 0xf1, 0xc0, 0x1c, 0xf3, 0x49, 0x9e, 0x85, 0x26, 0x40, | ||||
|   0xd6, 0x0d, 0x32, 0x0e, 0x39, 0xd2, 0xfc, 0x7f, 0xc4, 0xa9, 0x88, 0xe4, 0x2c, 0x85, 0x38, 0x31, | ||||
|   0x92, 0x86, 0x13, 0x46, 0xe2, 0x50, 0x87, 0x3b, 0x40, 0xd2, 0x1b, 0x31, 0x1d, 0xad, 0xea, 0xa0, | ||||
|   0xa0, 0x78, 0x38, 0xc7, 0x8c, 0x32, 0xac, 0x06, 0x8a, 0x96, 0x3b, 0x34, 0x80, 0x5a, 0x30, 0x67, | ||||
|   0x5b, 0x24, 0x13, 0xd7, 0x1c, 0x77, 0x4d, 0xcf, 0x31, 0xe7, 0x60, 0x80, 0xd2, 0xc9, 0x48, 0xcb, | ||||
|   0x0c, 0xd4, 0xe3, 0xe9, 0x75, 0xaa, 0xd9, 0x0c, 0x23, 0x10, 0x9d, 0xa6, 0xc0, 0xd3, 0x8f, 0x8f, | ||||
|   0x85, 0x18, 0xec, 0x9e, 0xa5, 0x80, 0xfc, 0x57, 0xd0, 0x47, 0x3e, 0xc9, 0x98, 0xf9, 0x64, 0x98, | ||||
|   0xb0, 0x50, 0x31, 0x02, 0x11, 0x81, 0x4a, 0xbf, 0x3a, 0x1b, 0x1c, 0x93, 0xd3, 0x21, 0x60, 0xf3, | ||||
|   0x2a, 0x1a, 0x55, 0x55, 0xa3, 0x67, 0xb4, 0xb9, 0x50, 0x7a, 0x89, 0x62, 0x0f, 0xb6, 0x22, 0x01, | ||||
|   0x5a, 0xa8, 0xa7, 0x58, 0x71, 0x9e, 0x40, 0x56, 0x4e, 0x60, 0x2c, 0x70, 0x5a, 0x50, 0x59, 0x90, | ||||
|   0x26, 0x65, 0x4a, 0x88, 0x36, 0xa8, 0xfb, 0xa1, 0xde, 0xea, 0x18, 0x76, 0x6d, 0xba, 0xbe, 0x4a, | ||||
|   0x13, 0xae, 0xcd, 0xd7, 0x83, 0x92, 0xa2, 0x7a, 0xfb, 0xbb, 0xbb, 0xce, 0xea, 0x04, 0x5f, 0x7b, | ||||
|   0xeb, 0x15, 0xde, 0x5a, 0x2f, 0xb4, 0x3f, 0x95, 0x4a, 0xa3, 0xa9, 0x3d, 0x60, 0x30, 0x9c, 0x1b, | ||||
|   0x3e, 0xd0, 0x0e, 0xdd, 0xb3, 0x8f, 0x1d, 0x4a, 0xdd, 0x3d, 0x50, 0xba, 0x27, 0xae, 0x9b, 0x5f, | ||||
|   0xdd, 0x65, 0x51, 0xab, 0x4f, 0xce, 0xca, 0x86, 0x82, 0x23, 0xeb, 0x43, 0x1a, 0xb4, 0xc0, 0xd5, | ||||
|   0x9d, 0x96, 0x71, 0x17, 0x4c, 0xc7, 0xfe, 0x68, 0xec, 0x87, 0x26, 0x23, 0xc1, 0xd3, 0x2d, 0x78, | ||||
|   0x32, 0x43, 0x34, 0xd7, 0x49, 0x2b, 0x44, 0x56, 0xf3, 0x00, 0x42, 0xff, 0x50, 0xc2, 0x07, 0x10, | ||||
|   0x80, 0xc2, 0x20, 0x36, 0x98, 0xf4, 0xb2, 0xd6, 0x6d, 0x14, 0x13, 0x4c, 0x57, 0xe9, 0x7b, 0x18, | ||||
|   0x68, 0xfe, 0xce, 0x67, 0x08, 0x99, 0xe4, 0x59, 0x02, 0x3d, 0x82, 0x9f, 0xfc, 0x48, 0x01, 0x0d, | ||||
|   0x1d, 0x80, 0xa0, 0x11, 0xe8, 0x36, 0xec, 0xec, 0x86, 0x25, 0x0f, 0x95, 0x88, 0xce, 0x00, 0x87, | ||||
|   0xc0, 0x01, 0xd0, 0xeb, 0x02, 0x57, 0xcf, 0x6a, 0x04, 0x7b, 0x1d, 0x9f, 0x7e, 0x57, 0x94, 0xd8, | ||||
|   0x6e, 0x1f, 0x8d, 0x29, 0x81, 0x49, 0x6d, 0x2a, 0x61, 0x25, 0x85, 0x30, 0x81, 0x68, 0xcc, 0xe7, | ||||
|   0x24, 0x4a, 0xe0, 0x28, 0x06, 0x8e, 0x90, 0x80, 0x6d, 0x51, 0xfd, 0x36, 0x65, 0x49, 0x7a, 0x44, | ||||
|   0x7b, 0xb5, 0x2e, 0xb4, 0x9a, 0x06, 0xaf, 0x2c, 0x9b, 0xd8, 0x17, 0x0a, 0x56, 0x23, 0x48, 0xe5, | ||||
|   0x6d, 0x40, 0x4f, 0xd0, 0xec, 0x87, 0x6e, 0xc3, 0x2e, 0x00, 0x34, 0x50, 0xd1, 0x7b, 0x7e, 0x4f, | ||||
|   0x6d, 0xb5, 0xe9, 0x08, 0x37, 0x1d, 0x85, 0xd1, 0xed, 0x7a, 0x5f, 0x65, 0x87, 0xca, 0x6f, 0x66, | ||||
|   0x1c, 0x30, 0x8e, 0xc2, 0x39, 0x23, 0xbb, 0x04, 0x78, 0x52, 0x00, 0x9d, 0xaf, 0x85, 0xa7, 0x19, | ||||
|   0xe0, 0xb2, 0x96, 0xa6, 0xfb, 0x76, 0x2a, 0x84, 0x74, 0xe4, 0x29, 0x04, 0x66, 0x1f, 0x3e, 0xb5, | ||||
|   0x7b, 0xc5, 0x0e, 0xa2, 0x25, 0x61, 0x77, 0xd0, 0xd2, 0xd8, 0x8f, 0x05, 0x5f, 0x83, 0x4c, 0x7b, | ||||
|   0x65, 0xae, 0x56, 0x45, 0x88, 0x71, 0x33, 0x83, 0xd0, 0xda, 0xbf, 0x73, 0x84, 0x8a, 0xec, 0xb7, | ||||
|   0x01, 0x15, 0xac, 0x9f, 0x5b, 0x65, 0x26, 0xba, 0xc4, 0x31, 0xcc, 0x48, 0x18, 0x34, 0xd1, 0x3d, | ||||
|   0x9a, 0x14, 0x52, 0x63, 0xeb, 0x23, 0x02, 0xb7, 0x83, 0xe2, 0x5d, 0x43, 0xca, 0x64, 0x83, 0x90, | ||||
|   0x49, 0x41, 0xc7, 0xe5, 0xa8, 0x8b, 0x8f, 0x2b, 0xf6, 0x0d, 0x68, 0x7b, 0x9f, 0x1a, 0x3b, 0xa5, | ||||
|   0x99, 0x14, 0x52, 0x02, 0x0f, 0xf1, 0x53, 0x6d, 0xe5, 0xca, 0x5a, 0xd3, 0xb0, 0xa2, 0xe9, 0x5d, | ||||
|   0xdb, 0x6a, 0x1a, 0x69, 0xe0, 0x8d, 0x08, 0xba, 0x98, 0xc0, 0x59, 0x8e, 0x61, 0x0d, 0x35, 0x69, | ||||
|   0xfa, 0xe6, 0x1f, 0x81, 0x52, 0x21, 0xc7, 0x27, 0xfd, 0x61, 0x05, 0x6c, 0xa1, 0xee, 0xb4, 0x49, | ||||
|   0x0b, 0x4b, 0x22, 0x9f, 0xdd, 0xb0, 0x8c, 0x96, 0xf5, 0x01, 0xa5, 0x35, 0xe3, 0x22, 0xa0, 0x4d, | ||||
|   0x63, 0x2e, 0xa0, 0xfb, 0x6f, 0xdf, 0x52, 0x92, 0xb1, 0x3f, 0x73, 0x0e, 0xe3, 0x59, 0x8f, 0xf8, | ||||
|   0x64, 0x4b, 0x4f, 0xeb, 0x95, 0xf4, 0xec, 0xbf, 0x92, 0x9e, 0xf6, 0x4f, 0xe9, 0xd9, 0x08, 0xe5, | ||||
|   0x04, 0x26, 0xfc, 0x45, 0x78, 0xdf, 0xa9, 0x6d, 0x04, 0xcd, 0xea, 0xfe, 0xf8, 0xd3, 0x31, 0xab, | ||||
|   0x55, 0xf5, 0xbc, 0x52, 0xcc, 0x3e, 0xbe, 0x52, 0xcc, 0x3e, 0xfe, 0x7c, 0xcc, 0x6a, 0x45, 0xd0, | ||||
|   0xa0, 0xb3, 0xa1, 0x0f, 0x41, 0x4a, 0xdd, 0x76, 0x9e, 0xc4, 0x6d, 0xf4, 0x3f, 0xc4, 0xad, 0xf6, | ||||
|   0x5d, 0xa0, 0x85, 0x9e, 0xd6, 0x2b, 0xe9, 0xd9, 0x7f, 0x25, 0x3d, 0xed, 0x9f, 0xd3, 0x83, 0x01, | ||||
|   0x9a, 0x1d, 0x9f, 0x8f, 0x08, 0x4c, 0x27, 0x70, 0x1b, 0x54, 0x65, 0xeb, 0x5a, 0xa2, 0xc1, 0xae, | ||||
|   0x15, 0x92, 0xa0, 0x80, 0x6d, 0x5c, 0x73, 0xb3, 0x6d, 0x34, 0x0a, 0xdb, 0xb5, 0x0a, 0xdd, 0x14, | ||||
|   0xdc, 0xf0, 0xe9, 0x09, 0xcb, 0x10, 0x33, 0x52, 0x24, 0xb8, 0xbf, 0x9f, 0x70, 0x38, 0xef, 0x81, | ||||
|   0x22, 0x3a, 0xa4, 0xab, 0xd2, 0x50, 0xac, 0x50, 0xf2, 0x14, 0xce, 0x81, 0xf3, 0x35, 0xa9, 0xb1, | ||||
|   0x18, 0x4e, 0x22, 0x10, 0x30, 0x00, 0x0b, 0xba, 0x35, 0x73, 0x0e, 0x23, 0x87, 0x51, 0x84, 0x40, | ||||
|   0x87, 0x92, 0x0b, 0x6d, 0x98, 0xb6, 0x76, 0x38, 0x24, 0x48, 0x8f, 0xcf, 0x62, 0x3f, 0x1c, 0xbe, | ||||
|   0xc8, 0x8f, 0x16, 0xf0, 0xe1, 0x53, 0x5a, 0x34, 0xed, 0x76, 0xc2, 0x63, 0xb0, 0x35, 0x34, 0x52, | ||||
|   0x1d, 0x52, 0xd9, 0x1e, 0x4d, 0x59, 0x74, 0x7b, 0x23, 0xef, 0x56, 0x2a, 0x4e, 0x2c, 0x01, 0x22, | ||||
|   0x90, 0x92, 0x2c, 0x9f, 0x82, 0xc1, 0xab, 0xb3, 0xfb, 0x3d, 0x76, 0x2d, 0x94, 0x0d, 0x6d, 0xa6, | ||||
|   0x36, 0xd8, 0x15, 0x94, 0x6a, 0x18, 0x92, 0x20, 0x8b, 0x8e, 0xff, 0xf0, 0xde, 0x7b, 0xd7, 0x5e, | ||||
|   0xba, 0x8f, 0x70, 0x66, 0x10, 0xf3, 0xe3, 0x44, 0x40, 0x07, 0xc6, 0x04, 0x58, 0x80, 0x44, 0xfb, | ||||
|   0xe4, 0xbd, 0xf9, 0xa9, 0x05, 0x46, 0x09, 0x96, 0xa9, 0x12, 0xd6, 0x46, 0xc4, 0x88, 0x39, 0xca, | ||||
|   0xf0, 0x4e, 0x27, 0x58, 0xd2, 0xa9, 0x16, 0xd1, 0x61, 0xff, 0x85, 0x22, 0xba, 0x2b, 0xab, 0xa8, | ||||
|   0x55, 0x56, 0x51, 0xab, 0xbd, 0x55, 0x44, 0xe0, 0x3a, 0x3a, 0xa8, 0x30, 0xb1, 0xe6, 0x66, 0x54, | ||||
|   0xea, 0x84, 0x03, 0xbe, 0x6b, 0xef, 0x40, 0xc4, 0x8e, 0xfa, 0x50, 0x8a, 0x98, 0xea, 0x32, 0xd3, | ||||
|   0xb8, 0x10, 0x8e, 0x71, 0x06, 0xbc, 0x91, 0x12, 0x12, 0x6a, 0x65, 0xb7, 0xf7, 0xb4, 0x68, 0xef, | ||||
|   0x98, 0xab, 0x8d, 0xe2, 0xd8, 0x12, 0xab, 0x15, 0x72, 0x90, 0xbd, 0xc3, 0x04, 0x28, 0x53, 0xbd, | ||||
|   0xa4, 0x08, 0xce, 0xaa, 0x73, 0x36, 0x07, 0x6b, 0x0e, 0x1e, 0xa1, 0x19, 0x83, 0xf9, 0x78, 0x06, | ||||
|   0x83, 0x22, 0x8b, 0xdd, 0xd5, 0x0e, 0x9c, 0x96, 0x8c, 0x0b, 0xa5, 0x63, 0xcf, 0x97, 0x2b, 0x56, | ||||
|   0x2b, 0x4e, 0x6c, 0x73, 0xb6, 0x55, 0xaa, 0x83, 0xbb, 0x94, 0x65, 0x1c, 0x7f, 0x96, 0x81, 0xa2, | ||||
|   0x37, 0x05, 0x7a, 0x6c, 0xef, 0x65, 0x36, 0xf6, 0x2a, 0x61, 0x2c, 0xfd, 0x41, 0x45, 0x5d, 0x8d, | ||||
|   0x6c, 0xea, 0xba, 0xbc, 0x57, 0xeb, 0x83, 0x5d, 0x9c, 0x94, 0xc8, 0x02, 0x66, 0xd9, 0x55, 0xd4, | ||||
|   0xe6, 0x1c, 0x72, 0xce, 0x95, 0xca, 0x99, 0xf2, 0x4d, 0x92, 0x8f, 0xed, 0x50, 0xc0, 0x84, 0xb1, | ||||
|   0xc4, 0xc7, 0xd6, 0x18, 0x57, 0x04, 0x4f, 0x77, 0x1c, 0x4e, 0x22, 0x99, 0x81, 0xbb, 0x3a, 0xb9, | ||||
|   0xf7, 0x08, 0x17, 0xf8, 0xeb, 0x91, 0x62, 0x8a, 0xa4, 0x72, 0x01, 0xb1, 0xc0, 0xdb, 0x47, 0x3e, | ||||
|   0x33, 0xde, 0xfb, 0xdd, 0x06, 0x37, 0x43, 0x9a, 0x1d, 0xf1, 0xe0, 0xce, 0x1e, 0x53, 0xe3, 0xd5, | ||||
|   0x15, 0xa4, 0x3a, 0xc1, 0x32, 0xfa, 0x0c, 0xd7, 0x78, 0xcd, 0xec, 0x8c, 0xc3, 0x7b, 0xf6, 0x36, | ||||
|   0x63, 0x0a, 0x9c, 0xe1, 0xed, 0x46, 0x11, 0x89, 0xd1, 0x1d, 0x8c, 0x86, 0xf5, 0xf3, 0x8b, 0x2b, | ||||
|   0x83, 0xec, 0x37, 0xf0, 0x97, 0x94, 0x57, 0x53, 0x44, 0x86, 0x38, 0x73, 0x85, 0x98, 0x42, 0x92, | ||||
|   0x19, 0x6d, 0x3f, 0x80, 0x84, 0x91, 0x00, 0x58, 0xb5, 0x81, 0x75, 0xce, 0x22, 0xf8, 0x41, 0x08, | ||||
|   0x3f, 0x0f, 0x6c, 0x08, 0x4f, 0xc2, 0x2c, 0x5e, 0x84, 0xc0, 0x1b, 0x9f, 0x0e, 0xfb, 0xab, 0x2d, | ||||
|   0xb5, 0xa7, 0x3c, 0xf0, 0x19, 0xd6, 0xed, 0x8e, 0xb3, 0x10, 0x2e, 0xef, 0x23, 0xc6, 0xc4, 0x56, | ||||
|   0xd6, 0xb3, 0x84, 0xc7, 0x98, 0x76, 0x51, 0x49, 0xb8, 0x99, 0x11, 0x6b, 0x66, 0xac, 0xc5, 0x80, | ||||
|   0xc1, 0x00, 0x5c, 0x04, 0x6c, 0x80, 0x57, 0x78, 0x3c, 0x89, 0x2e, 0xc1, 0x96, 0x0d, 0x57, 0xa5, | ||||
|   0x33, 0x06, 0x97, 0x27, 0xcf, 0xb5, 0x06, 0xea, 0xaf, 0xbd, 0x54, 0xbd, 0x7f, 0x83, 0xf2, 0x3e, | ||||
|   0xea, 0xef, 0xd8, 0xeb, 0xd2, 0x97, 0x37, 0x6d, 0x98, 0x5c, 0xf1, 0x82, 0x07, 0xe7, 0x1e, 0xc4, | ||||
|   0xe5, 0xa5, 0x4d, 0xc8, 0x68, 0x90, 0x8f, 0xf6, 0x7e, 0x7d, 0x78, 0x31, 0x78, 0x49, 0xe8, 0x1d, | ||||
|   0xed, 0x19, 0x99, 0x63, 0x96, 0xdf, 0xbd, 0x24, 0xf3, 0x0b, 0xed, 0xfd, 0x76, 0x7a, 0x59, 0xff, | ||||
|   0x32, 0x78, 0x11, 0xdf, 0x7b, 0xda, 0xfb, 0x67, 0xce, 0x05, 0xa0, 0xab, 0x1f, 0xf3, 0x49, 0xfd, | ||||
|   0x22, 0xd2, 0x21, 0x40, 0xbc, 0xac, 0x83, 0xaf, 0xcf, 0x1a, 0x2f, 0xdb, 0xf6, 0xcd, 0x7a, 0x9f, | ||||
|   0x41, 0xf1, 0x22, 0x0d, 0x40, 0x80, 0x46, 0x2c, 0x9b, 0xfc, 0xf2, 0x06, 0x55, 0x3e, 0x23, 0x57, | ||||
|   0x2a, 0x7c, 0x4b, 0x7b, 0x97, 0x0b, 0x9e, 0xf0, 0xc9, 0x54, 0x9f, 0x01, 0xb9, 0x7e, 0x5f, 0x2b, | ||||
|   0x70, 0xc2, 0xd5, 0xf3, 0x02, 0xb5, 0x35, 0xfd, 0x5c, 0x5d, 0x42, 0x00, 0xc1, 0x68, 0xb3, 0xb5, | ||||
|   0x96, 0xda, 0xe4, 0x89, 0x75, 0x31, 0xe0, 0xdd, 0xe1, 0xff, 0x7d, 0x3d, 0x69, 0xe0, 0xdd, 0x0b, | ||||
|   0x99, 0x0a, 0x2f, 0x68, 0x78, 0x5b, 0xc3, 0xdf, 0xdf, 0xff, 0x0b, 0x68, 0xad, 0xac, 0xd2, 0x8f, | ||||
|   0x17, 0x00, 0x00 | ||||
| }; | ||||
|  | ||||
|  | ||||
| // Autogenerated from wled00/data/settings_leds.htm, do not edit!! | ||||
| const uint16_t PAGE_settings_leds_length = 8389; | ||||
| const uint8_t PAGE_settings_leds[] PROGMEM = { | ||||
|   0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x13, 0xdd, 0x7d, 0xeb, 0x76, 0xdb, 0x38, | ||||
|   0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0a, 0xdd, 0x7d, 0xeb, 0x76, 0xdb, 0x38, | ||||
|   0xd2, 0xe0, 0x7f, 0x3d, 0x05, 0x8d, 0xee, 0x76, 0xc8, 0x16, 0x25, 0x91, 0xb2, 0x95, 0x76, 0x24, | ||||
|   0x51, 0x5e, 0x5f, 0x92, 0xb4, 0xbf, 0xb1, 0x63, 0x1f, 0xdb, 0xe9, 0xcc, 0x77, 0xd2, 0xd9, 0x0e, | ||||
|   0x44, 0x41, 0x12, 0x63, 0x8a, 0xd4, 0x90, 0x94, 0x2f, 0x6b, 0x7b, 0x9f, 0x69, 0x9f, 0x61, 0x9f, | ||||
| @@ -825,7 +833,7 @@ const uint8_t PAGE_settings_leds[] PROGMEM = { | ||||
| // Autogenerated from wled00/data/settings_dmx.htm, do not edit!! | ||||
| const uint16_t PAGE_settings_dmx_length = 1751; | ||||
| const uint8_t PAGE_settings_dmx[] PROGMEM = { | ||||
|   0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x13, 0x95, 0x57, 0x5b, 0x73, 0xdb, 0x36, | ||||
|   0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0a, 0x95, 0x57, 0x5b, 0x73, 0xdb, 0x36, | ||||
|   0x16, 0x7e, 0xd7, 0xaf, 0x40, 0xf0, 0x50, 0x93, 0x63, 0x86, 0x94, 0x9c, 0x55, 0xb7, 0x91, 0x44, | ||||
|   0x7a, 0x63, 0xc7, 0x6b, 0x7b, 0xc7, 0x76, 0x3d, 0x51, 0xd2, 0x74, 0xa7, 0xe9, 0x74, 0x20, 0x12, | ||||
|   0x12, 0x51, 0x93, 0x04, 0x17, 0x00, 0x25, 0xbb, 0x69, 0xfe, 0xfb, 0x7e, 0x00, 0xa9, 0x8b, 0x6f, | ||||
| @@ -941,7 +949,7 @@ const uint8_t PAGE_settings_dmx[] PROGMEM = { | ||||
| // Autogenerated from wled00/data/settings_ui.htm, do not edit!! | ||||
| const uint16_t PAGE_settings_ui_length = 3327; | ||||
| const uint8_t PAGE_settings_ui[] PROGMEM = { | ||||
|   0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x13, 0xad, 0x5a, 0x6b, 0x73, 0xdb, 0xb8, | ||||
|   0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0a, 0xad, 0x5a, 0x6b, 0x73, 0xdb, 0xb8, | ||||
|   0x15, 0xfd, 0xae, 0x5f, 0x81, 0x60, 0x77, 0xbc, 0xe2, 0x98, 0xa1, 0xe5, 0x6c, 0x3b, 0x4d, 0x24, | ||||
|   0x51, 0x6e, 0xe2, 0x64, 0x37, 0xee, 0x78, 0x37, 0x69, 0xe4, 0x74, 0xdb, 0x49, 0x33, 0x5e, 0x88, | ||||
|   0x84, 0x24, 0x6c, 0x28, 0x82, 0x25, 0x40, 0x3f, 0xaa, 0xd5, 0x7f, 0xef, 0xb9, 0x00, 0x29, 0x51, | ||||
| @@ -1155,7 +1163,7 @@ const uint8_t PAGE_settings_ui[] PROGMEM = { | ||||
| // Autogenerated from wled00/data/settings_sync.htm, do not edit!! | ||||
| const uint16_t PAGE_settings_sync_length = 3474; | ||||
| const uint8_t PAGE_settings_sync[] PROGMEM = { | ||||
|   0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x13, 0x9d, 0x1a, 0x6b, 0x53, 0xdb, 0x48, | ||||
|   0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0a, 0x9d, 0x1a, 0x6b, 0x53, 0xdb, 0x48, | ||||
|   0xf2, 0xbb, 0x7e, 0xc5, 0x44, 0x57, 0x95, 0xb5, 0x17, 0xe3, 0x07, 0x60, 0x42, 0xc0, 0x52, 0x0e, | ||||
|   0x30, 0x01, 0xdf, 0x41, 0xe2, 0xd8, 0xb0, 0xc9, 0xd6, 0xdd, 0xd5, 0xd6, 0x58, 0x1a, 0xdb, 0x03, | ||||
|   0x92, 0x46, 0xab, 0x19, 0xf1, 0xa8, 0x6c, 0xfe, 0xfb, 0x75, 0xcf, 0x48, 0xb2, 0x2d, 0xfc, 0xca, | ||||
| @@ -1379,7 +1387,7 @@ const uint8_t PAGE_settings_sync[] PROGMEM = { | ||||
| // Autogenerated from wled00/data/settings_time.htm, do not edit!! | ||||
| const uint16_t PAGE_settings_time_length = 3444; | ||||
| const uint8_t PAGE_settings_time[] PROGMEM = { | ||||
|   0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x13, 0xd5, 0x1a, 0x6b, 0x57, 0xdb, 0x38, | ||||
|   0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0a, 0xd5, 0x1a, 0x6b, 0x57, 0xdb, 0x38, | ||||
|   0xf6, 0x7b, 0x7e, 0x85, 0x50, 0x7b, 0x18, 0x7b, 0x70, 0x9e, 0x90, 0x16, 0x92, 0xd8, 0x6c, 0x08, | ||||
|   0x69, 0xa1, 0x4d, 0x02, 0xa7, 0x49, 0x87, 0xdd, 0x3e, 0xce, 0x54, 0x89, 0x95, 0xc4, 0xe0, 0x48, | ||||
|   0x59, 0x5b, 0x26, 0xb0, 0x94, 0xff, 0xbe, 0x57, 0x92, 0xe3, 0x3c, 0x0d, 0x6d, 0x67, 0xf6, 0xc3, | ||||
| @@ -1601,7 +1609,7 @@ const uint8_t PAGE_settings_time[] PROGMEM = { | ||||
| // Autogenerated from wled00/data/settings_sec.htm, do not edit!! | ||||
| const uint16_t PAGE_settings_sec_length = 2563; | ||||
| const uint8_t PAGE_settings_sec[] PROGMEM = { | ||||
|   0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x13, 0x9d, 0x58, 0x6d, 0x73, 0xdb, 0xb8, | ||||
|   0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0a, 0x9d, 0x58, 0x6d, 0x73, 0xdb, 0xb8, | ||||
|   0x11, 0xfe, 0xae, 0x5f, 0x01, 0xe1, 0x66, 0x72, 0x64, 0x43, 0x53, 0xb2, 0x93, 0xde, 0xe4, 0x6c, | ||||
|   0x51, 0xae, 0x1d, 0x3b, 0x8d, 0x3b, 0x76, 0xec, 0xb1, 0xe4, 0x4b, 0x3b, 0x69, 0x26, 0x43, 0x91, | ||||
|   0x90, 0x88, 0x88, 0x22, 0x78, 0x00, 0x68, 0x45, 0xcd, 0xe5, 0xbf, 0xf7, 0x59, 0x90, 0xd4, 0x8b, | ||||
| @@ -1746,7 +1754,7 @@ const uint8_t PAGE_settings_sec[] PROGMEM = { | ||||
|   0xb7, 0x4d, 0x92, 0x26, 0x11, 0xda, 0xcf, 0x48, 0x28, 0xb8, 0x59, 0x35, 0x09, 0x71, 0x75, 0xef, | ||||
|   0x9d, 0x48, 0x9d, 0x28, 0xa5, 0xe6, 0x52, 0xf4, 0xa8, 0x07, 0xef, 0xa1, 0x4e, 0xc7, 0x7a, 0x46, | ||||
|   0x9f, 0xbb, 0x3e, 0x4d, 0x72, 0x94, 0x48, 0x3e, 0xa4, 0x61, 0x0a, 0x82, 0x0e, 0xbb, 0x17, 0x9a, | ||||
|   0x68, 0x86, 0xf5, 0xc3, 0xfd, 0x97, 0x61, 0x7f, 0x6f, 0xf2, 0x62, 0xcd, 0x55, 0x7f, 0x46, 0xc2, | ||||
|   0x68, 0x86, 0xf5, 0xc3, 0xfd, 0x97, 0x61, 0x7f, 0x6f, 0xf2, 0x72, 0xcd, 0x55, 0x7f, 0x46, 0xc2, | ||||
|   0x52, 0xce, 0x65, 0xcf, 0x5d, 0xdb, 0xa8, 0x83, 0x55, 0xda, 0xec, 0x81, 0x0d, 0xf7, 0x12, 0x2d, | ||||
|   0x52, 0x49, 0x41, 0xda, 0x79, 0x28, 0x7f, 0x7b, 0x29, 0xaa, 0xb5, 0xa0, 0x0b, 0x28, 0xf8, 0x4f, | ||||
|   0x8a, 0x9a, 0x46, 0x4d, 0x29, 0x12, 0x09, 0xce, 0xb1, 0xa8, 0x08, 0xf3, 0x75, 0xea, 0x76, 0x4e, | ||||
| @@ -1760,7 +1768,7 @@ const uint8_t PAGE_settings_sec[] PROGMEM = { | ||||
|   0x19, 0xc6, 0xa0, 0x40, 0x82, 0x50, 0x71, 0x5d, 0x2e, 0x5a, 0x26, 0x30, 0xb2, 0xe4, 0x94, 0xb3, | ||||
|   0xee, 0x93, 0x02, 0x73, 0x5f, 0x09, 0x88, 0xea, 0x69, 0x49, 0xcd, 0xab, 0x94, 0x27, 0xc4, 0x12, | ||||
|   0xf5, 0x67, 0x98, 0xdf, 0x6d, 0x64, 0xbf, 0xef, 0x63, 0x3b, 0x7f, 0xaa, 0x91, 0xed, 0x51, 0xb5, | ||||
|   0xc1, 0x0f, 0xf5, 0xef, 0xd4, 0xcc, 0xd3, 0x77, 0xe0, 0xff, 0x02, 0xe8, 0x93, 0xa8, 0x82, 0x17, | ||||
|   0xc1, 0x0f, 0xf5, 0xef, 0xd4, 0xcc, 0xd3, 0x77, 0xe0, 0xff, 0x02, 0x6f, 0x8b, 0xcf, 0x3d, 0x17, | ||||
|   0x16, 0x00, 0x00 | ||||
| }; | ||||
|  | ||||
| @@ -1768,7 +1776,7 @@ const uint8_t PAGE_settings_sec[] PROGMEM = { | ||||
| // Autogenerated from wled00/data/settings_um.htm, do not edit!! | ||||
| const uint16_t PAGE_settings_um_length = 3306; | ||||
| const uint8_t PAGE_settings_um[] PROGMEM = { | ||||
|   0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x13, 0xad, 0x59, 0x6d, 0x73, 0xdb, 0x36, | ||||
|   0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0a, 0xad, 0x59, 0x6d, 0x73, 0xdb, 0x36, | ||||
|   0x12, 0xfe, 0xee, 0x5f, 0x41, 0xa3, 0x19, 0x99, 0x1c, 0xd1, 0x94, 0x9c, 0xb6, 0x33, 0x39, 0x49, | ||||
|   0x94, 0x2e, 0x76, 0xdc, 0x46, 0x97, 0x17, 0x7b, 0xe2, 0xa4, 0x99, 0x1b, 0xc7, 0x17, 0x53, 0x22, | ||||
|   0x24, 0x21, 0xa6, 0x08, 0x96, 0x00, 0xed, 0xf8, 0x64, 0xfd, 0xf7, 0x7b, 0x16, 0x20, 0x29, 0xca, | ||||
| @@ -1981,7 +1989,7 @@ const uint8_t PAGE_settings_um[] PROGMEM = { | ||||
| // Autogenerated from wled00/data/settings_2D.htm, do not edit!! | ||||
| const uint16_t PAGE_settings_2D_length = 3296; | ||||
| const uint8_t PAGE_settings_2D[] PROGMEM = { | ||||
|   0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x13, 0xc5, 0x5a, 0x5b, 0x77, 0xdb, 0x36, | ||||
|   0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0a, 0xc5, 0x5a, 0x5b, 0x77, 0xdb, 0x36, | ||||
|   0x12, 0x7e, 0xd7, 0xaf, 0x80, 0xb1, 0x5d, 0x97, 0xb4, 0xa8, 0x9b, 0x9b, 0xf4, 0xb4, 0x92, 0x28, | ||||
|   0x35, 0x8e, 0xd3, 0xd8, 0x7b, 0xec, 0x44, 0xc7, 0x72, 0xed, 0xe4, 0xb4, 0x3d, 0x0d, 0x4d, 0x42, | ||||
|   0x12, 0x12, 0x0a, 0x60, 0x09, 0xd0, 0x97, 0x3a, 0xfe, 0xef, 0x3b, 0x03, 0xf0, 0xa6, 0x8b, 0x9d, | ||||
| @@ -2193,7 +2201,7 @@ const uint8_t PAGE_settings_2D[] PROGMEM = { | ||||
| // Autogenerated from wled00/data/settings_pin.htm, do not edit!! | ||||
| const uint16_t PAGE_settings_pin_length = 473; | ||||
| const uint8_t PAGE_settings_pin[] PROGMEM = { | ||||
|   0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x13, 0x5d, 0x52, 0x4d, 0x6f, 0x13, 0x31, | ||||
|   0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0a, 0x5d, 0x52, 0x4d, 0x6f, 0x13, 0x31, | ||||
|   0x10, 0xbd, 0xef, 0xaf, 0x30, 0x73, 0x69, 0x82, 0x92, 0xdd, 0x50, 0x81, 0x04, 0xaa, 0xbd, 0x42, | ||||
|   0x81, 0x1e, 0xb8, 0x94, 0x48, 0xe5, 0x82, 0xaa, 0xaa, 0x72, 0xec, 0xd9, 0xc4, 0xaa, 0x3f, 0x16, | ||||
|   0xdb, 0x9b, 0x10, 0x2a, 0xfe, 0x3b, 0xe3, 0xdd, 0x50, 0x50, 0x2f, 0x6b, 0xbf, 0x99, 0xf1, 0x9b, | ||||
|   | ||||
| @@ -7,7 +7,7 @@ | ||||
|  */ | ||||
|   | ||||
| // Autogenerated from wled00/data/simple.htm, do not edit!! | ||||
| const uint16_t PAGE_simple_L = 18050; | ||||
| const uint16_t PAGE_simple_L = 18061; | ||||
| const uint8_t PAGE_simple[] PROGMEM = { | ||||
|   0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x13, 0xcd, 0x7d, 0x69, 0x77, 0xe2, 0xba, | ||||
|   0xb2, 0xe8, 0xf7, 0xfc, 0x0a, 0xda, 0x7d, 0x4e, 0x1a, 0x1f, 0x1c, 0x30, 0xf3, 0xd4, 0x24, 0x87, | ||||
| @@ -688,454 +688,454 @@ const uint8_t PAGE_simple[] PROGMEM = { | ||||
|   0x06, 0x51, 0xa0, 0xd0, 0x78, 0xbe, 0x0e, 0x92, 0x98, 0x78, 0x44, 0x0c, 0x5d, 0x93, 0xdc, 0x3e, | ||||
|   0xba, 0x08, 0x61, 0x7e, 0xe8, 0x79, 0x0e, 0x85, 0x24, 0xb3, 0x80, 0x35, 0x40, 0x99, 0x73, 0x0f, | ||||
|   0x06, 0x03, 0xe0, 0x96, 0xe3, 0x77, 0xb6, 0xb2, 0xb5, 0x91, 0xa9, 0xa9, 0x09, 0x11, 0x56, 0x89, | ||||
|   0x05, 0xa6, 0x01, 0x4d, 0xad, 0x07, 0xb6, 0xf3, 0x62, 0x80, 0xac, 0x0d, 0x48, 0xe8, 0x9b, 0x8e, | ||||
|   0x8b, 0x60, 0x53, 0x49, 0xc8, 0x34, 0x6d, 0x77, 0x07, 0xb4, 0x88, 0x14, 0x7b, 0x44, 0x7c, 0xc2, | ||||
|   0x2c, 0x31, 0x3d, 0x6e, 0x5b, 0x04, 0xfd, 0x99, 0xfb, 0xd2, 0x68, 0x98, 0x40, 0x23, 0x3b, 0x49, | ||||
|   0x0f, 0x3f, 0x14, 0x4a, 0xaa, 0x01, 0xad, 0xa4, 0x30, 0x9d, 0xaf, 0x79, 0xf6, 0x0c, 0xaa, 0x28, | ||||
|   0x7e, 0xab, 0x40, 0xee, 0xac, 0x34, 0x3f, 0x67, 0x94, 0xb8, 0x1a, 0x9b, 0x0b, 0xf5, 0x88, 0xc7, | ||||
|   0x49, 0x71, 0xf1, 0x15, 0x6d, 0x60, 0xab, 0x0e, 0x88, 0xdd, 0x23, 0x7b, 0x84, 0x58, 0xf8, 0x8b, | ||||
|   0x29, 0x4e, 0x74, 0x99, 0x25, 0x5d, 0x9e, 0xe7, 0xc1, 0x90, 0x7e, 0x21, 0xf7, 0x1d, 0x50, 0xb9, | ||||
|   0x16, 0x0a, 0x8b, 0xc0, 0x71, 0x11, 0xf5, 0xa8, 0x97, 0x86, 0xb5, 0xf3, 0xfb, 0x77, 0x60, 0x68, | ||||
|   0x81, 0xa9, 0xea, 0x0c, 0x07, 0x69, 0xab, 0x0f, 0x5d, 0x73, 0x32, 0xd9, 0x6a, 0x4e, 0xcc, 0x64, | ||||
|   0xc5, 0x8a, 0x18, 0x53, 0xaa, 0x68, 0x2d, 0xb6, 0x74, 0xcc, 0xa5, 0xf4, 0x7a, 0x97, 0xb8, 0x4a, | ||||
|   0x3f, 0x19, 0x10, 0x75, 0x1f, 0x77, 0x02, 0xa4, 0xa9, 0x93, 0x7e, 0x06, 0xa3, 0x0a, 0x70, 0x36, | ||||
|   0x1b, 0x10, 0xb7, 0x6f, 0xaa, 0x35, 0x0e, 0x4a, 0x70, 0x73, 0x1e, 0xeb, 0x1a, 0x49, 0x60, 0x13, | ||||
|   0x84, 0x16, 0x48, 0xf2, 0x8b, 0x94, 0x59, 0xdc, 0xfa, 0x80, 0x51, 0xa3, 0x09, 0x0c, 0x66, 0x08, | ||||
|   0x9f, 0x06, 0x0a, 0x85, 0x56, 0xe8, 0x4b, 0x08, 0x4d, 0xc3, 0x31, 0x81, 0x2d, 0xe8, 0x66, 0x0f, | ||||
|   0x56, 0x6a, 0xb8, 0xb5, 0x84, 0x6a, 0x12, 0x87, 0x1e, 0x08, 0xf2, 0xc2, 0x9c, 0x13, 0x12, 0x42, | ||||
|   0x4a, 0x80, 0x71, 0x13, 0x94, 0x4b, 0x78, 0x1e, 0x6f, 0x87, 0x32, 0x09, 0xa2, 0xa6, 0x39, 0x84, | ||||
|   0xde, 0xd5, 0x0c, 0x58, 0x78, 0x53, 0xf6, 0xbe, 0x3c, 0xdf, 0x94, 0x20, 0x0d, 0xdf, 0x6e, 0x14, | ||||
|   0x5c, 0x50, 0xe3, 0xdd, 0xef, 0x00, 0xc4, 0x57, 0xe4, 0x5d, 0x50, 0xe4, 0x3d, 0x46, 0x07, 0xe6, | ||||
|   0x17, 0x64, 0xfc, 0x70, 0x7f, 0x22, 0x2d, 0xd0, 0x39, 0x6c, 0x03, 0x3b, 0x7a, 0x24, 0xc0, 0xb2, | ||||
|   0xf9, 0x5a, 0x90, 0x03, 0x36, 0x86, 0x0f, 0x2d, 0xe9, 0x08, 0x5e, 0x72, 0xf6, 0xa7, 0xff, 0x94, | ||||
|   0xfb, 0x09, 0xcb, 0x60, 0x51, 0xc2, 0xc0, 0x17, 0x37, 0xc2, 0x4a, 0xa0, 0x3f, 0x74, 0x84, 0x49, | ||||
|   0x9f, 0xf8, 0x94, 0x57, 0x3c, 0x0f, 0xc5, 0xc9, 0x76, 0x03, 0x4c, 0x5b, 0xf2, 0x5d, 0x07, 0x34, | ||||
|   0x99, 0x7e, 0x17, 0x0a, 0x3f, 0xf9, 0x39, 0xa3, 0xcc, 0xcd, 0x4d, 0x8f, 0xf7, 0x03, 0xfb, 0xe0, | ||||
|   0xe7, 0xb8, 0x7a, 0x7c, 0x61, 0xb0, 0x34, 0xb3, 0xf5, 0x30, 0xbf, 0xe4, 0x90, 0x2b, 0xb5, 0x90, | ||||
|   0x29, 0x05, 0x36, 0x95, 0xd3, 0xa0, 0x12, 0x07, 0x43, 0x37, 0x60, 0x22, 0x90, 0x27, 0xd9, 0xc4, | ||||
|   0xf8, 0xc0, 0x68, 0x5a, 0x30, 0x6d, 0xea, 0xdf, 0xa2, 0xe1, 0x6f, 0x49, 0xd0, 0xa1, 0xf0, 0x7f, | ||||
|   0x1e, 0x4c, 0xa7, 0x70, 0xe8, 0xc6, 0xa7, 0xdf, 0xde, 0xc8, 0xbc, 0x39, 0xeb, 0x97, 0xcc, 0x25, | ||||
|   0x18, 0x2a, 0xc8, 0x4e, 0x24, 0xd5, 0xdb, 0xe3, 0x70, 0xd8, 0x8c, 0x86, 0x53, 0xd0, 0xbf, 0x96, | ||||
|   0xb4, 0x89, 0x6a, 0x4b, 0x63, 0x48, 0xba, 0xb4, 0xc9, 0x88, 0xd5, 0x68, 0x3f, 0x2c, 0xca, 0xb6, | ||||
|   0x1f, 0x68, 0x29, 0x0f, 0x14, 0x8b, 0xa5, 0x60, 0xb9, 0x51, 0x87, 0x01, 0xfd, 0x4f, 0x50, 0x57, | ||||
|   0x48, 0xc3, 0xc5, 0xb1, 0x32, 0xff, 0x0d, 0x93, 0xab, 0xfd, 0x14, 0xc2, 0x97, 0x6c, 0x60, 0x29, | ||||
|   0x31, 0x24, 0x8f, 0x02, 0xa1, 0xee, 0x4b, 0x42, 0x91, 0x1a, 0xc9, 0xfa, 0x2a, 0x63, 0x73, 0xe5, | ||||
|   0xbb, 0x20, 0x17, 0x13, 0x27, 0x21, 0xe9, 0xeb, 0xbc, 0xb4, 0xa2, 0x83, 0xf4, 0xfd, 0x0c, 0xe8, | ||||
|   0xcf, 0xc4, 0xb7, 0x53, 0x52, 0xa7, 0xe8, 0x2e, 0xdd, 0x5d, 0x06, 0xee, 0xb1, 0xae, 0x34, 0x9d, | ||||
|   0x95, 0x48, 0xd9, 0x90, 0xc7, 0xa4, 0x6f, 0x8e, 0x6f, 0x70, 0x2b, 0x07, 0xbd, 0x21, 0x0d, 0x18, | ||||
|   0xd4, 0x0c, 0x79, 0x16, 0x1b, 0x91, 0xb7, 0xf7, 0xc3, 0xaf, 0xa3, 0x0c, 0xff, 0x54, 0x9f, 0x0d, | ||||
|   0xba, 0x4d, 0x9d, 0x31, 0x19, 0x5a, 0x91, 0x6d, 0x0d, 0x51, 0x11, 0x8b, 0xb7, 0x9a, 0x1c, 0xde, | ||||
|   0x9c, 0x9d, 0x52, 0x49, 0xab, 0xf8, 0x7e, 0x91, 0x06, 0x30, 0x68, 0x7a, 0xbf, 0x2e, 0xb0, 0x69, | ||||
|   0xec, 0x00, 0x18, 0xa2, 0xb8, 0x59, 0xe7, 0xbf, 0x76, 0xd2, 0x73, 0x9a, 0x22, 0xdb, 0x66, 0x2d, | ||||
|   0x07, 0xb7, 0xec, 0x36, 0x3c, 0x63, 0xd9, 0x2b, 0xd1, 0x08, 0xbf, 0xab, 0x12, 0x67, 0xd9, 0x6b, | ||||
|   0x03, 0xc7, 0x0f, 0x72, 0x7d, 0x60, 0x8e, 0x40, 0x27, 0xa0, 0x0d, 0xf0, 0x73, 0x21, 0x57, 0x15, | ||||
|   0x81, 0x62, 0x61, 0x74, 0x61, 0x3e, 0x14, 0x47, 0xc5, 0x3e, 0xf6, 0x8a, 0xe1, 0x83, 0x9f, 0x8d, | ||||
|   0x9d, 0xcd, 0xcd, 0xb1, 0x13, 0x7a, 0xe1, 0x26, 0x70, 0xd7, 0x7b, 0x22, 0x77, 0xc0, 0xd6, 0x26, | ||||
|   0x6e, 0xfa, 0xe2, 0x72, 0xff, 0x1c, 0x50, 0x05, 0x05, 0x14, 0x74, 0x46, 0x03, 0x1d, 0x8c, 0x1d, | ||||
|   0xaa, 0xd0, 0x04, 0x9e, 0xca, 0xf4, 0xd8, 0xd9, 0xde, 0xca, 0x6e, 0x6e, 0x86, 0x7a, 0xc9, 0x58, | ||||
|   0xbd, 0x50, 0x84, 0xae, 0x00, 0xf9, 0x04, 0xb8, 0xe7, 0x5a, 0x80, 0x6b, 0xe2, 0x99, 0xb8, 0x66, | ||||
|   0x82, 0x1a, 0xc0, 0x89, 0xae, 0x04, 0x12, 0x58, 0xfd, 0xc2, 0x09, 0x28, 0x74, 0x16, 0x06, 0x2c, | ||||
|   0x62, 0x2a, 0xd2, 0xcd, 0x30, 0xce, 0x43, 0x38, 0x5e, 0x9d, 0x0c, 0xa3, 0xa1, 0xfb, 0xae, 0x49, | ||||
|   0x6f, 0x02, 0x40, 0xd0, 0xf0, 0x11, 0x25, 0xe5, 0x7a, 0x68, 0x20, 0x76, 0x3b, 0xae, 0x8d, 0xba, | ||||
|   0x0a, 0x93, 0x75, 0x54, 0x56, 0x1d, 0x81, 0xf2, 0x44, 0x50, 0xd5, 0x3c, 0x03, 0x19, 0x9e, 0xee, | ||||
|   0xea, 0x26, 0xd0, 0xaa, 0x9b, 0xa9, 0x94, 0x0a, 0x88, 0x56, 0x27, 0x9c, 0x9a, 0x74, 0xb7, 0x68, | ||||
|   0xf2, 0xbf, 0x4c, 0x3e, 0x93, 0x2f, 0x61, 0xb6, 0xb1, 0x3a, 0x7b, 0x0b, 0x73, 0xff, 0xe5, 0xf0, | ||||
|   0x99, 0x92, 0x88, 0x5c, 0xd4, 0xdc, 0x01, 0x45, 0x28, 0xc1, 0xa5, 0x92, 0xd9, 0x06, 0xfa, 0x47, | ||||
|   0x80, 0xed, 0x73, 0xe8, 0xd8, 0x9d, 0x02, 0x4b, 0x4b, 0x71, 0x42, 0x82, 0xc3, 0xfb, 0x29, 0x3c, | ||||
|   0x3f, 0x98, 0x9e, 0x6a, 0x38, 0xbf, 0x7f, 0x9b, 0x3b, 0x4e, 0x50, 0xc1, 0xd9, 0x01, 0x99, 0x32, | ||||
|   0x44, 0x8a, 0xc2, 0x2f, 0xa8, 0x02, 0xa5, 0x85, 0x2f, 0xc0, 0x4d, 0x1d, 0x14, 0xdd, 0x20, 0xdd, | ||||
|   0x01, 0x00, 0x4c, 0xff, 0x76, 0xb1, 0xba, 0xb9, 0xf9, 0xc5, 0x64, 0x69, 0x46, 0x8a, 0x06, 0x7f, | ||||
|   0x60, 0xfa, 0x77, 0xec, 0xca, 0xe6, 0x26, 0xcb, 0x0f, 0x95, 0xf7, 0xd2, 0x31, 0xc5, 0xdd, 0x2a, | ||||
|   0x89, 0xff, 0xc2, 0x2a, 0x0e, 0x41, 0xcb, 0x48, 0x0f, 0x79, 0xe9, 0x60, 0xb2, 0x6d, 0x73, 0x8c, | ||||
|   0x4b, 0x08, 0xf0, 0x03, 0x18, 0xf5, 0x74, 0xbc, 0x5f, 0xdf, 0x5d, 0x7b, 0xfb, 0xbb, 0xab, 0xfa, | ||||
|   0x3b, 0x0f, 0xf4, 0xdd, 0x02, 0xdc, 0xf6, 0x3f, 0x66, 0x64, 0xfe, 0x3d, 0xe3, 0xaa, 0xe1, 0x2c, | ||||
|   0xfa, 0x86, 0x00, 0xcc, 0x72, 0xe7, 0xa0, 0x21, 0x7b, 0xd9, 0x19, 0xa8, 0xfe, 0x6b, 0xd1, 0x8c, | ||||
|   0xe5, 0xf9, 0x14, 0xbd, 0x59, 0xf1, 0x22, 0xcb, 0x60, 0xfc, 0xc4, 0x47, 0x0b, 0x75, 0xb4, 0x6f, | ||||
|   0x6e, 0xd2, 0xaf, 0x1f, 0xe4, 0xe7, 0xe2, 0x29, 0x0d, 0xa9, 0x49, 0x98, 0xc8, 0xe0, 0x27, 0x0c, | ||||
|   0x2d, 0xec, 0x65, 0xbc, 0xd4, 0xa5, 0x29, 0xee, 0xa6, 0x84, 0x5c, 0x8d, 0x41, 0x59, 0xcb, 0xcb, | ||||
|   0x0b, 0x41, 0xf3, 0x93, 0xd2, 0x96, 0x13, 0xea, 0x9e, 0x64, 0x69, 0x77, 0x92, 0xee, 0x2b, 0xee, | ||||
|   0xb4, 0xf0, 0xef, 0xdf, 0x5f, 0xfc, 0x4a, 0x3c, 0x83, 0x0b, 0x73, 0xc8, 0xba, 0xef, 0x79, 0x3e, | ||||
|   0x61, 0xf4, 0x5a, 0xcf, 0x48, 0xe2, 0x56, 0x80, 0x5f, 0xd0, 0x1f, 0x8d, 0x9b, 0x06, 0x3d, 0x77, | ||||
|   0x87, 0x7e, 0xd6, 0x92, 0x2a, 0xc1, 0x37, 0xe1, 0x42, 0x9a, 0x21, 0x04, 0x8f, 0xd6, 0xe2, 0xf1, | ||||
|   0x55, 0x8f, 0xfb, 0xa3, 0xdc, 0xb0, 0x37, 0xea, 0x55, 0xf7, 0x71, 0xf7, 0x21, 0xa6, 0x5e, 0xf5, | ||||
|   0x9d, 0xd0, 0x33, 0xee, 0x13, 0x2c, 0xd6, 0x9e, 0xb5, 0x4b, 0x5f, 0xf7, 0xcc, 0x94, 0x0c, 0xba, | ||||
|   0xc0, 0x64, 0x05, 0x8d, 0x09, 0xe2, 0xdd, 0x14, 0x01, 0x4c, 0x80, 0x2a, 0xc2, 0x1d, 0xff, 0x3e, | ||||
|   0x29, 0xfa, 0x12, 0x60, 0x10, 0x9f, 0x55, 0xfa, 0x0f, 0x45, 0x0e, 0x99, 0x10, 0xa5, 0x65, 0x0e, | ||||
|   0x06, 0x20, 0x55, 0x90, 0xc5, 0x5a, 0x53, 0x2e, 0xc6, 0x08, 0x2c, 0x8d, 0xa8, 0xc8, 0x04, 0xf0, | ||||
|   0x62, 0x38, 0xd9, 0x94, 0x6c, 0xe0, 0x00, 0x31, 0x0b, 0xc9, 0x17, 0x6c, 0x84, 0xb2, 0x1b, 0x8a, | ||||
|   0x6d, 0x02, 0x03, 0x18, 0xb8, 0x8d, 0x06, 0x15, 0xb4, 0xf4, 0x79, 0x5b, 0xe4, 0xc3, 0x43, 0x6d, | ||||
|   0x84, 0x94, 0xce, 0x77, 0xe4, 0x30, 0x18, 0x02, 0x82, 0x65, 0xd2, 0x37, 0x13, 0x11, 0xbf, 0x19, | ||||
|   0x3e, 0xd8, 0x84, 0x81, 0x6f, 0x81, 0x6a, 0xe6, 0xc0, 0xed, 0xea, 0x49, 0xf2, 0xfb, 0x37, 0x24, | ||||
|   0x7c, 0x69, 0x78, 0xb9, 0xa8, 0xf5, 0x85, 0x0b, 0xc6, 0xd4, 0x4b, 0x8b, 0x41, 0xfb, 0x48, 0xbb, | ||||
|   0x04, 0x05, 0xde, 0x7c, 0xf9, 0xfd, 0x3b, 0xce, 0x8b, 0x85, 0x40, 0xeb, 0x0c, 0xa9, 0x9d, 0x4b, | ||||
|   0xac, 0xd0, 0xdb, 0x68, 0x22, 0xcb, 0x43, 0x08, 0x14, 0xd1, 0xc5, 0x2b, 0x8d, 0x81, 0x16, 0xc2, | ||||
|   0xc2, 0xef, 0x0b, 0xaa, 0x33, 0x51, 0xc9, 0xc0, 0xc7, 0xf4, 0x4b, 0x12, 0x61, 0xe5, 0x04, 0x26, | ||||
|   0x15, 0xcb, 0xc4, 0xe6, 0xc6, 0xd7, 0x5f, 0xfc, 0xc9, 0x89, 0xa1, 0x01, 0x47, 0x91, 0xf1, 0xb7, | ||||
|   0x0c, 0xff, 0x63, 0x78, 0x60, 0xdb, 0x6b, 0xde, 0x0a, 0x03, 0x85, 0xc0, 0xd6, 0xb0, 0x47, 0xa1, | ||||
|   0xa9, 0xf5, 0x7b, 0xf9, 0x39, 0xc4, 0xac, 0xc2, 0x04, 0xa1, 0x6a, 0x54, 0x64, 0xec, 0xa0, 0x89, | ||||
|   0xbd, 0x37, 0x6a, 0xe2, 0x85, 0x6a, 0xfe, 0xa7, 0x06, 0x4d, 0x3e, 0x18, 0xb4, 0x17, 0x2a, 0xfa, | ||||
|   0xff, 0x7a, 0xcc, 0x54, 0xe3, 0x7c, 0x6f, 0xdc, 0x6c, 0x1f, 0xf4, 0x3f, 0x36, 0xec, 0xa4, 0xb7, | ||||
|   0xcf, 0x0a, 0xcb, 0xf1, 0xc7, 0x4f, 0xd0, 0xd5, 0xfa, 0x5a, 0x17, 0x93, 0x59, 0x6a, 0x7a, 0x68, | ||||
|   0xb0, 0x04, 0xee, 0xdf, 0xf5, 0x2f, 0x75, 0x6e, 0xcd, 0xd0, 0x17, 0x3b, 0xb5, 0x9f, 0x43, 0x82, | ||||
|   0xc0, 0xe2, 0x29, 0x6f, 0x8f, 0x28, 0x3e, 0x90, 0x1b, 0x62, 0x47, 0xbd, 0x85, 0x21, 0x58, 0x57, | ||||
|   0xa7, 0x00, 0x6a, 0xb1, 0xd1, 0xe7, 0xe3, 0xff, 0xea, 0x34, 0x60, 0x9d, 0x20, 0x04, 0x80, 0x69, | ||||
|   0x41, 0xc1, 0xc0, 0x2e, 0xe7, 0x7d, 0xd5, 0xd7, 0x05, 0xd5, 0x97, 0xe6, 0x38, 0x60, 0xbc, 0x27, | ||||
|   0xe9, 0x1e, 0x1d, 0xd8, 0x9c, 0x60, 0x88, 0x6d, 0xbb, 0x68, 0x9b, 0x23, 0x74, 0x3a, 0x50, 0x9e, | ||||
|   0xa4, 0x1a, 0xbf, 0x96, 0x43, 0x06, 0x12, 0xec, 0x96, 0xcb, 0x04, 0x5e, 0xb6, 0xe6, 0x85, 0x2a, | ||||
|   0x82, 0x4c, 0x85, 0x9a, 0xf3, 0x57, 0x5d, 0xe6, 0xfc, 0xf8, 0x55, 0x4c, 0xca, 0xfd, 0xdc, 0xc1, | ||||
|   0x0f, 0x64, 0xf0, 0xb1, 0x60, 0x2c, 0xca, 0x34, 0x92, 0x5e, 0x35, 0xbe, 0x4e, 0xa5, 0x32, 0x98, | ||||
|   0x7c, 0xf3, 0x20, 0xd4, 0xe0, 0x17, 0xdb, 0xe7, 0xc2, 0xe3, 0xb1, 0x7c, 0x58, 0xc7, 0x9d, 0x2f, | ||||
|   0x8d, 0x39, 0x60, 0x40, 0xc8, 0xa4, 0x29, 0x77, 0xe2, 0x67, 0x9e, 0xcc, 0x62, 0x42, 0x46, 0xfc, | ||||
|   0x59, 0xf7, 0x51, 0x22, 0xb8, 0x71, 0xe2, 0x65, 0x15, 0xea, 0x2e, 0xc3, 0x85, 0x32, 0xb0, 0x2e, | ||||
|   0x79, 0x1f, 0xbb, 0x4c, 0xdd, 0x46, 0x34, 0xfb, 0xb6, 0x1e, 0xc5, 0x1b, 0xdb, 0x42, 0x77, 0x19, | ||||
|   0x86, 0xa8, 0x18, 0x66, 0x3b, 0x88, 0x0e, 0xf4, 0x9f, 0xe7, 0xd1, 0xba, 0xd6, 0x8c, 0x21, 0xf1, | ||||
|   0x5e, 0x38, 0x1f, 0xa8, 0x75, 0x0e, 0x62, 0x96, 0x82, 0x34, 0x1a, 0x58, 0x12, 0xe4, 0x5e, 0x1d, | ||||
|   0x85, 0x23, 0xcc, 0x82, 0x35, 0x74, 0xfa, 0xc9, 0x1f, 0xae, 0x60, 0x08, 0x4c, 0xfb, 0x70, 0xf9, | ||||
|   0x9f, 0xa8, 0x97, 0xd3, 0x64, 0xd0, 0xd0, 0xe9, 0x24, 0xc4, 0xe2, 0xcf, 0x12, 0x4a, 0x02, 0x99, | ||||
|   0xfd, 0x02, 0xfb, 0x73, 0x73, 0x1d, 0x82, 0xe7, 0x3c, 0xb7, 0xfd, 0x8b, 0x02, 0xf9, 0xc7, 0x2c, | ||||
|   0xa4, 0x84, 0xb8, 0xfc, 0x0e, 0x17, 0x44, 0x96, 0x7e, 0x63, 0xf1, 0x1a, 0xfe, 0x7d, 0x9f, 0xdf, | ||||
|   0x68, 0x7c, 0x46, 0x36, 0xcf, 0xa2, 0x86, 0x51, 0x27, 0x9c, 0x47, 0xa2, 0x72, 0xfc, 0xdb, 0x91, | ||||
|   0x70, 0xd6, 0xfc, 0x2e, 0xcf, 0xbd, 0x90, 0x18, 0x16, 0x19, 0xf2, 0x8b, 0x46, 0x1a, 0xa4, 0x52, | ||||
|   0x73, 0x36, 0x89, 0x2c, 0x10, 0x3e, 0x62, 0xaa, 0x30, 0xf2, 0xbe, 0x6c, 0x26, 0x17, 0xcc, 0x03, | ||||
|   0x89, 0x97, 0x19, 0xe3, 0x7e, 0x30, 0x43, 0x58, 0xf1, 0xa1, 0x78, 0xc4, 0x70, 0x26, 0x8f, 0xbe, | ||||
|   0x7d, 0x0b, 0x40, 0x40, 0x9f, 0x17, 0xf6, 0x86, 0x11, 0xcc, 0x22, 0x38, 0x2e, 0xdc, 0x9e, 0x0b, | ||||
|   0x0b, 0x5d, 0xd7, 0x46, 0x84, 0x6a, 0x68, 0x5c, 0xf2, 0x14, 0x1e, 0x79, 0x50, 0xea, 0x5c, 0xea, | ||||
|   0x5f, 0xf3, 0x13, 0xbd, 0x14, 0x35, 0xcd, 0x28, 0xd8, 0xf5, 0xe3, 0x41, 0xa0, 0x2a, 0x51, 0x9d, | ||||
|   0xf4, 0x78, 0xb4, 0x08, 0xd4, 0xf0, 0x92, 0x14, 0xfc, 0x21, 0xa0, 0x1b, 0xf1, 0xa6, 0xa7, 0x5f, | ||||
|   0x13, 0x65, 0x04, 0x19, 0xa0, 0x1d, 0xf9, 0x61, 0x1b, 0x5e, 0x29, 0xf8, 0xe5, 0x90, 0x1e, 0x0d, | ||||
|   0xba, 0x20, 0xe9, 0xae, 0x93, 0x46, 0xc9, 0x8d, 0x01, 0x26, 0x3e, 0x10, 0xc5, 0x5d, 0x26, 0x6a, | ||||
|   0x3a, 0xd4, 0x85, 0x1a, 0xca, 0x09, 0xe8, 0x93, 0xeb, 0xda, 0x84, 0xf4, 0x89, 0x64, 0x65, 0xb2, | ||||
|   0x24, 0x5f, 0x37, 0x1b, 0x66, 0xda, 0x35, 0xdb, 0xf8, 0x2e, 0x8b, 0x64, 0x96, 0x51, 0x96, 0xe3, | ||||
|   0x83, 0xb4, 0xc6, 0x36, 0xd8, 0x03, 0xdc, 0x39, 0x7a, 0x7b, 0x24, 0x5d, 0xa1, 0x10, 0x55, 0xae, | ||||
|   0xee, 0x6c, 0x43, 0xc5, 0x1d, 0xa3, 0x91, 0x74, 0xe0, 0xff, 0x4c, 0x03, 0x7e, 0xf0, 0x01, 0x08, | ||||
|   0xc8, 0x13, 0x77, 0xc4, 0x5a, 0x96, 0x07, 0x3b, 0x20, 0xd1, 0xe4, 0x6a, 0x0e, 0xfa, 0xf1, 0x92, | ||||
|   0xb4, 0x6c, 0x51, 0xfc, 0x17, 0x35, 0x2d, 0xa8, 0x5d, 0x0a, 0x15, 0x8b, 0x22, 0x2d, 0x34, 0x68, | ||||
|   0x7a, 0x26, 0xa9, 0xee, 0xf1, 0x1a, 0x92, 0x1e, 0x52, 0x16, 0x83, 0xb4, 0x04, 0x76, 0xb7, 0x60, | ||||
|   0xfe, 0x04, 0x0b, 0x3b, 0x2e, 0x2b, 0xa0, 0x0c, 0x6f, 0x02, 0xfd, 0xef, 0x80, 0xb6, 0xef, 0xeb, | ||||
|   0xf4, 0x50, 0x94, 0xfa, 0x93, 0x71, 0x01, 0xd5, 0xa2, 0xe9, 0xac, 0x05, 0xa9, 0xc1, 0x9d, 0x0c, | ||||
|   0x87, 0x7d, 0xe9, 0x65, 0xc8, 0x81, 0x1e, 0x38, 0x22, 0x76, 0x9a, 0x5a, 0xe7, 0x9e, 0x3f, 0x53, | ||||
|   0x4c, 0x67, 0x0b, 0x69, 0x0e, 0x75, 0x23, 0x28, 0x77, 0x68, 0x02, 0x33, 0xe6, 0x90, 0xb1, 0x63, | ||||
|   0x31, 0x0d, 0x96, 0xc4, 0x10, 0xe3, 0x99, 0xb8, 0x2d, 0x59, 0xf7, 0x8b, 0x74, 0x86, 0xd6, 0xff, | ||||
|   0xf9, 0xdf, 0x00, 0x0a, 0x0b, 0x29, 0x06, 0x4d, 0xc3, 0x07, 0x50, 0xd7, 0x61, 0x91, 0x8c, 0xc0, | ||||
|   0x72, 0xc0, 0xaa, 0xf3, 0x04, 0x70, 0x30, 0x69, 0xce, 0x61, 0x70, 0x12, 0xfd, 0xa3, 0x2f, 0xf4, | ||||
|   0xd8, 0xfe, 0x5f, 0xc6, 0x3f, 0x66, 0xfa, 0x1c, 0x3f, 0xfd, 0x4e, 0x72, 0xbb, 0x43, 0x4d, 0x47, | ||||
|   0xef, 0x7e, 0x7a, 0xa4, 0xa9, 0x7c, 0x34, 0xab, 0x03, 0x6a, 0xb7, 0xa4, 0x27, 0x80, 0x24, 0x28, | ||||
|   0x0b, 0xc6, 0x42, 0x63, 0xad, 0xab, 0xa5, 0x1d, 0x9a, 0x9e, 0xe2, 0xfe, 0x99, 0x48, 0xa2, 0x0f, | ||||
|   0x95, 0xa6, 0xd9, 0xa0, 0xa4, 0x0b, 0x5c, 0x42, 0xdd, 0x1d, 0x80, 0xa9, 0x1f, 0x05, 0x73, 0x6b, | ||||
|   0xa1, 0xb9, 0xc8, 0x09, 0x31, 0xd3, 0x31, 0x3d, 0xa4, 0xe9, 0x7c, 0xac, 0x74, 0x1b, 0xa8, 0x24, | ||||
|   0x81, 0x64, 0x02, 0x44, 0x03, 0x00, 0x5f, 0x76, 0x3d, 0x70, 0x04, 0x2c, 0x09, 0x5b, 0x1a, 0xec, | ||||
|   0x44, 0x0b, 0x5e, 0x76, 0xae, 0x9b, 0x67, 0x9c, 0x90, 0xf4, 0x72, 0x33, 0x59, 0x31, 0x57, 0xe0, | ||||
|   0x43, 0x84, 0xe5, 0x41, 0x40, 0x1e, 0x10, 0x69, 0x65, 0x1f, 0x56, 0xdf, 0x00, 0xc9, 0x2a, 0xe1, | ||||
|   0x85, 0x39, 0x71, 0x82, 0x11, 0xeb, 0x48, 0x13, 0xd0, 0x08, 0xea, 0x6f, 0xa2, 0x7d, 0xd9, 0xc1, | ||||
|   0x91, 0x53, 0xca, 0xec, 0x5a, 0x4e, 0xac, 0xd4, 0x59, 0xb3, 0x95, 0x90, 0x54, 0x15, 0xf8, 0x95, | ||||
|   0x83, 0xa5, 0x06, 0x92, 0x12, 0x1f, 0x0f, 0x98, 0xe8, 0xce, 0xd4, 0x01, 0x05, 0x1a, 0xf3, 0x61, | ||||
|   0xfd, 0x0c, 0x53, 0xe8, 0x46, 0xa6, 0x8f, 0x6e, 0x0a, 0xbb, 0x87, 0x58, 0x0c, 0x51, 0x68, 0x16, | ||||
|   0x0c, 0x5e, 0x56, 0x30, 0xc3, 0x0a, 0x01, 0xb5, 0xfe, 0x73, 0x09, 0xa9, 0xfb, 0xc6, 0x48, 0xb3, | ||||
|   0x4d, 0x63, 0x40, 0xbb, 0x4e, 0xd2, 0x18, 0x88, 0x4c, 0x0d, 0x5d, 0x0c, 0xc9, 0xb0, 0x09, 0x3c, | ||||
|   0xd2, 0xa9, 0xd1, 0xc7, 0x9a, 0x95, 0xe2, 0x58, 0x65, 0xb0, 0x15, 0x29, 0x0d, 0xfc, 0x62, 0xde, | ||||
|   0xa8, 0x97, 0x51, 0x94, 0xc5, 0x2c, 0x2f, 0x62, 0xff, 0x68, 0x53, 0x78, 0x21, 0xe3, 0x42, 0x09, | ||||
|   0x42, 0xbf, 0x92, 0x68, 0xc9, 0xf4, 0x98, 0x52, 0xc1, 0xa4, 0x74, 0x3c, 0x00, 0xcc, 0x8b, 0xfb, | ||||
|   0xf2, 0x6b, 0x6c, 0x67, 0xf9, 0x45, 0x30, 0x87, 0x58, 0x37, 0xbf, 0xfb, 0x19, 0x9b, 0x9b, 0xe6, | ||||
|   0xf7, 0x42, 0xdd, 0x5c, 0x78, 0x5e, 0x29, 0xe4, 0x1f, 0xe6, 0x4f, 0x2a, 0x87, 0x8c, 0x90, 0x1c, | ||||
|   0x4a, 0x03, 0x95, 0xd6, 0xbd, 0x48, 0xb6, 0x1f, 0xc6, 0xcf, 0x86, 0x93, 0x36, 0xd1, 0x5f, 0xd9, | ||||
|   0x08, 0x37, 0x4c, 0x3d, 0xf1, 0xa1, 0x7e, 0x18, 0x29, 0x20, 0x04, 0x63, 0x1b, 0x3b, 0x83, 0x59, | ||||
|   0xd8, 0x27, 0x6f, 0xb9, 0x44, 0x04, 0x93, 0x7f, 0x08, 0xe8, 0x1f, 0x33, 0x07, 0x8d, 0x61, 0xea, | ||||
|   0x6b, 0x85, 0xa7, 0x1d, 0xf8, 0xab, 0xf9, 0xe7, 0xbc, 0x00, 0xc3, 0x68, 0x7a, 0xa3, 0x90, 0x00, | ||||
|   0x8c, 0xb2, 0xaf, 0xc4, 0x77, 0x56, 0xd5, 0x3f, 0x03, 0x41, 0x6f, 0xa9, 0xa4, 0xf7, 0xa2, 0x72, | ||||
|   0x98, 0x9b, 0xd8, 0x34, 0x64, 0xc7, 0xaa, 0xe3, 0x53, 0x24, 0xde, 0x9d, 0x96, 0x93, 0xcd, 0x09, | ||||
|   0xe7, 0x9f, 0x11, 0xfb, 0xc7, 0xcc, 0x98, 0x3b, 0x5e, 0x58, 0x74, 0x70, 0x5c, 0x05, 0x7b, 0x9b, | ||||
|   0xc4, 0x1c, 0x9e, 0x4b, 0x60, 0xc7, 0x20, 0x65, 0x87, 0xf3, 0x2e, 0xcc, 0xa4, 0xa2, 0x8d, 0x36, | ||||
|   0x11, 0x91, 0x6f, 0xc1, 0xfd, 0x98, 0xb4, 0x13, 0x9c, 0x1f, 0xed, 0x89, 0x1d, 0xcd, 0xd0, 0x9e, | ||||
|   0xd2, 0xc7, 0xd8, 0x0d, 0x2c, 0xac, 0x7b, 0x6b, 0x0f, 0xe8, 0x24, 0x80, 0x27, 0x43, 0xfb, 0x0b, | ||||
|   0xc4, 0xef, 0x70, 0x92, 0xe2, 0x72, 0x4c, 0x35, 0x0a, 0xf5, 0x1f, 0x8a, 0x45, 0x25, 0x39, 0x74, | ||||
|   0xff, 0x72, 0x6c, 0xfb, 0x23, 0x08, 0x94, 0x2b, 0xc0, 0xe9, 0x3c, 0x7a, 0xb3, 0x10, 0xed, 0x40, | ||||
|   0x70, 0x62, 0x8e, 0x1d, 0x87, 0x62, 0x30, 0xe9, 0x6d, 0x2d, 0xab, 0x8f, 0xfd, 0x60, 0xa5, 0xc8, | ||||
|   0x31, 0x2a, 0x56, 0x43, 0x5e, 0xba, 0xdf, 0x05, 0x40, 0xe1, 0x15, 0x2f, 0x5e, 0x37, 0xfe, 0xfe, | ||||
|   0x2d, 0x2f, 0x38, 0x02, 0x68, 0x05, 0x06, 0x9f, 0xf1, 0x3a, 0xf1, 0xd1, 0xf9, 0x1f, 0x3a, 0xbe, | ||||
|   0xc5, 0xd3, 0xa7, 0x0e, 0x01, 0xd1, 0x29, 0xf3, 0x68, 0x8d, 0x29, 0x26, 0x4c, 0x23, 0xf1, 0x0f, | ||||
|   0x14, 0x46, 0x16, 0x70, 0xa0, 0xe7, 0x79, 0xde, 0xfb, 0x60, 0x69, 0x19, 0xb0, 0xb4, 0xd0, 0x85, | ||||
|   0x1f, 0x1e, 0x2c, 0x82, 0xf9, 0xb5, 0xc0, 0xd6, 0xaf, 0xb0, 0x91, 0x2a, 0xe3, 0x80, 0xa9, 0xbd, | ||||
|   0x33, 0xd6, 0xe8, 0xce, 0x0c, 0x3f, 0x53, 0x70, 0x73, 0x2f, 0x57, 0xa3, 0x5f, 0xf9, 0x5c, 0xcd, | ||||
|   0xf3, 0xd3, 0xec, 0x77, 0x2e, 0xf3, 0x39, 0xae, 0x4e, 0x53, 0xb3, 0x2c, 0xb3, 0x12, 0xce, 0xac, | ||||
|   0xe4, 0x4a, 0x25, 0x6e, 0xee, 0xfd, 0xde, 0x09, 0x79, 0x49, 0x64, 0x23, 0xe2, 0x6a, 0xe1, 0x70, | ||||
|   0xc3, 0x90, 0xee, 0x4b, 0x62, 0xfa, 0x0e, 0x49, 0x6b, 0x56, 0x8d, 0x3d, 0x2f, 0x33, 0x25, 0x16, | ||||
|   0xdf, 0x4b, 0x03, 0xf8, 0x18, 0x1b, 0x01, 0xe5, 0xc2, 0xc1, 0x0f, 0x1c, 0x35, 0xee, 0xa7, 0xa5, | ||||
|   0x69, 0x0c, 0x33, 0x3f, 0xf3, 0x1e, 0xa2, 0x46, 0x02, 0x05, 0x4a, 0x37, 0x45, 0x75, 0xd2, 0x32, | ||||
|   0x07, 0xf8, 0x9e, 0x13, 0xac, 0x21, 0xa1, 0x18, 0x0a, 0xf0, 0xa7, 0x03, 0x24, 0xfd, 0xbb, 0x5f, | ||||
|   0xdf, 0xdb, 0x03, 0xd1, 0x7d, 0xde, 0x24, 0x35, 0xbc, 0x9c, 0x1f, 0xfa, 0x4f, 0x6c, 0x50, 0x62, | ||||
|   0xd5, 0x9d, 0x85, 0xdc, 0x5f, 0x65, 0x73, 0x00, 0xeb, 0x0d, 0x51, 0xbf, 0x04, 0x23, 0x9c, 0x47, | ||||
|   0xc2, 0x9e, 0xbd, 0x4b, 0xa2, 0x3c, 0x57, 0xd7, 0x37, 0x1a, 0xfb, 0x9b, 0xc9, 0x78, 0x25, 0xbf, | ||||
|   0x31, 0x0b, 0x83, 0x61, 0x4d, 0xe2, 0x43, 0x56, 0x86, 0x00, 0x5a, 0x31, 0x9b, 0x2e, 0x89, 0x6e, | ||||
|   0x49, 0x43, 0x1e, 0x0a, 0x7b, 0x0d, 0x4a, 0x8b, 0x8d, 0x86, 0x84, 0x32, 0x7d, 0x87, 0x3b, 0xcf, | ||||
|   0x80, 0x42, 0x44, 0x9f, 0xe7, 0xb8, 0xd0, 0x7e, 0x01, 0x2f, 0x04, 0xd5, 0x76, 0x0e, 0xc8, 0x50, | ||||
|   0x95, 0xef, 0xe2, 0x8e, 0x99, 0x6a, 0x70, 0x91, 0x00, 0xf9, 0x84, 0x86, 0xb7, 0xce, 0x39, 0x28, | ||||
|   0x2c, 0xd4, 0x34, 0x57, 0x03, 0x40, 0xa8, 0x65, 0x60, 0xb1, 0x73, 0x33, 0x61, 0x82, 0x9d, 0x69, | ||||
|   0x2f, 0xa2, 0xbf, 0x13, 0x5d, 0x94, 0x59, 0x69, 0xdc, 0x40, 0x45, 0x76, 0xca, 0x5e, 0x1b, 0xe6, | ||||
|   0x33, 0x11, 0x7c, 0x99, 0x2a, 0x5d, 0xa3, 0xb0, 0x5a, 0xe6, 0xf4, 0x2b, 0x10, 0x5f, 0x2d, 0x26, | ||||
|   0x75, 0x03, 0x40, 0x35, 0x14, 0x62, 0x14, 0x91, 0x73, 0x4a, 0xf4, 0x51, 0x51, 0x65, 0x44, 0x28, | ||||
|   0xdd, 0x8c, 0xda, 0xd7, 0x5e, 0xc4, 0xf7, 0x4a, 0xc3, 0x9a, 0xc5, 0xb3, 0x7f, 0xca, 0xae, 0x0e, | ||||
|   0xbc, 0x6b, 0x43, 0x5d, 0xa5, 0x1b, 0x8d, 0x08, 0x3b, 0x81, 0xc0, 0x69, 0x10, 0x39, 0x73, 0xb2, | ||||
|   0x7f, 0xd6, 0xc9, 0x14, 0x21, 0xd6, 0x40, 0xd5, 0x27, 0x7f, 0xd5, 0xc9, 0xb4, 0xbc, 0x0c, 0x02, | ||||
|   0x4f, 0x85, 0x67, 0x4e, 0x50, 0xcf, 0x86, 0x40, 0x25, 0x34, 0xf1, 0x0d, 0x7c, 0x4a, 0xd0, 0xcc, | ||||
|   0x8e, 0xc3, 0x2d, 0x4e, 0x12, 0xde, 0xe0, 0x24, 0x3f, 0xdc, 0x9f, 0x8d, 0x99, 0xa6, 0xd6, 0x88, | ||||
|   0xbf, 0x87, 0x09, 0xb8, 0x67, 0x3f, 0xc0, 0x8c, 0x45, 0x18, 0x9f, 0x5d, 0x36, 0x80, 0x12, 0xdf, | ||||
|   0x83, 0x80, 0xf0, 0x44, 0x06, 0x89, 0xa3, 0xa7, 0xc6, 0xd0, 0xa3, 0x20, 0x02, 0xbe, 0x83, 0x9e, | ||||
|   0x30, 0xd6, 0x44, 0xc2, 0x1b, 0x8b, 0xa8, 0x79, 0xe3, 0xde, 0x22, 0x6d, 0x82, 0xde, 0x25, 0x7a, | ||||
|   0xd1, 0x4d, 0x72, 0xd7, 0x9d, 0xbb, 0x3d, 0x8e, 0xff, 0x2e, 0xfa, 0xab, 0x7c, 0x45, 0x91, 0x7f, | ||||
|   0xa3, 0x5b, 0x14, 0x07, 0x6c, 0x6e, 0x8b, 0x3b, 0x4e, 0xa8, 0x84, 0x33, 0x94, 0x41, 0x65, 0x4d, | ||||
|   0x9a, 0x7c, 0xcd, 0x6c, 0x54, 0xab, 0x55, 0x14, 0xf4, 0x3d, 0xdc, 0xeb, 0x02, 0xb4, 0x21, 0x79, | ||||
|   0xa3, 0x2f, 0xf3, 0xd0, 0x1d, 0xe8, 0x49, 0xae, 0x3b, 0x01, 0xaa, 0xc3, 0x6a, 0x9a, 0x2a, 0x2c, | ||||
|   0x55, 0x17, 0x41, 0x7b, 0x17, 0x16, 0x47, 0xe1, 0x70, 0x1b, 0x04, 0xff, 0x07, 0xfd, 0x8f, 0xd2, | ||||
|   0xa4, 0x7f, 0x46, 0xf0, 0x7d, 0x15, 0x6a, 0xe1, 0x45, 0xf3, 0xcd, 0x3e, 0x9c, 0xa7, 0xff, 0x4f, | ||||
|   0xa6, 0xc8, 0xdb, 0x2e, 0xc7, 0xf9, 0x09, 0xd4, 0x3b, 0xbf, 0x3f, 0x4c, 0x3d, 0x0b, 0xfa, 0x83, | ||||
|   0x9a, 0xd9, 0x5a, 0x34, 0x7a, 0xbe, 0x4a, 0xc4, 0xa5, 0xe9, 0xe1, 0xd2, 0x64, 0xb8, 0x14, 0x42, | ||||
|   0x67, 0xd2, 0x38, 0xe1, 0xdb, 0x7b, 0xc7, 0xd0, 0x80, 0xc7, 0x31, 0x63, 0xdb, 0x3f, 0xc7, 0xb7, | ||||
|   0x1a, 0xb1, 0x91, 0xdd, 0xdd, 0x20, 0xd8, 0x65, 0x55, 0xac, 0xee, 0x57, 0x0f, 0x52, 0x82, 0xde, | ||||
|   0x70, 0xcc, 0xbd, 0x8b, 0xea, 0x19, 0x1b, 0x32, 0xe2, 0x36, 0x8d, 0x7e, 0x2e, 0xe8, 0x35, 0x8e, | ||||
|   0xc3, 0x61, 0x29, 0xf1, 0x60, 0xdd, 0xa0, 0xeb, 0x7c, 0x1d, 0x77, 0x8e, 0x1c, 0xb6, 0x05, 0x89, | ||||
|   0xc8, 0xf1, 0xfa, 0xd5, 0x72, 0x1c, 0xa0, 0xbe, 0x68, 0x68, 0x4f, 0x38, 0x8f, 0x6d, 0x7f, 0x84, | ||||
|   0x4f, 0x85, 0x2c, 0xb6, 0xd1, 0x16, 0x69, 0x3f, 0x08, 0x95, 0x2f, 0x5f, 0x5c, 0x7f, 0x5b, 0xc4, | ||||
|   0xbf, 0x44, 0x21, 0xc1, 0x02, 0x89, 0xb3, 0x0d, 0x90, 0x44, 0x6c, 0x10, 0xe8, 0x02, 0x00, 0xa2, | ||||
|   0x68, 0xa0, 0x3b, 0x4a, 0x88, 0x86, 0x5a, 0x60, 0x3a, 0xef, 0xe5, 0x43, 0x6e, 0x03, 0x34, 0x1b, | ||||
|   0x9e, 0x8f, 0xfa, 0x86, 0x18, 0x0e, 0xc5, 0x3a, 0xf9, 0xee, 0xc3, 0xab, 0x13, 0x44, 0x0a, 0x35, | ||||
|   0x84, 0x41, 0x17, 0x77, 0xb1, 0x27, 0x74, 0xf5, 0x0a, 0xba, 0x20, 0x09, 0x76, 0xe3, 0x4b, 0x16, | ||||
|   0x3b, 0x16, 0x6d, 0xc7, 0xe1, 0x79, 0xbb, 0x81, 0x5e, 0xa2, 0x0c, 0xb4, 0xf0, 0x2f, 0xb0, 0x61, | ||||
|   0x04, 0xe6, 0x28, 0x12, 0x74, 0xf8, 0xca, 0xfd, 0x14, 0x24, 0xf8, 0xca, 0xff, 0xa4, 0xa1, 0x3e, | ||||
|   0x09, 0x8c, 0x45, 0xb2, 0x41, 0xde, 0x3b, 0xbc, 0x81, 0xfd, 0xf1, 0xcc, 0x73, 0x7a, 0xcf, 0x13, | ||||
|   0x7a, 0xa6, 0x57, 0xa4, 0x49, 0xcb, 0x69, 0x01, 0xa8, 0xe0, 0x9c, 0x8d, 0x4f, 0x0d, 0xd8, 0xec, | ||||
|   0x56, 0xb6, 0x0e, 0xed, 0xfb, 0x39, 0x30, 0x00, 0xc4, 0x8c, 0x1e, 0x4d, 0xc9, 0xd2, 0x5e, 0x85, | ||||
|   0x53, 0x72, 0x3f, 0xe7, 0x5f, 0x00, 0xad, 0x0d, 0x1b, 0x10, 0x66, 0x37, 0x48, 0xc6, 0xc7, 0x07, | ||||
|   0x8e, 0x27, 0xf0, 0x69, 0xfd, 0xc2, 0x70, 0x07, 0xd4, 0x9b, 0x04, 0xb4, 0xa5, 0x05, 0x34, 0xb3, | ||||
|   0x79, 0x10, 0x6d, 0xf6, 0xfc, 0x9f, 0xbf, 0x78, 0x4f, 0xd9, 0xf9, 0x15, 0xba, 0xa4, 0x2a, 0xb1, | ||||
|   0xf6, 0x96, 0x2a, 0x8c, 0x73, 0x7b, 0x36, 0x35, 0x1a, 0x6d, 0x50, 0xff, 0x15, 0xa5, 0x16, 0xba, | ||||
|   0xcc, 0x2e, 0xe8, 0x1b, 0x5d, 0x82, 0x85, 0x46, 0x95, 0x1e, 0x7f, 0xdb, 0x90, 0xbd, 0xed, 0x65, | ||||
|   0xa1, 0x8e, 0x92, 0x39, 0xdb, 0x1a, 0x04, 0xdd, 0x91, 0xe6, 0x84, 0x77, 0x05, 0x57, 0x2e, 0x5b, | ||||
|   0xba, 0x13, 0x29, 0x38, 0xe8, 0x68, 0xe1, 0x04, 0xf4, 0x81, 0x00, 0x32, 0xc2, 0xfb, 0x92, 0x71, | ||||
|   0x97, 0x1d, 0x0e, 0x36, 0x74, 0x3c, 0x15, 0xdb, 0xf2, 0x7e, 0x42, 0x83, 0x0d, 0xe6, 0x6d, 0x00, | ||||
|   0x8d, 0xa6, 0xc5, 0x34, 0x1a, 0x94, 0xf8, 0xbe, 0xfb, 0x2e, 0x66, 0x6d, 0x84, 0xee, 0x3b, 0xe7, | ||||
|   0x96, 0x8d, 0x97, 0x85, 0x73, 0x8e, 0xaa, 0xd5, 0xb8, 0xd3, 0xc9, 0x34, 0xe7, 0x85, 0x0d, 0xe3, | ||||
|   0xe9, 0xd0, 0x38, 0x05, 0x0b, 0xbd, 0x38, 0x18, 0x6c, 0x58, 0xcb, 0x65, 0x0b, 0x0d, 0xfd, 0xee, | ||||
|   0x5f, 0x1a, 0x81, 0x11, 0x4b, 0xd2, 0x7d, 0xc9, 0x69, 0xba, 0xae, 0xad, 0x81, 0x16, 0x45, 0x92, | ||||
|   0x1c, 0x28, 0xfc, 0x1c, 0x0f, 0x4a, 0xa7, 0xe4, 0x27, 0x51, 0x97, 0x17, 0xbb, 0x87, 0xa5, 0x06, | ||||
|   0x64, 0x27, 0x98, 0x0d, 0x66, 0x92, 0xd3, 0x94, 0x8c, 0x5b, 0x4f, 0x9a, 0x0b, 0x7b, 0x14, 0x96, | ||||
|   0xf9, 0xf7, 0xa2, 0xc8, 0xd4, 0xa3, 0x9c, 0xef, 0xc6, 0xfa, 0xb5, 0xfa, 0x75, 0x88, 0xa1, 0x97, | ||||
|   0x0e, 0xd0, 0x71, 0xfd, 0x53, 0x08, 0xdd, 0x39, 0xcd, 0x52, 0xf8, 0x5f, 0x75, 0x8c, 0x80, 0x43, | ||||
|   0xd5, 0x08, 0x75, 0x87, 0x75, 0x87, 0x46, 0x62, 0x16, 0x06, 0x86, 0x33, 0x2e, 0x45, 0x60, 0x34, | ||||
|   0x1c, 0xcf, 0x5d, 0x1b, 0x01, 0xb8, 0x0e, 0x76, 0x10, 0x1f, 0xc9, 0x2c, 0x0f, 0x0a, 0x12, 0x1d, | ||||
|   0xbc, 0x49, 0x23, 0xec, 0xf6, 0xf4, 0x2e, 0xa7, 0x09, 0x91, 0x6a, 0x38, 0x66, 0x84, 0x86, 0xcc, | ||||
|   0xa7, 0xd9, 0xe9, 0xc3, 0xbf, 0xda, 0x66, 0x28, 0x3a, 0x83, 0x81, 0x4e, 0x72, 0xf1, 0xb7, 0x25, | ||||
|   0x86, 0xf7, 0x3a, 0x17, 0x6e, 0x58, 0x7f, 0xc7, 0x95, 0x9e, 0xbb, 0xe1, 0xa8, 0x77, 0xf9, 0x43, | ||||
|   0xe9, 0xba, 0x2a, 0x14, 0xc4, 0x3b, 0x09, 0x87, 0x3b, 0xb6, 0x01, 0x30, 0xdc, 0x28, 0xf8, 0x9b, | ||||
|   0xc0, 0x80, 0x0c, 0x23, 0xe7, 0xe9, 0xb6, 0x45, 0x9f, 0x1c, 0xa9, 0x25, 0x66, 0xfd, 0x63, 0x16, | ||||
|   0xc9, 0x9e, 0x9b, 0xbf, 0xf8, 0x3a, 0x98, 0x6e, 0x6e, 0x08, 0xaa, 0xa4, 0xaa, 0x61, 0x90, 0x42, | ||||
|   0x72, 0x5d, 0xdd, 0x57, 0x5d, 0x06, 0x7b, 0xee, 0xdd, 0xca, 0xf3, 0x38, 0x0a, 0x71, 0xa3, 0x86, | ||||
|   0x85, 0x89, 0x84, 0xef, 0x08, 0x0e, 0x07, 0x8b, 0xe0, 0xd1, 0x43, 0x6a, 0xf4, 0x6b, 0x23, 0x42, | ||||
|   0xe3, 0x2c, 0x18, 0xc2, 0xa9, 0xd1, 0xa5, 0xb3, 0xad, 0x72, 0xfa, 0xe5, 0xe1, 0x85, 0x0f, 0x62, | ||||
|   0xed, 0x18, 0xbe, 0xc2, 0x79, 0x14, 0x67, 0x7e, 0x35, 0x44, 0x1d, 0x30, 0x94, 0x46, 0xe8, 0x0c, | ||||
|   0x22, 0x90, 0x11, 0x98, 0xb3, 0xb2, 0x4d, 0xa4, 0x97, 0xb9, 0xaf, 0x14, 0xe0, 0x5d, 0x12, 0x61, | ||||
|   0x9d, 0xe0, 0xdb, 0xda, 0x7b, 0x25, 0xe8, 0x01, 0xfc, 0x6f, 0x29, 0x3d, 0x08, 0x64, 0x40, 0x3b, | ||||
|   0x12, 0xb5, 0xcc, 0x86, 0xc8, 0x36, 0x00, 0x37, 0x37, 0xc9, 0x52, 0x47, 0xbd, 0x49, 0x5d, 0xd1, | ||||
|   0x49, 0xb2, 0xaa, 0x93, 0xed, 0x49, 0xb8, 0x8f, 0x9e, 0x8a, 0x1a, 0x6e, 0x30, 0xa2, 0xa6, 0x82, | ||||
|   0x26, 0xd5, 0xa0, 0x3c, 0xa2, 0x41, 0x77, 0xf8, 0x3d, 0xfd, 0xf1, 0x73, 0x23, 0x0a, 0xae, 0xe3, | ||||
|   0xf8, 0x96, 0x8a, 0x36, 0x10, 0x52, 0x53, 0xe7, 0x71, 0xcb, 0x3e, 0x74, 0xcd, 0x2d, 0xef, 0x6f, | ||||
|   0xc5, 0x2d, 0xe5, 0xb2, 0xcb, 0x66, 0xd6, 0xe7, 0x2f, 0xee, 0x4f, 0xe1, 0xbd, 0x3e, 0xb3, 0xdb, | ||||
|   0xc1, 0xe2, 0xe7, 0x94, 0xd8, 0x36, 0x43, 0xfc, 0xb0, 0x12, 0xab, 0x80, 0x57, 0x6a, 0xc5, 0xcb, | ||||
|   0x2b, 0x8a, 0xbb, 0xb2, 0xf0, 0xcb, 0x4a, 0xe8, 0xb4, 0x34, 0x2d, 0x55, 0xf3, 0x2a, 0x85, 0xf7, | ||||
|   0x5e, 0x62, 0xea, 0xa0, 0x9f, 0xd5, 0xa1, 0x03, 0x00, 0xad, 0xdb, 0x63, 0xc8, 0xf1, 0x63, 0x3f, | ||||
|   0xc6, 0xc7, 0xa7, 0xbb, 0x18, 0x41, 0x44, 0x88, 0x81, 0x52, 0x41, 0xb4, 0x77, 0x4e, 0x6c, 0x24, | ||||
|   0xa1, 0x40, 0x90, 0x81, 0x75, 0x19, 0x96, 0xd8, 0x09, 0x82, 0xbb, 0x66, 0xc6, 0x0e, 0x28, 0xec, | ||||
|   0xf8, 0xe0, 0x87, 0xc7, 0xec, 0x70, 0xff, 0x0d, 0x75, 0x13, 0x18, 0xd0, 0x4d, 0xf3, 0xf9, 0x98, | ||||
|   0x0a, 0x4f, 0xf5, 0xb6, 0x15, 0xa5, 0x69, 0xb2, 0xc1, 0x42, 0x2d, 0x44, 0x61, 0x66, 0x0c, 0x07, | ||||
|   0xc4, 0xd6, 0x94, 0xda, 0x17, 0x71, 0xce, 0xd7, 0x82, 0xad, 0xd0, 0x45, 0x6f, 0xfc, 0xf8, 0x61, | ||||
|   0x14, 0x87, 0x63, 0xc7, 0x53, 0x28, 0xeb, 0x4c, 0x5d, 0xc2, 0x28, 0xf3, 0xc0, 0x6a, 0x1e, 0x03, | ||||
|   0xa7, 0x5b, 0x04, 0x80, 0xa1, 0x1b, 0x02, 0xac, 0x9e, 0x31, 0x8d, 0x95, 0x1a, 0x63, 0x54, 0x31, | ||||
|   0x97, 0x5a, 0xba, 0xd7, 0xda, 0x0f, 0xac, 0xa6, 0x95, 0xeb, 0x49, 0x0c, 0x71, 0x23, 0xe3, 0x44, | ||||
|   0x10, 0x05, 0x87, 0xa1, 0xf9, 0x69, 0x74, 0x54, 0x3b, 0x0e, 0x46, 0xf8, 0xfb, 0xa7, 0x08, 0xdc, | ||||
|   0x70, 0xb8, 0x09, 0xa1, 0x5a, 0x37, 0xcf, 0xd4, 0x5d, 0xea, 0x69, 0xe7, 0x67, 0x91, 0x78, 0xbf, | ||||
|   0xd0, 0xe6, 0x31, 0x2f, 0x84, 0x7e, 0x2c, 0xa2, 0xe9, 0xbc, 0x83, 0xc9, 0x41, 0x58, 0xef, 0xb2, | ||||
|   0x51, 0xfe, 0x67, 0x11, 0x8b, 0x3a, 0xcf, 0x79, 0x5a, 0x32, 0x98, 0x02, 0x60, 0xbc, 0xd7, 0xcd, | ||||
|   0x9d, 0xc0, 0x90, 0x6f, 0x98, 0x42, 0x68, 0x43, 0xcf, 0x3b, 0x8c, 0xbd, 0xb9, 0x19, 0xd9, 0xfc, | ||||
|   0x02, 0xc5, 0x00, 0xcc, 0xcf, 0xc0, 0xf4, 0xc7, 0x08, 0x41, 0x1a, 0x20, 0x98, 0xc4, 0xa3, 0x0f, | ||||
|   0xf0, 0xbd, 0xe3, 0x7d, 0xd7, 0x5c, 0x60, 0xc6, 0xc2, 0x18, 0xdd, 0xd8, 0x34, 0x48, 0x90, 0x22, | ||||
|   0xe8, 0x8f, 0x83, 0x2b, 0xff, 0x30, 0xb0, 0xd0, 0x6b, 0xd0, 0xb4, 0x88, 0x41, 0xdb, 0x1b, 0xa3, | ||||
|   0x5f, 0x19, 0xa3, 0x8d, 0x66, 0xdf, 0x46, 0xdf, 0x6a, 0xae, 0x3d, 0x04, 0x6d, 0x12, 0x17, 0xd7, | ||||
|   0xab, 0x73, 0x4a, 0x7a, 0x92, 0x8e, 0x11, 0xf0, 0x4b, 0xf8, 0x9c, 0x87, 0x8d, 0x32, 0x7f, 0x70, | ||||
|   0x7e, 0x84, 0x28, 0x4e, 0x24, 0xf1, 0xc8, 0x0c, 0xad, 0x05, 0x3c, 0xb6, 0x4e, 0xd0, 0x53, 0x1f, | ||||
|   0xe7, 0x4e, 0x4c, 0xa3, 0x80, 0x3c, 0xd9, 0xd6, 0x04, 0x43, 0x6f, 0xa2, 0x0f, 0x50, 0xa7, 0x2e, | ||||
|   0x7d, 0x7d, 0x6f, 0x68, 0xb3, 0x5f, 0xea, 0xd0, 0x86, 0x9f, 0x37, 0x92, 0xf7, 0xd3, 0x65, 0x45, | ||||
|   0xdb, 0x92, 0x4a, 0x58, 0x02, 0xbe, 0x98, 0x9d, 0xee, 0x62, 0x76, 0x60, 0x0c, 0x90, 0x34, 0x54, | ||||
|   0x2d, 0x83, 0x8e, 0x27, 0x76, 0x84, 0x1d, 0x34, 0x11, 0xfd, 0xbb, 0xb8, 0x83, 0x5b, 0x45, 0x35, | ||||
|   0x7c, 0xc6, 0xe3, 0xe8, 0xa0, 0xaf, 0x04, 0xaf, 0x35, 0xca, 0x64, 0x45, 0x6f, 0xca, 0x45, 0x30, | ||||
|   0xfd, 0xc4, 0xfa, 0x8a, 0x7d, 0x90, 0x98, 0x12, 0xb0, 0xbc, 0x01, 0xc2, 0xcc, 0x49, 0xba, 0x9b, | ||||
|   0x88, 0x1b, 0x18, 0xc8, 0x30, 0x08, 0xc8, 0x33, 0x13, 0xb4, 0x31, 0x26, 0x2b, 0x9c, 0x54, 0x6a, | ||||
|   0xee, 0xeb, 0x65, 0xde, 0x16, 0x07, 0x22, 0xcb, 0xf0, 0x43, 0xb1, 0x42, 0xae, 0xa8, 0x73, 0x33, | ||||
|   0xe1, 0x37, 0xed, 0x79, 0x9f, 0xe8, 0x72, 0x5f, 0x08, 0xec, 0x7a, 0x60, 0xbc, 0x34, 0x0c, 0x3c, | ||||
|   0x5e, 0xeb, 0x6d, 0x67, 0xae, 0x88, 0xe8, 0x0e, 0xd9, 0x79, 0x7e, 0x9c, 0x3b, 0x58, 0x48, 0x64, | ||||
|   0x1b, 0xad, 0xbe, 0xad, 0x2d, 0xcf, 0xb1, 0x29, 0xd8, 0x82, 0x26, 0x28, 0x75, 0x89, 0x01, 0xf3, | ||||
|   0x6c, 0x26, 0x7b, 0xf1, 0x0b, 0xec, 0x25, 0x6d, 0xf1, 0x0b, 0x6c, 0x3a, 0xc6, 0xf9, 0xf1, 0x00, | ||||
|   0xc3, 0x22, 0x19, 0xc3, 0xd7, 0xf1, 0xe1, 0xbd, 0x58, 0x71, 0x2e, 0x25, 0xa5, 0x80, 0xad, 0xa4, | ||||
|   0x6c, 0xfa, 0xa9, 0xe1, 0x06, 0xd5, 0x02, 0x16, 0xbb, 0xb4, 0x00, 0x20, 0x2c, 0x94, 0x6c, 0x05, | ||||
|   0x23, 0x61, 0x17, 0x51, 0xe5, 0x78, 0x3f, 0x01, 0x8f, 0x12, 0x3d, 0x44, 0x4c, 0xf7, 0x01, 0x29, | ||||
|   0x79, 0xf5, 0xb1, 0xd0, 0x4f, 0xc1, 0xc0, 0xed, 0xe9, 0xcd, 0x4d, 0xfa, 0xb5, 0x4d, 0x65, 0x70, | ||||
|   0xa8, 0x4e, 0x33, 0xa8, 0x43, 0xf3, 0x79, 0x61, 0x59, 0x38, 0x06, 0xf9, 0xce, 0x44, 0x58, 0x2d, | ||||
|   0x1a, 0x83, 0x12, 0xda, 0x44, 0x20, 0x69, 0x1a, 0x31, 0xbb, 0xb9, 0x29, 0x82, 0xb9, 0xc1, 0x9e, | ||||
|   0x19, 0x6a, 0x55, 0x74, 0xad, 0xf8, 0xde, 0x74, 0x3f, 0x83, 0xb9, 0xcd, 0xc5, 0x1a, 0xbd, 0x28, | ||||
|   0xd8, 0x77, 0x3a, 0x0e, 0xd0, 0x65, 0x9f, 0xe8, 0x06, 0x7b, 0x86, 0x5f, 0x38, 0x46, 0x37, 0x9e, | ||||
|   0x93, 0x3d, 0x8b, 0xa5, 0x71, 0x5f, 0x9c, 0x18, 0xe6, 0xb0, 0xd7, 0x4f, 0xd0, 0x37, 0x3b, 0x61, | ||||
|   0x28, 0xa0, 0x23, 0x8d, 0x48, 0x82, 0x05, 0xd0, 0xc5, 0xaa, 0xe4, 0x6a, 0xc1, 0x0d, 0x83, 0xb4, | ||||
|   0x05, 0xcf, 0x61, 0x1b, 0x29, 0x93, 0xc7, 0x32, 0x67, 0x9a, 0xe3, 0xe0, 0x7b, 0x30, 0x8e, 0xae, | ||||
|   0xa9, 0x8f, 0x33, 0x56, 0xa4, 0x8a, 0x45, 0x9a, 0xa1, 0x9e, 0x25, 0xe8, 0x30, 0x12, 0x60, 0x4b, | ||||
|   0x25, 0x4c, 0x05, 0x16, 0x1a, 0xfa, 0x8a, 0xe7, 0x21, 0xea, 0xa5, 0xbc, 0x82, 0x6e, 0x48, 0xd2, | ||||
|   0x82, 0x29, 0xae, 0x06, 0x3f, 0x54, 0x1a, 0x32, 0x14, 0xbe, 0x6e, 0xc2, 0x00, 0x11, 0xa0, 0x87, | ||||
|   0x6f, 0xa3, 0x30, 0xd2, 0xdd, 0x49, 0x38, 0x7a, 0x08, 0xf1, 0x17, 0xe2, 0x44, 0xd9, 0x7a, 0x88, | ||||
|   0xed, 0x2c, 0x02, 0xf6, 0x43, 0x81, 0x8e, 0x7f, 0xce, 0x3c, 0xbf, 0x90, 0xdf, 0xbf, 0x83, 0x26, | ||||
|   0xf8, 0x59, 0x48, 0xbe, 0xfc, 0xfe, 0x1d, 0x16, 0x3d, 0xe1, 0x60, 0xf2, 0x68, 0x28, 0x96, 0x90, | ||||
|   0x27, 0x79, 0xde, 0x77, 0xa3, 0x51, 0x46, 0x6c, 0x36, 0x3e, 0x8e, 0x0d, 0x47, 0x07, 0xd3, 0x0e, | ||||
|   0x67, 0x81, 0x00, 0xe5, 0x98, 0x67, 0x1a, 0x4f, 0xd1, 0x27, 0x31, 0xf4, 0x18, 0x79, 0x14, 0xb4, | ||||
|   0x0d, 0x06, 0x57, 0x83, 0x79, 0x9d, 0x71, 0xa7, 0x3c, 0x1c, 0x21, 0x8d, 0x32, 0x2e, 0x6d, 0x98, | ||||
|   0xe3, 0x24, 0x8f, 0xd1, 0x14, 0xd4, 0x18, 0x88, 0x05, 0xb7, 0xa2, 0xd8, 0xf5, 0x42, 0xa7, 0xb2, | ||||
|   0x78, 0x1f, 0x42, 0x12, 0xaf, 0x0b, 0x81, 0x85, 0x64, 0xee, 0xf8, 0xdc, 0x1e, 0x46, 0xf7, 0x6d, | ||||
|   0xc6, 0x8d, 0x38, 0xc6, 0xf0, 0xbf, 0xf1, 0x35, 0x8c, 0x11, 0xc5, 0x96, 0x23, 0x62, 0x23, 0x84, | ||||
|   0x65, 0x21, 0x87, 0x6e, 0x90, 0x55, 0x7e, 0x76, 0x47, 0x0b, 0x39, 0xd9, 0x1d, 0x01, 0x0f, 0xd9, | ||||
|   0x11, 0xbc, 0x2f, 0x03, 0xa3, 0xd6, 0xd1, 0xd0, 0xdf, 0xc2, 0xcd, 0x09, 0x18, 0x24, 0x1e, 0x5f, | ||||
|   0xd2, 0x98, 0xe2, 0x40, 0x2b, 0xd6, 0xf1, 0x02, 0x59, 0x1b, 0x99, 0xf3, 0xed, 0x4d, 0x7b, 0xab, | ||||
|   0xc2, 0xcd, 0x05, 0x7c, 0x61, 0x4b, 0xcd, 0xfd, 0x8b, 0xa1, 0x6f, 0xc9, 0xff, 0x61, 0xa5, 0xa1, | ||||
|   0xc7, 0xe3, 0xc5, 0x07, 0x3b, 0xa8, 0x9c, 0x2b, 0x0a, 0x28, 0x3c, 0x74, 0x0a, 0x35, 0xaa, 0x1c, | ||||
|   0x2c, 0x94, 0x07, 0x96, 0xf2, 0xb1, 0x06, 0xe1, 0x57, 0xe0, 0xf9, 0x90, 0xf6, 0x40, 0x3c, 0xed, | ||||
|   0xc1, 0xfb, 0xae, 0x91, 0xa8, 0x98, 0xe6, 0x6b, 0xe1, 0x15, 0x88, 0x97, 0x49, 0xc0, 0x2a, 0x71, | ||||
|   0x2c, 0xb0, 0x26, 0x08, 0x3b, 0x24, 0xf0, 0xd7, 0xf6, 0x1f, 0x96, 0x2d, 0x7e, 0xef, 0x6d, 0x31, | ||||
|   0x91, 0x43, 0x33, 0x33, 0xd3, 0xa8, 0xb1, 0x0b, 0x6a, 0xf0, 0x33, 0x1c, 0x06, 0x19, 0xbe, 0xce, | ||||
|   0x69, 0xe6, 0xdd, 0x58, 0x03, 0xf6, 0x69, 0xf8, 0xc2, 0x1e, 0x21, 0xe9, 0xdf, 0x69, 0xc3, 0xbe, | ||||
|   0xf9, 0xd8, 0x0d, 0x1e, 0xde, 0xc9, 0x58, 0xbc, 0x07, 0xcc, 0x9f, 0x86, 0xe0, 0x0a, 0xf7, 0x06, | ||||
|   0xab, 0xb2, 0xc3, 0x85, 0xae, 0x72, 0xc7, 0x37, 0x21, 0x01, 0xc1, 0x85, 0x52, 0xf0, 0xb5, 0x63, | ||||
|   0xbc, 0x67, 0x6b, 0xf8, 0x6f, 0xa4, 0x89, 0x1a, 0xb8, 0x0c, 0xc8, 0xc2, 0xc4, 0x8d, 0x0f, 0xc0, | ||||
|   0xdf, 0x69, 0xf2, 0xa7, 0x2b, 0x3c, 0x2c, 0xec, 0xbf, 0x77, 0x13, 0x8f, 0xf7, 0xc0, 0xb3, 0x63, | ||||
|   0x5a, 0xfe, 0xf8, 0x58, 0x78, 0x17, 0xdb, 0x8f, 0x5a, 0x31, 0x00, 0x5a, 0xec, 0x8f, 0x47, 0x70, | ||||
|   0xee, 0xc1, 0x0b, 0x8f, 0xc2, 0x83, 0xb4, 0x72, 0x18, 0xec, 0x5d, 0x30, 0x7e, 0x88, 0xa5, 0x57, | ||||
|   0x04, 0xf8, 0x52, 0x08, 0x64, 0xeb, 0x32, 0x0c, 0xaf, 0xbe, 0x36, 0x07, 0x59, 0x17, 0xae, 0x68, | ||||
|   0x06, 0x83, 0x75, 0xca, 0xbb, 0x17, 0x3f, 0x6e, 0xc3, 0x91, 0xb8, 0x05, 0x47, 0x0b, 0x8f, 0x56, | ||||
|   0xda, 0x7b, 0xab, 0xcb, 0xfa, 0x17, 0xac, 0x7f, 0x54, 0xda, 0xdf, 0xc8, 0x60, 0xbf, 0xfc, 0x81, | ||||
|   0xb1, 0xcb, 0x8d, 0x63, 0x75, 0xeb, 0xeb, 0xb3, 0x1a, 0x71, 0x93, 0x33, 0x8a, 0xc1, 0x50, 0x40, | ||||
|   0x8c, 0xef, 0x80, 0x21, 0x73, 0xc5, 0x81, 0xac, 0x5f, 0x7c, 0xda, 0x0b, 0xcd, 0xa8, 0x2f, 0x72, | ||||
|   0xcc, 0xec, 0xaf, 0x15, 0xf0, 0x97, 0x0d, 0x60, 0xaf, 0x74, 0xee, 0xd7, 0xe7, 0x7b, 0xe3, 0x85, | ||||
|   0x87, 0x90, 0xd8, 0x3a, 0x04, 0xbd, 0xb2, 0x46, 0x37, 0x8e, 0x50, 0xae, 0xd6, 0x16, 0x5b, 0xfd, | ||||
|   0x04, 0x25, 0xef, 0xa2, 0x8f, 0xf3, 0x79, 0xf4, 0xda, 0x8c, 0xc8, 0x95, 0x9e, 0xe1, 0x13, 0x0c, | ||||
|   0xe1, 0xab, 0x1d, 0xbd, 0xce, 0xd5, 0x17, 0xdd, 0x5b, 0x20, 0x3b, 0x48, 0x5b, 0x39, 0x87, 0xa1, | ||||
|   0x3b, 0x3d, 0xe3, 0x23, 0xf4, 0xb0, 0xb0, 0x02, 0xd2, 0xe6, 0xe6, 0xaa, 0x1e, 0xd0, 0x97, 0xc9, | ||||
|   0x81, 0x12, 0x66, 0xde, 0x69, 0x64, 0x9c, 0x9c, 0xc9, 0xa4, 0x2f, 0x8d, 0x34, 0xd3, 0xae, 0x71, | ||||
|   0xce, 0xc0, 0x34, 0x31, 0x50, 0x8d, 0x02, 0xaa, 0xf9, 0x57, 0xfd, 0xc6, 0xc6, 0x19, 0xbe, 0x1e, | ||||
|   0x35, 0x3c, 0xcc, 0xe5, 0x0e, 0xfe, 0x85, 0x51, 0xae, 0xc0, 0xd5, 0xe7, 0x87, 0x19, 0xed, 0xc1, | ||||
|   0xdf, 0x18, 0xe5, 0x22, 0xf0, 0x66, 0x3d, 0x6d, 0x00, 0xb7, 0xfe, 0xe2, 0xc7, 0xf3, 0x90, 0x9f, | ||||
|   0xf3, 0xe5, 0xea, 0x18, 0x30, 0xb3, 0xbe, 0x3a, 0x58, 0x61, 0xb5, 0x40, 0x43, 0x0f, 0xd3, 0x18, | ||||
|   0x0d, 0x27, 0x09, 0x3c, 0xc5, 0x51, 0xa8, 0xde, 0xb5, 0xa2, 0xa4, 0x21, 0xf2, 0xb3, 0xd8, 0x4c, | ||||
|   0x08, 0xcb, 0xed, 0x74, 0x27, 0xb5, 0xf0, 0xb9, 0xb2, 0xee, 0x44, 0x25, 0x5d, 0x74, 0x71, 0xc4, | ||||
|   0x80, 0xfa, 0x97, 0x5e, 0xfa, 0x3a, 0x60, 0x9c, 0x94, 0x57, 0x40, 0x86, 0x59, 0xaa, 0x91, 0x38, | ||||
|   0x1c, 0xfa, 0x0e, 0xa8, 0xe8, 0x70, 0x97, 0x06, 0xb9, 0x6c, 0xbb, 0xf2, 0x71, 0xc4, 0xb1, 0xfb, | ||||
|   0x9a, 0x57, 0xa0, 0xcd, 0x99, 0xac, 0x84, 0x15, 0x31, 0x35, 0x96, 0x30, 0x16, 0xba, 0xad, 0x78, | ||||
|   0xd5, 0x4c, 0xac, 0x06, 0xb9, 0x64, 0x9f, 0x2c, 0x81, 0xc5, 0x9b, 0xec, 0xe2, 0x73, 0x8b, 0xf7, | ||||
|   0x9e, 0x91, 0x38, 0x6e, 0x59, 0x20, 0x76, 0xc0, 0xf0, 0x66, 0x68, 0x3b, 0xcf, 0xeb, 0x91, 0xe3, | ||||
|   0x60, 0xb8, 0xbb, 0x08, 0x26, 0x3b, 0xd5, 0x54, 0x43, 0xea, 0x87, 0xff, 0x5e, 0x3d, 0xcb, 0x3f, | ||||
|   0x83, 0xe6, 0x1f, 0x4e, 0xf3, 0x82, 0x13, 0x69, 0x5c, 0x62, 0x64, 0x6e, 0xdc, 0x48, 0xdb, 0x81, | ||||
|   0xbd, 0x87, 0xf1, 0x47, 0x78, 0x25, 0x1d, 0xa9, 0x2f, 0x98, 0xee, 0x7a, 0xfb, 0x76, 0x69, 0x1f, | ||||
|   0x13, 0xb7, 0x2f, 0x57, 0x38, 0xe7, 0xe9, 0x7b, 0xe2, 0x39, 0xbe, 0x1e, 0xcb, 0xa6, 0x8e, 0x72, | ||||
|   0x2f, 0x4f, 0x40, 0x04, 0x50, 0x91, 0x96, 0x74, 0xd7, 0x9a, 0xb4, 0x11, 0xb3, 0x71, 0xc9, 0x0c, | ||||
|   0x25, 0x3f, 0x3f, 0xf4, 0x51, 0x52, 0x0b, 0x07, 0x95, 0xbd, 0x3e, 0xf4, 0x7d, 0x11, 0x41, 0xd0, | ||||
|   0xf2, 0x76, 0xaf, 0xe8, 0xfb, 0x70, 0x1a, 0xb8, 0x7d, 0x05, 0x04, 0x3e, 0xeb, 0xd7, 0x44, 0xc1, | ||||
|   0x81, 0xbf, 0x11, 0xbe, 0x45, 0x15, 0xb4, 0xb9, 0xc8, 0xa9, 0xca, 0x20, 0xd2, 0xd9, 0xdb, 0x22, | ||||
|   0x4d, 0x15, 0x45, 0xbe, 0xae, 0x9a, 0x33, 0x92, 0xee, 0x87, 0x8b, 0xe5, 0x4b, 0xb1, 0x72, 0xfc, | ||||
|   0x1c, 0x7a, 0xab, 0x93, 0x24, 0x4d, 0x94, 0x64, 0x0c, 0x73, 0xee, 0xd3, 0xfb, 0xd4, 0xfa, 0xb8, | ||||
|   0xb9, 0xc5, 0xd7, 0x59, 0xe7, 0x20, 0x71, 0xbe, 0x40, 0x08, 0xa1, 0xd8, 0xf1, 0x5f, 0xd2, 0xb0, | ||||
|   0xb4, 0x23, 0x13, 0x8c, 0xce, 0x63, 0xb0, 0xec, 0x18, 0x38, 0xbb, 0x2d, 0x0c, 0x84, 0x79, 0x3d, | ||||
|   0x84, 0xb3, 0xeb, 0x90, 0x17, 0xc8, 0x0e, 0x23, 0xf3, 0x20, 0x94, 0xd1, 0x8b, 0x78, 0x8e, 0xc2, | ||||
|   0x7e, 0xa3, 0x7a, 0x18, 0x74, 0x9f, 0x4c, 0x3a, 0xd4, 0x02, 0xf2, 0xdc, 0xe3, 0xf0, 0xe4, 0x47, | ||||
|   0x97, 0xbb, 0x11, 0xcf, 0x40, 0xdd, 0xc5, 0x00, 0x71, 0xdc, 0x64, 0xea, 0x78, 0xa5, 0x4a, 0x91, | ||||
|   0x03, 0xca, 0xfe, 0x8b, 0x76, 0xf0, 0x88, 0x32, 0x6b, 0x2a, 0xdc, 0x0c, 0x4d, 0xf1, 0x7c, 0xcb, | ||||
|   0x30, 0x25, 0x91, 0x1e, 0x0c, 0x41, 0xea, 0x46, 0x52, 0x1c, 0xc9, 0x1d, 0xda, 0xd4, 0xe4, 0xf1, | ||||
|   0x66, 0x4d, 0x30, 0x1a, 0x9a, 0x6d, 0xa6, 0x5b, 0xac, 0xbc, 0x33, 0xba, 0x31, 0xf1, 0x75, 0x1f, | ||||
|   0x0e, 0xee, 0x7c, 0x7b, 0xee, 0x11, 0x23, 0xcd, 0x5c, 0x23, 0x46, 0xba, 0xe7, 0x7d, 0xcb, 0xb8, | ||||
|   0x5a, 0xa0, 0x2f, 0x06, 0x99, 0xf8, 0x3b, 0x68, 0x1d, 0x4d, 0xd6, 0xe9, 0x48, 0x57, 0xdf, 0xa4, | ||||
|   0xb2, 0x66, 0x0f, 0x12, 0x6f, 0x51, 0x4a, 0x88, 0xff, 0x14, 0xe8, 0x7e, 0x2e, 0xff, 0x2b, 0x8c, | ||||
|   0xd6, 0x93, 0x00, 0xad, 0xe1, 0xee, 0xbf, 0x10, 0x7d, 0xa4, 0x19, 0x51, 0xa6, 0xe0, 0x93, 0x80, | ||||
|   0xc7, 0x14, 0xd0, 0x7e, 0x0a, 0x46, 0x84, 0x5e, 0x32, 0x97, 0xc1, 0xd9, 0x16, 0x77, 0x22, 0x88, | ||||
|   0x20, 0x78, 0x6e, 0xa3, 0x16, 0x4b, 0x6a, 0xb1, 0x37, 0x88, 0x24, 0x39, 0xc0, 0x04, 0x8c, 0x15, | ||||
|   0xfe, 0xc2, 0xe4, 0xe4, 0xbd, 0xce, 0x68, 0xf6, 0x61, 0xa5, 0xa5, 0xdb, 0xf8, 0x16, 0x53, 0xe8, | ||||
|   0xb3, 0xc0, 0x08, 0xd0, 0x93, 0x65, 0xa0, 0xc9, 0x19, 0x1b, 0x6b, 0x6d, 0x1d, 0xac, 0x00, 0x41, | ||||
|   0xf3, 0x18, 0x30, 0xfa, 0xba, 0x96, 0xd9, 0x02, 0x33, 0x5e, 0x88, 0xc0, 0x2a, 0x22, 0xc7, 0x80, | ||||
|   0x81, 0x55, 0x34, 0x1e, 0x4b, 0xdf, 0x5d, 0x34, 0xf5, 0x6b, 0xcd, 0x4a, 0x0b, 0x12, 0x23, 0xda, | ||||
|   0x68, 0x9c, 0x31, 0x66, 0x81, 0x75, 0x6c, 0x6e, 0x46, 0xaf, 0x68, 0x68, 0x34, 0x5c, 0xb6, 0x0a, | ||||
|   0x56, 0x73, 0xb4, 0xcd, 0xcd, 0x0f, 0xb1, 0x4d, 0xe3, 0x21, 0xde, 0x05, 0x12, 0x5f, 0xf1, 0x6c, | ||||
|   0x99, 0x09, 0xb9, 0x2f, 0xd8, 0x9d, 0x64, 0x78, 0x29, 0x36, 0x56, 0x49, 0xb0, 0x80, 0x91, 0x06, | ||||
|   0xc1, 0x2a, 0x31, 0x78, 0x02, 0xac, 0x3c, 0x2a, 0x02, 0x21, 0xa5, 0xf6, 0xe3, 0x87, 0x09, 0xac, | ||||
|   0xc3, 0x04, 0x2e, 0x61, 0xa6, 0x65, 0x21, 0x0c, 0xfc, 0xa7, 0xf0, 0x03, 0xff, 0x07, 0xf5, 0xa6, | ||||
|   0x9e, 0xa5, 0x4d, 0xc7, 0x4c, 0x83, 0xd5, 0x16, 0x0b, 0xd8, 0xed, 0xe8, 0x23, 0xe9, 0xa5, 0xbb, | ||||
|   0x13, 0xd0, 0x54, 0x04, 0xc0, 0x21, 0x02, 0xdb, 0x89, 0x36, 0x09, 0x70, 0xdf, 0x6b, 0x15, 0x9a, | ||||
|   0xac, 0xe5, 0x58, 0x45, 0x7a, 0x11, 0x52, 0xac, 0xea, 0x7b, 0xb5, 0x51, 0x19, 0x8b, 0x08, 0x46, | ||||
|   0x27, 0xa6, 0xa8, 0x78, 0xef, 0x8b, 0x59, 0xa9, 0x9c, 0x29, 0x8a, 0x1b, 0xd6, 0x9a, 0xe6, 0xde, | ||||
|   0xf1, 0xbb, 0xbe, 0x12, 0x96, 0x2e, 0xe8, 0xf9, 0x3f, 0x38, 0xc4, 0x0b, 0x0c, 0xd8, 0x6e, 0x0e, | ||||
|   0xfe, 0x4e, 0x06, 0x57, 0xc7, 0x78, 0x17, 0x73, 0xe2, 0x25, 0xa2, 0x8b, 0x7b, 0x88, 0x33, 0x18, | ||||
|   0xa4, 0x9b, 0x19, 0x6b, 0x2f, 0xa0, 0xf9, 0xcc, 0x3d, 0xc5, 0xc4, 0x86, 0x29, 0x62, 0xa7, 0xfe, | ||||
|   0x7c, 0x93, 0x38, 0x99, 0xec, 0x2b, 0xa9, 0x46, 0xb6, 0xc2, 0x6f, 0xe7, 0xe9, 0xa1, 0x78, 0x6c, | ||||
|   0x96, 0x17, 0xfa, 0xca, 0x76, 0xce, 0xff, 0x99, 0x17, 0x4b, 0x80, 0xd1, 0x42, 0xa1, 0xd1, 0xe8, | ||||
|   0x2b, 0x34, 0x25, 0xd5, 0xc8, 0x63, 0x8a, 0x58, 0x09, 0xa5, 0x00, 0x00, 0xc6, 0x99, 0xd8, 0x4d, | ||||
|   0xc9, 0xfe, 0xf4, 0xd0, 0xd9, 0x6f, 0xfc, 0xea, 0x3b, 0x78, 0x49, 0x54, 0x5f, 0x99, 0xe3, 0x8d, | ||||
|   0x5b, 0xc8, 0xcb, 0x8a, 0x60, 0x17, 0xff, 0xe2, 0xe7, 0x42, 0x35, 0x2b, 0x32, 0x72, 0x51, 0x8c, | ||||
|   0xae, 0x1d, 0xf1, 0x15, 0x2e, 0xae, 0x6f, 0xa6, 0x7b, 0x13, 0x98, 0x1f, 0xd1, 0xfd, 0x83, 0x1b, | ||||
|   0x9f, 0x83, 0xa3, 0xe5, 0x24, 0xd2, 0x26, 0xf7, 0x15, 0x5f, 0x60, 0x27, 0x90, 0xd0, 0x7e, 0x2d, | ||||
|   0x47, 0x5f, 0xc6, 0x6a, 0x0f, 0x12, 0xec, 0x3a, 0x68, 0x8e, 0x7a, 0xe7, 0x93, 0xac, 0x65, 0x58, | ||||
|   0xa7, 0x6b, 0xde, 0xff, 0x4a, 0x1b, 0xe2, 0x56, 0x9f, 0x08, 0x8e, 0x9c, 0x13, 0x8d, 0x47, 0x88, | ||||
|   0x79, 0x7b, 0x76, 0x1f, 0x5d, 0x2d, 0x04, 0xb0, 0x26, 0xde, 0xcd, 0x42, 0xbc, 0x6b, 0x4f, 0x11, | ||||
|   0x4c, 0x32, 0xb2, 0xd7, 0xe6, 0xb2, 0xd0, 0x80, 0x11, 0x6e, 0x67, 0x07, 0xbb, 0x45, 0x78, 0xf6, | ||||
|   0xc7, 0x3f, 0x0b, 0x1e, 0x6a, 0xb4, 0x81, 0x07, 0xe8, 0xe9, 0xb0, 0xd8, 0xa9, 0x4e, 0x7e, 0xee, | ||||
|   0xdd, 0xd5, 0xc3, 0xcf, 0xe6, 0x91, 0x72, 0xb3, 0x39, 0x9e, 0xee, 0x89, 0x8c, 0x43, 0x14, 0xbc, | ||||
|   0x3b, 0x57, 0xd6, 0xdd, 0x11, 0x49, 0x7b, 0x1a, 0x3f, 0x92, 0x3f, 0xb3, 0x6a, 0x91, 0xdb, 0x92, | ||||
|   0xa1, 0x63, 0xb5, 0x70, 0x2f, 0xe7, 0x18, 0xcd, 0xb8, 0xea, 0x90, 0x75, 0xe4, 0x86, 0x8a, 0x28, | ||||
|   0x42, 0x71, 0x13, 0x76, 0xcd, 0x19, 0xeb, 0xc9, 0x8e, 0x85, 0xc2, 0x12, 0xb4, 0xd1, 0x58, 0x8c, | ||||
|   0xf0, 0xdf, 0x70, 0x61, 0xfe, 0x05, 0xdf, 0xa5, 0x09, 0x88, 0x8a, 0xe0, 0x73, 0xf9, 0xe6, 0x83, | ||||
|   0x30, 0x52, 0xcc, 0xb4, 0x05, 0x30, 0xbe, 0x9b, 0xe9, 0xc1, 0x4e, 0xfc, 0x7a, 0x93, 0xa5, 0xc1, | ||||
|   0xa7, 0xb2, 0x78, 0x85, 0xad, 0x00, 0x6a, 0x5c, 0xcd, 0x4d, 0x46, 0x6f, 0x5b, 0x5a, 0x3a, 0xc9, | ||||
|   0x1b, 0x66, 0x32, 0xf4, 0xcd, 0x09, 0xb8, 0x9d, 0xb7, 0xb8, 0x40, 0x60, 0xbd, 0xf2, 0x11, 0x18, | ||||
|   0xb8, 0x78, 0x64, 0xc6, 0x8b, 0x12, 0x8a, 0xbb, 0x38, 0x82, 0x80, 0x7d, 0x5c, 0x6f, 0x2e, 0xbf, | ||||
|   0x72, 0xff, 0x7d, 0x11, 0xa8, 0xa9, 0x61, 0x60, 0xc9, 0x77, 0xff, 0x52, 0xae, 0xba, 0xb6, 0x38, | ||||
|   0x19, 0x64, 0xfe, 0xd0, 0xf0, 0xc6, 0x25, 0x67, 0x65, 0x58, 0x26, 0x8d, 0x1c, 0xf3, 0x82, 0x2a, | ||||
|   0x6e, 0xa0, 0xb7, 0xa0, 0xdf, 0xdd, 0xe2, 0xdb, 0xb3, 0x5b, 0x12, 0x5e, 0xbf, 0x52, 0x77, 0x62, | ||||
|   0xfd, 0x35, 0x82, 0x30, 0x0d, 0xaf, 0xd3, 0xd1, 0xf2, 0xfc, 0xf6, 0x56, 0x96, 0x3a, 0xb9, 0xd8, | ||||
|   0xde, 0xfe, 0x3c, 0x7a, 0xc5, 0x8a, 0xc1, 0xe2, 0x9d, 0x56, 0x99, 0xf8, 0x75, 0x3f, 0xd2, 0x0c, | ||||
|   0xc3, 0x44, 0x35, 0x73, 0xe8, 0x44, 0xb1, 0xe6, 0xeb, 0x47, 0xf4, 0x44, 0x6f, 0x9a, 0xbe, 0xac, | ||||
|   0x22, 0x89, 0xb7, 0xe4, 0x21, 0x10, 0x9c, 0x1d, 0x7a, 0x43, 0x4f, 0x12, 0xb5, 0x2a, 0xf6, 0xc4, | ||||
|   0xae, 0x4e, 0xe2, 0xc2, 0x71, 0xe0, 0x43, 0xf6, 0x8e, 0x8b, 0x85, 0x9a, 0xbd, 0x64, 0x9c, 0xca, | ||||
|   0xfa, 0xd0, 0x4e, 0xae, 0xdc, 0xd3, 0x5a, 0xce, 0x09, 0xdb, 0x8b, 0x2c, 0x77, 0xce, 0x82, 0x3f, | ||||
|   0xff, 0xab, 0xb5, 0xe2, 0xb2, 0xda, 0xc5, 0x8b, 0x86, 0x79, 0xe1, 0xbc, 0x91, 0xa5, 0x61, 0x04, | ||||
|   0x63, 0x41, 0xa3, 0x7d, 0x69, 0x88, 0xc2, 0x44, 0x64, 0x0e, 0x76, 0xe6, 0xbf, 0xe8, 0xd0, 0x5b, | ||||
|   0xc1, 0xd1, 0xdd, 0x14, 0xe1, 0xc7, 0x43, 0x83, 0xed, 0x51, 0x04, 0xd1, 0x11, 0x69, 0x76, 0x58, | ||||
|   0x47, 0xbd, 0xa1, 0xd7, 0x11, 0x39, 0x3b, 0xf1, 0x84, 0x1f, 0xe2, 0xcf, 0x5a, 0xe8, 0x38, 0x48, | ||||
|   0x5f, 0x72, 0x8e, 0x6c, 0x93, 0x46, 0xc4, 0xd1, 0xe3, 0xe9, 0x91, 0x58, 0x23, 0xb2, 0xb4, 0x19, | ||||
|   0xcb, 0x22, 0x37, 0x16, 0x67, 0x2e, 0xa1, 0x2e, 0xa0, 0xd3, 0xdb, 0x9f, 0x16, 0xe7, 0xfe, 0x46, | ||||
|   0x75, 0x98, 0x2d, 0x2b, 0x2f, 0xc9, 0x50, 0xc8, 0xa0, 0x17, 0xd5, 0x16, 0xd8, 0x89, 0xf4, 0x40, | ||||
|   0x6b, 0x24, 0xd4, 0xcd, 0xbf, 0x44, 0x3a, 0x28, 0x02, 0xb3, 0xec, 0x61, 0xca, 0x49, 0x06, 0x2f, | ||||
|   0x7e, 0xe3, 0x7f, 0xff, 0x0e, 0x77, 0xdd, 0x8d, 0xfd, 0x36, 0xf1, 0x92, 0x3d, 0x40, 0xa0, 0x8f, | ||||
|   0x1e, 0x80, 0x86, 0xca, 0xfb, 0x43, 0x80, 0x4c, 0x2f, 0x24, 0x2d, 0xf4, 0x4e, 0x67, 0xfe, 0x07, | ||||
|   0xc3, 0xfc, 0x4f, 0xcf, 0x61, 0x74, 0x63, 0x5a, 0xc2, 0x7f, 0xb5, 0x56, 0xc5, 0xd1, 0x79, 0x5e, | ||||
|   0xa3, 0x2f, 0x49, 0x7f, 0x3e, 0x44, 0x3e, 0x4c, 0x52, 0xd4, 0x2c, 0x66, 0x36, 0x27, 0x2b, 0xe0, | ||||
|   0x8f, 0x7e, 0xa9, 0x33, 0x66, 0xc3, 0xdd, 0x9a, 0x88, 0xfe, 0x8d, 0x3e, 0x94, 0x45, 0x99, 0x78, | ||||
|   0x83, 0x4f, 0x2a, 0xe9, 0xfc, 0xcb, 0xcc, 0x8c, 0x17, 0xe7, 0x2f, 0x73, 0x7c, 0x5d, 0xfc, 0xd2, | ||||
|   0xc0, 0xeb, 0xa2, 0x58, 0x1f, 0xb7, 0x45, 0x60, 0x86, 0xdf, 0x45, 0x3e, 0x48, 0xf8, 0x8e, 0x09, | ||||
|   0xdb, 0x98, 0x60, 0x6c, 0xa7, 0xb3, 0xb9, 0xcd, 0xcd, 0x4f, 0x8d, 0xaf, 0xd1, 0xf0, 0xd0, 0x01, | ||||
|   0x70, 0x60, 0xa8, 0xcb, 0xd7, 0x76, 0x73, 0x5b, 0x5b, 0x1a, 0xe7, 0x51, 0xe4, 0x56, 0xc3, 0xc1, | ||||
|   0xbe, 0x65, 0xb7, 0x0c, 0x3f, 0xd0, 0x49, 0xc2, 0x45, 0xf8, 0xe2, 0x78, 0x5d, 0x00, 0x81, 0xb2, | ||||
|   0x0e, 0x46, 0x17, 0x0f, 0x85, 0x7e, 0x16, 0x99, 0xb8, 0xb7, 0xe6, 0x91, 0x7e, 0x88, 0x51, 0xb0, | ||||
|   0xfb, 0xbf, 0xc2, 0x9a, 0x86, 0x6b, 0x5a, 0x9c, 0x8f, 0xca, 0x43, 0x82, 0x81, 0xc0, 0xf5, 0xe0, | ||||
|   0xc2, 0x65, 0x3c, 0x62, 0x9b, 0xe2, 0xa2, 0x97, 0x30, 0x5b, 0x90, 0xb6, 0x95, 0x8c, 0xa9, 0xad, | ||||
|   0xfe, 0x3b, 0xd7, 0x63, 0x7a, 0xeb, 0x8e, 0x58, 0x8b, 0x65, 0xb3, 0x76, 0x00, 0x67, 0x7c, 0x0c, | ||||
|   0x2e, 0xbd, 0x8c, 0x14, 0x6f, 0x7d, 0x0e, 0x53, 0x40, 0x70, 0x07, 0x21, 0x11, 0xd2, 0xe9, 0xb4, | ||||
|   0xcb, 0x74, 0x25, 0xdf, 0x99, 0xe2, 0x2b, 0x08, 0xa4, 0xce, 0x78, 0x03, 0xbd, 0x9f, 0xd1, 0x3b, | ||||
|   0xc6, 0x00, 0xe5, 0xfc, 0x7b, 0xc8, 0x37, 0x37, 0xd9, 0x93, 0xc9, 0x2f, 0x4e, 0x53, 0x27, 0xf0, | ||||
|   0xa0, 0x4f, 0xc2, 0xe4, 0xbd, 0x1c, 0x58, 0x8d, 0xfc, 0x0e, 0x5d, 0x94, 0xbf, 0x7f, 0x47, 0x25, | ||||
|   0x1d, 0x11, 0x66, 0x90, 0x5a, 0x9b, 0xa1, 0x02, 0x1c, 0xea, 0x0d, 0xa4, 0x09, 0xb4, 0x16, 0x5f, | ||||
|   0x5b, 0x59, 0x1e, 0xf3, 0xe6, 0x81, 0xe6, 0xb6, 0x34, 0x8c, 0xb9, 0x77, 0x0b, 0x9b, 0xa7, 0x92, | ||||
|   0x2d, 0xdf, 0x81, 0x06, 0x4a, 0x19, 0x94, 0xe0, 0xe8, 0x6d, 0x6d, 0xf4, 0xda, 0x36, 0x98, 0xf3, | ||||
|   0xe5, 0x52, 0x03, 0x13, 0x4f, 0x93, 0xa2, 0x73, 0x96, 0x72, 0xb4, 0xf5, 0x05, 0xc3, 0x17, 0xb0, | ||||
|   0xbd, 0x5f, 0x92, 0x82, 0x04, 0xe1, 0xcd, 0x09, 0xb8, 0xfa, 0x3e, 0x28, 0x37, 0xb4, 0x3e, 0x2a, | ||||
|   0xb6, 0xb8, 0xcb, 0xcd, 0x2f, 0xb7, 0xf1, 0x3d, 0xe3, 0xbd, 0x99, 0x22, 0xf1, 0x3d, 0x83, 0x7b, | ||||
|   0xab, 0xf8, 0xdd, 0x77, 0x07, 0xfa, 0x76, 0xe2, 0xff, 0x02, 0x77, 0x7d, 0xe1, 0x05, 0xcc, 0xc4, | ||||
|   0x00, 0x00 | ||||
|   0x05, 0xa6, 0x01, 0x4d, 0xad, 0x7b, 0x7b, 0x29, 0x0e, 0x2a, 0x0e, 0x26, 0x4c, 0xf1, 0xe6, 0x26, | ||||
|   0x10, 0x52, 0x5f, 0xeb, 0xba, 0x4c, 0x57, 0x61, 0x76, 0xf5, 0x62, 0xf0, 0xac, 0x7d, 0x48, 0xe8, | ||||
|   0x9b, 0x8e, 0x8b, 0x4d, 0xa6, 0x92, 0x90, 0x69, 0xda, 0xee, 0x0e, 0x68, 0x18, 0x29, 0xf6, 0x88, | ||||
|   0xb8, 0x86, 0x19, 0x64, 0x3a, 0xde, 0xb6, 0x08, 0xba, 0x35, 0xf7, 0x85, 0x01, 0xdf, 0x49, 0x7a, | ||||
|   0xb8, 0xa3, 0x50, 0x52, 0x0d, 0xe8, 0x41, 0x0a, 0xd3, 0xf9, 0x9a, 0x67, 0xeb, 0x60, 0x2f, 0xfc, | ||||
|   0x56, 0x61, 0x29, 0xb0, 0xd2, 0xfc, 0x9c, 0x51, 0xe9, 0x6a, 0x4c, 0x2f, 0x54, 0x27, 0x1e, 0x27, | ||||
|   0xcc, 0xc5, 0xd7, 0xb7, 0x81, 0x1d, 0x3b, 0x20, 0x76, 0x8f, 0xec, 0x11, 0x62, 0xe1, 0x2f, 0xa6, | ||||
|   0x54, 0xd1, 0x25, 0x98, 0x74, 0x79, 0x9e, 0x07, 0x23, 0xfb, 0x85, 0xdc, 0x77, 0x60, 0x88, 0x0b, | ||||
|   0x65, 0x46, 0xe0, 0xb8, 0x88, 0xea, 0xd4, 0x4b, 0xc3, 0xba, 0xfa, 0xfd, 0x3b, 0x30, 0xc2, 0xc0, | ||||
|   0x8c, 0x75, 0x86, 0x83, 0xb4, 0xd5, 0x87, 0xae, 0x39, 0x99, 0x6c, 0x35, 0x27, 0x66, 0xb2, 0x62, | ||||
|   0x45, 0x8c, 0x29, 0x5c, 0xb4, 0x16, 0x5b, 0x56, 0xe6, 0x52, 0x7a, 0xbd, 0x4b, 0x5c, 0xa5, 0x9f, | ||||
|   0x0c, 0x08, 0xbe, 0x8f, 0xbb, 0x04, 0xd2, 0xd4, 0x49, 0x3f, 0x83, 0xc1, 0x05, 0x38, 0x9b, 0x0d, | ||||
|   0x88, 0xdb, 0x37, 0xd5, 0x1a, 0x07, 0x25, 0xb8, 0x39, 0x8f, 0x75, 0x8d, 0x24, 0xb0, 0x10, 0x42, | ||||
|   0x0b, 0x24, 0xf9, 0x45, 0xca, 0x2c, 0x6e, 0x99, 0xc0, 0xa8, 0xd1, 0x3c, 0x06, 0x13, 0x85, 0x4f, | ||||
|   0x03, 0xf5, 0x42, 0x2b, 0xf4, 0x05, 0x85, 0xa6, 0xe1, 0x98, 0xc0, 0x32, 0x74, 0xb3, 0x07, 0xab, | ||||
|   0x38, 0xdc, 0x5a, 0x42, 0x35, 0x89, 0x43, 0x0f, 0x0b, 0x79, 0x21, 0xd0, 0x09, 0x09, 0x21, 0x25, | ||||
|   0xc0, 0xf0, 0x09, 0xca, 0x25, 0x3c, 0x6f, 0xb8, 0x43, 0x19, 0x08, 0x51, 0xd3, 0x1c, 0x42, 0xef, | ||||
|   0x6a, 0x06, 0x2c, 0xca, 0x29, 0x7b, 0x97, 0x9e, 0x6f, 0x66, 0x90, 0x86, 0x6f, 0x53, 0x0a, 0x2e, | ||||
|   0xa8, 0xf8, 0xee, 0x77, 0x00, 0xe2, 0x2b, 0xf9, 0x2e, 0x28, 0xf9, 0x1e, 0x13, 0x04, 0xd3, 0x0c, | ||||
|   0x32, 0x7e, 0xb8, 0x3f, 0x91, 0x16, 0xe8, 0x1c, 0xb6, 0x81, 0x55, 0x3d, 0x12, 0x60, 0xe7, 0x7c, | ||||
|   0x2d, 0xc8, 0x01, 0xfb, 0xc3, 0x87, 0x96, 0x74, 0x04, 0x2f, 0x39, 0xfb, 0xd3, 0x7f, 0xca, 0xfd, | ||||
|   0x04, 0xca, 0x5c, 0x94, 0x30, 0xf0, 0xa5, 0x8e, 0xb0, 0x4a, 0xe8, 0x0f, 0x1d, 0x61, 0xd2, 0x27, | ||||
|   0x3e, 0xe5, 0x15, 0xcf, 0x43, 0x71, 0xb2, 0xdd, 0x00, 0xb3, 0x97, 0x7c, 0xd7, 0x01, 0x4d, 0xa6, | ||||
|   0xdf, 0x85, 0xc2, 0x4f, 0x7e, 0xce, 0x28, 0x73, 0x73, 0xd3, 0x93, 0x0b, 0xc0, 0x5a, 0xf8, 0x39, | ||||
|   0xae, 0x2c, 0x5f, 0x50, 0x2c, 0xcd, 0x6c, 0x3d, 0xcc, 0x4b, 0x39, 0xe4, 0x58, 0x2d, 0x64, 0x58, | ||||
|   0x81, 0xbd, 0xe5, 0x34, 0xa8, 0x34, 0xc2, 0xb0, 0x0e, 0x98, 0x08, 0xe4, 0x57, 0x36, 0x31, 0x3e, | ||||
|   0x30, 0xa8, 0x16, 0x0c, 0x9d, 0xfa, 0xbe, 0x68, 0x68, 0x5c, 0x12, 0xf4, 0x2b, 0xfc, 0x9f, 0x07, | ||||
|   0xb3, 0x2a, 0x1c, 0xd6, 0xf1, 0xe9, 0x37, 0x3b, 0x32, 0x4f, 0xcf, 0xfa, 0x25, 0x73, 0x09, 0x46, | ||||
|   0x0c, 0xae, 0x70, 0x49, 0xf5, 0xf6, 0x3f, 0x1c, 0x36, 0xa3, 0xe1, 0x14, 0xf4, 0xbd, 0x25, 0x6d, | ||||
|   0xa2, 0xda, 0xd2, 0x18, 0x92, 0x2e, 0x6d, 0x32, 0x62, 0x35, 0xda, 0x0f, 0x8b, 0xb2, 0xed, 0x07, | ||||
|   0x5a, 0xca, 0x03, 0xc5, 0xe2, 0x2c, 0x58, 0x6e, 0xd4, 0x99, 0x40, 0xff, 0x13, 0xd4, 0x15, 0x92, | ||||
|   0x72, 0x71, 0xe4, 0xcc, 0x7f, 0xfb, 0xe4, 0x6a, 0x1f, 0x86, 0xf0, 0x25, 0x1b, 0x58, 0x51, 0x0c, | ||||
|   0xc9, 0xa3, 0x40, 0xe0, 0xfb, 0x52, 0x52, 0xa4, 0x06, 0xb4, 0xbe, 0xca, 0x10, 0x5d, 0xf9, 0x9e, | ||||
|   0xc8, 0xc5, 0xc4, 0x49, 0x48, 0xfa, 0x3a, 0x2f, 0xad, 0xe8, 0x20, 0x7d, 0x77, 0x03, 0xfa, 0x3a, | ||||
|   0xf1, 0xcd, 0x95, 0xd4, 0x61, 0xba, 0x4b, 0x77, 0x9e, 0x81, 0x7b, 0xac, 0x2b, 0x4d, 0x67, 0x25, | ||||
|   0x52, 0x36, 0xe4, 0x4d, 0xe9, 0x9b, 0xe3, 0x1b, 0xdc, 0xe6, 0x41, 0x4f, 0x49, 0x03, 0x06, 0x35, | ||||
|   0x43, 0x9e, 0xc5, 0x46, 0xe4, 0xed, 0x0b, 0xf1, 0xeb, 0x28, 0xc3, 0x3f, 0xf1, 0x67, 0x83, 0xde, | ||||
|   0x53, 0x67, 0x4c, 0x86, 0x56, 0x64, 0xdb, 0x46, 0x54, 0xfc, 0xe2, 0x8d, 0x27, 0x87, 0x37, 0x67, | ||||
|   0xa7, 0x54, 0x0a, 0x2b, 0xbe, 0xcf, 0xa4, 0x01, 0x0c, 0x9a, 0xde, 0xbd, 0x0b, 0x6c, 0x1a, 0x3b, | ||||
|   0x00, 0x46, 0x2a, 0x6e, 0xe4, 0xf9, 0xaf, 0xa4, 0xf4, 0x1c, 0xaa, 0xc8, 0xb6, 0x59, 0xcb, 0xc1, | ||||
|   0x0d, 0xbc, 0x0d, 0xcf, 0x90, 0xf6, 0x4a, 0x34, 0xc2, 0xef, 0xb1, 0xc4, 0x59, 0xf6, 0xda, 0xc0, | ||||
|   0xf1, 0x83, 0xcc, 0x1f, 0x98, 0x23, 0xd0, 0x17, 0x68, 0x03, 0xfc, 0x5c, 0xc8, 0x55, 0x45, 0xa0, | ||||
|   0x58, 0x18, 0x5d, 0x98, 0x0f, 0xc5, 0x51, 0xb1, 0x8f, 0xbd, 0x62, 0xf8, 0xe0, 0x67, 0x63, 0x67, | ||||
|   0x73, 0x73, 0xec, 0x84, 0x5e, 0xc6, 0x09, 0xdc, 0xf5, 0x9e, 0xc8, 0x1d, 0xb0, 0xc3, 0x89, 0x9b, | ||||
|   0xbe, 0xb8, 0xdc, 0x3f, 0x07, 0x54, 0x41, 0x01, 0x05, 0x1d, 0xd5, 0x40, 0x07, 0x63, 0x87, 0x2a, | ||||
|   0x3b, 0x81, 0x17, 0x33, 0x3d, 0x76, 0xb6, 0xb7, 0xb2, 0x9b, 0x9b, 0xa1, 0x5e, 0x32, 0x56, 0x2f, | ||||
|   0x14, 0xa1, 0x2b, 0x40, 0x3e, 0x01, 0xee, 0xb9, 0x16, 0xe0, 0x9a, 0x78, 0xe6, 0xaf, 0x99, 0xa0, | ||||
|   0xc6, 0x71, 0xa2, 0x2b, 0x81, 0x74, 0x56, 0xbf, 0x70, 0x02, 0x0a, 0x9d, 0x85, 0x71, 0x8b, 0x98, | ||||
|   0x8a, 0x74, 0x33, 0x8c, 0xf3, 0x10, 0x8e, 0x57, 0x27, 0xc3, 0x68, 0xe8, 0x9e, 0x6c, 0xd2, 0x9b, | ||||
|   0x00, 0x10, 0x34, 0x7c, 0x44, 0x81, 0xb9, 0x1e, 0x1a, 0x88, 0xdd, 0x8e, 0x6b, 0xa3, 0x1e, 0xc3, | ||||
|   0x64, 0x1d, 0x95, 0x55, 0x47, 0xa0, 0x58, 0x11, 0x54, 0x43, 0xcf, 0x40, 0xbe, 0xa7, 0xbb, 0xba, | ||||
|   0x09, 0xb4, 0xea, 0x66, 0x2a, 0xa5, 0x02, 0xa2, 0xd5, 0x09, 0xa7, 0x26, 0xdd, 0x2d, 0x9a, 0xfc, | ||||
|   0x2f, 0x93, 0xcf, 0xe4, 0x4b, 0x98, 0x6d, 0xac, 0xce, 0xde, 0xc2, 0xdc, 0x7f, 0x39, 0x7c, 0xa6, | ||||
|   0x24, 0x22, 0x17, 0x35, 0x77, 0x40, 0x49, 0x4a, 0x70, 0xa9, 0x64, 0xb6, 0x81, 0xbe, 0x13, 0x60, | ||||
|   0xfb, 0x1c, 0x3a, 0x7d, 0xa7, 0xc0, 0xd2, 0x52, 0x9c, 0x90, 0xe0, 0xf0, 0xee, 0x0a, 0xcf, 0x47, | ||||
|   0xa6, 0xa7, 0x1a, 0xce, 0xef, 0xdf, 0xe6, 0x8e, 0x13, 0x54, 0x70, 0x76, 0x40, 0xa6, 0x0c, 0x91, | ||||
|   0xa2, 0xf0, 0x0b, 0xaa, 0x40, 0x69, 0xe1, 0x0b, 0x70, 0x53, 0x07, 0x45, 0x37, 0x48, 0x77, 0x00, | ||||
|   0x00, 0xd3, 0xbf, 0x5d, 0xac, 0x6e, 0x6e, 0x7e, 0x31, 0x59, 0x9a, 0x91, 0xa2, 0x81, 0x21, 0x98, | ||||
|   0xfe, 0x1d, 0xbb, 0xb2, 0xb9, 0xc9, 0xf2, 0x43, 0xe5, 0xbd, 0x74, 0x4c, 0x71, 0xb7, 0x4a, 0xe2, | ||||
|   0xbf, 0xb0, 0x8a, 0x43, 0xd0, 0x6a, 0xd2, 0x43, 0x1e, 0x3c, 0x98, 0x6c, 0xdb, 0x1c, 0xe3, 0x12, | ||||
|   0x02, 0xfc, 0x00, 0x46, 0x3d, 0xfd, 0xef, 0xd7, 0x77, 0xd7, 0xde, 0xfe, 0xee, 0xaa, 0xfe, 0xae, | ||||
|   0x04, 0x7d, 0xef, 0x00, 0xb7, 0xfd, 0x8f, 0x19, 0x99, 0x7f, 0xcf, 0xb8, 0x6a, 0x38, 0x8b, 0xbe, | ||||
|   0x3d, 0x00, 0xb3, 0xdc, 0x39, 0x68, 0xcf, 0x5e, 0x76, 0x06, 0xaa, 0xff, 0x5a, 0x34, 0x63, 0x79, | ||||
|   0xfe, 0x46, 0x6f, 0x56, 0xbc, 0xa8, 0x33, 0x18, 0x3f, 0xf1, 0xd1, 0x42, 0x9d, 0xf0, 0x9b, 0x9b, | ||||
|   0xf4, 0xeb, 0x07, 0xf9, 0xb9, 0x78, 0x4a, 0x43, 0x6a, 0x12, 0x26, 0x32, 0xf8, 0x09, 0x43, 0x0b, | ||||
|   0x7b, 0x20, 0x2f, 0x75, 0x69, 0x8a, 0x3b, 0x2d, 0x21, 0x37, 0x64, 0x50, 0xd6, 0xf2, 0xf2, 0x42, | ||||
|   0xd0, 0xfc, 0xa4, 0xb4, 0xe5, 0x84, 0xba, 0x27, 0x59, 0xda, 0x9d, 0xa4, 0xfb, 0x4a, 0x3d, 0x2d, | ||||
|   0xfc, 0xfb, 0xf7, 0x17, 0xbf, 0x12, 0xcf, 0xe0, 0xc2, 0x1c, 0xb2, 0xee, 0x7b, 0x5e, 0x51, 0x18, | ||||
|   0xbd, 0xd6, 0x33, 0x92, 0xb8, 0x4d, 0xe0, 0x17, 0xf4, 0x47, 0xe3, 0xa6, 0x41, 0x07, 0xde, 0xa1, | ||||
|   0x9f, 0xb5, 0xa4, 0x4a, 0xf0, 0x2d, 0xb9, 0x90, 0x66, 0x08, 0xc1, 0xa3, 0xb5, 0x78, 0x7c, 0xd5, | ||||
|   0xe3, 0xbe, 0x2a, 0x37, 0xec, 0xa9, 0x7a, 0xd5, 0x7d, 0xdc, 0x7d, 0x88, 0xa9, 0x57, 0x7d, 0x27, | ||||
|   0xf4, 0x8c, 0x7b, 0x08, 0x8b, 0xb5, 0x67, 0xed, 0xd2, 0x57, 0x41, 0x33, 0x25, 0x83, 0x2e, 0x30, | ||||
|   0x59, 0x41, 0x43, 0x83, 0x78, 0xb7, 0x48, 0x00, 0x13, 0xa0, 0x4a, 0x72, 0xc7, 0xbf, 0x6b, 0x8a, | ||||
|   0xbe, 0x20, 0x18, 0xc4, 0x67, 0x95, 0xfe, 0x43, 0x91, 0x43, 0x26, 0x44, 0x69, 0x99, 0x83, 0x01, | ||||
|   0x48, 0x15, 0x64, 0xb1, 0xd6, 0x94, 0x8b, 0x31, 0x02, 0x4b, 0x23, 0x2a, 0x32, 0x01, 0xbc, 0x34, | ||||
|   0x4e, 0x36, 0x25, 0x1b, 0x38, 0x40, 0xcc, 0x7a, 0xf2, 0x05, 0x1b, 0xa1, 0xec, 0x86, 0x62, 0x9b, | ||||
|   0xc0, 0x00, 0x06, 0x6e, 0xa3, 0x41, 0x05, 0x2d, 0x7d, 0xde, 0x16, 0xf9, 0xf0, 0x50, 0x1b, 0x21, | ||||
|   0xa5, 0xf3, 0x1d, 0x39, 0x0c, 0x46, 0x82, 0x60, 0x99, 0xf4, 0xad, 0x45, 0xc4, 0x6f, 0x86, 0x0f, | ||||
|   0x36, 0x68, 0xe0, 0x5b, 0xa0, 0x5a, 0x3b, 0x70, 0xbb, 0x7a, 0x92, 0xfc, 0xfe, 0x0d, 0x09, 0x5f, | ||||
|   0x1a, 0x5e, 0x2e, 0x6a, 0x7d, 0xe1, 0x82, 0x31, 0xf5, 0xd2, 0x62, 0xd0, 0x3e, 0xd2, 0x2e, 0x41, | ||||
|   0x81, 0x37, 0x5f, 0x7e, 0xff, 0x8e, 0xf3, 0x62, 0x21, 0xd0, 0x3a, 0x43, 0x6a, 0xe7, 0x12, 0x2b, | ||||
|   0xf4, 0x36, 0xa1, 0xc8, 0xf2, 0x10, 0x02, 0x45, 0x74, 0xf1, 0xba, 0x63, 0xa0, 0x85, 0xb0, 0xf0, | ||||
|   0xfb, 0x82, 0xea, 0x4c, 0x54, 0x32, 0xf0, 0x31, 0xfd, 0x92, 0x44, 0x58, 0x39, 0x81, 0x49, 0xc5, | ||||
|   0x32, 0xb1, 0xb9, 0xf1, 0xf5, 0x17, 0x7f, 0x72, 0x62, 0x68, 0xc0, 0x51, 0x64, 0xfc, 0xed, 0xc4, | ||||
|   0xff, 0x18, 0x1e, 0xd8, 0xd6, 0x9b, 0xb7, 0xc2, 0x40, 0x21, 0xb0, 0x35, 0xec, 0x51, 0x68, 0x6a, | ||||
|   0xfd, 0x5e, 0x7e, 0x0e, 0x31, 0xab, 0x30, 0x41, 0xa8, 0x1a, 0x15, 0x19, 0x3b, 0x68, 0x62, 0xef, | ||||
|   0x8d, 0x9a, 0x78, 0x61, 0x9c, 0xff, 0xa9, 0x41, 0x93, 0x0f, 0x06, 0xed, 0x85, 0x91, 0xfe, 0xbf, | ||||
|   0x1e, 0x33, 0xd5, 0x38, 0xdf, 0x1b, 0x37, 0xdb, 0x23, 0xfd, 0x8f, 0x0d, 0x3b, 0xe9, 0xed, 0xc1, | ||||
|   0xc2, 0x72, 0xfc, 0xf1, 0x93, 0x0f, 0xcc, 0x65, 0x96, 0x9a, 0x1e, 0x1a, 0x2c, 0x81, 0xfb, 0x77, | ||||
|   0xfd, 0x4b, 0x9d, 0x5b, 0x33, 0xf4, 0xc5, 0x2e, 0xee, 0xe7, 0x90, 0x20, 0xb0, 0x58, 0xcb, 0xdb, | ||||
|   0x23, 0x8a, 0x0f, 0xe4, 0x86, 0xd8, 0x51, 0x6f, 0x61, 0x08, 0xd6, 0xd5, 0x29, 0x80, 0x5a, 0x6c, | ||||
|   0x02, 0xfa, 0xf8, 0xbf, 0x3a, 0x0d, 0x58, 0x27, 0x08, 0x01, 0x60, 0x5a, 0x50, 0x30, 0xb0, 0xcb, | ||||
|   0x79, 0x5f, 0xf5, 0x75, 0x41, 0xf5, 0xa5, 0x39, 0x0e, 0x18, 0xef, 0x49, 0xba, 0x7f, 0x07, 0x36, | ||||
|   0x27, 0x18, 0x62, 0xdb, 0x2e, 0xda, 0xe6, 0x08, 0x9d, 0x0e, 0x94, 0x27, 0xa9, 0xc6, 0xaf, 0xe5, | ||||
|   0x70, 0x82, 0x04, 0xbb, 0x01, 0x33, 0x81, 0x17, 0xb1, 0x79, 0x61, 0x8c, 0x20, 0x53, 0xa1, 0xe6, | ||||
|   0xfc, 0x55, 0x97, 0x39, 0x3f, 0xb6, 0x15, 0x93, 0x72, 0x3f, 0x77, 0xf0, 0x03, 0x19, 0x7c, 0x2c, | ||||
|   0x50, 0x8b, 0x32, 0x8d, 0xa4, 0x57, 0x8d, 0xaf, 0x53, 0xa9, 0x0c, 0x26, 0xdf, 0x3c, 0x08, 0x43, | ||||
|   0xf8, 0xc5, 0xf6, 0xc0, 0xf0, 0xe8, 0x2c, 0x1f, 0xd6, 0x71, 0xe7, 0x4b, 0x63, 0x0e, 0x18, 0x10, | ||||
|   0x32, 0x69, 0xca, 0x9d, 0xf8, 0x99, 0x27, 0xb3, 0x98, 0x90, 0x11, 0x7f, 0xd6, 0x7d, 0x94, 0x08, | ||||
|   0x6e, 0x9c, 0x78, 0x59, 0x85, 0xba, 0xcb, 0x70, 0xa1, 0x0c, 0xac, 0x4b, 0xde, 0xc7, 0x2e, 0x53, | ||||
|   0xb7, 0x11, 0xcd, 0xbe, 0xad, 0x47, 0xf1, 0xc6, 0xb6, 0xd7, 0x5d, 0x86, 0x21, 0x2a, 0x86, 0xd9, | ||||
|   0xee, 0xa2, 0x03, 0xfd, 0xe7, 0x79, 0xb4, 0xae, 0x35, 0x63, 0x48, 0xbc, 0x97, 0xd1, 0x07, 0x6a, | ||||
|   0x9d, 0x83, 0x98, 0xa5, 0x20, 0x8d, 0x06, 0x96, 0x04, 0xb9, 0x57, 0x47, 0xe1, 0x08, 0xb3, 0x60, | ||||
|   0x0d, 0x9d, 0x7e, 0xf2, 0x87, 0x2b, 0x18, 0x02, 0xd3, 0x3e, 0x5c, 0xfe, 0x27, 0xea, 0xe5, 0x34, | ||||
|   0x19, 0x34, 0x74, 0x3a, 0x09, 0xb1, 0xd8, 0xb4, 0x84, 0x92, 0x40, 0x66, 0xbf, 0xc0, 0xfe, 0xdc, | ||||
|   0x5c, 0x87, 0xe0, 0x39, 0xcf, 0x6d, 0xff, 0xa2, 0x40, 0xfe, 0x31, 0x0b, 0x29, 0x21, 0x2e, 0xbf, | ||||
|   0xc3, 0x05, 0x51, 0xa7, 0xdf, 0x58, 0x2c, 0x87, 0x7f, 0x17, 0xe8, 0x37, 0x1a, 0xbb, 0x91, 0xcd, | ||||
|   0xb3, 0x88, 0x62, 0xd4, 0x09, 0xe7, 0x91, 0x88, 0x1d, 0xff, 0xe6, 0x24, 0x9c, 0x35, 0xbf, 0xcb, | ||||
|   0x73, 0x2f, 0x5c, 0x86, 0x45, 0x8d, 0xfc, 0xa2, 0x51, 0x08, 0xa9, 0xd4, 0x9c, 0x4d, 0x22, 0x0b, | ||||
|   0x92, 0x8f, 0x98, 0x2a, 0x8c, 0xbc, 0x2f, 0x9b, 0xc9, 0x05, 0xf3, 0x40, 0xe2, 0x65, 0xc6, 0xb8, | ||||
|   0x1f, 0xe8, 0x10, 0x56, 0x7c, 0x28, 0x1e, 0x31, 0xd4, 0xc9, 0xa3, 0x6f, 0xdf, 0x02, 0x10, 0xd0, | ||||
|   0x1f, 0x86, 0xbd, 0x61, 0x04, 0xb3, 0x08, 0x9c, 0x0b, 0xb7, 0xe7, 0xc2, 0x42, 0xd7, 0xb5, 0x11, | ||||
|   0xa1, 0x1a, 0x1a, 0x97, 0x3c, 0x85, 0x47, 0x1e, 0x94, 0x3a, 0x97, 0xba, 0xbc, 0xfc, 0x44, 0x2f, | ||||
|   0x45, 0x4d, 0x33, 0x0a, 0x76, 0xfd, 0x58, 0x11, 0xa8, 0x4a, 0x54, 0x27, 0x3d, 0x1e, 0x2d, 0x82, | ||||
|   0x38, 0xbc, 0x24, 0x05, 0x7f, 0x08, 0xe8, 0x62, 0xbc, 0xe9, 0xe9, 0xd7, 0x44, 0x19, 0x41, 0x06, | ||||
|   0x68, 0x47, 0x7e, 0x48, 0x87, 0x57, 0x0a, 0x7e, 0x39, 0xa4, 0x47, 0x03, 0x32, 0x48, 0xba, 0xeb, | ||||
|   0xa4, 0x51, 0x72, 0x63, 0xf0, 0x89, 0x0f, 0x44, 0x71, 0x97, 0x89, 0x9a, 0x0e, 0x75, 0xa1, 0x86, | ||||
|   0x72, 0x02, 0xfa, 0xe4, 0xba, 0x36, 0x21, 0x7d, 0x22, 0x59, 0x99, 0x2c, 0xc9, 0xd7, 0xcd, 0x86, | ||||
|   0x99, 0x76, 0xcd, 0x36, 0xbe, 0xe7, 0x22, 0x99, 0x65, 0x94, 0xe5, 0xf8, 0x20, 0xad, 0xb1, 0x0d, | ||||
|   0xf6, 0x00, 0x77, 0x8e, 0xde, 0x1e, 0x49, 0x57, 0x28, 0x44, 0x95, 0xab, 0x3b, 0xdb, 0x50, 0x71, | ||||
|   0xc7, 0x68, 0x24, 0x1d, 0xf8, 0x3f, 0xd3, 0x80, 0x1f, 0x7c, 0x00, 0x02, 0xf2, 0xc4, 0x1d, 0xb1, | ||||
|   0x96, 0xe5, 0xc1, 0x0e, 0x48, 0x34, 0xb9, 0x9a, 0x83, 0x7e, 0xbc, 0x24, 0x2d, 0x5b, 0x14, 0xff, | ||||
|   0x45, 0x4d, 0x0b, 0x6a, 0x97, 0x42, 0xc5, 0xa2, 0x48, 0x0b, 0x0d, 0x9a, 0x9e, 0x49, 0xaa, 0x7b, | ||||
|   0xbc, 0x86, 0xa4, 0x87, 0x94, 0xc5, 0x20, 0x2d, 0x81, 0xdd, 0x2d, 0x98, 0x3f, 0xc1, 0xc2, 0x8e, | ||||
|   0xcb, 0x0a, 0x28, 0xc3, 0x9b, 0x40, 0xff, 0x3b, 0xa0, 0xed, 0xfb, 0x3a, 0x3d, 0x14, 0xa5, 0xbe, | ||||
|   0x66, 0x5c, 0x40, 0xb5, 0x68, 0x3a, 0x6b, 0x41, 0x6a, 0x70, 0x27, 0xc3, 0x61, 0x5f, 0x7a, 0x19, | ||||
|   0x72, 0xa0, 0x07, 0x8e, 0x88, 0x9d, 0xa6, 0xd6, 0xb9, 0xe7, 0xeb, 0x14, 0xd3, 0xd9, 0x42, 0x9a, | ||||
|   0x43, 0xdd, 0x08, 0xca, 0x1d, 0x9a, 0xc0, 0x8c, 0x39, 0x64, 0xec, 0x58, 0x4c, 0x83, 0x25, 0x31, | ||||
|   0xc4, 0x58, 0x27, 0x6e, 0x4b, 0xd6, 0xfd, 0x22, 0x9d, 0xa1, 0xf5, 0x7f, 0xfe, 0x37, 0x80, 0xc2, | ||||
|   0x42, 0x8a, 0x41, 0xd3, 0xf0, 0x01, 0xd4, 0x75, 0x58, 0x24, 0x23, 0xb0, 0x1c, 0xb0, 0xea, 0x3c, | ||||
|   0x01, 0x1c, 0x4c, 0x9a, 0x73, 0x18, 0xb8, 0x44, 0xff, 0xe8, 0xcb, 0x3e, 0xb6, 0xff, 0x97, 0xf1, | ||||
|   0x8f, 0x99, 0x3e, 0xc7, 0x4f, 0xbf, 0x93, 0xdc, 0xee, 0x50, 0xd3, 0xd1, 0xf3, 0x9f, 0x1e, 0x69, | ||||
|   0x2a, 0x1f, 0xcd, 0xea, 0x80, 0xda, 0x2d, 0xe9, 0x09, 0x20, 0x09, 0xca, 0x82, 0xb1, 0xd0, 0x58, | ||||
|   0xeb, 0x6a, 0x69, 0x87, 0xa6, 0xa7, 0xb8, 0x7f, 0x26, 0x92, 0xe8, 0x43, 0xa5, 0x69, 0x36, 0x28, | ||||
|   0xe9, 0x02, 0x97, 0x50, 0x77, 0x07, 0x60, 0xea, 0x47, 0xc1, 0xdc, 0x5a, 0x68, 0x2e, 0x72, 0x42, | ||||
|   0xcc, 0x74, 0x4c, 0x0f, 0x69, 0x3a, 0x1f, 0x2b, 0xdd, 0x06, 0x2a, 0x49, 0x20, 0x99, 0x00, 0xd1, | ||||
|   0x00, 0xc0, 0x97, 0x5d, 0x0f, 0x1c, 0x01, 0x4b, 0xc2, 0x96, 0x06, 0x3b, 0xd1, 0x82, 0x97, 0x9d, | ||||
|   0xeb, 0xe6, 0x19, 0x27, 0x24, 0xbd, 0xdc, 0x4c, 0x56, 0xcc, 0x15, 0xf8, 0x10, 0x61, 0x79, 0x10, | ||||
|   0x90, 0x07, 0x44, 0x5a, 0xd9, 0x87, 0xd5, 0x37, 0x40, 0xb2, 0x4a, 0x78, 0x21, 0x50, 0x9c, 0x60, | ||||
|   0xc4, 0x3a, 0xd2, 0x04, 0x34, 0x82, 0xfa, 0x9b, 0x68, 0x5f, 0x76, 0x70, 0xe4, 0x94, 0x32, 0xbb, | ||||
|   0x96, 0x13, 0x2b, 0x75, 0xd6, 0x6c, 0x25, 0x24, 0x55, 0x05, 0x7e, 0xe5, 0x60, 0xa9, 0x81, 0xa4, | ||||
|   0xc4, 0xc7, 0x03, 0x26, 0xba, 0x33, 0x75, 0x40, 0x81, 0xc6, 0x7c, 0x58, 0x3f, 0xc3, 0x14, 0xba, | ||||
|   0x91, 0xe9, 0xa3, 0x9b, 0xc2, 0xee, 0x21, 0x16, 0x43, 0x14, 0x9a, 0x05, 0x83, 0x97, 0x15, 0xcc, | ||||
|   0xb0, 0x42, 0x40, 0xad, 0xff, 0x5c, 0x42, 0xea, 0xbe, 0x31, 0xd2, 0x6c, 0xd3, 0x18, 0xd0, 0xae, | ||||
|   0x93, 0x34, 0x06, 0x29, 0x53, 0x43, 0x17, 0xc3, 0x35, 0x6c, 0x02, 0x8f, 0x74, 0x6a, 0xf4, 0xb1, | ||||
|   0x66, 0xa5, 0x38, 0x56, 0x19, 0x6c, 0x45, 0x4a, 0x03, 0xbf, 0x98, 0x37, 0xea, 0x65, 0x14, 0x65, | ||||
|   0x31, 0xcb, 0x8b, 0xd8, 0x3f, 0xf6, 0x14, 0x5e, 0xc8, 0xb8, 0x50, 0x82, 0xb0, 0xb0, 0x24, 0x5a, | ||||
|   0x32, 0x3d, 0xa6, 0x54, 0x30, 0x29, 0x1d, 0x0f, 0x0e, 0xf3, 0x62, 0xc2, 0xfc, 0x1a, 0xdb, 0x59, | ||||
|   0x7e, 0x11, 0xe8, 0x21, 0xd6, 0xcd, 0xef, 0x7e, 0xc6, 0xe6, 0xa6, 0xf9, 0xbd, 0x50, 0x37, 0x17, | ||||
|   0x9e, 0x57, 0x0a, 0xf9, 0x87, 0xf9, 0x93, 0xca, 0x21, 0x23, 0x24, 0x87, 0xd2, 0x40, 0xa5, 0x75, | ||||
|   0x2f, 0xca, 0xed, 0x87, 0xf1, 0xb3, 0xe1, 0xa4, 0x4d, 0xf4, 0x57, 0x36, 0xc2, 0x0d, 0x53, 0x4f, | ||||
|   0x7c, 0xa8, 0x1f, 0x46, 0x0a, 0x08, 0xc1, 0xd8, 0xc6, 0xce, 0x60, 0x16, 0xf6, 0xc9, 0x5b, 0x2e, | ||||
|   0x11, 0xc1, 0xe4, 0x1f, 0x10, 0xfa, 0xc7, 0xcc, 0x41, 0x63, 0x98, 0xfa, 0x5a, 0xe1, 0x69, 0x07, | ||||
|   0xfe, 0x6a, 0xfe, 0x19, 0x30, 0xc0, 0x30, 0x9a, 0xde, 0x28, 0x24, 0x00, 0xa3, 0xec, 0x2b, 0xf1, | ||||
|   0x9d, 0x55, 0xf5, 0xcf, 0x47, 0xd0, 0x1b, 0x2c, 0xe9, 0x9d, 0xa9, 0x1c, 0xe6, 0x26, 0x36, 0x0d, | ||||
|   0xd9, 0xb1, 0xea, 0xf8, 0x14, 0x89, 0x85, 0xa7, 0xe5, 0x64, 0x73, 0xc2, 0xf9, 0xe7, 0xc7, 0xfe, | ||||
|   0x31, 0x33, 0xe6, 0x8e, 0x17, 0x32, 0x1d, 0x1c, 0x65, 0xc1, 0xde, 0x26, 0x31, 0x87, 0xe7, 0x12, | ||||
|   0xd8, 0x31, 0x48, 0xd9, 0xe1, 0xbc, 0xcb, 0x34, 0xa9, 0x68, 0xa3, 0x4d, 0x44, 0xe4, 0x5b, 0x70, | ||||
|   0x77, 0x26, 0xed, 0x04, 0xe7, 0x47, 0x82, 0x62, 0x47, 0x33, 0xb4, 0xa7, 0xf4, 0x31, 0x76, 0x3b, | ||||
|   0x0b, 0xeb, 0xde, 0xda, 0xc3, 0x3b, 0x09, 0xe0, 0xc9, 0xd0, 0xfe, 0x02, 0xf1, 0x3b, 0x9c, 0xa4, | ||||
|   0xb8, 0x1c, 0x53, 0x8d, 0x42, 0xfd, 0x87, 0x62, 0x51, 0x49, 0x0e, 0xdd, 0xbf, 0x1c, 0xdb, 0xfe, | ||||
|   0x08, 0x02, 0xe5, 0x0a, 0x70, 0x3a, 0x8f, 0xde, 0x3a, 0x44, 0x3b, 0x10, 0x9c, 0xa6, 0x63, 0x47, | ||||
|   0xa5, 0x18, 0x4c, 0x7a, 0x93, 0xcb, 0xea, 0x23, 0x41, 0x58, 0x29, 0x72, 0xc4, 0x8a, 0xd5, 0x90, | ||||
|   0x97, 0xee, 0x7e, 0x01, 0x50, 0x78, 0xfd, 0x8b, 0xd7, 0x8d, 0xbf, 0x7f, 0x03, 0x0c, 0x8e, 0x00, | ||||
|   0x5a, 0x81, 0xc1, 0x67, 0xbc, 0x4e, 0x7c, 0x74, 0x36, 0x88, 0x8e, 0x6f, 0xf1, 0xf4, 0xa9, 0x03, | ||||
|   0x42, 0x74, 0xca, 0x3c, 0x5a, 0x63, 0x8a, 0x09, 0xd3, 0x48, 0xfc, 0xc3, 0x86, 0x91, 0x05, 0x1c, | ||||
|   0xe8, 0x79, 0x9e, 0xf7, 0x3e, 0x58, 0x5a, 0x06, 0x2c, 0x2d, 0x74, 0xe1, 0x87, 0x07, 0x8b, 0x60, | ||||
|   0x7e, 0x2d, 0xb0, 0xf5, 0x2b, 0x6c, 0xa4, 0xca, 0x38, 0x60, 0x6a, 0xef, 0x8c, 0x35, 0xba, 0x33, | ||||
|   0xc3, 0xcf, 0x14, 0xdc, 0xf8, 0xcb, 0xd5, 0xe8, 0x57, 0x3e, 0x57, 0xf3, 0xfc, 0x34, 0xfb, 0x9d, | ||||
|   0xcb, 0x7c, 0x8e, 0xab, 0xd3, 0xd4, 0x2c, 0xcb, 0xac, 0x84, 0x33, 0x2b, 0xb9, 0x52, 0x89, 0x9b, | ||||
|   0x7b, 0xbf, 0x77, 0x42, 0x5e, 0x12, 0xd9, 0x88, 0xb8, 0x5a, 0x38, 0xdc, 0x4c, 0xa4, 0x7b, 0x96, | ||||
|   0x98, 0xbe, 0x43, 0xd2, 0x9a, 0x55, 0x63, 0xcf, 0xcb, 0x4c, 0x89, 0xc5, 0xfe, 0xd2, 0xe0, 0x3e, | ||||
|   0xc6, 0x46, 0x40, 0xb9, 0x70, 0xf0, 0x03, 0x47, 0x8d, 0xfb, 0x69, 0x69, 0x1a, 0xdf, 0xcc, 0xcf, | ||||
|   0xbc, 0x87, 0xa8, 0x91, 0x40, 0x81, 0xd2, 0x0d, 0x53, 0x9d, 0xb4, 0xcc, 0x01, 0xbe, 0x03, 0x05, | ||||
|   0x6b, 0x48, 0x28, 0x86, 0x02, 0xfc, 0xe9, 0x00, 0x49, 0xff, 0xee, 0xd7, 0xf7, 0xf6, 0x40, 0x74, | ||||
|   0x9f, 0x37, 0x49, 0x0d, 0x2f, 0xe7, 0x87, 0xfe, 0x13, 0x1b, 0x94, 0x58, 0x75, 0x67, 0x21, 0xf7, | ||||
|   0x57, 0xd9, 0x1c, 0xc0, 0x7a, 0x43, 0xd4, 0x2f, 0xc1, 0x08, 0xe7, 0x91, 0x90, 0x68, 0xef, 0x02, | ||||
|   0x29, 0xcf, 0xd5, 0xf5, 0x8d, 0xc6, 0x05, 0x67, 0x32, 0x5e, 0xc9, 0x6f, 0xcc, 0xc2, 0x60, 0x58, | ||||
|   0x93, 0xf8, 0x90, 0x95, 0x21, 0x80, 0x56, 0xcc, 0xa6, 0x4b, 0xa2, 0xdb, 0xd5, 0x90, 0x87, 0xc2, | ||||
|   0x5e, 0x83, 0xd2, 0x62, 0xa3, 0x21, 0xa1, 0x4c, 0xdf, 0xe1, 0xce, 0x33, 0xa0, 0x10, 0xd1, 0xe7, | ||||
|   0x39, 0x2e, 0xb4, 0x5f, 0xc0, 0x0b, 0x41, 0xb5, 0x9d, 0x03, 0x32, 0x54, 0xe5, 0xbb, 0xb8, 0x63, | ||||
|   0xa6, 0x1a, 0x5c, 0x24, 0x78, 0x3e, 0xa1, 0xe1, 0x8d, 0x74, 0x0e, 0x0a, 0x0b, 0x35, 0xcd, 0xd5, | ||||
|   0x00, 0x10, 0x6a, 0x19, 0x58, 0xec, 0xdc, 0x4c, 0x98, 0x60, 0x67, 0xda, 0x8b, 0xc8, 0xf0, 0x44, | ||||
|   0x17, 0x65, 0x56, 0x1a, 0x37, 0x50, 0x91, 0x9d, 0xb2, 0x57, 0x8a, 0xf9, 0x4c, 0x04, 0x5f, 0xb4, | ||||
|   0x4a, 0xd7, 0x28, 0xac, 0x96, 0x39, 0xfd, 0x0a, 0xc4, 0x57, 0x8b, 0x49, 0xdd, 0x00, 0x50, 0x0d, | ||||
|   0x85, 0x18, 0x45, 0xe4, 0x9c, 0x12, 0x7d, 0x54, 0x54, 0x19, 0x11, 0x4a, 0x37, 0xa3, 0xf6, 0xb5, | ||||
|   0x17, 0x0d, 0xbe, 0xd2, 0xb0, 0x66, 0xb1, 0xee, 0x9f, 0xb2, 0xab, 0x03, 0xef, 0xda, 0x50, 0x57, | ||||
|   0xe9, 0x46, 0x23, 0xc2, 0x4e, 0x20, 0x70, 0x1a, 0x60, 0xce, 0x9c, 0xec, 0x9f, 0x75, 0x32, 0x45, | ||||
|   0x88, 0x35, 0x50, 0xf5, 0xc9, 0x5f, 0x75, 0x32, 0x2d, 0x2f, 0x83, 0xc0, 0x53, 0xe1, 0x99, 0x13, | ||||
|   0xd4, 0xb3, 0x21, 0x50, 0x09, 0x4d, 0x7c, 0x03, 0x9f, 0x12, 0x34, 0xb3, 0xe3, 0x70, 0x8b, 0x93, | ||||
|   0x84, 0x37, 0x38, 0xc9, 0x0f, 0xf7, 0x67, 0x63, 0xa6, 0xa9, 0x35, 0xe2, 0xef, 0x61, 0x02, 0xee, | ||||
|   0xd9, 0x0f, 0x30, 0x63, 0x11, 0xc6, 0x67, 0x97, 0x0d, 0xa0, 0xc4, 0xf7, 0x20, 0x20, 0x3c, 0x91, | ||||
|   0x41, 0xe2, 0xe8, 0x89, 0x32, 0xf4, 0x28, 0x88, 0x80, 0xef, 0xa0, 0x27, 0x8c, 0x35, 0x91, 0xf0, | ||||
|   0xc6, 0x22, 0x6a, 0xde, 0xb8, 0xb7, 0x48, 0x9b, 0xa0, 0xf7, 0x8c, 0x5e, 0x74, 0x93, 0xdc, 0x75, | ||||
|   0xe7, 0x6e, 0x8f, 0xe3, 0xbf, 0x8b, 0xfe, 0x2a, 0x5f, 0x51, 0xe4, 0xdf, 0xe8, 0x16, 0xc5, 0x01, | ||||
|   0x9b, 0xdb, 0xe2, 0x8e, 0x13, 0x2a, 0xe1, 0x0c, 0x65, 0x50, 0x59, 0x93, 0x26, 0x5f, 0x33, 0x1b, | ||||
|   0xd5, 0x6a, 0x15, 0x05, 0x7d, 0x0f, 0xf7, 0xba, 0x00, 0x6d, 0x48, 0xde, 0xe8, 0xcb, 0x3c, 0x74, | ||||
|   0x07, 0x7a, 0x92, 0xeb, 0x4e, 0x80, 0xea, 0xb0, 0x9a, 0xa6, 0x0a, 0x4b, 0xd5, 0x45, 0xd0, 0xde, | ||||
|   0x85, 0xc5, 0x31, 0x39, 0xdc, 0x06, 0xc1, 0xff, 0x41, 0xff, 0xa3, 0x34, 0xe9, 0x9f, 0x1f, 0x7c, | ||||
|   0x5f, 0x85, 0x5a, 0x78, 0xd1, 0x7c, 0xb3, 0x0f, 0xe7, 0xe9, 0xff, 0x93, 0x29, 0xf2, 0xb6, 0xcb, | ||||
|   0x71, 0x7e, 0x02, 0xf5, 0xce, 0xef, 0x0f, 0x53, 0xcf, 0x82, 0xfe, 0xa0, 0x66, 0xb6, 0x16, 0x8d, | ||||
|   0x9e, 0xaf, 0x12, 0x71, 0x69, 0x7a, 0xb8, 0x34, 0x19, 0x2e, 0x85, 0xd0, 0x79, 0x35, 0x4e, 0xf8, | ||||
|   0xf6, 0xde, 0x11, 0x35, 0xe0, 0x71, 0xcc, 0xd8, 0xf6, 0xcf, 0xf8, 0xad, 0x46, 0x6c, 0x64, 0x77, | ||||
|   0x37, 0x08, 0x84, 0x59, 0x15, 0xc7, 0xfb, 0xd5, 0x83, 0x94, 0xa0, 0xb7, 0x1f, 0x73, 0xef, 0xa2, | ||||
|   0x7a, 0xc6, 0x86, 0x8c, 0xb8, 0x4d, 0xa3, 0x9f, 0x0b, 0x7a, 0x8d, 0xe3, 0x70, 0x58, 0x4a, 0x3c, | ||||
|   0x90, 0x37, 0xe8, 0x3a, 0x5f, 0xc7, 0x9d, 0x23, 0x87, 0x6d, 0x41, 0x22, 0x72, 0xbc, 0x7e, 0xb5, | ||||
|   0x1c, 0x07, 0xa8, 0x2f, 0x1a, 0xf6, 0x13, 0xce, 0x63, 0xdb, 0x1f, 0xe1, 0x13, 0x23, 0x8b, 0x6d, | ||||
|   0xb4, 0x45, 0xda, 0x0f, 0x42, 0xe5, 0xcb, 0x17, 0xd7, 0xdf, 0x16, 0xf1, 0x2f, 0x58, 0x48, 0xb0, | ||||
|   0x20, 0xe3, 0x6c, 0x03, 0x24, 0x11, 0x1b, 0x04, 0xba, 0x00, 0x80, 0x28, 0x1a, 0xe8, 0x8e, 0x12, | ||||
|   0xa2, 0xa1, 0x16, 0x98, 0xce, 0x7b, 0xf9, 0x90, 0xdb, 0x00, 0xcd, 0x86, 0xe7, 0xa3, 0xbe, 0x21, | ||||
|   0x86, 0x43, 0xb1, 0x4e, 0xbe, 0xfb, 0xf0, 0xea, 0x04, 0x91, 0x42, 0x0d, 0x61, 0xd0, 0xc5, 0x5d, | ||||
|   0xec, 0x09, 0x5d, 0xbd, 0x82, 0x2e, 0x48, 0x82, 0xdd, 0xf8, 0x92, 0xc5, 0x8e, 0x45, 0xdb, 0x71, | ||||
|   0x78, 0xde, 0x6e, 0xa0, 0x97, 0x28, 0x03, 0x2d, 0xfc, 0x0b, 0x6c, 0x18, 0x81, 0x39, 0x8a, 0x04, | ||||
|   0x1d, 0xbe, 0x72, 0x3f, 0x05, 0x09, 0xbe, 0xf2, 0x3f, 0x69, 0x18, 0x50, 0x02, 0xe3, 0x94, 0x6c, | ||||
|   0x90, 0xf7, 0x0e, 0x6f, 0x60, 0x7f, 0x3c, 0xf3, 0x9c, 0xde, 0x01, 0x85, 0x9e, 0xe9, 0x15, 0x69, | ||||
|   0xd2, 0x72, 0x5a, 0x00, 0x2a, 0x38, 0x83, 0xe3, 0x53, 0x03, 0x36, 0xbb, 0x95, 0xad, 0x43, 0xfb, | ||||
|   0x7e, 0x0e, 0x0c, 0x00, 0x31, 0xa3, 0x47, 0x53, 0xb2, 0xb4, 0x57, 0xe1, 0x94, 0xdc, 0xcf, 0xf9, | ||||
|   0x17, 0x40, 0x6b, 0xc3, 0x06, 0x84, 0xd9, 0x0d, 0x92, 0xf1, 0xf1, 0x81, 0xe3, 0x09, 0x7c, 0x5a, | ||||
|   0xbf, 0x30, 0xdc, 0x01, 0xf5, 0x26, 0x01, 0x6d, 0x69, 0x01, 0xcd, 0x6c, 0x1e, 0x44, 0x9b, 0x3d, | ||||
|   0xff, 0xe7, 0x2f, 0xde, 0x53, 0x76, 0x7e, 0x85, 0x2e, 0xb0, 0x4a, 0xac, 0xbd, 0xc1, 0x0a, 0x63, | ||||
|   0xe0, 0x9e, 0x4d, 0x8d, 0x46, 0x1b, 0xd4, 0x7f, 0x45, 0xa9, 0x85, 0x2e, 0xb3, 0x0b, 0xfa, 0xb6, | ||||
|   0x97, 0x60, 0xa1, 0x51, 0xa5, 0xc7, 0xdf, 0x36, 0x64, 0x6f, 0x82, 0x59, 0xa8, 0xa3, 0x64, 0xce, | ||||
|   0xb6, 0x06, 0x41, 0x77, 0xa4, 0x39, 0xe1, 0x5d, 0xc1, 0x95, 0xcb, 0x96, 0xee, 0x44, 0x0a, 0x0e, | ||||
|   0x3a, 0x5a, 0x38, 0x01, 0x7d, 0x20, 0x80, 0x8c, 0xf0, 0xbe, 0x64, 0xdc, 0x65, 0x87, 0x83, 0x0d, | ||||
|   0x1d, 0x5d, 0xc5, 0xb6, 0xbc, 0x9f, 0xd0, 0x60, 0x83, 0x79, 0x1b, 0x40, 0xa3, 0x69, 0x31, 0x8d, | ||||
|   0x06, 0x25, 0xbe, 0xef, 0xbe, 0x8b, 0x59, 0x1b, 0xa1, 0xbb, 0xd0, 0xb9, 0x65, 0xe3, 0x65, 0xe1, | ||||
|   0x9c, 0xa3, 0x6a, 0x35, 0xee, 0x74, 0x32, 0xcd, 0x79, 0x61, 0xc3, 0x78, 0x3a, 0x34, 0x4e, 0xc1, | ||||
|   0x42, 0x2f, 0x0e, 0x06, 0x1b, 0xd6, 0x72, 0xd9, 0x42, 0x43, 0xbf, 0xfb, 0x97, 0x46, 0x60, 0xc4, | ||||
|   0x92, 0x74, 0x5f, 0x72, 0x9a, 0xae, 0x6b, 0x6b, 0xa0, 0x45, 0x91, 0x24, 0x07, 0x0a, 0x3f, 0xc7, | ||||
|   0x83, 0xd2, 0x29, 0xf9, 0x49, 0xd4, 0xe5, 0xc5, 0xee, 0x68, 0xa9, 0x01, 0xd9, 0x09, 0x66, 0x83, | ||||
|   0x99, 0xe4, 0x34, 0x25, 0xe3, 0xd6, 0x93, 0xe6, 0xc2, 0x1e, 0x85, 0x65, 0xfe, 0xbd, 0x28, 0x32, | ||||
|   0xf5, 0x28, 0xe7, 0xbb, 0xb1, 0x7e, 0xad, 0x7e, 0x55, 0x62, 0xe8, 0x85, 0x04, 0x74, 0x5c, 0xff, | ||||
|   0x14, 0x42, 0xf7, 0x51, 0xb3, 0x14, 0xfe, 0x57, 0x1d, 0xa3, 0xe3, 0x50, 0x35, 0x42, 0xdd, 0x61, | ||||
|   0xdd, 0x81, 0x92, 0x98, 0x85, 0x81, 0xa1, 0x8e, 0x4b, 0x11, 0x18, 0x0d, 0xc7, 0x73, 0xd7, 0x46, | ||||
|   0x00, 0xae, 0x83, 0x1d, 0xc4, 0x4e, 0x32, 0xcb, 0x83, 0x82, 0x44, 0x07, 0x6f, 0xd2, 0x08, 0xbb, | ||||
|   0x3d, 0xbd, 0x8b, 0x6b, 0x42, 0xa4, 0x1a, 0x8e, 0x19, 0xa1, 0xe1, 0xf4, 0x69, 0x76, 0x32, 0xf1, | ||||
|   0xaf, 0xb6, 0x19, 0x8a, 0xce, 0x60, 0xa0, 0x93, 0x5c, 0xfc, 0x4d, 0x8a, 0xe1, 0xbd, 0xce, 0x85, | ||||
|   0x1b, 0xd6, 0xdf, 0x71, 0xa5, 0x67, 0x72, 0x38, 0xea, 0x5d, 0xfe, 0x50, 0xba, 0xae, 0x0a, 0x05, | ||||
|   0xf1, 0x4e, 0xc9, 0xe1, 0x8e, 0x6d, 0x00, 0x0c, 0x37, 0x0a, 0xfe, 0x26, 0x30, 0x20, 0xc3, 0xc8, | ||||
|   0x59, 0xbb, 0x6d, 0xd1, 0x27, 0x47, 0x6a, 0x89, 0x59, 0xff, 0x98, 0x45, 0xb2, 0xe7, 0xe6, 0x2f, | ||||
|   0xbe, 0x0e, 0xa6, 0x9b, 0x1b, 0x82, 0x2a, 0xa9, 0x6a, 0x18, 0xa4, 0x90, 0x5c, 0x57, 0xf7, 0x55, | ||||
|   0x97, 0xc1, 0x9e, 0x7b, 0xb7, 0xf2, 0x3c, 0x8e, 0x42, 0xdc, 0xa8, 0x61, 0x61, 0x22, 0xe1, 0xfb, | ||||
|   0x83, 0xc3, 0xc1, 0x22, 0x78, 0x2c, 0x91, 0x1a, 0xfd, 0xda, 0x88, 0xd0, 0x38, 0x0b, 0x86, 0x70, | ||||
|   0x6a, 0x74, 0xe9, 0x6c, 0xab, 0x9c, 0x7e, 0x79, 0x78, 0xe1, 0x83, 0x58, 0x3b, 0x86, 0xaf, 0x70, | ||||
|   0x1e, 0xc5, 0x99, 0x5f, 0x0d, 0x51, 0x07, 0x0c, 0xa5, 0x11, 0x3a, 0x9f, 0x08, 0x64, 0x04, 0xe6, | ||||
|   0xac, 0x6c, 0x13, 0xe9, 0x65, 0xee, 0x2b, 0x05, 0x78, 0xcf, 0x44, 0x58, 0x27, 0xf8, 0xb6, 0xf6, | ||||
|   0xce, 0x09, 0x7a, 0x38, 0xff, 0x5b, 0x4a, 0x0f, 0x02, 0x19, 0xd0, 0x8e, 0x44, 0x2d, 0xb3, 0x21, | ||||
|   0xb2, 0x0d, 0xc0, 0xcd, 0x4d, 0xb2, 0xd4, 0x51, 0x6f, 0x52, 0x57, 0x74, 0x92, 0xac, 0xea, 0x64, | ||||
|   0x7b, 0x12, 0xee, 0xa3, 0xa7, 0xa2, 0x86, 0x1b, 0x8c, 0xa8, 0xa9, 0xa0, 0x49, 0x35, 0x28, 0x8f, | ||||
|   0x68, 0xd0, 0x1d, 0x7e, 0x4f, 0x7f, 0xfc, 0xdc, 0x88, 0x82, 0xab, 0x3a, 0xbe, 0xa5, 0xa2, 0x0d, | ||||
|   0x84, 0xd4, 0xd4, 0x79, 0xdc, 0xb2, 0x0f, 0x5d, 0x81, 0xcb, 0xfb, 0x5b, 0x71, 0x4b, 0xb9, 0xec, | ||||
|   0x22, 0x9a, 0xf5, 0xf9, 0x8b, 0xbb, 0x55, 0x78, 0xaf, 0xcf, 0xec, 0xe6, 0xb0, 0xf8, 0x19, 0x26, | ||||
|   0xb6, 0xcd, 0x10, 0x3f, 0xc8, 0xc4, 0x2a, 0xe0, 0x75, 0x5b, 0xf1, 0xf2, 0x8a, 0xe2, 0xae, 0x2c, | ||||
|   0xfc, 0xb2, 0x12, 0x3a, 0x2d, 0x4d, 0x4b, 0xd5, 0xbc, 0x4a, 0xe1, 0xbd, 0x97, 0x98, 0x3a, 0xe8, | ||||
|   0x67, 0x75, 0x58, 0x8c, 0x70, 0xd2, 0x67, 0xc8, 0xf1, 0x23, 0x41, 0xc6, 0xc7, 0x27, 0xbf, 0x18, | ||||
|   0x41, 0x44, 0x88, 0x81, 0x52, 0x41, 0xb4, 0x77, 0x4e, 0x6c, 0x24, 0xa1, 0x40, 0x90, 0x81, 0x75, | ||||
|   0x19, 0x96, 0xd8, 0x09, 0x82, 0xbb, 0x66, 0xc6, 0x0e, 0x28, 0xec, 0xf8, 0xe0, 0x87, 0xc7, 0xec, | ||||
|   0x70, 0xff, 0x0d, 0x75, 0x13, 0x18, 0xec, 0x4d, 0xf3, 0xf9, 0x98, 0x0a, 0x4f, 0xf5, 0xb6, 0x15, | ||||
|   0xa5, 0x69, 0xb2, 0xc1, 0x42, 0x2d, 0x44, 0x61, 0x66, 0x0c, 0x07, 0xc4, 0xd6, 0x94, 0xda, 0x17, | ||||
|   0x71, 0xce, 0xd7, 0x82, 0xad, 0xd0, 0x45, 0x6f, 0xfc, 0xf8, 0x61, 0x14, 0x87, 0x63, 0xc7, 0x53, | ||||
|   0x28, 0xeb, 0x4c, 0x5d, 0xc2, 0x08, 0xf4, 0xc0, 0x6a, 0x1e, 0x03, 0xa7, 0x5b, 0x04, 0x80, 0xa1, | ||||
|   0x1b, 0x02, 0xac, 0x9e, 0x31, 0x8d, 0x95, 0x1a, 0x63, 0x54, 0x31, 0x97, 0x5a, 0xba, 0xf3, 0xda, | ||||
|   0x0f, 0xac, 0xa6, 0x95, 0xeb, 0x49, 0x0c, 0x71, 0x23, 0xe3, 0x44, 0x10, 0x05, 0x87, 0x61, 0xfb, | ||||
|   0x69, 0x74, 0x54, 0x3b, 0x0e, 0x46, 0xff, 0xfb, 0x27, 0x0c, 0xdc, 0x70, 0xb8, 0x09, 0xa1, 0x5a, | ||||
|   0x37, 0xcf, 0xd4, 0x5d, 0xea, 0x69, 0xe7, 0x67, 0x91, 0x78, 0xbf, 0xd0, 0xe6, 0x31, 0x2f, 0x84, | ||||
|   0x7e, 0x2c, 0xa2, 0xe9, 0xbc, 0x43, 0xcb, 0x41, 0x58, 0xef, 0xb2, 0x51, 0xfe, 0x67, 0x11, 0x8b, | ||||
|   0x3a, 0xcf, 0x79, 0x5a, 0x32, 0x98, 0x02, 0x60, 0xbc, 0xd7, 0xcd, 0x9d, 0xc0, 0x90, 0x6f, 0x98, | ||||
|   0x42, 0x68, 0x43, 0xcf, 0x3b, 0xa8, 0xbd, 0xb9, 0x19, 0xd9, 0xfc, 0x02, 0xc5, 0x00, 0xcc, 0xcf, | ||||
|   0xc0, 0xf4, 0xc7, 0x08, 0x41, 0x1a, 0x20, 0x98, 0xc4, 0x63, 0x11, 0xf0, 0xbd, 0xe3, 0x7d, 0xd7, | ||||
|   0x5c, 0x60, 0xc6, 0xc2, 0x18, 0xdd, 0xd8, 0x34, 0x48, 0x90, 0x22, 0xe8, 0x8f, 0x83, 0x2b, 0xff, | ||||
|   0x30, 0xb0, 0xd0, 0x6b, 0xd0, 0xb4, 0x88, 0x41, 0xdb, 0x1b, 0xa3, 0x5f, 0x19, 0xa3, 0x8d, 0x66, | ||||
|   0xdf, 0x46, 0xdf, 0x6a, 0xae, 0x3d, 0x04, 0x6d, 0x12, 0x17, 0xd7, 0xab, 0x73, 0x4a, 0x7a, 0x92, | ||||
|   0x8e, 0x11, 0xf0, 0x4b, 0xf8, 0x9c, 0x87, 0x8d, 0x32, 0x7f, 0x70, 0x7e, 0x84, 0x28, 0x4e, 0x24, | ||||
|   0xf1, 0xc8, 0x0c, 0xad, 0x05, 0x3c, 0xd2, 0x4e, 0xd0, 0x53, 0x1f, 0xe7, 0x4e, 0x4c, 0xa3, 0x80, | ||||
|   0x3c, 0xd9, 0xd6, 0x04, 0x43, 0x6f, 0xa2, 0x0f, 0x50, 0xa7, 0x2e, 0x7d, 0x7d, 0x6f, 0x68, 0xb3, | ||||
|   0x5f, 0xea, 0xd0, 0x86, 0x9f, 0x37, 0x92, 0xf7, 0xd3, 0x65, 0x45, 0xdb, 0x92, 0x4a, 0x58, 0x02, | ||||
|   0xbe, 0xb4, 0x9d, 0xee, 0x62, 0x76, 0x60, 0x0c, 0x90, 0x34, 0x54, 0x2d, 0x83, 0x8e, 0x27, 0x76, | ||||
|   0xbc, 0x1d, 0x34, 0x11, 0xfd, 0xbb, 0xb8, 0x83, 0x5b, 0x45, 0x35, 0x7c, 0xc6, 0xa3, 0xea, 0xa0, | ||||
|   0xaf, 0x04, 0xaf, 0x3c, 0xca, 0x64, 0x45, 0x6f, 0xca, 0x45, 0x30, 0xfd, 0xc4, 0xfa, 0x8a, 0x7d, | ||||
|   0x90, 0x98, 0x12, 0xb0, 0xbc, 0x01, 0xc2, 0xcc, 0x49, 0xba, 0x9b, 0x88, 0x1b, 0x18, 0xc8, 0x30, | ||||
|   0x08, 0xc8, 0x33, 0x13, 0xb4, 0x31, 0x26, 0x2b, 0x9c, 0x54, 0x6a, 0xee, 0xeb, 0x65, 0xde, 0x16, | ||||
|   0x07, 0x22, 0xcb, 0xf0, 0x43, 0xb1, 0x42, 0xae, 0xa8, 0x73, 0x33, 0xe1, 0x37, 0xed, 0x79, 0x9f, | ||||
|   0xe8, 0x72, 0x5f, 0x08, 0xec, 0x7a, 0x60, 0xbc, 0x34, 0x0c, 0x3c, 0x7a, 0xeb, 0x6d, 0x67, 0xae, | ||||
|   0x88, 0xe8, 0x0e, 0xd9, 0x79, 0x7e, 0x9c, 0x3b, 0x58, 0x48, 0x64, 0x1b, 0xad, 0xbe, 0xad, 0x2d, | ||||
|   0xcf, 0xb1, 0x29, 0xd8, 0x82, 0x26, 0x28, 0x75, 0x89, 0x01, 0xf3, 0x6c, 0x26, 0x7b, 0xf1, 0x0b, | ||||
|   0xec, 0x25, 0x6d, 0xf1, 0x0b, 0x6c, 0x3a, 0xc6, 0xf9, 0xf1, 0x00, 0xc3, 0x22, 0x19, 0xc3, 0xd7, | ||||
|   0xf1, 0xe1, 0xbd, 0x58, 0x71, 0x2e, 0x25, 0xa5, 0x80, 0xad, 0xa4, 0x6c, 0xfa, 0xa9, 0xe1, 0x06, | ||||
|   0xd5, 0x02, 0x16, 0xbb, 0xd0, 0x00, 0x20, 0x2c, 0x94, 0x6c, 0x05, 0x23, 0x61, 0x17, 0x51, 0xe5, | ||||
|   0x78, 0x77, 0x01, 0x8f, 0x12, 0x3d, 0x44, 0x4c, 0xf7, 0x01, 0x29, 0x79, 0xf5, 0xb1, 0xd0, 0x4f, | ||||
|   0xc1, 0xc0, 0xed, 0xe9, 0xcd, 0x4d, 0xfa, 0xb5, 0x4d, 0x65, 0x70, 0xa8, 0x4e, 0x33, 0xa8, 0x43, | ||||
|   0xf3, 0x79, 0x61, 0x59, 0x38, 0x06, 0xf9, 0xce, 0x44, 0x58, 0x2d, 0x1a, 0x83, 0x12, 0xda, 0x44, | ||||
|   0x20, 0x69, 0x1a, 0x31, 0xbb, 0xb9, 0x29, 0x82, 0xb9, 0xc1, 0x9e, 0x19, 0x6a, 0x55, 0x74, 0xad, | ||||
|   0xf8, 0xde, 0x74, 0x3f, 0x83, 0xb9, 0xcd, 0xc5, 0x1a, 0xbd, 0x44, 0xd8, 0x77, 0x3a, 0x0e, 0xd0, | ||||
|   0x65, 0x9f, 0xe8, 0x06, 0x7b, 0x86, 0x5f, 0x38, 0x46, 0x37, 0x9e, 0x93, 0x3d, 0x8b, 0xa5, 0x71, | ||||
|   0x5f, 0x9c, 0x18, 0xe6, 0xb0, 0xd7, 0x4f, 0xd0, 0xb7, 0x3e, 0x61, 0x28, 0xa0, 0x23, 0x8d, 0x48, | ||||
|   0x82, 0x05, 0xd0, 0xc5, 0xaa, 0xe4, 0x6a, 0xc1, 0xed, 0x83, 0xb4, 0x05, 0xcf, 0x61, 0x1b, 0x29, | ||||
|   0x93, 0xc7, 0x32, 0x67, 0x9a, 0xe3, 0xe0, 0x3b, 0x32, 0x8e, 0xae, 0xa9, 0x8f, 0x33, 0x56, 0xa4, | ||||
|   0x8a, 0x45, 0x9a, 0xa1, 0x9e, 0x25, 0xe8, 0x30, 0x12, 0x60, 0x4b, 0x25, 0x4c, 0x05, 0x16, 0x1a, | ||||
|   0xfa, 0x8a, 0xe7, 0x21, 0xea, 0xa5, 0xbc, 0x82, 0x6e, 0x48, 0xd2, 0x82, 0x29, 0xae, 0x06, 0x3f, | ||||
|   0x54, 0x1a, 0x32, 0x14, 0xbe, 0x8a, 0xc2, 0x00, 0x11, 0xa0, 0x87, 0x6f, 0xaa, 0x30, 0xd2, 0xdd, | ||||
|   0x49, 0x38, 0x7a, 0x08, 0xf1, 0x17, 0xe2, 0x44, 0xd9, 0x7a, 0x88, 0xed, 0x2c, 0x02, 0xf6, 0x43, | ||||
|   0x81, 0x8e, 0x7f, 0xce, 0x3c, 0xbf, 0x90, 0xdf, 0xbf, 0x83, 0x26, 0xf8, 0x59, 0x48, 0xbe, 0xfc, | ||||
|   0xfe, 0x1d, 0x16, 0x3d, 0xe1, 0x60, 0xf2, 0x68, 0x28, 0x96, 0x90, 0x27, 0x79, 0xde, 0x77, 0xa3, | ||||
|   0x51, 0x46, 0x6c, 0x36, 0x3e, 0x8e, 0x0d, 0x47, 0x07, 0xd3, 0x0e, 0x67, 0x81, 0x00, 0xe5, 0x98, | ||||
|   0x67, 0x1a, 0x4f, 0xd8, 0x27, 0x31, 0xf4, 0x18, 0x79, 0x14, 0xb4, 0x0d, 0x06, 0x57, 0x83, 0x79, | ||||
|   0x9d, 0x71, 0xa7, 0x3c, 0x1c, 0x21, 0x8d, 0x32, 0x2e, 0x6d, 0x98, 0xe3, 0x24, 0x8f, 0xd1, 0x14, | ||||
|   0xd4, 0x18, 0x88, 0x05, 0xb7, 0xa2, 0xd8, 0xf5, 0x42, 0xa7, 0xb2, 0x78, 0x57, 0x42, 0x12, 0xaf, | ||||
|   0x12, 0x81, 0x85, 0x64, 0xee, 0xf8, 0xdc, 0x1e, 0x46, 0xf7, 0x6d, 0xc6, 0x8d, 0x38, 0xc6, 0xf0, | ||||
|   0xbf, 0xf1, 0x35, 0x8c, 0x11, 0xc5, 0x96, 0x23, 0x62, 0x23, 0x84, 0x65, 0x21, 0x87, 0x6e, 0x90, | ||||
|   0x55, 0x7e, 0x76, 0x47, 0x0b, 0x39, 0xd9, 0x1d, 0x01, 0x0f, 0xe0, 0x11, 0xbc, 0x4b, 0x03, 0xa3, | ||||
|   0xd6, 0xd1, 0xd0, 0xdf, 0xc2, 0xcd, 0x09, 0x18, 0x24, 0x1e, 0x5f, 0xd2, 0x98, 0xe2, 0x40, 0x2b, | ||||
|   0xd6, 0xf1, 0x72, 0x59, 0x1b, 0x99, 0xf3, 0xed, 0x4d, 0x7b, 0xab, 0xc2, 0xcd, 0x05, 0x7c, 0x99, | ||||
|   0x4b, 0xcd, 0xfd, 0x8b, 0xa1, 0x6f, 0xc9, 0xff, 0x61, 0xa5, 0xa1, 0xc7, 0xe3, 0xa5, 0x08, 0x3b, | ||||
|   0xa8, 0x9c, 0x2b, 0x0a, 0x28, 0x3c, 0x74, 0x0a, 0x35, 0xaa, 0x1c, 0x2c, 0x94, 0x07, 0x96, 0xf2, | ||||
|   0xb1, 0x06, 0xe1, 0x57, 0xe0, 0xf9, 0x90, 0xf6, 0x40, 0x3c, 0xed, 0xc1, 0xfb, 0xae, 0x91, 0xa8, | ||||
|   0x98, 0xe6, 0x6b, 0xe1, 0x15, 0x88, 0x17, 0x4d, 0xc0, 0x2a, 0x71, 0x2c, 0xb0, 0x26, 0x08, 0x3b, | ||||
|   0x24, 0xf0, 0xd7, 0xf6, 0x1f, 0x96, 0x2d, 0x7e, 0xef, 0x4d, 0x32, 0x91, 0x43, 0x33, 0x33, 0xd3, | ||||
|   0xa8, 0xb1, 0xcb, 0x6b, 0xf0, 0x33, 0x1c, 0x06, 0x19, 0xbe, 0xea, 0x69, 0xe6, 0xdd, 0x66, 0x03, | ||||
|   0xf6, 0x69, 0xf8, 0x32, 0x1f, 0x21, 0xe9, 0xdf, 0x77, 0xc3, 0xbe, 0xf9, 0xd8, 0xed, 0x1e, 0xde, | ||||
|   0xa9, 0x59, 0xbc, 0x23, 0xcc, 0x9f, 0x86, 0xe0, 0x7a, 0xf7, 0x06, 0xab, 0xb2, 0xc3, 0x85, 0xae, | ||||
|   0x79, 0xc7, 0xb7, 0x24, 0x01, 0xc1, 0x85, 0x52, 0xf0, 0x95, 0x64, 0xbc, 0x67, 0x6b, 0xf8, 0x6f, | ||||
|   0xab, 0x89, 0x1a, 0xb8, 0x0c, 0xc8, 0xc2, 0xc4, 0x8d, 0x0f, 0xc0, 0xdf, 0x69, 0xf2, 0xa7, 0x2b, | ||||
|   0x3c, 0x2c, 0xec, 0xbf, 0x77, 0x4b, 0x8f, 0xf7, 0xc0, 0xb3, 0x63, 0x5a, 0xfe, 0xf8, 0x58, 0x78, | ||||
|   0x17, 0xdb, 0x8f, 0x5a, 0x31, 0x00, 0x5a, 0xec, 0x8f, 0x47, 0x70, 0xee, 0xc1, 0x0b, 0x8f, 0xc2, | ||||
|   0x83, 0xb4, 0x72, 0x18, 0xec, 0x3d, 0x31, 0x7e, 0x88, 0xa5, 0x57, 0x04, 0xf8, 0x52, 0x08, 0x64, | ||||
|   0xeb, 0x32, 0x0c, 0xaf, 0xbe, 0x36, 0x07, 0x59, 0x17, 0xae, 0x68, 0x06, 0x83, 0x75, 0xca, 0xbb, | ||||
|   0x33, 0x3f, 0x6e, 0xc3, 0x91, 0xb8, 0x05, 0x47, 0x0b, 0x8f, 0x56, 0xda, 0x7b, 0xab, 0xcb, 0xfa, | ||||
|   0x97, 0xaf, 0x7f, 0x54, 0xda, 0xdf, 0xc8, 0x60, 0xbf, 0xfc, 0x81, 0xb1, 0x8b, 0x8f, 0x63, 0x75, | ||||
|   0xeb, 0xeb, 0xb3, 0x1a, 0x71, 0x93, 0x33, 0x8a, 0xc1, 0x50, 0x40, 0x8c, 0xef, 0x80, 0x21, 0x73, | ||||
|   0xc5, 0x81, 0xac, 0x5f, 0x7c, 0xda, 0x0b, 0xcd, 0xa8, 0x2f, 0x72, 0xcc, 0xec, 0xaf, 0x15, 0xf0, | ||||
|   0x97, 0x0d, 0x60, 0xaf, 0x74, 0xee, 0xd7, 0xe7, 0x7b, 0xe3, 0x85, 0x87, 0x90, 0xd8, 0x3a, 0x04, | ||||
|   0xbd, 0xb2, 0x46, 0x37, 0x8e, 0x50, 0xae, 0xd6, 0x16, 0x5b, 0xfd, 0x04, 0x25, 0xef, 0xa2, 0x8f, | ||||
|   0xf3, 0x79, 0xf4, 0x4a, 0x8d, 0xc8, 0x75, 0x9f, 0xe1, 0x13, 0x0c, 0xe1, 0x6b, 0x1f, 0xbd, 0xce, | ||||
|   0xd5, 0x17, 0xdd, 0x5b, 0x20, 0x3b, 0x48, 0x5b, 0x39, 0x87, 0xa1, 0xfb, 0x3e, 0xe3, 0x23, 0xf4, | ||||
|   0xb0, 0xb0, 0x02, 0xd2, 0xe6, 0xe6, 0xaa, 0x1e, 0xd0, 0x17, 0xcd, 0x81, 0x12, 0x66, 0xde, 0x69, | ||||
|   0x64, 0x9c, 0x9c, 0xc9, 0xa4, 0x2f, 0x8d, 0x34, 0xd3, 0xae, 0x71, 0xce, 0xc0, 0x34, 0x31, 0x50, | ||||
|   0x8d, 0x02, 0xaa, 0xf9, 0xd7, 0x00, 0xc7, 0xc6, 0x19, 0xbe, 0x3a, 0x35, 0x3c, 0xcc, 0xe5, 0x0e, | ||||
|   0xfe, 0x85, 0x51, 0xae, 0xc0, 0xd5, 0xe7, 0x87, 0x19, 0xed, 0xc1, 0xdf, 0x18, 0xe5, 0x22, 0xf0, | ||||
|   0x66, 0x3d, 0x6d, 0x00, 0xb7, 0xfe, 0xe2, 0xc7, 0xf3, 0x90, 0x9f, 0xf3, 0xe5, 0xea, 0x18, 0x30, | ||||
|   0xb3, 0xbe, 0x3a, 0x58, 0x61, 0xb5, 0x40, 0x43, 0x0f, 0xd3, 0x18, 0x0d, 0x27, 0x09, 0x3c, 0xc5, | ||||
|   0x51, 0xa8, 0xde, 0x95, 0xa3, 0xa4, 0x21, 0xf2, 0xb3, 0xd8, 0x4c, 0x08, 0xcb, 0xed, 0x74, 0x27, | ||||
|   0xb5, 0xf0, 0xb9, 0xb2, 0xee, 0x44, 0x25, 0x5d, 0x74, 0x71, 0xc4, 0x80, 0xfa, 0x17, 0x62, 0xfa, | ||||
|   0x3a, 0x60, 0x9c, 0x94, 0x57, 0x40, 0x86, 0x59, 0xaa, 0x91, 0x38, 0x1c, 0xfa, 0x7e, 0xa8, 0xe8, | ||||
|   0x70, 0x97, 0x06, 0xb9, 0x6c, 0xbb, 0xf2, 0x71, 0xc4, 0xb1, 0xbb, 0x9c, 0x57, 0xa0, 0xcd, 0x99, | ||||
|   0xac, 0x84, 0x15, 0x31, 0x35, 0x96, 0x30, 0x16, 0xba, 0xc9, 0x78, 0xd5, 0x4c, 0xac, 0x06, 0xb9, | ||||
|   0x64, 0x9f, 0x2c, 0x81, 0xc5, 0x5b, 0xee, 0xe2, 0x73, 0x8b, 0x77, 0xa2, 0x91, 0x38, 0x6e, 0x59, | ||||
|   0x20, 0x76, 0xc0, 0xf0, 0x66, 0x68, 0x3b, 0xcf, 0xeb, 0x91, 0xe3, 0x60, 0xb8, 0xbb, 0x08, 0x26, | ||||
|   0x3b, 0xd5, 0x54, 0x43, 0xea, 0x87, 0xff, 0xce, 0x3d, 0xcb, 0x3f, 0x83, 0xe6, 0x1f, 0x4e, 0xf3, | ||||
|   0x82, 0x13, 0x69, 0x5c, 0x62, 0x64, 0x6e, 0xdc, 0x48, 0xdb, 0x81, 0xbd, 0x87, 0xf1, 0x47, 0x78, | ||||
|   0x5d, 0x1d, 0xa9, 0x2f, 0x98, 0xee, 0x7a, 0xfb, 0x76, 0x69, 0x1f, 0x13, 0xb7, 0x2f, 0x57, 0x38, | ||||
|   0xe7, 0xe9, 0x3b, 0xe4, 0x39, 0xbe, 0x1e, 0xcb, 0xa6, 0x8e, 0x72, 0x2f, 0x4f, 0x40, 0x04, 0x50, | ||||
|   0x91, 0x96, 0x74, 0xd7, 0x9a, 0xb4, 0x11, 0xb3, 0x71, 0xc9, 0x0c, 0x25, 0x3f, 0x3f, 0xf4, 0x51, | ||||
|   0x52, 0x0b, 0x07, 0x95, 0xbd, 0x3e, 0xf4, 0x7d, 0x11, 0x41, 0xd0, 0xf2, 0x76, 0xaf, 0xe8, 0xbb, | ||||
|   0x72, 0x1a, 0xb8, 0x7d, 0x05, 0x04, 0x3e, 0xeb, 0xd7, 0x44, 0xc1, 0x81, 0xbf, 0x11, 0xbe, 0x61, | ||||
|   0x15, 0xb4, 0xb9, 0xc8, 0xa9, 0xca, 0x20, 0xd2, 0xd9, 0xdb, 0x22, 0x4d, 0x15, 0x45, 0xbe, 0xae, | ||||
|   0x9a, 0x33, 0x92, 0xee, 0x87, 0x8b, 0xe5, 0x4b, 0xb1, 0x72, 0xfc, 0x1c, 0x7a, 0xab, 0x93, 0x24, | ||||
|   0x4d, 0x94, 0x64, 0x0c, 0x73, 0xee, 0xd3, 0xbb, 0xd6, 0xfa, 0xb8, 0xb9, 0xc5, 0xd7, 0x59, 0xe7, | ||||
|   0x20, 0x71, 0xbe, 0x40, 0x08, 0xa1, 0xd8, 0xf1, 0x5f, 0xe0, 0xb0, 0xb4, 0x23, 0x13, 0x8c, 0xce, | ||||
|   0x63, 0xb0, 0xec, 0x18, 0x38, 0xbb, 0x49, 0x0c, 0x84, 0x79, 0x3d, 0x84, 0xb3, 0xeb, 0x90, 0x17, | ||||
|   0xc8, 0x0e, 0x23, 0xf3, 0x20, 0x94, 0xd1, 0x8b, 0x78, 0x8e, 0xc2, 0x7e, 0xa3, 0x7a, 0x18, 0x74, | ||||
|   0x9f, 0x4c, 0x3a, 0xd4, 0x02, 0xf2, 0xdc, 0xe3, 0xf0, 0xe4, 0x47, 0x97, 0xbb, 0x11, 0xcf, 0x40, | ||||
|   0xdd, 0xc5, 0x00, 0x71, 0xdc, 0x64, 0xea, 0x78, 0xa5, 0x4a, 0x91, 0x03, 0xca, 0xfe, 0x4b, 0x78, | ||||
|   0xf0, 0x88, 0x32, 0x6b, 0x2a, 0xdc, 0x0c, 0x4d, 0xf1, 0x7c, 0xcb, 0x30, 0x25, 0x91, 0x1e, 0x0c, | ||||
|   0x41, 0xea, 0x46, 0x52, 0x1c, 0xc9, 0x1d, 0xda, 0xd4, 0xe4, 0xf1, 0x66, 0x4d, 0x30, 0x1a, 0x9a, | ||||
|   0x6d, 0xa6, 0x5b, 0xac, 0xbc, 0x33, 0xba, 0x31, 0xf1, 0x55, 0x20, 0x0e, 0xee, 0x7c, 0x7b, 0xee, | ||||
|   0x11, 0x23, 0xcd, 0x5c, 0x23, 0x46, 0xba, 0xe7, 0x7d, 0xcb, 0xb8, 0x5a, 0xa0, 0x2f, 0x06, 0x99, | ||||
|   0xf8, 0x3b, 0x68, 0x1d, 0x4d, 0xd6, 0xe9, 0x48, 0x57, 0xdf, 0xb2, 0xb2, 0x66, 0x0f, 0x12, 0x6f, | ||||
|   0x58, 0x4a, 0x88, 0xff, 0x14, 0xe8, 0x7e, 0x2e, 0xff, 0x2b, 0x8c, 0xd6, 0x93, 0x00, 0xad, 0xe1, | ||||
|   0xee, 0xbf, 0x10, 0x7d, 0xa4, 0x19, 0x51, 0xa6, 0xe0, 0x93, 0x80, 0xc7, 0x14, 0xd0, 0x7e, 0x0a, | ||||
|   0x46, 0x84, 0x5e, 0x32, 0x97, 0xc1, 0xd9, 0x16, 0x77, 0x22, 0x88, 0x20, 0x78, 0x6e, 0xa3, 0x16, | ||||
|   0x4b, 0x6a, 0xb1, 0xb7, 0x8b, 0x24, 0x39, 0xc0, 0x04, 0x8c, 0x15, 0xfe, 0xc2, 0xe4, 0xe4, 0xbd, | ||||
|   0xea, 0x68, 0xf6, 0x61, 0xa5, 0xa5, 0x9b, 0xfa, 0x16, 0x53, 0xe8, 0xb3, 0xc0, 0x08, 0xd0, 0x93, | ||||
|   0x65, 0xa0, 0xc9, 0x19, 0x1b, 0x6b, 0x6d, 0x1d, 0xac, 0x00, 0x41, 0xf3, 0x18, 0x30, 0xfa, 0x2a, | ||||
|   0x97, 0xd9, 0x02, 0x33, 0x5e, 0x88, 0xc0, 0x2a, 0x22, 0xc7, 0x80, 0x81, 0x55, 0x34, 0x1e, 0x4b, | ||||
|   0xdf, 0x5d, 0x34, 0xf5, 0x6b, 0xcd, 0x4a, 0x0b, 0x12, 0x23, 0xda, 0x68, 0x9c, 0x31, 0x66, 0x81, | ||||
|   0x75, 0x6c, 0x6e, 0x46, 0xaf, 0x68, 0x68, 0x34, 0x5c, 0xb6, 0x0a, 0x56, 0x73, 0xb4, 0xcd, 0xcd, | ||||
|   0x0f, 0xb1, 0x4d, 0xe3, 0x21, 0xde, 0x05, 0x12, 0x5f, 0xf1, 0x6c, 0x99, 0x09, 0xb9, 0x2f, 0xd8, | ||||
|   0x9d, 0x64, 0x78, 0x29, 0x36, 0x56, 0x49, 0xb0, 0x80, 0x91, 0x06, 0xc1, 0x2a, 0x31, 0x78, 0x02, | ||||
|   0xac, 0x3c, 0x2a, 0x02, 0x21, 0xa5, 0xf6, 0xe3, 0x87, 0x09, 0xac, 0xc3, 0x04, 0x2e, 0x61, 0xa6, | ||||
|   0x65, 0x21, 0x0c, 0xfc, 0xa7, 0xf0, 0x03, 0xff, 0x07, 0xf5, 0xa6, 0x9e, 0xa5, 0x4d, 0xc7, 0x4c, | ||||
|   0x83, 0xd5, 0x16, 0x0b, 0xd8, 0xed, 0xe8, 0x23, 0xe9, 0xa5, 0xbb, 0x13, 0xd0, 0x54, 0x04, 0xc0, | ||||
|   0x21, 0x02, 0xdb, 0x89, 0x36, 0x09, 0x70, 0xdf, 0x6b, 0x15, 0x9a, 0xac, 0xe5, 0x58, 0x45, 0x7a, | ||||
|   0x49, 0x52, 0xac, 0xea, 0x7b, 0xb5, 0x51, 0x19, 0x8b, 0x08, 0x46, 0x27, 0xa6, 0xa8, 0x78, 0xef, | ||||
|   0x92, 0x59, 0xa9, 0x9c, 0x29, 0x8a, 0x1b, 0xd6, 0x9a, 0xe6, 0xde, 0xf1, 0xbb, 0xbe, 0x12, 0x96, | ||||
|   0x2e, 0xe8, 0xf9, 0x3f, 0x38, 0xc4, 0x0b, 0x0c, 0xd8, 0x6e, 0x0e, 0xfe, 0x4e, 0x06, 0x57, 0xc7, | ||||
|   0x78, 0x97, 0x76, 0xe2, 0x05, 0xa3, 0x8b, 0x3b, 0x8a, 0x33, 0x18, 0xa4, 0x9b, 0x19, 0x6b, 0x2f, | ||||
|   0xa0, 0xf9, 0xcc, 0x3d, 0xc5, 0xc4, 0x86, 0x29, 0x62, 0xa7, 0xfe, 0x7c, 0x93, 0x38, 0x99, 0xec, | ||||
|   0x2b, 0xa9, 0x46, 0xb6, 0xc2, 0x6f, 0xe7, 0xe9, 0xa1, 0x78, 0x6c, 0x96, 0x17, 0xfa, 0xca, 0x76, | ||||
|   0xce, 0xff, 0x99, 0x17, 0x4b, 0x80, 0xd1, 0x42, 0xa1, 0xd1, 0xe8, 0x2b, 0x34, 0x25, 0xd5, 0xc8, | ||||
|   0x63, 0x8a, 0x58, 0x09, 0xa5, 0x00, 0x00, 0xc6, 0x99, 0xd8, 0x2d, 0xca, 0xfe, 0xf4, 0xd0, 0xd9, | ||||
|   0x6f, 0xfc, 0xea, 0x3b, 0x78, 0x81, 0x54, 0x5f, 0x99, 0xe3, 0x6d, 0x5c, 0xc8, 0xcb, 0x8a, 0x60, | ||||
|   0x17, 0xff, 0xe2, 0xe7, 0x42, 0x35, 0x2b, 0x32, 0x72, 0x51, 0x8c, 0xae, 0x1d, 0xf1, 0x15, 0x2e, | ||||
|   0xae, 0x76, 0xa6, 0x7b, 0x13, 0x98, 0x1f, 0xd1, 0xfd, 0x83, 0xdb, 0xa0, 0x83, 0xa3, 0xe5, 0x24, | ||||
|   0xd2, 0x26, 0xf7, 0x15, 0x5f, 0x6e, 0x27, 0x90, 0xd0, 0x7e, 0x2d, 0x47, 0x5f, 0xd4, 0x6a, 0x0f, | ||||
|   0x12, 0xec, 0xaa, 0x68, 0x8e, 0x7a, 0xe7, 0x93, 0xac, 0x65, 0x58, 0xa7, 0x6b, 0xde, 0x0d, 0x4b, | ||||
|   0x1b, 0xe2, 0x56, 0x9f, 0x08, 0x8e, 0x9c, 0x13, 0x8d, 0x47, 0x88, 0x79, 0x7b, 0x76, 0x1f, 0x5d, | ||||
|   0x2d, 0x04, 0xb0, 0x26, 0xde, 0xcd, 0x42, 0xbc, 0x6b, 0x4f, 0x11, 0x4c, 0x32, 0xb2, 0xd7, 0xe6, | ||||
|   0xb2, 0xd0, 0x80, 0x11, 0x6e, 0x67, 0x07, 0xbb, 0x45, 0x78, 0xf6, 0xc7, 0x3f, 0x0b, 0x1e, 0x6a, | ||||
|   0xb4, 0x81, 0x07, 0xe8, 0xe9, 0xb0, 0xd8, 0xa9, 0x4e, 0x7e, 0xee, 0xdd, 0xd5, 0xc3, 0xcf, 0xe6, | ||||
|   0x91, 0x72, 0xb3, 0x39, 0x9e, 0xee, 0x89, 0x8c, 0x43, 0x14, 0xbc, 0x3b, 0x57, 0xd6, 0xdd, 0x1f, | ||||
|   0x49, 0x7b, 0x1a, 0x3f, 0x92, 0x3f, 0xb3, 0x6a, 0x91, 0x9b, 0x94, 0xa1, 0x63, 0xb5, 0x70, 0x2f, | ||||
|   0xe7, 0x18, 0xcd, 0xb8, 0xea, 0x90, 0x75, 0xe4, 0x86, 0x8a, 0x28, 0x42, 0x71, 0x13, 0x76, 0xcd, | ||||
|   0x19, 0xeb, 0xc9, 0x8e, 0x85, 0xc2, 0x12, 0xb4, 0xd1, 0x58, 0x8c, 0xf0, 0xdf, 0x70, 0x61, 0xfe, | ||||
|   0x05, 0xdf, 0xa5, 0x09, 0x88, 0x8a, 0xe0, 0x73, 0xf9, 0xe6, 0x83, 0x30, 0x52, 0xcc, 0xb4, 0x05, | ||||
|   0x30, 0xbe, 0x9b, 0xe9, 0xc1, 0x4e, 0xfc, 0x7a, 0x93, 0xa5, 0xc1, 0xa7, 0xb2, 0x78, 0xbd, 0xad, | ||||
|   0x00, 0x6a, 0x5c, 0xcd, 0x4d, 0x46, 0x6f, 0x5b, 0x5a, 0x3a, 0xc9, 0x1b, 0x66, 0x32, 0xf4, 0xad, | ||||
|   0x0a, 0xb8, 0x9d, 0xb7, 0xb8, 0x40, 0x60, 0xbd, 0xf2, 0x11, 0x18, 0xb8, 0x78, 0x64, 0xc6, 0x8b, | ||||
|   0x12, 0x8a, 0xbb, 0x38, 0x82, 0x80, 0x7d, 0x5c, 0x6f, 0x2e, 0xbf, 0x72, 0xff, 0x7d, 0x11, 0xa8, | ||||
|   0xa9, 0x61, 0x60, 0xc9, 0x77, 0xff, 0x52, 0xae, 0xba, 0xb6, 0x38, 0x19, 0x64, 0xfe, 0xd0, 0xf0, | ||||
|   0xc6, 0x25, 0x67, 0x65, 0x58, 0x26, 0x8d, 0x1c, 0xf3, 0x82, 0x2a, 0x6e, 0xa0, 0xb7, 0xa0, 0xdf, | ||||
|   0xdd, 0xe2, 0x9b, 0xb5, 0x5b, 0x12, 0x5e, 0xbf, 0x52, 0x77, 0x62, 0xfd, 0x35, 0x82, 0x30, 0x0d, | ||||
|   0xaf, 0xd3, 0xd1, 0xf2, 0xfc, 0xf6, 0x56, 0x96, 0x3a, 0xb9, 0xd8, 0xde, 0xfe, 0x3c, 0x7a, 0xc5, | ||||
|   0x8a, 0xc1, 0xe2, 0x9d, 0x56, 0x99, 0xf8, 0x75, 0x3f, 0xd2, 0x0c, 0xc3, 0x44, 0x35, 0x73, 0xe8, | ||||
|   0x44, 0xb1, 0xe6, 0xeb, 0x47, 0xf4, 0x44, 0x6f, 0x9a, 0xbe, 0xc8, 0x22, 0x89, 0x37, 0xe8, 0x21, | ||||
|   0x10, 0x9c, 0x1d, 0x7a, 0x43, 0x4f, 0x12, 0xb5, 0x2a, 0xf6, 0xc4, 0xae, 0x4e, 0xe2, 0xc2, 0x71, | ||||
|   0xe0, 0x43, 0xf6, 0xfe, 0x8b, 0x85, 0x9a, 0xbd, 0x64, 0x9c, 0xca, 0xfa, 0xd0, 0x4e, 0xae, 0xdc, | ||||
|   0xd3, 0x5a, 0xce, 0x09, 0xdb, 0x8b, 0x2c, 0x77, 0xce, 0x82, 0x3f, 0xff, 0xab, 0xb5, 0xe2, 0x22, | ||||
|   0xdb, 0xc5, 0x4b, 0x88, 0x79, 0xe1, 0xbc, 0x91, 0xa5, 0x61, 0x04, 0x63, 0x41, 0xa3, 0x7d, 0x69, | ||||
|   0x88, 0xc2, 0x44, 0x64, 0x0e, 0x76, 0xe6, 0xbf, 0xe8, 0xd0, 0x1b, 0xc3, 0xd1, 0xdd, 0x14, 0xe1, | ||||
|   0xc7, 0x43, 0x83, 0xed, 0x51, 0x04, 0xd1, 0x11, 0x69, 0x76, 0x58, 0x47, 0xbd, 0xa1, 0xd7, 0x11, | ||||
|   0x39, 0x3b, 0xf1, 0x84, 0x1f, 0xe2, 0xcf, 0x5a, 0xe8, 0x38, 0x48, 0x5f, 0x72, 0x8e, 0x6c, 0x93, | ||||
|   0x46, 0xc4, 0xd1, 0xe3, 0xe9, 0x91, 0x58, 0x23, 0xb2, 0xb4, 0x19, 0xcb, 0x22, 0x37, 0x16, 0x67, | ||||
|   0x2e, 0xa1, 0x2e, 0xa0, 0xd3, 0xdb, 0x9f, 0x16, 0xe7, 0xfe, 0x46, 0x75, 0x98, 0x2d, 0x2b, 0x2f, | ||||
|   0xc9, 0x50, 0xc8, 0xa0, 0x17, 0xd5, 0x16, 0xd8, 0x89, 0xf4, 0x40, 0x6b, 0x24, 0xd4, 0xcd, 0xbf, | ||||
|   0x60, 0x3a, 0x28, 0x02, 0xb3, 0xec, 0x61, 0xca, 0x49, 0x06, 0x2f, 0x85, 0xe3, 0x7f, 0xff, 0x0e, | ||||
|   0x77, 0xdd, 0x8d, 0xfd, 0x36, 0xf1, 0x02, 0x3e, 0x40, 0xa0, 0x8f, 0x1e, 0x80, 0x86, 0xca, 0xfb, | ||||
|   0x43, 0x80, 0x4c, 0x2f, 0x24, 0x2d, 0xf4, 0xbe, 0x67, 0xfe, 0x07, 0xc3, 0xfc, 0x4f, 0xcf, 0x61, | ||||
|   0x74, 0x63, 0x5a, 0xc2, 0x7f, 0xb5, 0x56, 0xc5, 0xd1, 0x79, 0x5e, 0xa3, 0x2f, 0x49, 0x7f, 0x3e, | ||||
|   0x44, 0x3e, 0x4c, 0x52, 0xd4, 0x2c, 0x66, 0x36, 0x27, 0x2b, 0xe0, 0x8f, 0x7e, 0xa9, 0x33, 0x66, | ||||
|   0xc3, 0xdd, 0x9a, 0x88, 0xfe, 0x8d, 0x3e, 0x94, 0x45, 0x99, 0x78, 0x83, 0x4f, 0x2a, 0xe9, 0xfc, | ||||
|   0xcb, 0xcc, 0x8c, 0x17, 0xe7, 0x2f, 0x73, 0x7c, 0x5d, 0xfc, 0xd2, 0xc0, 0xeb, 0xa2, 0x58, 0x1f, | ||||
|   0xb7, 0x45, 0x60, 0x86, 0xdf, 0x45, 0x3e, 0x48, 0xf8, 0x8e, 0x09, 0xdb, 0x98, 0x60, 0x6c, 0xa7, | ||||
|   0xb3, 0xb9, 0xcd, 0xcd, 0x4f, 0x8d, 0xaf, 0xd1, 0xf0, 0xd0, 0x01, 0x70, 0x60, 0xa8, 0xcb, 0x57, | ||||
|   0x7a, 0x73, 0x5b, 0x5b, 0x1a, 0xe7, 0x51, 0xe4, 0x56, 0xc3, 0xc1, 0xbe, 0x65, 0xb7, 0x0c, 0x3f, | ||||
|   0xd0, 0x49, 0xc2, 0x45, 0xf8, 0xe2, 0x78, 0x5d, 0x00, 0x81, 0xb2, 0x0e, 0x46, 0x17, 0x0f, 0x85, | ||||
|   0x7e, 0x16, 0x99, 0xb8, 0xb7, 0xe6, 0x91, 0x7e, 0x88, 0x51, 0xb0, 0xfb, 0xbf, 0xc2, 0x9a, 0x86, | ||||
|   0x6b, 0x5a, 0x9c, 0x8f, 0xca, 0x43, 0x82, 0x81, 0xc0, 0xf5, 0xe0, 0x32, 0x66, 0x3c, 0x62, 0x9b, | ||||
|   0xe2, 0xa2, 0x17, 0x34, 0x5b, 0x90, 0xb6, 0x95, 0x8c, 0xa9, 0xad, 0xfe, 0xfb, 0xd8, 0x63, 0x7a, | ||||
|   0xeb, 0x8e, 0x58, 0x8b, 0x65, 0xb3, 0x76, 0x00, 0x67, 0x7c, 0x0c, 0x2e, 0xbd, 0xa8, 0x14, 0x6f, | ||||
|   0x84, 0x0e, 0x53, 0x40, 0x70, 0x07, 0x21, 0x11, 0xd2, 0xe9, 0xb4, 0xcb, 0x74, 0x25, 0xdf, 0x99, | ||||
|   0xe2, 0x2b, 0x08, 0xa4, 0xce, 0x78, 0x03, 0xbd, 0xbb, 0xd1, 0x3b, 0xc6, 0x00, 0xe5, 0xfc, 0x3b, | ||||
|   0xca, 0x37, 0x37, 0xd9, 0x93, 0xc9, 0x2f, 0x4e, 0x53, 0x27, 0xf0, 0xa0, 0x4f, 0xc2, 0xe4, 0xbd, | ||||
|   0x1c, 0x58, 0x8d, 0xfc, 0x0e, 0x5d, 0x94, 0xbf, 0x7f, 0x47, 0x25, 0x1d, 0x11, 0x66, 0x90, 0x5a, | ||||
|   0x9b, 0xa1, 0x02, 0x1c, 0xea, 0x0d, 0xa4, 0x09, 0xb4, 0x16, 0x5f, 0x5b, 0x59, 0x1e, 0xf3, 0xe6, | ||||
|   0x81, 0xe6, 0xb6, 0x34, 0x8c, 0xb9, 0x77, 0x0b, 0x9b, 0xa7, 0x92, 0x2d, 0xdf, 0x81, 0x06, 0x4a, | ||||
|   0x19, 0x94, 0xe0, 0xe8, 0x6d, 0x6d, 0xf4, 0xda, 0x36, 0x98, 0xf3, 0xe5, 0x52, 0x03, 0x13, 0x4f, | ||||
|   0x93, 0xa2, 0x73, 0x96, 0x72, 0xb4, 0xf5, 0x05, 0xc3, 0x17, 0xb0, 0xbd, 0x5f, 0x92, 0x82, 0x04, | ||||
|   0xe1, 0xcd, 0x09, 0xb8, 0xfa, 0x3e, 0x28, 0x37, 0xb4, 0x3e, 0x2a, 0xb6, 0xb8, 0xcb, 0xcd, 0x2f, | ||||
|   0xb7, 0xf1, 0x3d, 0xe3, 0xbd, 0xb5, 0x22, 0xf1, 0x3d, 0x83, 0x7b, 0xab, 0xf8, 0xdd, 0x77, 0x07, | ||||
|   0xfa, 0x76, 0xe2, 0xff, 0x02, 0x56, 0xec, 0xce, 0xa9, 0xe8, 0xc4, 0x00, 0x00 | ||||
| }; | ||||
|   | ||||
							
								
								
									
										3988
									
								
								wled00/html_ui.h
									
									
									
									
									
								
							
							
						
						
									
										3988
									
								
								wled00/html_ui.h
									
									
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -10,6 +10,11 @@ | ||||
|   #define DIMPROV_PRINTF(x...) | ||||
| #endif | ||||
|  | ||||
| #if defined(CONFIG_IDF_TARGET_ESP32S2) || defined(CONFIG_IDF_TARGET_ESP32C3) || defined(CONFIG_IDF_TARGET_ESP32S3) | ||||
| #undef WLED_DISABLE_IMPROV_WIFISCAN | ||||
| #define WLED_DISABLE_IMPROV_WIFISCAN | ||||
| #endif | ||||
|  | ||||
| #define IMPROV_VERSION 1 | ||||
|  | ||||
| void parseWiFiCommand(char *rpcData); | ||||
| @@ -28,20 +33,14 @@ enum ImprovPacketByte { | ||||
|   RPC_CommandType = 9 | ||||
| }; | ||||
|  | ||||
| enum ImprovRPCType { | ||||
|   Command_Wifi = 0x01, | ||||
|   Request_State = 0x02, | ||||
|   Request_Info = 0x03 | ||||
| }; | ||||
|  | ||||
| //File dbgf; | ||||
| #ifndef WLED_DISABLE_IMPROV_WIFISCAN | ||||
| static bool improvWifiScanRunning = false; | ||||
| #endif | ||||
|  | ||||
| //blocking function to parse an Improv Serial packet | ||||
| void handleImprovPacket() { | ||||
|   uint8_t header[6] = {'I','M','P','R','O','V'}; | ||||
|  | ||||
|   //dbgf = WLED_FS.open("/improv.log","a"); | ||||
|  | ||||
|   bool timeout = false; | ||||
|   uint8_t waitTime = 25; | ||||
|   uint16_t packetByte = 0; | ||||
| @@ -62,12 +61,11 @@ void handleImprovPacket() { | ||||
|     byte next = Serial.read(); | ||||
|  | ||||
|     DIMPROV_PRINT("Received improv byte: "); DIMPROV_PRINTF("%x\r\n",next); | ||||
|     //f.write(next); | ||||
|  | ||||
|     switch (packetByte) { | ||||
|       case ImprovPacketByte::Version: { | ||||
|         if (next != IMPROV_VERSION) { | ||||
|           DIMPROV_PRINTLN(F("Invalid version")); | ||||
|           //dbgf.close(); | ||||
|           return; | ||||
|         } | ||||
|         break; | ||||
| @@ -75,7 +73,6 @@ void handleImprovPacket() { | ||||
|       case ImprovPacketByte::PacketType: { | ||||
|         if (next != ImprovPacketType::RPC_Command) { | ||||
|           DIMPROV_PRINTF("Non RPC-command improv packet type %i\n",next); | ||||
|           //dbgf.close(); | ||||
|           return; | ||||
|         } | ||||
|         if (!improvActive) improvActive = 1; | ||||
| @@ -89,7 +86,6 @@ void handleImprovPacket() { | ||||
|           if (checksum != next) { | ||||
|             DIMPROV_PRINTF("Got RPC checksum %i, expected %i",next,checksum); | ||||
|             sendImprovStateResponse(0x01, true); | ||||
|             //dbgf.close(); | ||||
|             return; | ||||
|           } | ||||
|  | ||||
| @@ -100,22 +96,23 @@ void handleImprovPacket() { | ||||
|               if (WLED_WIFI_CONFIGURED) improvState = 0x03; //provisioning | ||||
|               if (Network.isConnected()) improvState = 0x04; //provisioned | ||||
|               sendImprovStateResponse(improvState, false); | ||||
|               if (improvState == 0x04) sendImprovRPCResponse(ImprovRPCType::Request_State); | ||||
|               if (improvState == 0x04) sendImprovIPRPCResult(ImprovRPCType::Request_State); | ||||
|               break; | ||||
|             } | ||||
|             case ImprovRPCType::Request_Info: sendImprovInfoResponse(); break; | ||||
|             #ifndef WLED_DISABLE_IMPROV_WIFISCAN | ||||
|             case ImprovRPCType::Request_Scan: startImprovWifiScan(); break; | ||||
|             #endif | ||||
|             default: { | ||||
|               DIMPROV_PRINTF("Unknown RPC command %i\n",next); | ||||
|               sendImprovStateResponse(0x02, true); | ||||
|             } | ||||
|           } | ||||
|           //dbgf.close(); | ||||
|           return; | ||||
|         } | ||||
|         if (packetByte < 6) { //check header | ||||
|           if (next != header[packetByte]) { | ||||
|             DIMPROV_PRINTLN(F("Invalid improv header")); | ||||
|             //dbgf.close(); | ||||
|             return; | ||||
|           } | ||||
|         } else if (packetByte > 9) { //RPC data | ||||
| @@ -128,7 +125,6 @@ void handleImprovPacket() { | ||||
|     checksum += next; | ||||
|     packetByte++; | ||||
|   } | ||||
|   //dbgf.close(); | ||||
| } | ||||
|  | ||||
| void sendImprovStateResponse(uint8_t state, bool error) { | ||||
| @@ -147,79 +143,116 @@ void sendImprovStateResponse(uint8_t state, bool error) { | ||||
|   Serial.write('\n'); | ||||
| } | ||||
|  | ||||
| void sendImprovRPCResponse(byte commandId) { | ||||
| // used by sendImprovIPRPCResult(), sendImprovInfoResponse(), and handleImprovWifiScan() | ||||
| void sendImprovRPCResult(ImprovRPCType type, uint8_t n_strings, const char **strings) { | ||||
|   if (improvError > 0 && improvError < 3) sendImprovStateResponse(0x00, true); | ||||
|   uint8_t packetLen = 12; | ||||
|   char out[64] = {'I','M','P','R','O','V'}; | ||||
|   char out[256] = {'I','M','P','R','O','V'}; | ||||
|   out[6] = IMPROV_VERSION; | ||||
|   out[7] = ImprovPacketType::RPC_Response; | ||||
|   out[8] = 2; //Length (set below) | ||||
|   out[9] = commandId; | ||||
|   out[10] = 0; //Data len (set below) | ||||
|   out[11] = '\0'; //URL len (set below) | ||||
|   //out[8] = 2; //Length (set below) | ||||
|   out[9] = type; | ||||
|   //out[10] = 0; //Data len (set below) | ||||
|   uint16_t pos = 11; | ||||
|  | ||||
|   if (Network.isConnected()) | ||||
|   { | ||||
|     IPAddress localIP = Network.localIP(); | ||||
|     uint8_t len = sprintf(out+12, "http://%d.%d.%d.%d", localIP[0], localIP[1], localIP[2], localIP[3]); | ||||
|     if (len > 24) return; //sprintf fail? | ||||
|     out[11] = len; | ||||
|     out[10] = 1 + len; | ||||
|     out[8] = 3 + len; //RPC command type + data len + url len + url | ||||
|     packetLen = 13 + len; | ||||
|   for (uint8_t s = 0; s < n_strings; s++) { | ||||
|     size_t len = strlen(strings[s]); | ||||
|     if (pos + len > 254) continue; // simple buffer overflow guard | ||||
|     out[pos++] = len; | ||||
|     strcpy(out + pos, strings[s]); | ||||
|     pos += len; | ||||
|   } | ||||
|  | ||||
|   packetLen = pos  +1; | ||||
|   out[8]    = pos  -9; // Length of packet (excluding first 9 header bytes and final checksum byte) | ||||
|   out[10]   = pos -11; // Data len | ||||
|  | ||||
|   uint8_t checksum = 0; | ||||
|   for (uint8_t i = 0; i < packetLen -1; i++) checksum += out[i]; | ||||
|   out[packetLen -1] = checksum; | ||||
|   Serial.write((uint8_t*)out, packetLen); | ||||
|   Serial.write('\n'); | ||||
|   DIMPROV_PRINT("RPC result checksum"); | ||||
|   DIMPROV_PRINTLN(checksum); | ||||
| } | ||||
|  | ||||
| void sendImprovIPRPCResult(ImprovRPCType type) { | ||||
|   if (Network.isConnected()) | ||||
|   { | ||||
|     char urlStr[64]; | ||||
|     IPAddress localIP = Network.localIP(); | ||||
|     uint8_t len = sprintf(urlStr, "http://%d.%d.%d.%d", localIP[0], localIP[1], localIP[2], localIP[3]); | ||||
|     if (len > 24) return; //sprintf fail? | ||||
|     const char *str[1] = {urlStr}; | ||||
|     sendImprovRPCResult(type, 1, str); | ||||
|   } else { | ||||
|     sendImprovRPCResult(type, 0); | ||||
|   } | ||||
|  | ||||
|   improvActive = 1; //no longer provisioning | ||||
| } | ||||
|  | ||||
| void sendImprovInfoResponse() { | ||||
|   if (improvError > 0 && improvError < 3) sendImprovStateResponse(0x00, true); | ||||
|   uint8_t packetLen = 12; | ||||
|   char out[128] = {'I','M','P','R','O','V'}; | ||||
|   out[6] = IMPROV_VERSION; | ||||
|   out[7] = ImprovPacketType::RPC_Response; | ||||
|   //out[8] = 2; //Length (set below) | ||||
|   out[9] = ImprovRPCType::Request_Info; | ||||
|   //out[10] = 0; //Data len (set below) | ||||
|   out[11] = 4; //Firmware len ("WLED") | ||||
|   out[12] = 'W'; out[13] = 'L'; out[14] = 'E'; out[15] = 'D'; | ||||
|   uint8_t lengthSum = 17; | ||||
|   uint8_t vlen = sprintf_P(out+lengthSum,PSTR("0.14.0-b3/%i"),VERSION); | ||||
|   out[16] = vlen; lengthSum += vlen; | ||||
|   uint8_t hlen = 7; | ||||
|   #ifdef ESP8266 | ||||
|   strcpy(out+lengthSum+1,"esp8266"); | ||||
|   #else | ||||
|   hlen = 5; | ||||
|   strcpy(out+lengthSum+1,"esp32"); | ||||
|   #endif | ||||
|   out[lengthSum] = hlen; | ||||
|   lengthSum += hlen + 1; | ||||
|   const char* bString =  | ||||
|     #ifdef ESP8266 | ||||
|       "esp8266" | ||||
|     #elif CONFIG_IDF_TARGET_ESP32C3 | ||||
|       "esp32-c3" | ||||
|     #elif CONFIG_IDF_TARGET_ESP32S2 | ||||
|       "esp32-s2" | ||||
|     #elif CONFIG_IDF_TARGET_ESP32S3 | ||||
|       "esp32-s3"; | ||||
|     #else // ESP32 | ||||
|       "esp32"; | ||||
|     #endif | ||||
|     ; | ||||
|  | ||||
|   //Use serverDescription if it has been changed from the default "WLED", else mDNS name | ||||
|   bool useMdnsName = (strcmp(serverDescription, "WLED") == 0 && strlen(cmDNS) > 0); | ||||
|   strcpy(out+lengthSum+1,useMdnsName ? cmDNS : serverDescription); | ||||
|   uint8_t nlen = strlen(useMdnsName ? cmDNS : serverDescription); | ||||
|   out[lengthSum] = nlen; | ||||
|   lengthSum += nlen + 1; | ||||
|   char vString[20]; | ||||
|   sprintf_P(vString, PSTR("0.14.0-b4/%i"), VERSION); | ||||
|   const char *str[4] = {"WLED", vString, bString, useMdnsName ? cmDNS : serverDescription}; | ||||
|  | ||||
|   packetLen = lengthSum +1; | ||||
|   out[8] = lengthSum -9; | ||||
|   out[10] = lengthSum -11; | ||||
|  | ||||
|   uint8_t checksum = 0; | ||||
|   for (uint8_t i = 0; i < packetLen -1; i++) checksum += out[i]; | ||||
|   out[packetLen -1] = checksum; | ||||
|   Serial.write((uint8_t*)out, packetLen); | ||||
|   Serial.write('\n'); | ||||
|   DIMPROV_PRINT("Info checksum"); | ||||
|   DIMPROV_PRINTLN(checksum); | ||||
|   sendImprovRPCResult(ImprovRPCType::Request_Info, 4, str); | ||||
| } | ||||
|  | ||||
| #ifndef WLED_DISABLE_IMPROV_WIFISCAN | ||||
| void startImprovWifiScan() { | ||||
|   if (improvWifiScanRunning) return; | ||||
|   WiFi.scanNetworks(true); | ||||
|   improvWifiScanRunning = true; | ||||
| } | ||||
|  | ||||
| void handleImprovWifiScan() { | ||||
|   if (!improvWifiScanRunning) return; | ||||
|   int16_t status = WiFi.scanComplete(); | ||||
|   if (status == WIFI_SCAN_RUNNING) return; | ||||
|   // here scan completed or failed (-2) | ||||
|   improvWifiScanRunning = false; | ||||
|  | ||||
|   for (int i = 0; i < status; i++) { | ||||
|     char rssiStr[8]; | ||||
|     sprintf(rssiStr, "%d", WiFi.RSSI(i)); | ||||
|     #ifdef ESP8266 | ||||
|     bool isOpen = WiFi.encryptionType(i) == ENC_TYPE_NONE; | ||||
|     #else | ||||
|     bool isOpen = WiFi.encryptionType(i) == WIFI_AUTH_OPEN; | ||||
|     #endif | ||||
|  | ||||
|     char ssidStr[33]; | ||||
|     strcpy(ssidStr, WiFi.SSID(i).c_str()); | ||||
|     const char *str[3] = {ssidStr, rssiStr, isOpen ? "NO":"YES"}; | ||||
|     sendImprovRPCResult(ImprovRPCType::Request_Scan, 3, str); | ||||
|   } | ||||
|   sendImprovRPCResult(ImprovRPCType::Request_Scan, 0); | ||||
|  | ||||
|   WiFi.scanDelete(); | ||||
| } | ||||
| #else | ||||
| void startImprovWifiScan() {} | ||||
| void handleImprovWifiScan() {} | ||||
| #endif | ||||
|  | ||||
| void parseWiFiCommand(char* rpcData) { | ||||
|   uint8_t len = rpcData[0]; | ||||
|   if (!len || len > 126) return; | ||||
|   | ||||
| @@ -70,13 +70,9 @@ void decBrightness() | ||||
|   } | ||||
| } | ||||
|  | ||||
| // apply preset or fallback to a effect and palette if it doesn't exist | ||||
| void presetFallback(uint8_t presetID, uint8_t effectID, uint8_t paletteID) | ||||
| { | ||||
|   applyPreset(presetID, CALL_MODE_BUTTON_PRESET); | ||||
|   //these two will be overwritten if preset exists in handlePresets() | ||||
|   effectCurrent = effectID; | ||||
|   effectPalette = paletteID; | ||||
|   applyPresetWithFallback(presetID, CALL_MODE_BUTTON_PRESET, effectID, paletteID); | ||||
| } | ||||
|  | ||||
| byte relativeChange(byte property, int8_t amount, byte lowerBoundary, byte higherBoundary) | ||||
|   | ||||
| @@ -22,7 +22,7 @@ bool deserializeSegment(JsonObject elem, byte it, byte presetId) | ||||
|  | ||||
|   int stop = elem["stop"] | -1; | ||||
|  | ||||
|   // if using vectors use this code to append segment | ||||
|   // append segment | ||||
|   if (id >= strip.getSegmentsNum()) { | ||||
|     if (stop <= 0) return false; // ignore empty/inactive segments | ||||
|     strip.appendSegment(Segment(0, strip.getLengthTotal())); | ||||
| @@ -34,7 +34,7 @@ bool deserializeSegment(JsonObject elem, byte it, byte presetId) | ||||
|  | ||||
|   uint16_t start = elem["start"] | seg.start; | ||||
|   if (stop < 0) { | ||||
|     uint16_t len = elem["len"]; | ||||
|     int len = elem["len"]; | ||||
|     stop = (len > 0) ? start + len : seg.stop; | ||||
|   } | ||||
|   // 2D segments | ||||
| @@ -70,9 +70,10 @@ bool deserializeSegment(JsonObject elem, byte it, byte presetId) | ||||
|     const char * name = elem["n"].as<const char*>(); | ||||
|     size_t len = 0; | ||||
|     if (name != nullptr) len = strlen(name); | ||||
|     if (len > 0 && len < 33) { | ||||
|     if (len > 0) { | ||||
|       if (len > WLED_MAX_SEGNAME_LEN) len = WLED_MAX_SEGNAME_LEN; | ||||
|       seg.name = new char[len+1]; | ||||
|       if (seg.name) strlcpy(seg.name, name, 33); | ||||
|       if (seg.name) strlcpy(seg.name, name, WLED_MAX_SEGNAME_LEN+1); | ||||
|     } else { | ||||
|       // but is empty (already deleted above) | ||||
|       elem.remove("n"); | ||||
| @@ -109,7 +110,11 @@ bool deserializeSegment(JsonObject elem, byte it, byte presetId) | ||||
|     of = offsetAbs; | ||||
|   } | ||||
|   if (stop > start && of > len -1) of = len -1; | ||||
|   seg.setUp(start, stop, grp, spc, of, startY, stopY); | ||||
|  | ||||
|   // update segment (delete if necessary) | ||||
|   // do not call seg.setUp() here, as it may cause a crash due to concurrent access if the segment is currently drawing effects | ||||
|   // WS2812FX handles queueing of the change | ||||
|   strip.setSegment(id, start, stop, grp, spc, of, startY, stopY); | ||||
|  | ||||
|   if (seg.reset && seg.stop == 0) return true; // segment was deleted & is marked for reset, no need to change anything else | ||||
|  | ||||
| @@ -425,7 +430,7 @@ bool deserializeState(JsonObject root, byte callMode, byte presetId) | ||||
|   // a) already applied preset content (requires "seg" or "win" but will ignore the rest) | ||||
|   if (!root["pd"].isNull() && stateChanged) { | ||||
|     currentPreset = root[F("pd")] | currentPreset; | ||||
|     if (root["win"].isNull()) presetCycCurr = currentPreset; | ||||
|     if (root["win"].isNull()) presetCycCurr = currentPreset; // otherwise it was set in handleSet() [set.cpp] | ||||
|     presetToRestore = currentPreset; // stateUpdated() will clear the preset, so we need to restore it after | ||||
|     //unloadPlaylist(); // applying a preset unloads the playlist, may be needed here too? | ||||
|   } else if (!root["ps"].isNull()) { | ||||
| @@ -467,10 +472,12 @@ void serializeSegment(JsonObject& root, Segment& seg, byte id, bool forPreset, b | ||||
|   if (segmentBounds) { | ||||
|     root["start"] = seg.start; | ||||
|     root["stop"] = seg.stop; | ||||
|     #ifndef WLED_DISABLE_2D | ||||
|     if (strip.isMatrix) { | ||||
|       root[F("startY")] = seg.startY; | ||||
|       root[F("stopY")]  = seg.stopY; | ||||
|     } | ||||
|     #endif | ||||
|   } | ||||
|   if (!forPreset) root["len"] = seg.stop - seg.start; | ||||
|   root["grp"]    = seg.grouping; | ||||
| @@ -1059,7 +1066,10 @@ void serveJson(AsyncWebServerRequest* request) | ||||
|  | ||||
|   DEBUG_PRINTF("JSON buffer size: %u for request: %d\n", lDoc.memoryUsage(), subJson); | ||||
|  | ||||
|   size_t len = response->setLength(); | ||||
|   #ifdef WLED_DEBUG | ||||
|   size_t len = | ||||
|   #endif | ||||
|   response->setLength(); | ||||
|   DEBUG_PRINT(F("JSON content length: ")); DEBUG_PRINTLN(len); | ||||
|  | ||||
|   request->send(response); | ||||
| @@ -1089,9 +1099,13 @@ bool serveLiveLeds(AsyncWebServerRequest* request, uint32_t wsClient) | ||||
|   for (size_t i= 0; i < used; i += n) | ||||
|   { | ||||
|     uint32_t c = strip.getPixelColor(i); | ||||
|     uint8_t r = qadd8(W(c), R(c)); //add white channel to RGB channels as a simple RGBW -> RGB map | ||||
|     uint8_t g = qadd8(W(c), G(c)); | ||||
|     uint8_t b = qadd8(W(c), B(c)); | ||||
|     uint8_t r = R(c); | ||||
|     uint8_t g = G(c); | ||||
|     uint8_t b = B(c); | ||||
|     uint8_t w = W(c); | ||||
|     r = scale8(qadd8(w, r), strip.getBrightness()); //R, add white channel to RGB channels as a simple RGBW -> RGB map | ||||
|     g = scale8(qadd8(w, g), strip.getBrightness()); //G | ||||
|     b = scale8(qadd8(w, b), strip.getBrightness()); //B | ||||
|     olen += sprintf(obuf + olen, "\"%06X\",", RGBW32(r,g,b,0)); | ||||
|   } | ||||
|   olen -= 1; | ||||
|   | ||||
| @@ -104,6 +104,7 @@ void stateUpdated(byte callMode) { | ||||
|     if (stateChanged) currentPreset = 0; //something changed, so we are no longer in the preset | ||||
|  | ||||
|     if (callMode != CALL_MODE_NOTIFICATION && callMode != CALL_MODE_NO_NOTIFY) notify(callMode); | ||||
|     if (bri != briOld && nodeBroadcastEnabled) sendSysInfoUDP(); // update on state | ||||
|  | ||||
|     //set flag to update ws and mqtt | ||||
|     interfaceUpdateCallMode = callMode; | ||||
| @@ -146,8 +147,8 @@ void stateUpdated(byte callMode) { | ||||
|     if (transitionActive) { | ||||
|       briOld = briT; | ||||
|       tperLast = 0; | ||||
|     } | ||||
|     strip.setTransitionMode(true); // force all segments to transition mode | ||||
|     } else | ||||
|       strip.setTransitionMode(true); // force all segments to transition mode | ||||
|     transitionActive = true; | ||||
|     transitionStartTime = millis(); | ||||
|   } else { | ||||
| @@ -194,7 +195,7 @@ void handleTransitions() | ||||
|       applyFinalBri(); | ||||
|       return; | ||||
|     } | ||||
|     if (tper - tperLast < 0.004) return; | ||||
|     if (tper - tperLast < 0.004f) return; | ||||
|     tperLast = tper; | ||||
|     briT = briOld + ((bri - briOld) * tper); | ||||
|  | ||||
| @@ -204,7 +205,7 @@ void handleTransitions() | ||||
|  | ||||
|  | ||||
| // legacy method, applies values from col, effectCurrent, ... to selected segments | ||||
| void colorUpdated(byte callMode){ | ||||
| void colorUpdated(byte callMode) { | ||||
|   applyValuesToSelectedSegs(); | ||||
|   stateUpdated(callMode); | ||||
| } | ||||
|   | ||||
| @@ -120,6 +120,15 @@ bool applyPreset(byte index, byte callMode) | ||||
|   return true; | ||||
| } | ||||
|  | ||||
| // apply preset or fallback to a effect and palette if it doesn't exist | ||||
| void applyPresetWithFallback(uint8_t index, uint8_t callMode, uint8_t effectID, uint8_t paletteID) | ||||
| { | ||||
|   applyPreset(index, callMode); | ||||
|   //these two will be overwritten if preset exists in handlePresets() | ||||
|   effectCurrent = effectID; | ||||
|   effectPalette = paletteID; | ||||
| } | ||||
|  | ||||
| void handlePresets() | ||||
| { | ||||
|   if (presetToSave) { | ||||
| @@ -171,7 +180,7 @@ void handlePresets() | ||||
|       fdo.remove("ps"); // remove load request for presets to prevent recursive crash (if not called by button and contains preset cycling string "1~5~") | ||||
|     deserializeState(fdo, CALL_MODE_NO_NOTIFY, tmpPreset); // may change presetToApply by calling applyPreset() | ||||
|   } | ||||
|   if (!errorFlag && tmpPreset < 255 && changePreset) presetCycCurr = currentPreset = tmpPreset; | ||||
|   if (!errorFlag && tmpPreset < 255 && changePreset) currentPreset = tmpPreset; | ||||
|  | ||||
|   #if defined(ARDUINO_ARCH_ESP32) | ||||
|   //Aircoookie recommended not to delete buffer | ||||
|   | ||||
							
								
								
									
										200
									
								
								wled00/remote.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										200
									
								
								wled00/remote.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,200 @@ | ||||
| #include "wled.h" | ||||
|  | ||||
| #define ESP_NOW_STATE_UNINIT       0 | ||||
| #define ESP_NOW_STATE_ON           1 | ||||
| #define ESP_NOW_STATE_ERROR        2 | ||||
|  | ||||
| #define NIGHT_MODE_DEACTIVATED     -1 | ||||
| #define NIGHT_MODE_BRIGHTNESS      5 | ||||
|  | ||||
| #define WIZMOTE_BUTTON_ON          1 | ||||
| #define WIZMOTE_BUTTON_OFF         2 | ||||
| #define WIZMOTE_BUTTON_NIGHT       3 | ||||
| #define WIZMOTE_BUTTON_ONE         16 | ||||
| #define WIZMOTE_BUTTON_TWO         17 | ||||
| #define WIZMOTE_BUTTON_THREE       18 | ||||
| #define WIZMOTE_BUTTON_FOUR        19 | ||||
| #define WIZMOTE_BUTTON_BRIGHT_UP   9 | ||||
| #define WIZMOTE_BUTTON_BRIGHT_DOWN 8 | ||||
|  | ||||
| #ifdef WLED_DISABLE_ESPNOW | ||||
| void handleRemote(){} | ||||
| #else | ||||
|  | ||||
| // This is kind of an esoteric strucure because it's pulled from the "Wizmote" | ||||
| // product spec. That remote is used as the baseline for behavior and availability | ||||
| // since it's broadly commercially available and works out of the box as a drop-in | ||||
| typedef struct message_structure { | ||||
|   uint8_t program;      // 0x91 for ON button, 0x81 for all others | ||||
|   uint8_t seq[4];       // Incremetal sequence number 32 bit unsigned integer LSB first | ||||
|   uint8_t byte5 = 32;   // Unknown | ||||
|   uint8_t button;       // Identifies which button is being pressed | ||||
|   uint8_t byte8 = 1;    // Unknown, but always 0x01 | ||||
|   uint8_t byte9 = 100;  // Unnkown, but always 0x64 | ||||
|  | ||||
|   uint8_t byte10;  // Unknown, maybe checksum | ||||
|   uint8_t byte11;  // Unknown, maybe checksum | ||||
|   uint8_t byte12;  // Unknown, maybe checksum | ||||
|   uint8_t byte13;  // Unknown, maybe checksum | ||||
| } message_structure; | ||||
|  | ||||
| static int esp_now_state = ESP_NOW_STATE_UNINIT; | ||||
| static uint32_t last_seq = UINT32_MAX; | ||||
| static int brightnessBeforeNightMode = NIGHT_MODE_DEACTIVATED; | ||||
| static message_structure incoming; | ||||
|  | ||||
| // Pulled from the IR Remote logic but reduced to 10 steps with a constant of 3 | ||||
| static const byte brightnessSteps[] = { | ||||
|   6, 9, 14, 22, 33, 50, 75, 113, 170, 255 | ||||
| }; | ||||
| static const size_t numBrightnessSteps = sizeof(brightnessSteps) / sizeof(uint8_t); | ||||
|  | ||||
| static bool nightModeActive() { | ||||
|   return brightnessBeforeNightMode != NIGHT_MODE_DEACTIVATED; | ||||
| } | ||||
|  | ||||
| static void activateNightMode() { | ||||
|   brightnessBeforeNightMode = bri; | ||||
|   bri = NIGHT_MODE_BRIGHTNESS; | ||||
| } | ||||
|  | ||||
| static bool resetNightMode() { | ||||
|   if (!nightModeActive()) { | ||||
|     return false; | ||||
|   } | ||||
|   bri = brightnessBeforeNightMode; | ||||
|   brightnessBeforeNightMode = NIGHT_MODE_DEACTIVATED; | ||||
|   return true; | ||||
| } | ||||
|  | ||||
| // increment `bri` to the next `brightnessSteps` value | ||||
| static void brightnessUp() { | ||||
|   if (nightModeActive()) { return; } | ||||
|   // dumb incremental search is efficient enough for so few items | ||||
|   for (uint8_t index = 0; index < numBrightnessSteps; ++index) { | ||||
|     if (brightnessSteps[index] > bri) { | ||||
|       bri = brightnessSteps[index]; | ||||
|       break; | ||||
|     } | ||||
|   } | ||||
| } | ||||
|  | ||||
| // decrement `bri` to the next `brightnessSteps` value | ||||
| static void brightnessDown() { | ||||
|   if (nightModeActive()) { return; } | ||||
|   // dumb incremental search is efficient enough for so few items | ||||
|   for (int index = numBrightnessSteps - 1; index >= 0; --index) { | ||||
|     if (brightnessSteps[index] < bri) { | ||||
|       bri = brightnessSteps[index]; | ||||
|       break; | ||||
|     } | ||||
|   } | ||||
| } | ||||
|  | ||||
| static void setOn() { | ||||
|   if (resetNightMode()) { | ||||
|     stateUpdated(CALL_MODE_BUTTON); | ||||
|   } | ||||
|   if (!bri) { | ||||
|     toggleOnOff();  | ||||
|   } | ||||
| } | ||||
|  | ||||
| static void setOff() { | ||||
|   if (resetNightMode()) { | ||||
|     stateUpdated(CALL_MODE_BUTTON); | ||||
|   } | ||||
|   if (bri) { | ||||
|     toggleOnOff();  | ||||
|   } | ||||
| } | ||||
|  | ||||
| static void presetWithFallback(uint8_t presetID, uint8_t effectID, uint8_t paletteID) { | ||||
|   applyPresetWithFallback(presetID, CALL_MODE_BUTTON_PRESET, effectID, paletteID); | ||||
| } | ||||
|   | ||||
| // Callback function that will be executed when data is received | ||||
| #ifdef ESP8266 | ||||
| void OnDataRecv(uint8_t * mac, uint8_t *incomingData, uint8_t len) { | ||||
| #else | ||||
| void OnDataRecv(const uint8_t * mac, const uint8_t *incomingData, int len) { | ||||
| #endif | ||||
|  | ||||
|   sprintf (last_signal_src, "%02x%02x%02x%02x%02x%02x", | ||||
|     mac [0], mac [1], mac [2], mac [3], mac [4], mac [5]); | ||||
|  | ||||
|   if (strcmp(last_signal_src, linked_remote) != 0) { | ||||
|     DEBUG_PRINT(F("ESP Now Message Received from Unlinked Sender: ")); | ||||
|     DEBUG_PRINTLN(last_signal_src); | ||||
|     return; | ||||
|   } | ||||
|  | ||||
|   if (len != sizeof(incoming)) { | ||||
|     DEBUG_PRINT(F("Unknown incoming ESP Now message received of length ")); | ||||
|     DEBUG_PRINTLN(len); | ||||
|     return; | ||||
|   } | ||||
|  | ||||
|   memcpy(&(incoming.program), incomingData, sizeof(incoming)); | ||||
|   uint32_t cur_seq = incoming.seq[0] | (incoming.seq[1] << 8) | (incoming.seq[2] << 16) | (incoming.seq[3] << 24); | ||||
|  | ||||
|   if (cur_seq == last_seq) { | ||||
|     return; | ||||
|   } | ||||
|  | ||||
|  | ||||
|   DEBUG_PRINT(F("Incoming ESP Now Packet[")); | ||||
|   DEBUG_PRINT(cur_seq); | ||||
|   DEBUG_PRINT(F("] from sender[")); | ||||
|   DEBUG_PRINT(last_signal_src); | ||||
|   DEBUG_PRINT(F("] button: ")); | ||||
|   DEBUG_PRINTLN(incoming.button); | ||||
|   switch (incoming.button) { | ||||
|     case WIZMOTE_BUTTON_ON             : setOn();                                         stateUpdated(CALL_MODE_BUTTON); break; | ||||
|     case WIZMOTE_BUTTON_OFF            : setOff();                                        stateUpdated(CALL_MODE_BUTTON); break; | ||||
|     case WIZMOTE_BUTTON_ONE            : presetWithFallback(1, FX_MODE_STATIC,        0); resetNightMode(); break; | ||||
|     case WIZMOTE_BUTTON_TWO            : presetWithFallback(2, FX_MODE_BREATH,        0); resetNightMode(); break; | ||||
|     case WIZMOTE_BUTTON_THREE          : presetWithFallback(3, FX_MODE_FIRE_FLICKER,  0); resetNightMode(); break; | ||||
|     case WIZMOTE_BUTTON_FOUR           : presetWithFallback(4, FX_MODE_RAINBOW,       0); resetNightMode(); break; | ||||
|     case WIZMOTE_BUTTON_NIGHT          : activateNightMode();                             stateUpdated(CALL_MODE_BUTTON); break; | ||||
|     case WIZMOTE_BUTTON_BRIGHT_UP      : brightnessUp();                                  stateUpdated(CALL_MODE_BUTTON); break; | ||||
|     case WIZMOTE_BUTTON_BRIGHT_DOWN    : brightnessDown();                                stateUpdated(CALL_MODE_BUTTON); break; | ||||
|     default: break; | ||||
|  | ||||
|   } | ||||
|  | ||||
|   last_seq = cur_seq; | ||||
| } | ||||
|  | ||||
| void handleRemote() { | ||||
|   if (enable_espnow_remote) { | ||||
|     if ((esp_now_state == ESP_NOW_STATE_UNINIT) && (interfacesInited || apActive)) { // ESPNOW requires Wifi to be initialized (either STA, or AP Mode)  | ||||
|       DEBUG_PRINTLN(F("Initializing ESP_NOW listener")); | ||||
|       // Init ESP-NOW | ||||
|       if (esp_now_init() != 0) { | ||||
|         DEBUG_PRINTLN(F("Error initializing ESP-NOW")); | ||||
|         esp_now_state = ESP_NOW_STATE_ERROR; | ||||
|       } | ||||
|  | ||||
|       #ifdef ESP8266 | ||||
|       esp_now_set_self_role(ESP_NOW_ROLE_SLAVE); | ||||
|       #endif | ||||
|        | ||||
|       esp_now_register_recv_cb(OnDataRecv); | ||||
|       esp_now_state = ESP_NOW_STATE_ON; | ||||
|     } | ||||
|   } else { | ||||
|     if (esp_now_state == ESP_NOW_STATE_ON) { | ||||
|       DEBUG_PRINTLN(F("Disabling ESP-NOW Remote Listener")); | ||||
|       if (esp_now_deinit() != 0) { | ||||
|         DEBUG_PRINTLN(F("Error de-initializing ESP-NOW")); | ||||
|       } | ||||
|       esp_now_state = ESP_NOW_STATE_UNINIT; | ||||
|     } else if (esp_now_state == ESP_NOW_STATE_ERROR) { | ||||
|       //Clear any error states (allows retrying by cycling) | ||||
|       esp_now_state = ESP_NOW_STATE_UNINIT; | ||||
|     } | ||||
|   } | ||||
| } | ||||
|  | ||||
| #endif | ||||
| @@ -34,6 +34,14 @@ void handleSettingsSet(AsyncWebServerRequest *request, byte subPage) | ||||
|  | ||||
|     noWifiSleep = request->hasArg(F("WS")); | ||||
|  | ||||
|     #ifndef WLED_DISABLE_ESPNOW | ||||
|     enable_espnow_remote = request->hasArg(F("RE")); | ||||
|     strlcpy(linked_remote,request->arg(F("RMAC")).c_str(), 13); | ||||
|  | ||||
|     //Normalize MAC format to lowercase | ||||
|     strlcpy(linked_remote,strlwr(linked_remote), 13); | ||||
|     #endif | ||||
|  | ||||
|     #ifdef WLED_USE_ETHERNET | ||||
|     ethernetType = request->arg(F("ETH")).toInt(); | ||||
|     WLED::instance().initEthernet(); | ||||
| @@ -83,7 +91,7 @@ void handleSettingsSet(AsyncWebServerRequest *request, byte subPage) | ||||
|     Bus::setCCTBlend(strip.cctBlending); | ||||
|     Bus::setGlobalAWMode(request->arg(F("AW")).toInt()); | ||||
|     strip.setTargetFps(request->arg(F("FR")).toInt()); | ||||
|     strip.useLedsArray = request->hasArg(F("LD")); | ||||
|     useGlobalLedBuffer = request->hasArg(F("LD")); | ||||
|  | ||||
|     bool busesChanged = false; | ||||
|     for (uint8_t s = 0; s < WLED_MAX_BUSSES+WLED_MIN_VIRTUAL_BUSSES; s++) { | ||||
| @@ -145,7 +153,7 @@ void handleSettingsSet(AsyncWebServerRequest *request, byte subPage) | ||||
|       // actual finalization is done in WLED::loop() (removing old busses and adding new) | ||||
|       // this may happen even before this loop is finished so we do "doInitBusses" after the loop | ||||
|       if (busConfigs[s] != nullptr) delete busConfigs[s]; | ||||
|       busConfigs[s] = new BusConfig(type, pins, start, length, colorOrder | (channelSwap<<4), request->hasArg(cv), skip, awmode, freqHz); | ||||
|       busConfigs[s] = new BusConfig(type, pins, start, length, colorOrder | (channelSwap<<4), request->hasArg(cv), skip, awmode, freqHz, useGlobalLedBuffer); | ||||
|       busesChanged = true; | ||||
|     } | ||||
|     //doInitBusses = busesChanged; // we will do that below to ensure all input data is processed | ||||
| @@ -789,7 +797,7 @@ bool handleSet(AsyncWebServerRequest *request, const String& req, bool apply) | ||||
|   if (pos > 0) { | ||||
|     spcI = getNumVal(&req, pos); | ||||
|   } | ||||
|   selseg.setUp(startI, stopI, grpI, spcI, UINT16_MAX, startY, stopY); | ||||
|   strip.setSegment(selectedSeg, startI, stopI, grpI, spcI, UINT16_MAX, startY, stopY); | ||||
|  | ||||
|   pos = req.indexOf(F("RV=")); //Segment reverse | ||||
|   if (pos > 0) selseg.reverse = req.charAt(pos+3) != '0'; | ||||
|   | ||||
| @@ -669,6 +669,7 @@ void sendSysInfoUDP() | ||||
|   #else | ||||
|   data[38] = NODE_TYPE_ID_UNDEFINED; | ||||
|   #endif | ||||
|   if (bri) data[38] |= 0x80U;  // add on/off state | ||||
|   data[39] = ip[3]; // unit ID == last IP number | ||||
|  | ||||
|   uint32_t build = VERSION; | ||||
|   | ||||
| @@ -133,6 +133,10 @@ | ||||
|   #include "../usermods/wizlights/wizlights.h" | ||||
| #endif | ||||
|  | ||||
| #ifdef USERMOD_WIREGUARD | ||||
|   #include "../usermods/wireguard/wireguard.h" | ||||
| #endif | ||||
|  | ||||
| #ifdef USERMOD_WORDCLOCK | ||||
|   #include "../usermods/usermod_v2_word_clock/usermod_v2_word_clock.h" | ||||
| #endif | ||||
| @@ -306,6 +310,10 @@ void registerUsermods() | ||||
|   usermods.add(new WizLightsUsermod()); | ||||
|   #endif | ||||
|  | ||||
|   #ifdef USERMOD_WIREGUARD | ||||
|   usermods.add(new WireguardUsermod()); | ||||
|   #endif | ||||
|  | ||||
|   #ifdef USERMOD_WORDCLOCK | ||||
|   usermods.add(new WordClockUsermod()); | ||||
|   #endif | ||||
|   | ||||
| @@ -503,8 +503,8 @@ um_data_t* simulateSound(uint8_t simulationId) | ||||
|   } | ||||
|  | ||||
|   samplePeak    = random8() > 250; | ||||
|   FFT_MajorPeak = volumeSmth; | ||||
|   maxVol        = 10;  // this gets feedback fro UI | ||||
|   FFT_MajorPeak = 21 + (volumeSmth*volumeSmth) / 8.0f; // walk thru full range of 21hz...8200hz | ||||
|   maxVol        = 31;  // this gets feedback fro UI | ||||
|   binNum        = 8;   // this gets feedback fro UI | ||||
|   volumeRaw = volumeSmth; | ||||
|   my_magnitude = 10000.0 / 8.0f; //no idea if 10000 is a good value for FFT_Magnitude ??? | ||||
|   | ||||
| @@ -23,7 +23,7 @@ void WLED::reset() | ||||
|   #ifdef WLED_ENABLE_WEBSOCKETS | ||||
|   ws.closeAll(1012); | ||||
|   #endif | ||||
|   long dly = millis(); | ||||
|   unsigned long dly = millis(); | ||||
|   while (millis() - dly < 450) { | ||||
|     yield();        // enough time to send response to client | ||||
|   } | ||||
| @@ -35,10 +35,18 @@ void WLED::reset() | ||||
| void WLED::loop() | ||||
| { | ||||
|   #ifdef WLED_DEBUG | ||||
|   static unsigned long lastRun = 0; | ||||
|   unsigned long        loopMillis = millis(); | ||||
|   size_t               loopDelay = loopMillis - lastRun; | ||||
|   if (lastRun == 0) loopDelay=0; // startup - don't have valid data from last run. | ||||
|   if (loopDelay > 2) DEBUG_PRINTF("Loop delayed more than %ums.\n", loopDelay); | ||||
|   static unsigned long maxLoopMillis = 0; | ||||
|   static size_t        avgLoopMillis = 0; | ||||
|   static unsigned long maxUsermodMillis = 0; | ||||
|   static uint16_t avgUsermodMillis = 0; | ||||
|   static size_t        avgUsermodMillis = 0; | ||||
|   static unsigned long maxStripMillis = 0; | ||||
|   static uint16_t avgStripMillis = 0; | ||||
|   static size_t        avgStripMillis = 0; | ||||
|   unsigned long        stripMillis; | ||||
|   #endif | ||||
|  | ||||
|   handleTime(); | ||||
| @@ -46,7 +54,11 @@ void WLED::loop() | ||||
|   handleIR();        // 2nd call to function needed for ESP32 to return valid results -- should be good for ESP8266, too | ||||
|   #endif | ||||
|   handleConnection(); | ||||
|   #ifndef WLED_DISABLE_ESPNOW | ||||
|   handleRemote(); | ||||
|   #endif | ||||
|   handleSerial(); | ||||
|   handleImprovWifiScan(); | ||||
|   handleNotifications(); | ||||
|   handleTransitions(); | ||||
| #ifdef WLED_ENABLE_DMX | ||||
| @@ -78,6 +90,9 @@ void WLED::loop() | ||||
|     yield(); | ||||
|   } | ||||
|  | ||||
|   #ifdef WLED_DEBUG | ||||
|   stripMillis = millis(); | ||||
|   #endif | ||||
|   if (!realtimeMode || realtimeOverride || (realtimeMode && useMainSegmentOnly))  // block stuff if WARLS/Adalight is enabled | ||||
|   { | ||||
|     if (apActive) dnsServer.processNextRequest(); | ||||
| @@ -96,22 +111,18 @@ void WLED::loop() | ||||
|     handlePresets(); | ||||
|     yield(); | ||||
|  | ||||
|     #ifdef WLED_DEBUG | ||||
|     unsigned long stripMillis = millis(); | ||||
|     #endif | ||||
|     if (!offMode || strip.isOffRefreshRequired()) | ||||
|       strip.service(); | ||||
|     #ifdef ESP8266 | ||||
|     else if (!noWifiSleep) | ||||
|       delay(1); //required to make sure ESP enters modem sleep (see #1184) | ||||
|     #endif | ||||
|     #ifdef WLED_DEBUG | ||||
|     stripMillis = millis() - stripMillis; | ||||
|     if (stripMillis > 50) DEBUG_PRINTLN("Slow strip."); | ||||
|     avgStripMillis += stripMillis; | ||||
|     if (stripMillis > maxStripMillis) maxStripMillis = stripMillis; | ||||
|     #endif | ||||
|   } | ||||
|   #ifdef WLED_DEBUG | ||||
|   stripMillis = millis() - stripMillis; | ||||
|   avgStripMillis += stripMillis; | ||||
|   if (stripMillis > maxStripMillis) maxStripMillis = stripMillis; | ||||
|   #endif | ||||
|  | ||||
|   yield(); | ||||
| #ifdef ESP8266 | ||||
| @@ -150,11 +161,16 @@ void WLED::loop() | ||||
|     DEBUG_PRINTLN(F("Re-init busses.")); | ||||
|     bool aligned = strip.checkSegmentAlignment(); //see if old segments match old bus(ses) | ||||
|     busses.removeAll(); | ||||
|     uint32_t mem = 0; | ||||
|     uint32_t mem = 0, globalBufMem = 0; | ||||
|     uint16_t maxlen = 0; | ||||
|     for (uint8_t i = 0; i < WLED_MAX_BUSSES+WLED_MIN_VIRTUAL_BUSSES; i++) { | ||||
|       if (busConfigs[i] == nullptr) break; | ||||
|       mem += BusManager::memUsage(*busConfigs[i]); | ||||
|       if (mem <= MAX_LED_MEMORY) { | ||||
|       if (useGlobalLedBuffer && busConfigs[i]->start + busConfigs[i]->count > maxlen) { | ||||
|           maxlen = busConfigs[i]->start + busConfigs[i]->count; | ||||
|           globalBufMem = maxlen * 4; | ||||
|       } | ||||
|       if (mem + globalBufMem <= MAX_LED_MEMORY) { | ||||
|         busses.add(*busConfigs[i]); | ||||
|       } | ||||
|       delete busConfigs[i]; busConfigs[i] = nullptr; | ||||
| @@ -175,8 +191,31 @@ void WLED::loop() | ||||
|   handleWs(); | ||||
|   handleStatusLED(); | ||||
|  | ||||
|   toki.resetTick(); | ||||
|  | ||||
| #if WLED_WATCHDOG_TIMEOUT > 0 | ||||
|   // we finished our mainloop, reset the watchdog timer | ||||
|   if (!strip.isUpdating()) | ||||
|   #ifdef ARDUINO_ARCH_ESP32 | ||||
|     esp_task_wdt_reset(); | ||||
|   #else | ||||
|     ESP.wdtFeed(); | ||||
|   #endif | ||||
| #endif | ||||
|  | ||||
|   if (doReboot && (!doInitBusses || !doSerializeConfig)) // if busses have to be inited & saved, wait until next iteration | ||||
|     reset(); | ||||
|  | ||||
| // DEBUG serial logging (every 30s) | ||||
| #ifdef WLED_DEBUG | ||||
|   loopMillis = millis() - loopMillis; | ||||
|   if (loopMillis > 30) { | ||||
|     DEBUG_PRINTF("Loop took %lums.\n", loopMillis); | ||||
|     DEBUG_PRINTF("Usermods took %lums.\n", usermodMillis); | ||||
|     DEBUG_PRINTF("Strip took %lums.\n", stripMillis); | ||||
|   } | ||||
|   avgLoopMillis += loopMillis; | ||||
|   if (loopMillis > maxLoopMillis) maxLoopMillis = loopMillis; | ||||
|   if (millis() - debugTime > 29999) { | ||||
|     DEBUG_PRINTLN(F("---DEBUG INFO---")); | ||||
|     DEBUG_PRINT(F("Runtime: "));       DEBUG_PRINTLN(millis()); | ||||
| @@ -199,11 +238,13 @@ void WLED::loop() | ||||
|     DEBUG_PRINT(F("Client IP: "));       DEBUG_PRINTLN(Network.localIP()); | ||||
|     if (loops > 0) { // avoid division by zero | ||||
|       DEBUG_PRINT(F("Loops/sec: "));       DEBUG_PRINTLN(loops / 30); | ||||
|       DEBUG_PRINT(F("Loop time[ms]: "));   DEBUG_PRINT(avgLoopMillis/loops); DEBUG_PRINT("/");DEBUG_PRINTLN(maxLoopMillis); | ||||
|       DEBUG_PRINT(F("UM time[ms]: "));     DEBUG_PRINT(avgUsermodMillis/loops); DEBUG_PRINT("/");DEBUG_PRINTLN(maxUsermodMillis); | ||||
|       DEBUG_PRINT(F("Strip time[ms]: "));  DEBUG_PRINT(avgStripMillis/loops); DEBUG_PRINT("/"); DEBUG_PRINTLN(maxStripMillis); | ||||
|     } | ||||
|     strip.printSize(); | ||||
|     loops = 0; | ||||
|     maxLoopMillis = 0; | ||||
|     maxUsermodMillis = 0; | ||||
|     maxStripMillis = 0; | ||||
|     avgUsermodMillis = 0; | ||||
| @@ -211,21 +252,8 @@ void WLED::loop() | ||||
|     debugTime = millis(); | ||||
|   } | ||||
|   loops++; | ||||
|   lastRun = millis(); | ||||
| #endif        // WLED_DEBUG | ||||
|   toki.resetTick(); | ||||
|  | ||||
| #if WLED_WATCHDOG_TIMEOUT > 0 | ||||
|   // we finished our mainloop, reset the watchdog timer | ||||
|   if (!strip.isUpdating()) | ||||
|   #ifdef ARDUINO_ARCH_ESP32 | ||||
|     esp_task_wdt_reset(); | ||||
|   #else | ||||
|     ESP.wdtFeed(); | ||||
|   #endif | ||||
| #endif | ||||
|  | ||||
|   if (doReboot && (!doInitBusses || !doSerializeConfig)) // if busses have to be inited & saved, wait until next iteration | ||||
|     reset(); | ||||
| } | ||||
|  | ||||
| void WLED::enableWatchdog() { | ||||
| @@ -510,7 +538,7 @@ void WLED::initAP(bool resetAP) | ||||
|   DEBUG_PRINTLN(apSSID); | ||||
|   WiFi.softAPConfig(IPAddress(4, 3, 2, 1), IPAddress(4, 3, 2, 1), IPAddress(255, 255, 255, 0)); | ||||
|   WiFi.softAP(apSSID, apPass, apChannel, apHide); | ||||
|   #if defined(LOLIN_WIFI_FIX) && (defined(ARDUINO_ARCH_ESP32C3) || defined(ARDUINO_ARCH_ESP32S2)) | ||||
|   #if defined(LOLIN_WIFI_FIX) && (defined(ARDUINO_ARCH_ESP32C3) || defined(ARDUINO_ARCH_ESP32S2) || defined(ARDUINO_ARCH_ESP32S3)) | ||||
|   WiFi.setTxPower(WIFI_POWER_8_5dBm); | ||||
|   #endif | ||||
|  | ||||
| @@ -645,7 +673,6 @@ void WLED::initConnection() | ||||
|   ws.onEvent(wsEvent); | ||||
|   #endif | ||||
|  | ||||
|  | ||||
|   WiFi.disconnect(true);        // close old connections | ||||
| #ifdef ESP8266 | ||||
|   WiFi.setPhyMode(WIFI_PHY_MODE_11N); | ||||
| @@ -689,7 +716,7 @@ void WLED::initConnection() | ||||
|  | ||||
|   WiFi.begin(clientSSID, clientPass); | ||||
| #ifdef ARDUINO_ARCH_ESP32 | ||||
|   #if defined(LOLIN_WIFI_FIX) && (defined(ARDUINO_ARCH_ESP32C3) || defined(ARDUINO_ARCH_ESP32S2)) | ||||
|   #if defined(LOLIN_WIFI_FIX) && (defined(ARDUINO_ARCH_ESP32C3) || defined(ARDUINO_ARCH_ESP32S2) || defined(ARDUINO_ARCH_ESP32S3)) | ||||
|   WiFi.setTxPower(WIFI_POWER_8_5dBm); | ||||
|   #endif | ||||
|   WiFi.setSleep(!noWifiSleep); | ||||
| @@ -844,7 +871,7 @@ void WLED::handleConnection() | ||||
|     if (improvActive) { | ||||
|       if (improvError == 3) sendImprovStateResponse(0x00, true); | ||||
|       sendImprovStateResponse(0x04); | ||||
|       if (improvActive > 1) sendImprovRPCResponse(0x01); | ||||
|       if (improvActive > 1) sendImprovIPRPCResult(ImprovRPCType::Command_Wifi); | ||||
|     } | ||||
|     initInterfaces(); | ||||
|     userConnected(); | ||||
|   | ||||
| @@ -3,12 +3,12 @@ | ||||
| /* | ||||
|    Main sketch, global variable declarations | ||||
|    @title WLED project sketch | ||||
|    @version 0.14.0-b3 | ||||
|    @version 0.14.0-b4 | ||||
|    @author Christian Schwinne | ||||
|  */ | ||||
|  | ||||
| // version code in format yymmddb (b = daily build) | ||||
| #define VERSION 2306210 | ||||
| #define VERSION 2308110 | ||||
|  | ||||
| //uncomment this if you have a "my_config.h" file you'd like to use | ||||
| //#define WLED_USE_MY_CONFIG | ||||
| @@ -36,7 +36,7 @@ | ||||
|   #undef WLED_ENABLE_ADALIGHT      // disable has priority over enable | ||||
| #endif | ||||
| //#define WLED_ENABLE_DMX          // uses 3.5kb (use LEDPIN other than 2) | ||||
| //#define WLED_ENABLE_JSONLIVE     // peek LED output via /json/live (WS binary peek is always enabled) | ||||
| #define WLED_ENABLE_JSONLIVE     // peek LED output via /json/live (WS binary peek is always enabled) | ||||
| #ifndef WLED_DISABLE_LOXONE | ||||
|   #define WLED_ENABLE_LOXONE       // uses 1.2kb | ||||
| #endif | ||||
| @@ -44,6 +44,8 @@ | ||||
|   #define WLED_ENABLE_WEBSOCKETS | ||||
| #endif | ||||
|  | ||||
| //#define WLED_DISABLE_ESPNOW      // Removes dependence on esp now  | ||||
|  | ||||
| #define WLED_ENABLE_FS_EDITOR      // enable /edit page for editing FS content. Will also be disabled with OTA lock | ||||
|  | ||||
| // to toggle usb serial debug (un)comment the following line | ||||
| @@ -73,6 +75,9 @@ | ||||
|   { | ||||
|   #include <user_interface.h> | ||||
|   } | ||||
|   #ifndef WLED_DISABLE_ESPNOW | ||||
|     #include <espnow.h> | ||||
|   #endif | ||||
| #else // ESP32 | ||||
|   #include <HardwareSerial.h>  // ensure we have the correct "Serial" on new MCUs (depends on ARDUINO_USB_MODE and ARDUINO_USB_CDC_ON_BOOT) | ||||
|   #include <WiFi.h> | ||||
| @@ -89,6 +94,10 @@ | ||||
|     #include <LittleFS.h> | ||||
|   #endif | ||||
|   #include "esp_task_wdt.h" | ||||
|  | ||||
|   #ifndef WLED_DISABLE_ESPNOW | ||||
|     #include <esp_now.h> | ||||
|   #endif | ||||
| #endif | ||||
| #include <Wire.h> | ||||
| #include <SPI.h> | ||||
| @@ -322,12 +331,17 @@ WLED_GLOBAL byte bootPreset   _INIT(0);                   // save preset to load | ||||
| //if true, a segment per bus will be created on boot and LED settings save | ||||
| //if false, only one segment spanning the total LEDs is created, | ||||
| //but not on LED settings save if there is more than one segment currently | ||||
| WLED_GLOBAL bool autoSegments    _INIT(false); | ||||
| WLED_GLOBAL bool correctWB       _INIT(false); // CCT color correction of RGB color | ||||
| WLED_GLOBAL bool cctFromRgb      _INIT(false); // CCT is calculated from RGB instead of using seg.cct | ||||
| WLED_GLOBAL bool gammaCorrectCol _INIT(true ); // use gamma correction on colors | ||||
| WLED_GLOBAL bool gammaCorrectBri _INIT(false); // use gamma correction on brightness | ||||
| WLED_GLOBAL float gammaCorrectVal _INIT(2.8f); // gamma correction value | ||||
| WLED_GLOBAL bool autoSegments       _INIT(false); | ||||
| #ifdef ESP8266 | ||||
| WLED_GLOBAL bool useGlobalLedBuffer _INIT(false); // double buffering disabled on ESP8266 | ||||
| #else | ||||
| WLED_GLOBAL bool useGlobalLedBuffer _INIT(true);  // double buffering enabled on ESP32 | ||||
| #endif | ||||
| WLED_GLOBAL bool correctWB          _INIT(false); // CCT color correction of RGB color | ||||
| WLED_GLOBAL bool cctFromRgb         _INIT(false); // CCT is calculated from RGB instead of using seg.cct | ||||
| WLED_GLOBAL bool gammaCorrectCol    _INIT(true);  // use gamma correction on colors | ||||
| WLED_GLOBAL bool gammaCorrectBri    _INIT(false); // use gamma correction on brightness | ||||
| WLED_GLOBAL float gammaCorrectVal   _INIT(2.8f);  // gamma correction value | ||||
|  | ||||
| WLED_GLOBAL byte col[]    _INIT_N(({ 255, 160, 0, 0 }));  // current RGB(W) primary color. col[] should be updated if you want to change the color. | ||||
| WLED_GLOBAL byte colSec[] _INIT_N(({ 0, 0, 0, 0 }));      // current RGB(W) secondary color | ||||
| @@ -444,6 +458,12 @@ WLED_GLOBAL bool hueApplyColor _INIT(true); | ||||
|  | ||||
| WLED_GLOBAL uint16_t serialBaud _INIT(1152); // serial baud rate, multiply by 100 | ||||
|  | ||||
| #ifndef WLED_DISABLE_ESPNOW | ||||
| WLED_GLOBAL bool enable_espnow_remote _INIT(false); | ||||
| WLED_GLOBAL char linked_remote[13]   _INIT(""); | ||||
| WLED_GLOBAL char last_signal_src[13]   _INIT(""); | ||||
| #endif | ||||
|  | ||||
| // Time CONFIG | ||||
| WLED_GLOBAL bool ntpEnabled _INIT(false);    // get internet time. Only required if you use clock overlays or time-activated macros | ||||
| WLED_GLOBAL bool useAMPM _INIT(false);       // 12h/24h clock format | ||||
| @@ -493,7 +513,7 @@ WLED_GLOBAL uint16_t userVar0 _INIT(0), userVar1 _INIT(0); //available for use i | ||||
| // wifi | ||||
| WLED_GLOBAL bool apActive _INIT(false); | ||||
| WLED_GLOBAL bool forceReconnect _INIT(false); | ||||
| WLED_GLOBAL uint32_t lastReconnectAttempt _INIT(0); | ||||
| WLED_GLOBAL unsigned long lastReconnectAttempt _INIT(0); | ||||
| WLED_GLOBAL bool interfacesInited _INIT(false); | ||||
| WLED_GLOBAL bool wasConnected _INIT(false); | ||||
|  | ||||
|   | ||||
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							| @@ -1,387 +0,0 @@ | ||||
| <?xml version="1.0" encoding="utf-8"?> | ||||
| <Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> | ||||
|   <ItemGroup> | ||||
|     <Filter Include="Source Files"> | ||||
|       <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier> | ||||
|       <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions> | ||||
|     </Filter> | ||||
|     <Filter Include="Header Files"> | ||||
|       <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier> | ||||
|       <Extensions>h;hh;hpp;hxx;hm;inl;inc;xsd</Extensions> | ||||
|     </Filter> | ||||
|     <Filter Include="Resource Files"> | ||||
|       <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier> | ||||
|       <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions> | ||||
|     </Filter> | ||||
|     <Filter Include="Source Files\Dependencies"> | ||||
|       <UniqueIdentifier>{72fe60da-ba26-45b4-82c1-bdff809975da}</UniqueIdentifier> | ||||
|     </Filter> | ||||
|     <Filter Include="Header Files\Dependencies"> | ||||
|       <UniqueIdentifier>{8880888d-efea-4189-a25a-834b7b3bb756}</UniqueIdentifier> | ||||
|     </Filter> | ||||
|   </ItemGroup> | ||||
|   <ItemGroup> | ||||
|     <None Include="wled00.ino" /> | ||||
|   </ItemGroup> | ||||
|   <ItemGroup> | ||||
|     <ClInclude Include="__vm\.wled00.vsarduino.h"> | ||||
|       <Filter>Header Files</Filter> | ||||
|     </ClInclude> | ||||
|     <ClInclude Include="html_classic.h"> | ||||
|       <Filter>Header Files</Filter> | ||||
|     </ClInclude> | ||||
|     <ClInclude Include="html_mobile.h"> | ||||
|       <Filter>Header Files</Filter> | ||||
|     </ClInclude> | ||||
|     <ClInclude Include="html_other.h"> | ||||
|       <Filter>Header Files</Filter> | ||||
|     </ClInclude> | ||||
|     <ClInclude Include="html_settings.h"> | ||||
|       <Filter>Header Files</Filter> | ||||
|     </ClInclude> | ||||
|     <ClInclude Include="FX.h"> | ||||
|       <Filter>Header Files</Filter> | ||||
|     </ClInclude> | ||||
|     <ClInclude Include="src\dependencies\json\ArduinoJson-v6.h"> | ||||
|       <Filter>Header Files\Dependencies</Filter> | ||||
|     </ClInclude> | ||||
|     <ClInclude Include="src\dependencies\json\AsyncJson-v6.h"> | ||||
|       <Filter>Header Files\Dependencies</Filter> | ||||
|     </ClInclude> | ||||
|     <ClInclude Include="src\dependencies\async-mqtt-client\AsyncMqttClient.h"> | ||||
|       <Filter>Header Files\Dependencies</Filter> | ||||
|     </ClInclude> | ||||
|     <ClInclude Include="src\dependencies\async-mqtt-client\AsyncMqttClient.hpp"> | ||||
|       <Filter>Header Files\Dependencies</Filter> | ||||
|     </ClInclude> | ||||
|     <ClInclude Include="src\dependencies\blynk\Blynk\BlynkApi.h"> | ||||
|       <Filter>Header Files\Dependencies</Filter> | ||||
|     </ClInclude> | ||||
|     <ClInclude Include="src\dependencies\blynk\Blynk\BlynkApiArduino.h"> | ||||
|       <Filter>Header Files\Dependencies</Filter> | ||||
|     </ClInclude> | ||||
|     <ClInclude Include="src\dependencies\blynk\Blynk\BlynkArduinoClient.h"> | ||||
|       <Filter>Header Files\Dependencies</Filter> | ||||
|     </ClInclude> | ||||
|     <ClInclude Include="src\dependencies\blynk\Blynk\BlynkConfig.h"> | ||||
|       <Filter>Header Files\Dependencies</Filter> | ||||
|     </ClInclude> | ||||
|     <ClInclude Include="src\dependencies\blynk\Blynk\BlynkDateTime.h"> | ||||
|       <Filter>Header Files\Dependencies</Filter> | ||||
|     </ClInclude> | ||||
|     <ClInclude Include="src\dependencies\blynk\Blynk\BlynkDebug.h"> | ||||
|       <Filter>Header Files\Dependencies</Filter> | ||||
|     </ClInclude> | ||||
|     <ClInclude Include="src\dependencies\blynk\Blynk\BlynkDetectDevice.h"> | ||||
|       <Filter>Header Files\Dependencies</Filter> | ||||
|     </ClInclude> | ||||
|     <ClInclude Include="src\dependencies\blynk\Blynk\BlynkEveryN.h"> | ||||
|       <Filter>Header Files\Dependencies</Filter> | ||||
|     </ClInclude> | ||||
|     <ClInclude Include="src\dependencies\blynk\Blynk\BlynkFifo.h"> | ||||
|       <Filter>Header Files\Dependencies</Filter> | ||||
|     </ClInclude> | ||||
|     <ClInclude Include="src\dependencies\blynk\Blynk\BlynkHandlers.h"> | ||||
|       <Filter>Header Files\Dependencies</Filter> | ||||
|     </ClInclude> | ||||
|     <ClInclude Include="src\dependencies\blynk\Blynk\BlynkParam.h"> | ||||
|       <Filter>Header Files\Dependencies</Filter> | ||||
|     </ClInclude> | ||||
|     <ClInclude Include="src\dependencies\blynk\Blynk\BlynkProtocol.h"> | ||||
|       <Filter>Header Files\Dependencies</Filter> | ||||
|     </ClInclude> | ||||
|     <ClInclude Include="src\dependencies\blynk\Blynk\BlynkProtocolDefs.h"> | ||||
|       <Filter>Header Files\Dependencies</Filter> | ||||
|     </ClInclude> | ||||
|     <ClInclude Include="src\dependencies\blynk\BlynkSimpleEsp.h"> | ||||
|       <Filter>Header Files\Dependencies</Filter> | ||||
|     </ClInclude> | ||||
|     <ClInclude Include="src\dependencies\blynk\Blynk\BlynkTemplates.h"> | ||||
|       <Filter>Header Files\Dependencies</Filter> | ||||
|     </ClInclude> | ||||
|     <ClInclude Include="src\dependencies\blynk\Blynk\BlynkTimer.h"> | ||||
|       <Filter>Header Files\Dependencies</Filter> | ||||
|     </ClInclude> | ||||
|     <ClInclude Include="src\dependencies\blynk\Blynk\BlynkUtility.h"> | ||||
|       <Filter>Header Files\Dependencies</Filter> | ||||
|     </ClInclude> | ||||
|     <ClInclude Include="src\dependencies\blynk\Blynk\BlynkWidgetBase.h"> | ||||
|       <Filter>Header Files\Dependencies</Filter> | ||||
|     </ClInclude> | ||||
|     <ClInclude Include="src\dependencies\blynk\Blynk\BlynkWiFiCommon.h"> | ||||
|       <Filter>Header Files\Dependencies</Filter> | ||||
|     </ClInclude> | ||||
|     <ClInclude Include="src\dependencies\async-mqtt-client\AsyncMqttClient\Callbacks.hpp"> | ||||
|       <Filter>Header Files\Dependencies</Filter> | ||||
|     </ClInclude> | ||||
|     <ClInclude Include="src\dependencies\async-mqtt-client\AsyncMqttClient\Packets\ConnAckPacket.hpp"> | ||||
|       <Filter>Header Files\Dependencies</Filter> | ||||
|     </ClInclude> | ||||
|     <ClInclude Include="src\dependencies\async-mqtt-client\AsyncMqttClient\DisconnectReasons.hpp"> | ||||
|       <Filter>Header Files\Dependencies</Filter> | ||||
|     </ClInclude> | ||||
|     <ClInclude Include="src\dependencies\espalexa\Espalexa.h"> | ||||
|       <Filter>Header Files\Dependencies</Filter> | ||||
|     </ClInclude> | ||||
|     <ClInclude Include="src\dependencies\espalexa\EspalexaDevice.h"> | ||||
|       <Filter>Header Files\Dependencies</Filter> | ||||
|     </ClInclude> | ||||
|     <ClInclude Include="src\dependencies\e131\ESPAsyncE131.h"> | ||||
|       <Filter>Header Files\Dependencies</Filter> | ||||
|     </ClInclude> | ||||
|     <ClInclude Include="src\dependencies\async-mqtt-client\AsyncMqttClient\Flags.hpp"> | ||||
|       <Filter>Header Files\Dependencies</Filter> | ||||
|     </ClInclude> | ||||
|     <ClInclude Include="src\dependencies\async-mqtt-client\AsyncMqttClient\Helpers.hpp"> | ||||
|       <Filter>Header Files\Dependencies</Filter> | ||||
|     </ClInclude> | ||||
|     <ClInclude Include="src\dependencies\async-mqtt-client\AsyncMqttClient\MessageProperties.hpp"> | ||||
|       <Filter>Header Files\Dependencies</Filter> | ||||
|     </ClInclude> | ||||
|     <ClInclude Include="NpbWrapper.h"> | ||||
|       <Filter>Header Files\Dependencies</Filter> | ||||
|     </ClInclude> | ||||
|     <ClInclude Include="src\dependencies\async-mqtt-client\AsyncMqttClient\Packets\Packet.hpp"> | ||||
|       <Filter>Header Files\Dependencies</Filter> | ||||
|     </ClInclude> | ||||
|     <ClInclude Include="src\dependencies\async-mqtt-client\AsyncMqttClient\ParsingInformation.hpp"> | ||||
|       <Filter>Header Files\Dependencies</Filter> | ||||
|     </ClInclude> | ||||
|     <ClInclude Include="src\dependencies\async-mqtt-client\AsyncMqttClient\Packets\PingRespPacket.hpp"> | ||||
|       <Filter>Header Files\Dependencies</Filter> | ||||
|     </ClInclude> | ||||
|     <ClInclude Include="src\dependencies\async-mqtt-client\AsyncMqttClient\Packets\PubAckPacket.hpp"> | ||||
|       <Filter>Header Files\Dependencies</Filter> | ||||
|     </ClInclude> | ||||
|     <ClInclude Include="src\dependencies\async-mqtt-client\AsyncMqttClient\Packets\PubCompPacket.hpp"> | ||||
|       <Filter>Header Files\Dependencies</Filter> | ||||
|     </ClInclude> | ||||
|     <ClInclude Include="src\dependencies\async-mqtt-client\AsyncMqttClient\Packets\PublishPacket.hpp"> | ||||
|       <Filter>Header Files\Dependencies</Filter> | ||||
|     </ClInclude> | ||||
|     <ClInclude Include="src\dependencies\async-mqtt-client\AsyncMqttClient\Packets\PubRecPacket.hpp"> | ||||
|       <Filter>Header Files\Dependencies</Filter> | ||||
|     </ClInclude> | ||||
|     <ClInclude Include="src\dependencies\async-mqtt-client\AsyncMqttClient\Packets\PubRelPacket.hpp"> | ||||
|       <Filter>Header Files\Dependencies</Filter> | ||||
|     </ClInclude> | ||||
|     <ClInclude Include="src\dependencies\async-mqtt-client\AsyncMqttClient\Storage.hpp"> | ||||
|       <Filter>Header Files\Dependencies</Filter> | ||||
|     </ClInclude> | ||||
|     <ClInclude Include="src\dependencies\async-mqtt-client\AsyncMqttClient\Packets\SubAckPacket.hpp"> | ||||
|       <Filter>Header Files\Dependencies</Filter> | ||||
|     </ClInclude> | ||||
|     <ClInclude Include="src\dependencies\time\Time.h"> | ||||
|       <Filter>Header Files\Dependencies</Filter> | ||||
|     </ClInclude> | ||||
|     <ClInclude Include="src\dependencies\time\TimeLib.h"> | ||||
|       <Filter>Header Files\Dependencies</Filter> | ||||
|     </ClInclude> | ||||
|     <ClInclude Include="src\dependencies\timezone\Timezone.h"> | ||||
|       <Filter>Header Files\Dependencies</Filter> | ||||
|     </ClInclude> | ||||
|     <ClInclude Include="src\dependencies\async-mqtt-client\AsyncMqttClient\Packets\UnsubAckPacket.hpp"> | ||||
|       <Filter>Header Files\Dependencies</Filter> | ||||
|     </ClInclude> | ||||
|     <ClInclude Include="alexa.h"> | ||||
|       <Filter>Header Files</Filter> | ||||
|     </ClInclude> | ||||
|     <ClInclude Include="blynk.h"> | ||||
|       <Filter>Header Files</Filter> | ||||
|     </ClInclude> | ||||
|     <ClInclude Include="button.h"> | ||||
|       <Filter>Header Files</Filter> | ||||
|     </ClInclude> | ||||
|     <ClInclude Include="colors.h"> | ||||
|       <Filter>Header Files</Filter> | ||||
|     </ClInclude> | ||||
|     <ClInclude Include="const.h"> | ||||
|       <Filter>Header Files</Filter> | ||||
|     </ClInclude> | ||||
|     <ClInclude Include="cronixie.h"> | ||||
|       <Filter>Header Files</Filter> | ||||
|     </ClInclude> | ||||
|     <ClInclude Include="dmx.h"> | ||||
|       <Filter>Header Files</Filter> | ||||
|     </ClInclude> | ||||
|     <ClInclude Include="file.h"> | ||||
|       <Filter>Header Files</Filter> | ||||
|     </ClInclude> | ||||
|     <ClInclude Include="html_ui.h"> | ||||
|       <Filter>Header Files</Filter> | ||||
|     </ClInclude> | ||||
|     <ClInclude Include="hue.h"> | ||||
|       <Filter>Header Files</Filter> | ||||
|     </ClInclude> | ||||
|     <ClInclude Include="ir.h"> | ||||
|       <Filter>Header Files</Filter> | ||||
|     </ClInclude> | ||||
|     <ClInclude Include="json.h"> | ||||
|       <Filter>Header Files</Filter> | ||||
|     </ClInclude> | ||||
|     <ClInclude Include="led.h"> | ||||
|       <Filter>Header Files</Filter> | ||||
|     </ClInclude> | ||||
|     <ClInclude Include="mqtt.h"> | ||||
|       <Filter>Header Files</Filter> | ||||
|     </ClInclude> | ||||
|     <ClInclude Include="notify.h"> | ||||
|       <Filter>Header Files</Filter> | ||||
|     </ClInclude> | ||||
|     <ClInclude Include="ntp.h"> | ||||
|       <Filter>Header Files</Filter> | ||||
|     </ClInclude> | ||||
|     <ClInclude Include="overlay.h"> | ||||
|       <Filter>Header Files</Filter> | ||||
|     </ClInclude> | ||||
|     <ClInclude Include="set.h"> | ||||
|       <Filter>Header Files</Filter> | ||||
|     </ClInclude> | ||||
|     <ClInclude Include="usermod.h"> | ||||
|       <Filter>Header Files</Filter> | ||||
|     </ClInclude> | ||||
|     <ClInclude Include="wled.h"> | ||||
|       <Filter>Header Files</Filter> | ||||
|     </ClInclude> | ||||
|     <ClInclude Include="wled_eeprom.h"> | ||||
|       <Filter>Header Files</Filter> | ||||
|     </ClInclude> | ||||
|     <ClInclude Include="wled_server.h"> | ||||
|       <Filter>Header Files</Filter> | ||||
|     </ClInclude> | ||||
|     <ClInclude Include="xml.h"> | ||||
|       <Filter>Header Files</Filter> | ||||
|     </ClInclude> | ||||
|     <ClInclude Include="ir_codes.h"> | ||||
|       <Filter>Header Files</Filter> | ||||
|     </ClInclude> | ||||
|     <ClInclude Include="palettes.h"> | ||||
|       <Filter>Header Files</Filter> | ||||
|     </ClInclude> | ||||
|   </ItemGroup> | ||||
|   <ItemGroup> | ||||
|     <ClCompile Include="FX.cpp"> | ||||
|       <Filter>Source Files</Filter> | ||||
|     </ClCompile> | ||||
|     <ClCompile Include="FX_fcn.cpp"> | ||||
|       <Filter>Source Files</Filter> | ||||
|     </ClCompile> | ||||
|     <ClCompile Include="src\dependencies\blynk\Blynk\utility.cpp"> | ||||
|       <Filter>Source Files\Dependencies</Filter> | ||||
|     </ClCompile> | ||||
|     <ClCompile Include="src\dependencies\async-mqtt-client\AsyncMqttClient.cpp"> | ||||
|       <Filter>Source Files\Dependencies</Filter> | ||||
|     </ClCompile> | ||||
|     <ClCompile Include="src\dependencies\blynk\Blynk\BlynkDebug.cpp"> | ||||
|       <Filter>Source Files\Dependencies</Filter> | ||||
|     </ClCompile> | ||||
|     <ClCompile Include="src\dependencies\blynk\Blynk\BlynkHandlers.cpp"> | ||||
|       <Filter>Source Files\Dependencies</Filter> | ||||
|     </ClCompile> | ||||
|     <ClCompile Include="src\dependencies\blynk\Blynk\BlynkTimer.cpp"> | ||||
|       <Filter>Source Files\Dependencies</Filter> | ||||
|     </ClCompile> | ||||
|     <ClCompile Include="src\dependencies\async-mqtt-client\AsyncMqttClient\Packets\ConnAckPacket.cpp"> | ||||
|       <Filter>Source Files\Dependencies</Filter> | ||||
|     </ClCompile> | ||||
|     <ClCompile Include="src\dependencies\time\DateStrings.cpp"> | ||||
|       <Filter>Source Files\Dependencies</Filter> | ||||
|     </ClCompile> | ||||
|     <ClCompile Include="src\dependencies\espalexa\EspalexaDevice.cpp"> | ||||
|       <Filter>Source Files\Dependencies</Filter> | ||||
|     </ClCompile> | ||||
|     <ClCompile Include="src\dependencies\e131\ESPAsyncE131.cpp"> | ||||
|       <Filter>Source Files\Dependencies</Filter> | ||||
|     </ClCompile> | ||||
|     <ClCompile Include="src\dependencies\async-mqtt-client\AsyncMqttClient\Packets\PingRespPacket.cpp"> | ||||
|       <Filter>Source Files\Dependencies</Filter> | ||||
|     </ClCompile> | ||||
|     <ClCompile Include="src\dependencies\async-mqtt-client\AsyncMqttClient\Packets\PubAckPacket.cpp"> | ||||
|       <Filter>Source Files\Dependencies</Filter> | ||||
|     </ClCompile> | ||||
|     <ClCompile Include="src\dependencies\async-mqtt-client\AsyncMqttClient\Packets\PubCompPacket.cpp"> | ||||
|       <Filter>Source Files\Dependencies</Filter> | ||||
|     </ClCompile> | ||||
|     <ClCompile Include="src\dependencies\async-mqtt-client\AsyncMqttClient\Packets\PublishPacket.cpp"> | ||||
|       <Filter>Source Files\Dependencies</Filter> | ||||
|     </ClCompile> | ||||
|     <ClCompile Include="src\dependencies\async-mqtt-client\AsyncMqttClient\Packets\PubRecPacket.cpp"> | ||||
|       <Filter>Source Files\Dependencies</Filter> | ||||
|     </ClCompile> | ||||
|     <ClCompile Include="src\dependencies\async-mqtt-client\AsyncMqttClient\Packets\PubRelPacket.cpp"> | ||||
|       <Filter>Source Files\Dependencies</Filter> | ||||
|     </ClCompile> | ||||
|     <ClCompile Include="src\dependencies\async-mqtt-client\AsyncMqttClient\Packets\SubAckPacket.cpp"> | ||||
|       <Filter>Source Files\Dependencies</Filter> | ||||
|     </ClCompile> | ||||
|     <ClCompile Include="src\dependencies\time\Time.cpp"> | ||||
|       <Filter>Source Files\Dependencies</Filter> | ||||
|     </ClCompile> | ||||
|     <ClCompile Include="src\dependencies\timezone\Timezone.cpp"> | ||||
|       <Filter>Source Files\Dependencies</Filter> | ||||
|     </ClCompile> | ||||
|     <ClCompile Include="src\dependencies\async-mqtt-client\AsyncMqttClient\Packets\UnsubAckPacket.cpp"> | ||||
|       <Filter>Source Files\Dependencies</Filter> | ||||
|     </ClCompile> | ||||
|     <ClCompile Include="alexa.cpp"> | ||||
|       <Filter>Source Files</Filter> | ||||
|     </ClCompile> | ||||
|     <ClCompile Include="blynk.cpp"> | ||||
|       <Filter>Source Files</Filter> | ||||
|     </ClCompile> | ||||
|     <ClCompile Include="button.cpp"> | ||||
|       <Filter>Source Files</Filter> | ||||
|     </ClCompile> | ||||
|     <ClCompile Include="colors.cpp"> | ||||
|       <Filter>Source Files</Filter> | ||||
|     </ClCompile> | ||||
|     <ClCompile Include="cronixie.cpp"> | ||||
|       <Filter>Source Files</Filter> | ||||
|     </ClCompile> | ||||
|     <ClCompile Include="file.cpp"> | ||||
|       <Filter>Source Files</Filter> | ||||
|     </ClCompile> | ||||
|     <ClCompile Include="hue.cpp"> | ||||
|       <Filter>Source Files</Filter> | ||||
|     </ClCompile> | ||||
|     <ClCompile Include="ir.cpp"> | ||||
|       <Filter>Source Files</Filter> | ||||
|     </ClCompile> | ||||
|     <ClCompile Include="json.cpp"> | ||||
|       <Filter>Source Files</Filter> | ||||
|     </ClCompile> | ||||
|     <ClCompile Include="led.cpp"> | ||||
|       <Filter>Source Files</Filter> | ||||
|     </ClCompile> | ||||
|     <ClCompile Include="mqtt.cpp"> | ||||
|       <Filter>Source Files</Filter> | ||||
|     </ClCompile> | ||||
|     <ClCompile Include="notify.cpp"> | ||||
|       <Filter>Source Files</Filter> | ||||
|     </ClCompile> | ||||
|     <ClCompile Include="ntp.cpp"> | ||||
|       <Filter>Source Files</Filter> | ||||
|     </ClCompile> | ||||
|     <ClCompile Include="overlay.cpp"> | ||||
|       <Filter>Source Files</Filter> | ||||
|     </ClCompile> | ||||
|     <ClCompile Include="set.cpp"> | ||||
|       <Filter>Source Files</Filter> | ||||
|     </ClCompile> | ||||
|     <ClCompile Include="usermod.cpp"> | ||||
|       <Filter>Source Files</Filter> | ||||
|     </ClCompile> | ||||
|     <ClCompile Include="wled.cpp"> | ||||
|       <Filter>Source Files</Filter> | ||||
|     </ClCompile> | ||||
|     <ClCompile Include="wled_eeprom.cpp"> | ||||
|       <Filter>Source Files</Filter> | ||||
|     </ClCompile> | ||||
|     <ClCompile Include="wled_server.cpp"> | ||||
|       <Filter>Source Files</Filter> | ||||
|     </ClCompile> | ||||
|     <ClCompile Include="xml.cpp"> | ||||
|       <Filter>Source Files</Filter> | ||||
|     </ClCompile> | ||||
|   </ItemGroup> | ||||
| </Project> | ||||
| @@ -1,4 +0,0 @@ | ||||
| <?xml version="1.0" encoding="utf-8"?> | ||||
| <Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> | ||||
|   <PropertyGroup /> | ||||
| </Project> | ||||
| @@ -9,6 +9,9 @@ | ||||
| #ifdef WLED_ENABLE_PIXART | ||||
|   #include "html_pixart.h" | ||||
| #endif | ||||
| #ifndef WLED_DISABLE_PXMAGIC | ||||
|   #include "html_pxmagic.h" | ||||
| #endif | ||||
| #include "html_cpal.h" | ||||
|  | ||||
| /* | ||||
| @@ -113,14 +116,6 @@ void initServer() | ||||
|   DefaultHeaders::Instance().addHeader(F("Access-Control-Allow-Headers"), "*"); | ||||
|  | ||||
| #ifdef WLED_ENABLE_WEBSOCKETS | ||||
|   server.on("/liveview", HTTP_GET, [](AsyncWebServerRequest *request){ | ||||
|     if (handleIfNoneMatchCacheHeader(request)) return; | ||||
|     AsyncWebServerResponse *response = request->beginResponse_P(200, "text/html", PAGE_liveviewws, PAGE_liveviewws_length); | ||||
|     response->addHeader(FPSTR(s_content_enc),"gzip"); | ||||
|     setStaticContentCacheHeaders(response); | ||||
|     request->send(response); | ||||
|     //request->send_P(200, "text/html", PAGE_liveviewws); | ||||
|   }); | ||||
|   #ifndef WLED_DISABLE_2D | ||||
|   server.on("/liveview2D", HTTP_GET, [](AsyncWebServerRequest *request){ | ||||
|     if (handleIfNoneMatchCacheHeader(request)) return; | ||||
| @@ -128,19 +123,16 @@ void initServer() | ||||
|     response->addHeader(FPSTR(s_content_enc),"gzip"); | ||||
|     setStaticContentCacheHeaders(response); | ||||
|     request->send(response); | ||||
|     //request->send_P(200, "text/html", PAGE_liveviewws); | ||||
|   }); | ||||
|   #endif | ||||
| #else | ||||
| #endif | ||||
|   server.on("/liveview", HTTP_GET, [](AsyncWebServerRequest *request){ | ||||
|     if (handleIfNoneMatchCacheHeader(request)) return; | ||||
|     AsyncWebServerResponse *response = request->beginResponse_P(200, "text/html", PAGE_liveview, PAGE_liveview_length); | ||||
|     response->addHeader(FPSTR(s_content_enc),"gzip"); | ||||
|     setStaticContentCacheHeaders(response); | ||||
|     request->send(response); | ||||
|     //request->send_P(200, "text/html", PAGE_liveview); | ||||
|   }); | ||||
| #endif | ||||
|  | ||||
|   //settings page | ||||
|   server.on("/settings", HTTP_GET, [](AsyncWebServerRequest *request){ | ||||
| @@ -164,10 +156,6 @@ void initServer() | ||||
|     } | ||||
|   }); | ||||
|  | ||||
|   server.on("/sliders", HTTP_GET, [](AsyncWebServerRequest *request){ | ||||
|     serveIndex(request); | ||||
|   }); | ||||
|  | ||||
|   server.on("/welcome", HTTP_GET, [](AsyncWebServerRequest *request){ | ||||
|     serveSettings(request); | ||||
|   }); | ||||
| @@ -244,19 +232,15 @@ void initServer() | ||||
|     request->send(200, "text/plain", (String)ESP.getFreeHeap()); | ||||
|   }); | ||||
|  | ||||
| #ifdef WLED_ENABLE_USERMOD_PAGE | ||||
|   server.on("/u", HTTP_GET, [](AsyncWebServerRequest *request){ | ||||
|     if (handleIfNoneMatchCacheHeader(request)) return; | ||||
|     AsyncWebServerResponse *response = request->beginResponse_P(200, "text/html", PAGE_usermod, PAGE_usermod_length); | ||||
|     response->addHeader(FPSTR(s_content_enc),"gzip"); | ||||
|     setStaticContentCacheHeaders(response); | ||||
|     request->send(response); | ||||
|     //request->send_P(200, "text/html", PAGE_usermod); | ||||
|   }); | ||||
|  | ||||
|   //Deprecated, use of /json/state and presets recommended instead | ||||
|   server.on("/url", HTTP_GET, [](AsyncWebServerRequest *request){ | ||||
|     URL_response(request); | ||||
|   }); | ||||
| #endif | ||||
|  | ||||
|   server.on("/teapot", HTTP_GET, [](AsyncWebServerRequest *request){ | ||||
|     serveMessage(request, 418, F("418. I'm a teapot."), F("(Tangible Embedded Advanced Project Of Twinkling)"), 254); | ||||
| @@ -353,9 +337,14 @@ void initServer() | ||||
|     serveMessage(request, 501, "Not implemented", F("DMX support is not enabled in this build."), 254); | ||||
|   }); | ||||
|   #endif | ||||
|  | ||||
|   server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){ | ||||
|     if (captivePortal(request)) return; | ||||
|     serveIndexOrWelcome(request); | ||||
|     if (!showWelcomePage || request->hasArg(F("sliders"))){ | ||||
|       serveIndex(request); | ||||
|     } else { | ||||
|       serveSettings(request); | ||||
|     } | ||||
|   }); | ||||
|  | ||||
|   #ifdef WLED_ENABLE_PIXART | ||||
| @@ -369,6 +358,17 @@ void initServer() | ||||
|   }); | ||||
|   #endif | ||||
|  | ||||
|   #ifndef WLED_DISABLE_PXMAGIC | ||||
|   server.on("/pxmagic.htm", HTTP_GET, [](AsyncWebServerRequest *request){ | ||||
|     if (handleFileRead(request, "/pxmagic.htm")) return; | ||||
|     if (handleIfNoneMatchCacheHeader(request)) return; | ||||
|     AsyncWebServerResponse *response = request->beginResponse_P(200, "text/html", PAGE_pxmagic, PAGE_pxmagic_L); | ||||
|     response->addHeader(FPSTR(s_content_enc),"gzip"); | ||||
|     setStaticContentCacheHeaders(response); | ||||
|     request->send(response); | ||||
|   }); | ||||
|   #endif | ||||
|  | ||||
|   server.on("/cpal.htm", HTTP_GET, [](AsyncWebServerRequest *request){ | ||||
|     if (handleFileRead(request, "/cpal.htm")) return; | ||||
|     if (handleIfNoneMatchCacheHeader(request)) return; | ||||
| @@ -406,20 +406,9 @@ void initServer() | ||||
|     response->addHeader(FPSTR(s_content_enc),"gzip"); | ||||
|     setStaticContentCacheHeaders(response); | ||||
|     request->send(response); | ||||
|     //request->send_P(404, "text/html", PAGE_404); | ||||
|   }); | ||||
| } | ||||
|  | ||||
|  | ||||
| void serveIndexOrWelcome(AsyncWebServerRequest *request) | ||||
| { | ||||
|   if (!showWelcomePage){ | ||||
|     serveIndex(request); | ||||
|   } else { | ||||
|     serveSettings(request); | ||||
|   } | ||||
| } | ||||
|  | ||||
| bool handleIfNoneMatchCacheHeader(AsyncWebServerRequest* request) | ||||
| { | ||||
|   AsyncWebHeader* header = request->getHeader("If-None-Match"); | ||||
|   | ||||
| @@ -166,23 +166,24 @@ bool sendLiveLedsWs(uint32_t wsClient) | ||||
|   size_t n = ((used -1)/MAX_LIVE_LEDS_WS) +1; //only serve every n'th LED if count over MAX_LIVE_LEDS_WS | ||||
|   size_t pos = (strip.isMatrix ? 4 : 2);  // start of data | ||||
|   size_t bufSize = pos + (used/n)*3; | ||||
|   size_t skipLines = 0; | ||||
|  | ||||
|   AsyncWebSocketMessageBuffer * wsBuf = ws.makeBuffer(bufSize); | ||||
|   if (!wsBuf) return false; //out of memory | ||||
|   uint8_t* buffer = wsBuf->get(); | ||||
|   buffer[0] = 'L'; | ||||
|   buffer[1] = 1; //version | ||||
|  | ||||
| #ifndef WLED_DISABLE_2D | ||||
|   size_t skipLines = 0; | ||||
|   if (strip.isMatrix) { | ||||
|     buffer[1] = 2; //version | ||||
|     buffer[2] = Segment::maxWidth; | ||||
|     buffer[3] = Segment::maxHeight; | ||||
|     if (Segment::maxWidth * Segment::maxHeight > MAX_LIVE_LEDS_WS*4) { | ||||
|     if (used > MAX_LIVE_LEDS_WS*4) { | ||||
|       buffer[2] = Segment::maxWidth/4; | ||||
|       buffer[3] = Segment::maxHeight/4; | ||||
|       skipLines = 3; | ||||
|     } else if (Segment::maxWidth * Segment::maxHeight > MAX_LIVE_LEDS_WS) { | ||||
|     } else if (used > MAX_LIVE_LEDS_WS) { | ||||
|       buffer[2] = Segment::maxWidth/2; | ||||
|       buffer[3] = Segment::maxHeight/2; | ||||
|       skipLines = 1; | ||||
| @@ -198,9 +199,13 @@ bool sendLiveLedsWs(uint32_t wsClient) | ||||
|     } | ||||
| #endif | ||||
|     uint32_t c = strip.getPixelColor(i); | ||||
|     buffer[pos++] = qadd8(W(c), R(c)); //R, add white channel to RGB channels as a simple RGBW -> RGB map | ||||
|     buffer[pos++] = qadd8(W(c), G(c)); //G | ||||
|     buffer[pos++] = qadd8(W(c), B(c)); //B | ||||
|     uint8_t r = R(c); | ||||
|     uint8_t g = G(c); | ||||
|     uint8_t b = B(c); | ||||
|     uint8_t w = W(c); | ||||
|     buffer[pos++] = scale8(qadd8(w, r), strip.getBrightness()); //R, add white channel to RGB channels as a simple RGBW -> RGB map | ||||
|     buffer[pos++] = scale8(qadd8(w, g), strip.getBrightness()); //G | ||||
|     buffer[pos++] = scale8(qadd8(w, b), strip.getBrightness()); //B | ||||
|   } | ||||
|  | ||||
|   wsc->binary(wsBuf); | ||||
|   | ||||
| @@ -72,55 +72,6 @@ void XML_response(AsyncWebServerRequest *request, char* dest) | ||||
|   if (request != nullptr) request->send(200, "text/xml", obuf); | ||||
| } | ||||
|  | ||||
| //Deprecated, use of /json/state and presets recommended instead | ||||
| void URL_response(AsyncWebServerRequest *request) | ||||
| { | ||||
|   char sbuf[256]; | ||||
|   char s2buf[100]; | ||||
|   obuf = s2buf; | ||||
|   olen = 0; | ||||
|  | ||||
|   char s[16]; | ||||
|   oappend(SET_F("http://")); | ||||
|   IPAddress localIP = Network.localIP(); | ||||
|   sprintf(s, "%d.%d.%d.%d", localIP[0], localIP[1], localIP[2], localIP[3]); | ||||
|   oappend(s); | ||||
|  | ||||
|   oappend(SET_F("/win&A=")); | ||||
|   oappendi(bri); | ||||
|   oappend(SET_F("&CL=h")); | ||||
|   for (int i = 0; i < 3; i++) | ||||
|   { | ||||
|    sprintf(s,"%02X", col[i]); | ||||
|    oappend(s); | ||||
|   } | ||||
|   oappend(SET_F("&C2=h")); | ||||
|   for (int i = 0; i < 3; i++) | ||||
|   { | ||||
|    sprintf(s,"%02X", colSec[i]); | ||||
|    oappend(s); | ||||
|   } | ||||
|   oappend(SET_F("&FX=")); | ||||
|   oappendi(effectCurrent); | ||||
|   oappend(SET_F("&SX=")); | ||||
|   oappendi(effectSpeed); | ||||
|   oappend(SET_F("&IX=")); | ||||
|   oappendi(effectIntensity); | ||||
|   oappend(SET_F("&FP=")); | ||||
|   oappendi(effectPalette); | ||||
|  | ||||
|   obuf = sbuf; | ||||
|   olen = 0; | ||||
|  | ||||
|   oappend(SET_F("<html><body><a href=\"")); | ||||
|   oappend(s2buf); | ||||
|   oappend(SET_F("\" target=\"_blank\">")); | ||||
|   oappend(s2buf); | ||||
|   oappend(SET_F("</a></body></html>")); | ||||
|  | ||||
|   if (request != nullptr) request->send(200, "text/html", obuf); | ||||
| } | ||||
|  | ||||
| void extractPin(JsonObject &obj, const char *key) { | ||||
|   if (obj[key].is<JsonArray>()) { | ||||
|     JsonArray pins = obj[key].as<JsonArray>(); | ||||
| @@ -328,6 +279,14 @@ void getSettingsJS(byte subPage, char* dest) | ||||
|     sappend('v',SET_F("AC"),apChannel); | ||||
|     sappend('c',SET_F("WS"),noWifiSleep); | ||||
|  | ||||
|     #ifndef WLED_DISABLE_ESPNOW | ||||
|     sappend('c',SET_F("RE"),enable_espnow_remote); | ||||
|     sappends('s',SET_F("RMAC"),linked_remote); | ||||
|     #else | ||||
|     //hide remote settings if not compiled | ||||
|     oappend(SET_F("document.getElementById('remd').style.display='none';")); | ||||
|     #endif | ||||
|  | ||||
|     #ifdef WLED_USE_ETHERNET | ||||
|     sappend('v',SET_F("ETH"),ethernetType); | ||||
|     #else | ||||
| @@ -360,6 +319,19 @@ void getSettingsJS(byte subPage, char* dest) | ||||
|     { | ||||
|       sappends('m',SET_F("(\"sip\")[1]"),(char*)F("Not active")); | ||||
|     } | ||||
|  | ||||
|     #ifndef WLED_DISABLE_ESPNOW | ||||
|     if (last_signal_src[0] != 0) //Have seen an ESP-NOW Remote | ||||
|     { | ||||
|       sappends('m',SET_F("(\"rlid\")[0]"),last_signal_src); | ||||
|     } else if (!enable_espnow_remote) | ||||
|     { | ||||
|       sappends('m',SET_F("(\"rlid\")[0]"),(char*)F("(Enable remote to listen)")); | ||||
|     } else  | ||||
|     { | ||||
|       sappends('m',SET_F("(\"rlid\")[0]"),(char*)F("None")); | ||||
|     } | ||||
|     #endif | ||||
|   } | ||||
|  | ||||
|   if (subPage == SUBPAGE_LEDS) | ||||
| @@ -383,7 +355,7 @@ void getSettingsJS(byte subPage, char* dest) | ||||
|     sappend('v',SET_F("CB"),strip.cctBlending); | ||||
|     sappend('v',SET_F("FR"),strip.getTargetFps()); | ||||
|     sappend('v',SET_F("AW"),Bus::getGlobalAWMode()); | ||||
|     sappend('c',SET_F("LD"),strip.useLedsArray); | ||||
|     sappend('c',SET_F("LD"),useGlobalLedBuffer); | ||||
|  | ||||
|     for (uint8_t s=0; s < busses.getNumBusses(); s++) { | ||||
|       Bus* bus = busses.getBus(s); | ||||
| @@ -410,7 +382,7 @@ void getSettingsJS(byte subPage, char* dest) | ||||
|       sappend('v',lt,bus->getType()); | ||||
|       sappend('v',co,bus->getColorOrder() & 0x0F); | ||||
|       sappend('v',ls,bus->getStart()); | ||||
|       sappend('c',cv,bus->reversed); | ||||
|       sappend('c',cv,bus->isReversed()); | ||||
|       sappend('v',sl,bus->skippedLeds()); | ||||
|       sappend('c',rf,bus->isOffRefreshRequired()); | ||||
|       sappend('v',aw,bus->getAutoWhiteMode()); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user