diff --git a/src/W800_SDK_v1.00.10/lvgl/Makefile b/src/W800_SDK_v1.00.10/lvgl/Makefile index 20a0fa7..dded7af 100644 --- a/src/W800_SDK_v1.00.10/lvgl/Makefile +++ b/src/W800_SDK_v1.00.10/lvgl/Makefile @@ -3,7 +3,7 @@ sinclude $(TOP_DIR)/tools/w800/conf.mk ifndef PDIR GEN_LIBS = liblvgl$(LIB_EXT) -COMPONENTS_liblvgl = lvgl_v8.3/liblvglv8_3$(LIB_EXT) \ +COMPONENTS_liblvgl = lvgl_v8.4/liblvglv8_4$(LIB_EXT) \ lvgl_port/liblvgl_port$(LIB_EXT) endif diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_port/lv_conf.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_port/lv_conf.h index b139c2f..a10e363 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_port/lv_conf.h +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_port/lv_conf.h @@ -1,6 +1,6 @@ /** * @file lv_conf.h - * Configuration file for v8.3.3 + * Configuration file for v8.4.0 */ /* @@ -49,7 +49,7 @@ #define LV_MEM_CUSTOM 0 #if LV_MEM_CUSTOM == 0 /*Size of the memory available for `lv_mem_alloc()` in bytes (>= 2kB)*/ - #define LV_MEM_SIZE (35 * 1024U) /*[bytes]*/ + #define LV_MEM_SIZE (35U * 1024U) /*[bytes]*/ /*Set an address for the memory pool instead of allocating it as a normal array. Can be in external SRAM too.*/ #define LV_MEM_ADR 0 /*0: unused*/ @@ -89,6 +89,9 @@ #if LV_TICK_CUSTOM #define LV_TICK_CUSTOM_INCLUDE "Arduino.h" /*Header for the system time function*/ #define LV_TICK_CUSTOM_SYS_TIME_EXPR (millis()) /*Expression evaluating to current system time in ms*/ + /*If using lvgl as ESP32 component*/ + // #define LV_TICK_CUSTOM_INCLUDE "esp_timer.h" + // #define LV_TICK_CUSTOM_SYS_TIME_EXPR ((esp_timer_get_time() / 1000LL)) #endif /*LV_TICK_CUSTOM*/ /*Default Dot Per Inch. Used to initialize default sizes such as widgets sized, style paddings. @@ -173,6 +176,9 @@ * GPU *-----------*/ +/*Use TSi's (aka Think Silicon) acceleration library NemaGFX */ +#define LV_USE_NEMA_GFX 0 + /*Use Arm's 2D acceleration library Arm-2D */ #define LV_USE_GPU_ARM2D 0 @@ -180,10 +186,18 @@ #define LV_USE_GPU_STM32_DMA2D 0 #if LV_USE_GPU_STM32_DMA2D /*Must be defined to include path of CMSIS header of target processor - e.g. "stm32f769xx.h" or "stm32f429xx.h"*/ + e.g. "stm32f7xx.h" or "stm32f4xx.h"*/ #define LV_GPU_DMA2D_CMSIS_INCLUDE #endif +/*Enable RA6M3 G2D GPU*/ +#define LV_USE_GPU_RA6M3_G2D 0 +#if LV_USE_GPU_RA6M3_G2D + /*include path of target processor + e.g. "hal_data.h"*/ + #define LV_GPU_RA6M3_G2D_INCLUDE "hal_data.h" +#endif + /*Use SWM341's DMA2D GPU*/ #define LV_USE_GPU_SWM341_DMA2D 0 #if LV_USE_GPU_SWM341_DMA2D @@ -628,6 +642,13 @@ #define LV_FS_FATFS_CACHE_SIZE 0 /*>0 to cache this number of bytes in lv_fs_read()*/ #endif +/*API for LittleFS (library needs to be added separately). Uses lfs_file_open, lfs_file_read, etc*/ +#define LV_USE_FS_LITTLEFS 0 +#if LV_USE_FS_LITTLEFS + #define LV_FS_LITTLEFS_LETTER '\0' /*Set an upper cased letter on which the drive will accessible (e.g. 'A')*/ + #define LV_FS_LITTLEFS_CACHE_SIZE 0 /*>0 to cache this number of bytes in lv_fs_read()*/ +#endif + /*PNG decoder library*/ #define LV_USE_PNG 0 @@ -661,6 +682,13 @@ #endif #endif +/*Tiny TTF library*/ +#define LV_USE_TINY_TTF 0 +#if LV_USE_TINY_TTF + /*Load TTF data from files*/ + #define LV_TINY_TTF_FILE_SUPPORT 0 +#endif + /*Rlottie library*/ #define LV_USE_RLOTTIE 0 diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/CHANGELOG.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/CHANGELOG.md deleted file mode 100644 index d32fecb..0000000 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/CHANGELOG.md +++ /dev/null @@ -1,1826 +0,0 @@ -# Changelog - -## [v8.3.3](https://github.com/lvgl/lvgl/compare/v8.3.2...v8.3.3) 06 October 2022 - -v8.3.3 is the same as v8.3.2. It was released only because the version number was set incorrectly in lvgl.h. - -## [v8.3.2](https://github.com/lvgl/lvgl/compare/v8.3.1...v8.3.2) 27 September 2022 - -### Fixes - -- fix(fragment): fixed child fragment event dispatch [`3683`](https://github.com/lvgl/lvgl/pull/3683) -- fix(sdl): clear streaming/target texture with FillRect [`3682`](https://github.com/lvgl/lvgl/pull/3682) -- fix(sdl): transformation with alpha (#3576) [`3678`](https://github.com/lvgl/lvgl/pull/3678) -- fix(draw_sw): fix image cache to access the freed stack space [`3584`](https://github.com/lvgl/lvgl/pull/3584) -- fix(style): use compile time prop_cnt for const styles [`3609`](https://github.com/lvgl/lvgl/pull/3609) -- fix(demo): can not found lvgl.h file [`3477`](https://github.com/lvgl/lvgl/pull/3477) -- fix(ci) checkout lv_micropython release/v8 branch [`3524`](https://github.com/lvgl/lvgl/pull/3524) -- fix(canvas): fix clipéping on transformation [`b884aba`](https://github.com/lvgl/lvgl/commit/b884abae26f3824b27783a85d18ed51e550347c1) -- fix(draw): allow drawing outline with LV_DRAW_COMPLEX == 0 too [`ece3495`](https://github.com/lvgl/lvgl/commit/ece34950040e218fc73605a4e88f1060c2a274f8) -- fix(colorwheel): fix updating color when using lv_colorwheel_set_hsv [`d59bba1`](https://github.com/lvgl/lvgl/commit/d59bba12db115afb4b6aa53eed2625221dfff2fd) -- fix(slider): find the nearest value on click instead of floor [`dfd14fa`](https://github.com/lvgl/lvgl/commit/dfd14fa778aef25d0db61748a58aa9989ce5e2c8) -- fix(draw): fix border drawing with thick borders [`d5b2a9b`](https://github.com/lvgl/lvgl/commit/d5b2a9b2562cbfa327bf0ec03c11d28576037a14) -- fix(refr): fix true double double buffering logic with transparent screens [`8b605cc`](https://github.com/lvgl/lvgl/commit/8b605cc48224d0497cdd936fa77229e0c3d606d2) -- fix(group): be sure obj is removed from its current group in lv_group_add_obj [`5156ee0`](https://github.com/lvgl/lvgl/commit/5156ee058d5de674a00ffd84d15d460de7f0e53b) -- fix(style): add missing invalidation in lv_obj_remove_local_style_prop [`a0515ba`](https://github.com/lvgl/lvgl/commit/a0515ba30dd74b8b22a6709d334eb03782ee1a4d) - -### Docs - -- docs(draw) remove reference to old lv_fs_add_drv function [`3564`](https://github.com/lvgl/lvgl/pull/3564) -- docs(disp): LV_COLOR_SCREEN_TRANSP remove dependency on LV_COLOR_DEPTH_32 as transparency is supported across all color depths [`3556`](https://github.com/lvgl/lvgl/pull/3556) - -### CI and tests - -- ci: protect test.c with #if LV_BUILD_TEST [`be485d7`](https://github.com/lvgl/lvgl/commit/be485d7605136d2a5d6a633c7cb5b7c525cae7ee) - -### Others - -- chore(rt-thread) backport fixes from v9 [`3604`](https://github.com/lvgl/lvgl/pull/3604) - -- chore: fix warnings [`7640950`](https://github.com/lvgl/lvgl/commit/76409502163ffe67cfbab9c7f24f2226cc8a5941) -- remove accidentally added code [`5022476`](https://github.com/lvgl/lvgl/commit/5022476edc8676f2a6ef7b919d3578159edeef7c) - - -## [v8.3.1](https://github.com/lvgl/lvgl/compare/v8.3.0...v8.3.1) 25 July 2022 - -### Fixes - -- fix(led): add bg_color draw descriptors back to led draw event to support LV_DRAW_COMPLEX 0 [`3515`](https://github.com/lvgl/lvgl/pull/3515) -- fix(slider): fix knob drawing in symmetrical mode [`2967172`](https://github.com/lvgl/lvgl/commit/2967172bee806e77da6ee2307c79e867af3f76bc) -- fix(refr): fix lv_refr_get_top_obj [`9750c97`](https://github.com/lvgl/lvgl/commit/9750c97aff4dc3de80559b150852b829f006d6bf) -- fix(arc): fix arc knob invalidation in SYMMETRICAL mode [`a283273`](https://github.com/lvgl/lvgl/commit/a283273bd27599dae6b044a941b6591ad45e059b) - -### Examples - -- example(freetype): Update the Micropython example to use the Lato font [`71913d3`](https://github.com/lvgl/lvgl/commit/71913d300dde25d1b87d1b44fa1fa47854defd59) -- example(freetype): replace the arial font with lato to avoid licensing issues [`8544cc3`](https://github.com/lvgl/lvgl/commit/8544cc38062d9c817013bbe6aedbb47112e580ad) - -### Docs - -- docs(readme): fix LVGL version typo (8.3.0) [`3462`](https://github.com/lvgl/lvgl/pull/3462) -- docs(tasmota): support LVGL 8.3.0 (#3511) [`62662f6`](https://github.com/lvgl/lvgl/commit/62662f68e9cf90adcb96d42030eca5fa135b96a5) - - - -## [v8.3.0](https://github.com/lvgl/lvgl/compare/v8.2.0...v8.3.0) 6 July 2022 - - -### Overview - -- **Layers** Support transforming (zoom and rotate) any widgets and their children drawn by LVGL. To do this LVGL renders the transformed widgets into a layer and draws that layer as an image applying all the transformations. Layers are also used when `opa` (not `bg_opa`, `border_opa`, etc) and `blend_mode` are set. This way nested objects are blended as one layer to avoid color bleeding. See more [here](https://docs.lvgl.io/master/overview/style.html#opacity-blend-modes-and-transformations). -- **inherit and initial style properties** Besides setting "normal values" for style properties now you can set them to `inherit` (inherit the parent's value) and `initial` (set the system default). See more [here](https://docs.lvgl.io/master/overview/style.html#forced-value-inheritance-default-value) -- **NXP-PXP and VGLITE GPU support** The support for NXP GPUs are added again -- **Color font support** You can use emojis and images in texts with this great new features. See more [here](https://docs.lvgl.io/master/others/imgfont.html). -- **ARM2D GPU support** Get support for ARM's own GPU. -- **PubSub messaging** A publisher-subscriber based messaging system is added to make communication between components easier. See more [here](https://docs.lvgl.io/master/others/msg.html). -- **Pinyin IME** Add support for Pinyin IME Chinese input. See more [here](https://docs.lvgl.io/master/others/ime_pinyin.html). -- **render_start_cb** A new callback is added to `lv_disp_drv_t` to indicate when the rendering starts. It's useful to make synchronization, e.g. wait for a TE signal. - - -### New Features - -- feat(ime_pinyin): add API to support 9-key input mode [`3447`](https://github.com/lvgl/lvgl/pull/3447) -- feat(font): add font placeholder drawing configuration [`3446`](https://github.com/lvgl/lvgl/pull/3446) -- feat(fsdrv): add posix lseek() error checking [`3444`](https://github.com/lvgl/lvgl/pull/3444) -- feat(misc): add asynchronous call function cancellation function [`3439`](https://github.com/lvgl/lvgl/pull/3439) -- feat(ime_pinyin): add API to use Pinyin IME(Chinese input) [`3408`](https://github.com/lvgl/lvgl/pull/3408) -- feat(style) add 'inherit' and 'initial' CSS properties [`3390`](https://github.com/lvgl/lvgl/pull/3390) -- feat(porting): add flushing control to the template [`3384`](https://github.com/lvgl/lvgl/pull/3384) -- feat(anim): add deleted callback (#3279) [`3295`](https://github.com/lvgl/lvgl/pull/3295) -- feat(cmsis-pack): monthly update for May [`3394`](https://github.com/lvgl/lvgl/pull/3394) -- feat(textarea): make it possible to customize the bullet character [`3388`](https://github.com/lvgl/lvgl/pull/3388) -- feat(disp): add a temporary invalidation disable interface [`3378`](https://github.com/lvgl/lvgl/pull/3378) -- feat(group): add edge callbacks when trying to move focus past beginning or end [`3374`](https://github.com/lvgl/lvgl/pull/3374) -- feat(benchmark): make lvgl render at the highest frame rate [`3352`](https://github.com/lvgl/lvgl/pull/3352) -- feat(rt-thread): allow users to control refresh period in the lvgl thread [`3375`](https://github.com/lvgl/lvgl/pull/3375) -- feat(cmsis-pack): Monthly update for May (alpha) [`3359`](https://github.com/lvgl/lvgl/pull/3359) -- feat(demos): add a callback for benchmark [`3353`](https://github.com/lvgl/lvgl/pull/3353) -- feat(gpu): Update lv_gpu_arm2d with new features [`3340`](https://github.com/lvgl/lvgl/pull/3340) -- feat(draw): improve acceleration for LV_IMG_CF_ALPHA_8BIT [`3337`](https://github.com/lvgl/lvgl/pull/3337) -- feat(anim): add the function of getting global animation refresher timer [`3331`](https://github.com/lvgl/lvgl/pull/3331) -- feat(demo): add Weighted FPS and Opa speed log output [`3326`](https://github.com/lvgl/lvgl/pull/3326) -- feat(gpu): Update gpu arm 2d [`3320`](https://github.com/lvgl/lvgl/pull/3320) -- feat(cmsis-pack): Monthly update for April [`3300`](https://github.com/lvgl/lvgl/pull/3300) -- feat(fsdrv) fix issues for win32 backends [`3284`](https://github.com/lvgl/lvgl/pull/3284) -- feat(cmake-build): Option to allow building shared libraries. [`3278`](https://github.com/lvgl/lvgl/pull/3278) -- feat(hal): add render_start_cb to disp_drv [`3274`](https://github.com/lvgl/lvgl/pull/3274) -- feat(cmsis-pack): monthly update for April (v1.0.3-alpha) [`3271`](https://github.com/lvgl/lvgl/pull/3271) -- feat(benchmark): add trace output for running a specific scenario [`3245`](https://github.com/lvgl/lvgl/pull/3245) -- feat(env_support): cmsis pack monthly update [`3209`](https://github.com/lvgl/lvgl/pull/3209) -- feat(tabview): support vertical scrolling [`3184`](https://github.com/lvgl/lvgl/pull/3184) -- feat(span): add an interface for setting the number of lines [`3200`](https://github.com/lvgl/lvgl/pull/3200) -- feat(indev): add possibility to enable/disable all input devices at once [`3179`](https://github.com/lvgl/lvgl/pull/3179) -- feat(font): add imgfont - can be used to add emojis to label/span [`3160`](https://github.com/lvgl/lvgl/pull/3160) -- feat(gpu): add gpu arm2d [`3162`](https://github.com/lvgl/lvgl/pull/3162) -- feat(dma2d): add lv_draw_stm32_dma2d_buffer_copy function [`3147`](https://github.com/lvgl/lvgl/pull/3147) -- feat(disp): add screen out animations [`3081`](https://github.com/lvgl/lvgl/pull/3081) -- feat(menu): make menu widget more compatible with encoder [`3061`](https://github.com/lvgl/lvgl/pull/3061) -- feat(label): added animation style property to apply it to circular scrolling animation of label widget [`3128`](https://github.com/lvgl/lvgl/pull/3128) -- feat(script): add pre-commit configuration for code formatting [`3092`](https://github.com/lvgl/lvgl/pull/3092) -- feat(refr): prevents dirty areas from being modified during rendering [`3107`](https://github.com/lvgl/lvgl/pull/3107) -- feat(log): improve lv_log and add log the result from lv_demo_benchmark [`3084`](https://github.com/lvgl/lvgl/pull/3084) -- feat(fragment): add fragment manager (a UI Controller concept) [`2940`](https://github.com/lvgl/lvgl/pull/2940) -- feat(porting): add a macro lv_run_timer_handler_in_period to simplify porting [`3063`](https://github.com/lvgl/lvgl/pull/3063) -- feat(gpu): reattach nxp pxp vglite accelerators(#3322) [`029eef7`](https://github.com/lvgl/lvgl/commit/029eef79c4cf6fef4ad46f7e335011ba4172381b) -- feat(draw): support transforming widgets and improfe sw transform [`318146a`](https://github.com/lvgl/lvgl/commit/318146a2c25362eabf258470be263a4cfeaefe87) -- feat(msg): add publisher-subscriber messaging [`79a29d7`](https://github.com/lvgl/lvgl/commit/79a29d749d3e261ebadbe31fccbff896f63b4d93) -- feat(benchmark): add an API to run specific scene (#3089) [`305ad00`](https://github.com/lvgl/lvgl/commit/305ad00893c0d18d9a65e28ee03d65f76f8abb0a) -- feat(gpu): add SWM341 gpu support (synwit) [`07b7eea`](https://github.com/lvgl/lvgl/commit/07b7eea56c048a0654c254cadebee8caf5f7933b) -- feat(arc): add lv_arc_align_obj_to_angle and lv_arc_rotate_obj_to_angle [`a76bb70`](https://github.com/lvgl/lvgl/commit/a76bb70a79dfa5b841328f07ede0907c700a039a) -- feat(draw): add draw_ctx->buffer_copy [`d034511`](https://github.com/lvgl/lvgl/commit/d034511bba3a27aa1a29d2e1b612b1adeb4e2ae1) -- feat(dropdown): add lv_dropdown_get_option_index [`9997fb0`](https://github.com/lvgl/lvgl/commit/9997fb00aa60b4478c76fa8387a74ca5b3c595b2) -- feat(tabview) add API to rename tab. [`2c9695a`](https://github.com/lvgl/lvgl/commit/2c9695afb4ed6597ae54806c5eb2a287925343f8) -- feat(indev): send LV_EVENT_PRESS_LOST on release with wait_until_release [`cc18518`](https://github.com/lvgl/lvgl/commit/cc18518e96df63c2a02ee9d423cb7bc23382e5a7) -- feat(style) add 'inherit' and 'initial' CSS properties (#3390) [`9a48de0`](https://github.com/lvgl/lvgl/commit/9a48de0f8b19ec02a44aaf6b330066eed7d0a105) -- feat(draw): improve acceleration for LV_IMG_CF_ALPHA_8BIT (#3337) [`8d3c41d`](https://github.com/lvgl/lvgl/commit/8d3c41d5170dad0455fea3d95b2765db70d3c7c2) -- feat(label): added animation style property to apply it to circular scrolling animation of label widget (#3128) [`340d45c`](https://github.com/lvgl/lvgl/commit/340d45cfa91b7108d43af906fc51b1c431877827) -- feat(gridnav): add lv_gridnav_set_focused [`b6d2daa`](https://github.com/lvgl/lvgl/commit/b6d2daa4935128ca8193863d4deaf58fa40b3154) - -### Performance - -- perf(draw): speed up non normal blend modes [`5a06fce`](https://github.com/lvgl/lvgl/commit/5a06fce472c103b4204002a7932dd6c6d05eb13c) -- perf(draw): minor optimiziation in point transformation [`c6c2864`](https://github.com/lvgl/lvgl/commit/c6c286404898bf559eca6eb5bb007251790c572c) -- perf(layer): cache the layer_type [`ac2e2f1`](https://github.com/lvgl/lvgl/commit/ac2e2f132e264d5f0f0313f4e6adbcf56d937a14) - -### Fixes - -- fix(draw): conflict with external ALIGN define [`3336`](https://github.com/lvgl/lvgl/pull/3336) -- fix(arc): fix bug with LV_ARC_MODE_REVERSE (#3417) [`3418`](https://github.com/lvgl/lvgl/pull/3418) -- fix(fragment): memory leak of fragments #3438 [`3442`](https://github.com/lvgl/lvgl/pull/3442) -- fix(draw): solve memory leaking issue [`3437`](https://github.com/lvgl/lvgl/pull/3437) -- fix(gridnav) correct logic in find_last_focusable [`3423`](https://github.com/lvgl/lvgl/pull/3423) -- fix(examples) correct comment in slider example [`3419`](https://github.com/lvgl/lvgl/pull/3419) -- fix(sdl): add transformation support for the SDL backend [`3403`](https://github.com/lvgl/lvgl/pull/3403) -- fix(bmp): fix with LV_COLOR_16_SWAP [`3412`](https://github.com/lvgl/lvgl/pull/3412) -- fix(sdl): fix LRU, reported in #3402 [`3404`](https://github.com/lvgl/lvgl/pull/3404) -- fix(draw) avoid use-after-free when drawing arcs [`3399`](https://github.com/lvgl/lvgl/pull/3399) -- fix(subpx): fix subpixel rendering font is not displaying bug [`3387`](https://github.com/lvgl/lvgl/pull/3387) -- fix(style): reset style lookup table after gc sweep/lv_deinit [`3385`](https://github.com/lvgl/lvgl/pull/3385) -- fix(benchmark): fix the issue that wrong scene number is used [`3372`](https://github.com/lvgl/lvgl/pull/3372) -- fix(draw): fix colour supports for indexed and alpha-only [`3371`](https://github.com/lvgl/lvgl/pull/3371) -- fix(mem): fix TLSF returning the wrong pointer when the requested size is too large [`3325`](https://github.com/lvgl/lvgl/pull/3325) -- fix(demo): fix warning. [`3344`](https://github.com/lvgl/lvgl/pull/3344) -- fix(config): add LV_GPU_SDL_LRU_SIZE [`3348`](https://github.com/lvgl/lvgl/pull/3348) -- feat(draw): improve acceleration for LV_IMG_CF_ALPHA_8BIT [`3337`](https://github.com/lvgl/lvgl/pull/3337) -- fix(txt): fix returned value of lv_txt_iso8859_1_next(..., NULL) [`3338`](https://github.com/lvgl/lvgl/pull/3338) -- fix(benchmark): remove redundant string for the small screens [`3335`](https://github.com/lvgl/lvgl/pull/3335) -- fix(chart): fix accessing uninitialized point_area [`3327`](https://github.com/lvgl/lvgl/pull/3327) -- fix(config): add LV_LAYER_SIMPLE_BUF_SIZE to Kconfig [`3312`](https://github.com/lvgl/lvgl/pull/3312) -- fix(config): Keep the sequence of widget in order [`3314`](https://github.com/lvgl/lvgl/pull/3314) -- fix(config): fix typo in LV_USE_PERF_MONITOR and LV_USE_MEM_MONITOR [`3313`](https://github.com/lvgl/lvgl/pull/3313) -- fix(refr): initializing row_cnt is to silence the warning [`3309`](https://github.com/lvgl/lvgl/pull/3309) -- fix(meter): fix typo [`3308`](https://github.com/lvgl/lvgl/pull/3308) -- fix(draw): update Makefiles [`3303`](https://github.com/lvgl/lvgl/pull/3303) -- fix(lodepng): fix NULL pointer access [`3307`](https://github.com/lvgl/lvgl/pull/3307) -- fix(Kconfig): change the type of LV_FS_STDIO_LETTER from string to int [`3282`](https://github.com/lvgl/lvgl/pull/3282) -- fix(demo): fix Wformat warning [`3290`](https://github.com/lvgl/lvgl/pull/3290) -- fix(snapshot): add missing ASSERT checks [`3292`](https://github.com/lvgl/lvgl/pull/3292) -- fix(Kconfig): Add LV_USE_GRIDNAV and LV_USE_FRAGMENT to Kconfig [`3270`](https://github.com/lvgl/lvgl/pull/3270) -- fix(msgbox): do not execute init obj when obj == NULL [`3264`](https://github.com/lvgl/lvgl/pull/3264) -- fix(menu): use LV_ASSERT_MALLOC check for new_node [`3263`](https://github.com/lvgl/lvgl/pull/3263) -- fix(canvas):image cache may expire after set canvas's buff [`3267`](https://github.com/lvgl/lvgl/pull/3267) -- fix(obj_style): prevent access to class null pointer [`3252`](https://github.com/lvgl/lvgl/pull/3252) -- fix(png): fix possible memory leak when decoding fails [`3249`](https://github.com/lvgl/lvgl/pull/3249) -- fix(libs): fix possible buffer underflow caused by extension matching [`3250`](https://github.com/lvgl/lvgl/pull/3250) -- fix(fs): track multiple directory handles with win32 backends [`3243`](https://github.com/lvgl/lvgl/pull/3243) -- fix(png): use LV_IMG_CF_TRUE_COLOR_ALPHA instead of LV_IMG_CF_RAW_ALPHA [`3212`](https://github.com/lvgl/lvgl/pull/3212) -- fix(Keil-AC5): slience warnings in Keil-AC5 [`3221`](https://github.com/lvgl/lvgl/pull/3221) -- fix(meter): fix infinite loop caused by loop variable type mismatch [`3232`](https://github.com/lvgl/lvgl/pull/3232) -- fix(chart): remove invalid decision branches [`3231`](https://github.com/lvgl/lvgl/pull/3231) -- fix(gradient): assert before dividing by 0 [`3228`](https://github.com/lvgl/lvgl/pull/3228) -- fix(calendar): fix infinite loop caused by loop variable type mismatch [`3230`](https://github.com/lvgl/lvgl/pull/3230) -- fix(flex): assert before dividing by 0 [`3237`](https://github.com/lvgl/lvgl/pull/3237) -- fix(hal): fix LV_ASSERT_MALLOC wrong placement [`3236`](https://github.com/lvgl/lvgl/pull/3236) -- fix(disp): fix missing null pointer judgment [`3238`](https://github.com/lvgl/lvgl/pull/3238) -- fix(obj_class): fix possible memory leak when the default disp is NULL [`3235`](https://github.com/lvgl/lvgl/pull/3235) -- fix(draw_sw_letter): fix incorrect use of sizeof for a pointer [`3234`](https://github.com/lvgl/lvgl/pull/3234) -- fix(indev): fix null pointer access caused by typo [`3229`](https://github.com/lvgl/lvgl/pull/3229) -- fix(event): remove invalid decision branches [`3233`](https://github.com/lvgl/lvgl/pull/3233) -- fix(draw_mask): remove invalid decision branches [`3225`](https://github.com/lvgl/lvgl/pull/3225) -- fix(spinbox): remove invalid judgment [`3227`](https://github.com/lvgl/lvgl/pull/3227) -- fix(gradient): remove invalid decision branches [`3226`](https://github.com/lvgl/lvgl/pull/3226) -- fix(txt): return 0 if letter_uni is out of range [`3224`](https://github.com/lvgl/lvgl/pull/3224) -- fix(calendar): fix possible array access out of bounds [`3223`](https://github.com/lvgl/lvgl/pull/3223) -- fix(style): remove useless null pointer judgment [`3222`](https://github.com/lvgl/lvgl/pull/3222) -- fix(obj): scrolling exception when use lv_obj_set_parent() [`3210`](https://github.com/lvgl/lvgl/pull/3210) -- fix(libs): fix memcmp memory access overflow [`3205`](https://github.com/lvgl/lvgl/pull/3205) -- fix(png): fix possible file leaks [`3204`](https://github.com/lvgl/lvgl/pull/3204) -- fix(docs): rename task-handler.md to timer-handler.md [`3203`](https://github.com/lvgl/lvgl/pull/3203) -- fix(lru): Fix use of undefined variables [`3181`](https://github.com/lvgl/lvgl/pull/3181) -- fix(rt-thread): Sconscript use LOCAL_CFLAGS to replace LOCAL_CCFLAGS [`3196`](https://github.com/lvgl/lvgl/pull/3196) -- fix(make) make files under draw/gpu [`3202`](https://github.com/lvgl/lvgl/pull/3202) -- fix(docs-CN):fix broken links to docs in dir get-started [`3195`](https://github.com/lvgl/lvgl/pull/3195) -- fix broken links to docs in dir get-started [`3190`](https://github.com/lvgl/lvgl/pull/3190) -- fix(indev): fix warning about formatting uint32_t with %d [`3193`](https://github.com/lvgl/lvgl/pull/3193) -- fix(Kconfig): move LV_USE_IMGFONT to others menu [`3176`](https://github.com/lvgl/lvgl/pull/3176) -- fix(draw): src_buf_tmp will be NULL when LV_DRAW_COMPLEX is '0' [`3163`](https://github.com/lvgl/lvgl/pull/3163) -- fix(span): align the baselines [`3164`](https://github.com/lvgl/lvgl/pull/3164) -- fix(menu): fix crash on delete [`3154`](https://github.com/lvgl/lvgl/pull/3154) -- fix(Kconfig): add missing LV_USE_THEME_MONO [`3146`](https://github.com/lvgl/lvgl/pull/3146) -- fix(demo/stress): remove the unused assets [`3139`](https://github.com/lvgl/lvgl/pull/3139) -- fix(jpg): swap high and low bytes when macro LV_COLOR_16_SWAP is 1 [`3138`](https://github.com/lvgl/lvgl/pull/3138) -- fix(script): in lv_conf_internal fix some widget dependencies when using Kconfig [`3119`](https://github.com/lvgl/lvgl/pull/3119) -- fix(demo): minor fix for benchmark [`3114`](https://github.com/lvgl/lvgl/pull/3114) -- fix(misc): in lv_map() handle if maximum value less than minimum value [`3113`](https://github.com/lvgl/lvgl/pull/3113) -- fix(extra): adjust image decoder initialization order [`3085`](https://github.com/lvgl/lvgl/pull/3085) -- fix(chart): optimize chart invalidation [`3028`](https://github.com/lvgl/lvgl/pull/3028) -- fix(refr): fix performance monitor NULL pointer access [`3105`](https://github.com/lvgl/lvgl/pull/3105) -- fix(misc): Remove duplicate declaration of _lv_log_add. [`3103`](https://github.com/lvgl/lvgl/pull/3103) -- fix(gridnav): get key code from the actual event [`3101`](https://github.com/lvgl/lvgl/pull/3101) -- fix(draw_rect): delete __STDC_VERSION__ to ensure C++ compatibility [`3099`](https://github.com/lvgl/lvgl/pull/3099) -- fix(font):draw placeholder if get_glyph_dsc() returns false [`3000`](https://github.com/lvgl/lvgl/pull/3000) -- fix(conf): work around GCC bug [`3082`](https://github.com/lvgl/lvgl/pull/3082) -- fix(fsdrv): replacing sprintf with lv_snprintf for safety [`3079`](https://github.com/lvgl/lvgl/pull/3079) -- fix(cmsis-pack): add PIDX for cmsis-pack [`3064`](https://github.com/lvgl/lvgl/pull/3064) -- feat(gpu): add SWM341 gpu support (synwit) [`07b7eea`](https://github.com/lvgl/lvgl/commit/07b7eea56c048a0654c254cadebee8caf5f7933b) -- fix(fs): fix cached read and add unit test for lv_fs [`98660a8`](https://github.com/lvgl/lvgl/commit/98660a861d874d29e8356452baff21788b6a9ef1) -- fix(table): invalidate only the changed cell [`306fa19`](https://github.com/lvgl/lvgl/commit/306fa1968238fe33dd95e2865e147bceb4706ad5) -- fix(draw): handle non BLEND_MODE_NORMAL for ARGB drawing [`9ac8ce6`](https://github.com/lvgl/lvgl/commit/9ac8ce69f67234563d4254e29e1903a638bb8f4e) -- fix(draw): revert handling of style_opa on not MAIN parts [`51a7a61`](https://github.com/lvgl/lvgl/commit/51a7a61df365685a7cd04b0512ba3844dcfa7209) -- fix(draw): clip the bg img to the rectangle's area in lv_draw_sw_rect [`77d726e`](https://github.com/lvgl/lvgl/commit/77d726efb2467ff86691dee487f97aac79ea45c2) -- fix(obj): fix LV_OBJ_FLAG_OVERFLOW_VISIBLE [`c742f2c`](https://github.com/lvgl/lvgl/commit/c742f2c8888ad0102cebe91b4069b376068baa81) -- fix(scroll): do not fire scroll begin/end event on every scroll step [`25ce6e3`](https://github.com/lvgl/lvgl/commit/25ce6e3ae9e144e2df5dad34475dda3542015f6a) -- fix(indev): do not send keys to objects in disabled state [`b0a46c4`](https://github.com/lvgl/lvgl/commit/b0a46c4837c922cb1303ef768da3209e7efa45ae) -- fix(disp): make lv_scr_load work better with lv_scr_load_anim and auto_del = true [`52287fd`](https://github.com/lvgl/lvgl/commit/52287fd64ad59c35794d1f4486b777f4eb686abc) -- fix(draw): create intermediate layer for blend modes too [`8b15007`](https://github.com/lvgl/lvgl/commit/8b150075681455c6424ddd536e991307ac828eb4) -- fix(group): in lv_group_remove() fix if the object to focus is deleted [`72cb683`](https://github.com/lvgl/lvgl/commit/72cb683c799f65cd4fbae22dafc3a35c123bb66b) -- fix(draw): be sure angle values are in the correct range [`e624b90`](https://github.com/lvgl/lvgl/commit/e624b90db3515816eee8f6ce72677350487f3a02) -- fix(scroll): send LV_EVENT_SCROLL_BEGIN/END with no animation too [`777fe1e`](https://github.com/lvgl/lvgl/commit/777fe1ea706f38b82ab8ee180548ecb85334a469) -- fix(arc): fix arc image drawing issue [`7153e3f`](https://github.com/lvgl/lvgl/commit/7153e3f8b7b660474b8907954c80e21eb2f0bd21) -- fix(refr): fix memory write out of bounds issue [`13c99fc`](https://github.com/lvgl/lvgl/commit/13c99fc4b66d3e8d0ffcd6fda21d3b5a40b0771c) -- fix(gif): fix rare issue when drawing the gif's background [`b1e2c06`](https://github.com/lvgl/lvgl/commit/b1e2c0665829aa489f444169ce80fcd7cdf487bb) -- fix(chart): fix misaligned horizontal tick lines on bar charts [`4572a0c`](https://github.com/lvgl/lvgl/commit/4572a0c6c92b126e229ce9aada551d71b4f4296b) -- fix(font): use 0 width for non printable characters [`7cf5709`](https://github.com/lvgl/lvgl/commit/7cf5709b0669ab64e437a796c50f6bdb97b9d0d5) -- revert(group): 72cb683c799f65cd4fbae22dafc3a35c123bb66b [`b7b22c1`](https://github.com/lvgl/lvgl/commit/b7b22c190c6d9e11a841289708f55be0be86830f) -- fix(keyboard): don't show popovers on map change [`ac202e7`](https://github.com/lvgl/lvgl/commit/ac202e7b96510b9b12beb8a1eee3dfd65bc56a3d) -- fix(refr): consider masks with LV_OBJ_FLAG_OVERFLOW_VISIBLE [`a7f9dfa`](https://github.com/lvgl/lvgl/commit/a7f9dfa8c3e4fd56cc2db5c3f3926b9391d3661f) -- fix(draw): fix the calculation of the transformed coordinates [`76de7c6`](https://github.com/lvgl/lvgl/commit/76de7c6b7bce6da62f5e961ee477bfa324675683) -- fix(style): fix heap use after free with transition styles [`d9ae58b`](https://github.com/lvgl/lvgl/commit/d9ae58b6977ccfda90e02fa6f5b852d398f8600a) -- fix(tabview, tileview): fix scrolling [`22854ff`](https://github.com/lvgl/lvgl/commit/22854ff3fba236f50893221805c9cc4d378baaca) -- fix(draw): fix disp_bg_img drawing [`dea75d9`](https://github.com/lvgl/lvgl/commit/dea75d9b4a90601bf81bf69d533c4f13e62aa88c) -- fix(textarea): fix max length handling [`127d8e8`](https://github.com/lvgl/lvgl/commit/127d8e82e344cd8762672e787b1ee06390050b65) -- fix(btnmatrix): fix extra draw size calculation to not clip shadow [`7ada130`](https://github.com/lvgl/lvgl/commit/7ada1301c2ee113a5184618538b979f6d9912239) -- fix(indev): scroll_ throw_vect cannot converge to 0 when vect is negative [`e5c11f1`](https://github.com/lvgl/lvgl/commit/e5c11f1f68275d294d5b8892366aa424a5a14bca) -- fix(theme): make the basic theme even more simpler [`62d6f3c`](https://github.com/lvgl/lvgl/commit/62d6f3c533ca6d13fce3056074c1e44ffea355b1) -- fix(color): color mix rounding error [`523062b`](https://github.com/lvgl/lvgl/commit/523062b9ee8a106ad4b3b7bd0ee7baca743f2e5f) -- fix(style): _lv_style_prop_lookup_flags tell all flags for LV_STYLE_PROP_ANY [`e53f602`](https://github.com/lvgl/lvgl/commit/e53f60259c01ab1243b0cf56eb228b7f5eedc203) -- fix(list): use for icon [`b171f7d`](https://github.com/lvgl/lvgl/commit/b171f7dde2a895142385ea1275f3f51255cb2811) -- fix(layout): fix the handling of FLOATING children [`48728a7`](https://github.com/lvgl/lvgl/commit/48728a7839d6859d7d6fc4f86f5fbcbcd9939348) -- fix(style): make color filter inherited [`5546b9d`](https://github.com/lvgl/lvgl/commit/5546b9d740de8d774071328251413ec29c12d288) -- fix(spinbox): set its default width in its class [`3d92972`](https://github.com/lvgl/lvgl/commit/3d9297269598ca40e2f8dd2d8f31150d41e94cb8) -- fix: fix warning [`6c00552`](https://github.com/lvgl/lvgl/commit/6c005526295aeb277edad42b3a05b0c7e6d72eaf) -- fix(draw): fix transformations on subdivided areas [`cbff8e8`](https://github.com/lvgl/lvgl/commit/cbff8e83e50fecc2b4b43d661deb91d8d81d6696) -- fix(slider): fix left knob in ranged mode [`17f5e0a`](https://github.com/lvgl/lvgl/commit/17f5e0accb15871040a6225a9c0471ceadd6dc16) -- fix(Kconfig): allow unchecking LV_CONF_SKIP [`f3a07a3`](https://github.com/lvgl/lvgl/commit/f3a07a3e8a21f3f9f2c48a2803b8bd991968cb05) -- fix(style): fix using width for both width and height in radius transition [`6acbdaa`](https://github.com/lvgl/lvgl/commit/6acbdaa53d941b891db377e65111bd999f04631d) -- fix(dropdown): fix scrolling when options are CENTER aligned [`e651383`](https://github.com/lvgl/lvgl/commit/e651383688dd29ab2e990cd997118435832d959c) -- fix(grid): fix dead branch [`46bf27d`](https://github.com/lvgl/lvgl/commit/46bf27d50bb668bdd1f84489cb70986ee0ef9fab) -- fix(hal): disable driver->screen_transp by default regardless to LV_COLOR_SCREEN_TRANSP [`ff7204e`](https://github.com/lvgl/lvgl/commit/ff7204ecadd10132b436b11c8948b9a882b58798) -- fix(theme): fix mono theme init [`5ec6694`](https://github.com/lvgl/lvgl/commit/5ec6694f7874f3c99a764e7ee2d45a933865c91c) -- fix(bmp) fix typo in BPP condition [`cbc38af`](https://github.com/lvgl/lvgl/commit/cbc38afb3a0d3ca02159ab89242749809e64df0c) -- fix(theme): in the basic theme show the textarea cursor only in focuses state [`bb03fb1`](https://github.com/lvgl/lvgl/commit/bb03fb197c7083680fd7dc730794a52561cabfd4) -- fix(draw): fix img recolor [`23eecce`](https://github.com/lvgl/lvgl/commit/23eecce008dacd8e5f5d56d017e4e5705f0c31e6) -- fix(theme) add disabled style to textarea in the default theme [`00f6759`](https://github.com/lvgl/lvgl/commit/00f67597d3c87ff811e5e682c10ef20227218651) -- fix(meter): improve the precision of tick line drawing [`0255c6d`](https://github.com/lvgl/lvgl/commit/0255c6dd39640d7ec639cbd339a0fbdcdfb2bb82) -- fix(gpu): fix warning with NXP GPU [`6be43b8`](https://github.com/lvgl/lvgl/commit/6be43b83b3dc9340263552167dbbb07c1069bdb0) -- fix(color): compensate rounding error during blending [`42d9c07`](https://github.com/lvgl/lvgl/commit/42d9c07eeb0abfdbf8746da3569a5f8bc156ae71) -- fix(examples) use type-safe function for retrieving event param [`71d535d`](https://github.com/lvgl/lvgl/commit/71d535defd730fc20ed8d57faa2550781be4f3d7) -- fix(draw) ensure variable is initialized to avoid warning [`276f28a`](https://github.com/lvgl/lvgl/commit/276f28a8a2f4ac2f6268a4363879faa6296e14ad) -- feat(draw): improve acceleration for LV_IMG_CF_ALPHA_8BIT (#3337) [`8d3c41d`](https://github.com/lvgl/lvgl/commit/8d3c41d5170dad0455fea3d95b2765db70d3c7c2) -- fix(spinbox): rename lv_spinbox_set_pos to lv_spinbox_set_cursor_pos [`a99eb6b`](https://github.com/lvgl/lvgl/commit/a99eb6bb6ae12f3fcb86f5268a0c000fb165e159) -- fix(layout): use uint16_t LV_LAYOUT_FLEX/GRID [`c596a36`](https://github.com/lvgl/lvgl/commit/c596a36d9ecf92ae5ce1ecc812210bf3a7df4999) -- fix(event) avoid using a boolean as a pointer [`06fff4b`](https://github.com/lvgl/lvgl/commit/06fff4b9bac35d63564de87fa63f7bedd8a0f9f2) -- fix(theme): properly disable transitions if LV_THEME_DEFAULT_TRANSITION_TIME==0 [`242112b`](https://github.com/lvgl/lvgl/commit/242112b2df8b6cc12aa9920cc3b2fdc9a11d807f) -- fix(scroll): fix scroll to view to the left [`7c74f65`](https://github.com/lvgl/lvgl/commit/7c74f6556abbc299a79b1490c06151a43c902f61) -- fix(fs): mark the read cache as invalid by default [`54f9987`](https://github.com/lvgl/lvgl/commit/54f99870b3cac619fb7057618637d7ee19d58bb3) -- fix(menu): fix crash on delete (#3154) [`a6c4c13`](https://github.com/lvgl/lvgl/commit/a6c4c134902f9a4c156672a70108e809b58fa18c) -- fix(roller): fix unexpected jump in infinite mode [`18f2d78`](https://github.com/lvgl/lvgl/commit/18f2d78728c758179e4ef01ebc632da4e1263be7) -- fix(conf): work around GCC bug (#3082) [`c6b34bc`](https://github.com/lvgl/lvgl/commit/c6b34bc85bb6f5e57e1c87857e03d1a0bd225e4c) - -### Examples -- example(ime_pinyin): improved lv_example_ime_pinyin_1 [`3428`](https://github.com/lvgl/lvgl/pull/3428) -- example(imgfont): fix lvgl.h include path [`3405`](https://github.com/lvgl/lvgl/pull/3405) -- example(btnmatrix): update lv_example_btnmatrix_2 to expicitly check which part is drawn [`6b2eac1`](https://github.com/lvgl/lvgl/commit/6b2eac1dd70df62916b46cee8d4b981ff088b1a7) -- example(slider): make lv_example_slider_3 work with dark theme too [`4a766c5`](https://github.com/lvgl/lvgl/commit/4a766c516db7c2572a075ec5ffe748d30af8c7b9) -- example(span): avoid ambiguous meaing [`7bb09e3`](https://github.com/lvgl/lvgl/commit/7bb09e358026aff3d55d881237624baac77db890) -- demo(benchmark): add LV_DEMO_BENCHMARK_RGB565A8 option [`afaa8c9`](https://github.com/lvgl/lvgl/commit/afaa8c93006a88db9f115b2b318eef790928d2a6) - -### Docs - -- docs(indev): add comment in input device part [`3422`](https://github.com/lvgl/lvgl/pull/3422) -- docs(slider) mention that VALUE_CHANGED is not sent on release [`3397`](https://github.com/lvgl/lvgl/pull/3397) -- docs(readme): add version portuguese brazilian [`3349`](https://github.com/lvgl/lvgl/pull/3349) -- docs(pc-simulator): add MDK with FastModel [`3318`](https://github.com/lvgl/lvgl/pull/3318) -- docs(intro): update for v8.2.0 [`3316`](https://github.com/lvgl/lvgl/pull/3316) -- docs(readme) update link to the PlatformIO Registry [`3296`](https://github.com/lvgl/lvgl/pull/3296) -- docs(gesture): fix typo lv_indev_act() -> lv_indev_get_act() [`3291`](https://github.com/lvgl/lvgl/pull/3291) -- docs(scroll) add information about scroll coordinates [`3088`](https://github.com/lvgl/lvgl/pull/3088) -- docs(msgbox) fix typo [`3095`](https://github.com/lvgl/lvgl/pull/3095) -- docs(scroll): use LV_DIR_VER instead of LV_DIR_TOP [`3066`](https://github.com/lvgl/lvgl/pull/3066) -- docs: rearrange the get-started section [`8a81532`](https://github.com/lvgl/lvgl/commit/8a8153219163b689e8f96d6a97c1f128eefd7ce2) -- docs: add section for renderers and gpus [`378aaa6`](https://github.com/lvgl/lvgl/commit/378aaa637bdcaef8f06667ab9d56c914e0a61beb) -- docs collapse APIs by default [`ebd20af`](https://github.com/lvgl/lvgl/commit/ebd20af6e9cbd68230f49b6c85d940569a7db81c) -- docs(images): fix notes about breaking change inf v8.2 [`9a1e385`](https://github.com/lvgl/lvgl/commit/9a1e385b2b3498ed70704bf0ed33e4bd263747d8) -- docs(sim): add link to qt-creator [`88bbef1`](https://github.com/lvgl/lvgl/commit/88bbef14bf69725a1ab62bffa6ab79355ea31c2d) -- docs(chart): describe how to set the space between columns [`746917d`](https://github.com/lvgl/lvgl/commit/746917dcca74c53f6b2dc3849c9d588a0bf91b60) -- docs(README): fix broken link [`c2c44c6`](https://github.com/lvgl/lvgl/commit/c2c44c68ee69cdee16fce7833cbf6d6dc0d551ab) -- docs(examples) avoid redirects when loading examples [`d367bb7`](https://github.com/lvgl/lvgl/commit/d367bb7cf17dc34863f4439bba9b66a820088951) -- docs(gesture): describe how prevent sending events after a gesture [`65db5c9`](https://github.com/lvgl/lvgl/commit/65db5c99e05f86d2ec69ebae9f1fc50fe30a3145) -- docs(get-started): add quick-overview to the index [`91ebf81`](https://github.com/lvgl/lvgl/commit/91ebf810aacfe972f0ae140a1a61031eea9cda0c) -- docs(others): add imgfont to the index [`656a0e5`](https://github.com/lvgl/lvgl/commit/656a0e5167dca8c6c29497130e374080397fa45f) - -### CI and tests - -- ci(slider): add unit test [`3198`](https://github.com/lvgl/lvgl/pull/3198) -- test(line): add unit tests for line widget [`3104`](https://github.com/lvgl/lvgl/pull/3104) -- test(table): replicate issue when reducing table cells [`3121`](https://github.com/lvgl/lvgl/pull/3121) -- test(textarea): add unit test [`3074`](https://github.com/lvgl/lvgl/pull/3074) -- test(table): add unit tests [`3040`](https://github.com/lvgl/lvgl/pull/3040) -- ci(docs) replace use of sed with proper configuration variables [`1816fa5`](https://github.com/lvgl/lvgl/commit/1816fa576cc40ef1795e95ed127d93df5390b0cf) -- ci add Makefile test [`ea79cee`](https://github.com/lvgl/lvgl/commit/ea79cee01a6bec9b3ce5b6c232dd7ca0d020d5c9) -- test(mem) add test for #3324 [`9700664`](https://github.com/lvgl/lvgl/commit/97006647d8ed3af65fd2113ddf01c7882a4dba19) -- test(img): fix image error diff handler [`48d87e1`](https://github.com/lvgl/lvgl/commit/48d87e1ed2d362e9c3bd84eb60c311ad6519ae85) -- ci update docs builder to work with Python 3.10 [`a3d66c9`](https://github.com/lvgl/lvgl/commit/a3d66c9b67d226f8ab4555616ecf2ea62e307962) -- ci make sure LVGL assertions cause tests to fail [`b83c5aa`](https://github.com/lvgl/lvgl/commit/b83c5aa9bc4a278a6758f76e77ac9c403e483948) -- ci remove formatting comment [`d345f76`](https://github.com/lvgl/lvgl/commit/d345f76d02a23d94550b1b60be90585f6f5276b7) -- ci don't run workflows twice on PRs [`fcc1152`](https://github.com/lvgl/lvgl/commit/fcc1152f9c14494f128f26a6b47b00864a70c741) -- ci bump test timeout to 30 seconds [skip ci] [`85e3e23`](https://github.com/lvgl/lvgl/commit/85e3e2387845bd29c9f85b406623e41d36b66808) -- ci limit tests to 15 seconds [`003f18f`](https://github.com/lvgl/lvgl/commit/003f18f86c5c728920575cf1d34dd0f811607a51) -- ci(makefile) fix typo in GitHub action [`a101e70`](https://github.com/lvgl/lvgl/commit/a101e70ebd4120549236abd637049678dd6800e7) -- ci(switch): fix mem leak test [`8481e3a`](https://github.com/lvgl/lvgl/commit/8481e3a33bc3313b679babac31e6193ec4319bcd) -- ci(stale) bump action version [`5977eef`](https://github.com/lvgl/lvgl/commit/5977eeff3c559c0473d5abd8a99687eeb4659c61) -- ci use GCC problem matcher on ARM tests as well [`9fcefe5`](https://github.com/lvgl/lvgl/commit/9fcefe5a49a024054a3cee08d273b8fe5cf8840e) - - -## [v8.2.0](https://github.com/littlevgl/lvgl/compare/v8.1.0...v8.2.0) 31 January 2022 - - -### Overview - -Among many fixes and minor updates these are the most important features in v8.2.0: -- Abstract render layer to make it easier to attach external draw engines -- Add `LV_FLAD_OVERFLOW_VISIBLE`. If enabled the children of an object won't be clipped to the boundary of the object -- Add ffmpeg decoder support to play videos and open a wide variety of image formats -- Add font fallback support -- Add gradient dithering support -- Add "monkey test" -- Add cmsis-pack support -- Add Grid navigation (`lv_gridnav`) - -The GPU support for NXP microcontrollers is still not updated to the new draw architecture. See [#3052](https://github.com/lvgl/lvgl/issues/3052) - -### Breaking Changes - -- :warning: feat(fs): add caching option for lv_fs-read [`2979`](https://github.com/littlevgl/lvgl/pull/2979) -- :warning: feat(span): lv_spangroup_get_expand_width() adds a parameter [`2968`](https://github.com/littlevgl/lvgl/pull/2968) -- :warning: arch(draw): allow replacing the draw engine [`db53ea9`](https://github.com/littlevgl/lvgl/commit/db53ea925c9502b20f38db0fc30c4ef599bdfc33) -- :warning: indexed images are not chroma keyed. Use the alpha chaneel instead. - -### Architectural - -- arch(draw): separate SW renderer to allow replacing it [`2803`](https://github.com/littlevgl/lvgl/pull/2803) -- arch: merge lv_demos [`5414652`](https://github.com/littlevgl/lvgl/commit/5414652a4108dc6761b859fbb48a43e37e67a37a) -- arch(sdl): migrated to use new backend architecture [`2840`](https://github.com/littlevgl/lvgl/pull/2840) -- arch(env): move rt-thread into env_support folder [`3025`](https://github.com/littlevgl/lvgl/pull/3025) -- arch(env): arch(env): move the cmake folder into the env_support folder [`773d50f`](https://github.com/littlevgl/lvgl/commit/773d50f0acafa279fa7440ddcf15e80cf07eda54) -- arch(env): move the zephyr folder into the env_support folder [`4bd1e7e`](https://github.com/littlevgl/lvgl/commit/4bd1e7e9f7acc5295b65440477e76a048094afbf) - -### New Features - -- feat(cmsis-pack): prepare for lvgl v8.2.0 release [`3062`](https://github.com/littlevgl/lvgl/pull/3062) -- feat(gridnav): add lv_gridnav [`2911`](https://github.com/littlevgl/lvgl/pull/2911) -- feat: update the cmsis-pack to 0.8.3 [`3021`](https://github.com/littlevgl/lvgl/pull/3021) -- feat(sdl): support rounded images [`3012`](https://github.com/littlevgl/lvgl/pull/3012) -- feat(cmsis-pack): add cmsis-pack support [`2993`](https://github.com/littlevgl/lvgl/pull/2993) -- feat(event): add preprocessing and stop bubbling features for events [`3003`](https://github.com/littlevgl/lvgl/pull/3003) -- feat(draw): add gradient dithering support [`2872`](https://github.com/littlevgl/lvgl/pull/2872) -- feat(symbols): add guards to LV_SYMBOL_* to allow redefining them [`2973`](https://github.com/littlevgl/lvgl/pull/2973) -- feat(obj): subdivide LV_OBJ_FLAG_SCROLL_CHAIN into ...CHAIN_HOR and ...CHAIN_VER [`2961`](https://github.com/littlevgl/lvgl/pull/2961) -- feat(draw): add draw_bg callback to draw_ctx #2934 [`2935`](https://github.com/littlevgl/lvgl/pull/2935) -- feat(docs): add Chinese readme [`2919`](https://github.com/littlevgl/lvgl/pull/2919) -- feat(txt): add used_width parameter to _lv_txt_get_next_line() [`2898`](https://github.com/littlevgl/lvgl/pull/2898) -- feat(others) add monkey test [`2885`](https://github.com/littlevgl/lvgl/pull/2885) -- feat(rlottie): add animation control options [`2857`](https://github.com/littlevgl/lvgl/pull/2857) -- feat(lv_hal_indev): add missing lv_indev_delete() [`2854`](https://github.com/littlevgl/lvgl/pull/2854) -- feat(freetype): optimize memory allocation [`2849`](https://github.com/littlevgl/lvgl/pull/2849) -- feat(Kconfig): add FreeType config [`2846`](https://github.com/littlevgl/lvgl/pull/2846) -- feat(widgets): add menu widget [`2603`](https://github.com/littlevgl/lvgl/pull/2603) -- feat(refr): add reset function for FPS statistics [`2832`](https://github.com/littlevgl/lvgl/pull/2832) -- feat(Kconfig): add monitor position configuration [`2834`](https://github.com/littlevgl/lvgl/pull/2834) -- feat(examples) add micropython versions of the external library examples [`2762`](https://github.com/littlevgl/lvgl/pull/2762) -- feat(freetype): support bold and italic [`2824`](https://github.com/littlevgl/lvgl/pull/2824) -- feat(font) add fallback support and mem. font load option to FreeType [`2796`](https://github.com/littlevgl/lvgl/pull/2796) -- feat(lib) add ffmpeg video and image decoder [`2805`](https://github.com/littlevgl/lvgl/pull/2805) -- feat(obj): add LV_OBJ_FLAG_OVERFLOW_VISIBLE [`e7ac0e4`](https://github.com/littlevgl/lvgl/commit/e7ac0e41988e5fda772e17292c05d65bcaf58394) -- feat(scrollbar): add more control over scrollbar paddings [`4197b2f`](https://github.com/littlevgl/lvgl/commit/4197b2fd6ebec4b4dcfeeb2c41b724e09b77d1d0) -- feat(dropdown): keep the list on open/close for simpler styling [`9d3134b`](https://github.com/littlevgl/lvgl/commit/9d3134b66e40882c232afa79498c41294603f437) -- feat(qrcode) use destructor instead of lv_qrcode_delete() [`318edd8`](https://github.com/littlevgl/lvgl/commit/318edd8a3f61a65be3ed15a97c0870de0ad4125a) -- feat(disp) allow decoupling the disp_refr timer [`85cc84a`](https://github.com/littlevgl/lvgl/commit/85cc84ad947786bb3d4857290503047946a55c43) -- feat(obj): add lv_obj_get_event_user_data() [`53ececc`](https://github.com/littlevgl/lvgl/commit/53ececc5ec6f62ee4ab47ea66a847679e3836f52) -- feat(obj) add LV_OBJ_FLAG_SCROLL_WITH_ARROW [`70327bd`](https://github.com/littlevgl/lvgl/commit/70327bdb2d758336340c5a3b378ab876bfee2d53) -- feat(slider): consider ext_click_area on the knob with LV_OBJ_FLAG_ADV_HITTEST [`9d3fb41`](https://github.com/littlevgl/lvgl/commit/9d3fb418969c13b93f01a6b0342a1cd8d02e9b6c) - -### Performance - -- perf(sdl): optimize the use of SDL_RenderSetClipRect [`2941`](https://github.com/littlevgl/lvgl/pull/2941) -- perf(color): add faster lv_color_hex function [`2864`](https://github.com/littlevgl/lvgl/pull/2864) - -### Fixes - -- fix(micropython) update examples for new API [`3059`](https://github.com/littlevgl/lvgl/pull/3059) -- fix: increase default value of LV_MEM_SIZE for lv_demo_widgets #3057 [`3058`](https://github.com/littlevgl/lvgl/pull/3058) -- fix(cmsis-pack): fix issue #3032 [`3056`](https://github.com/littlevgl/lvgl/pull/3056) -- fix(porting): add missing function prototypes [`3054`](https://github.com/littlevgl/lvgl/pull/3054) -- fix(kconfig): add missing default values [`3050`](https://github.com/littlevgl/lvgl/pull/3050) -- fix(canvas): force canvas to use sw draw [`3045`](https://github.com/littlevgl/lvgl/pull/3045) -- fix(rt-thread): use ARCH_CPU_BIG_ENDIAN to replace RT_USING_BIG_ENDIAN [`3044`](https://github.com/littlevgl/lvgl/pull/3044) -- fix(gradient): general cleanup and fix for alignment issues [`3036`](https://github.com/littlevgl/lvgl/pull/3036) -- fix(draw): rendering issues for vertical gradient with and without dithering [`3034`](https://github.com/littlevgl/lvgl/pull/3034) -- fix uninitialized variable [`3033`](https://github.com/littlevgl/lvgl/pull/3033) -- fix(lru): lower dependency for standard C functions [`3024`](https://github.com/littlevgl/lvgl/pull/3024) -- fix(env_support): move cmsis-pack to env_support folder [`3026`](https://github.com/littlevgl/lvgl/pull/3026) -- fix(doc): full covering opacity is 255, not 256 [`3022`](https://github.com/littlevgl/lvgl/pull/3022) -- fix uninitialized variables [`3023`](https://github.com/littlevgl/lvgl/pull/3023) -- fix various issues for esp32 [`3007`](https://github.com/littlevgl/lvgl/pull/3007) -- fix(sdl): fix clipped image drawing [`2992`](https://github.com/littlevgl/lvgl/pull/2992) -- fix(draw): missed bg_color renaming in the draw function [`3002`](https://github.com/littlevgl/lvgl/pull/3002) -- fix(porting): fix typo and an unmatched prototype [`2998`](https://github.com/littlevgl/lvgl/pull/2998) -- fix(conf) add missing LV_LOG_LEVEL default definition [`2996`](https://github.com/littlevgl/lvgl/pull/2996) -- fix(refr): crash if full_refresh = 1 [`2999`](https://github.com/littlevgl/lvgl/pull/2999) -- fix(Kconfig): adapt to lvgl's built-in demos [`2989`](https://github.com/littlevgl/lvgl/pull/2989) -- fix(Makefile): compilation errors [`2944`](https://github.com/littlevgl/lvgl/pull/2944) -- fix(rlottie): fix variable name [`2971`](https://github.com/littlevgl/lvgl/pull/2971) -- fix(group): in lv_group_del() remove group from indev (lvgl#2963) [`2964`](https://github.com/littlevgl/lvgl/pull/2964) -- fix(obj): old parent's scroll is not updated in lv_obj_set_parent() [`2965`](https://github.com/littlevgl/lvgl/pull/2965) -- fix(fatfs) add missing cast [`2969`](https://github.com/littlevgl/lvgl/pull/2969) -- fix(snapshot) fix memory leak [`2970`](https://github.com/littlevgl/lvgl/pull/2970) -- fix(examples) move event callback registration outside loop in `lv_example_event_3` [`2959`](https://github.com/littlevgl/lvgl/pull/2959) -- fix(canvas): off by one error in size check in lv_canvas_copy_buf [`2950`](https://github.com/littlevgl/lvgl/pull/2950) -- fix(indev) add braces to avoid compiler warning [`2947`](https://github.com/littlevgl/lvgl/pull/2947) -- fix: fix parameter order in function prototypes [`2929`](https://github.com/littlevgl/lvgl/pull/2929) -- fix(style):add const qualifier for lv_style_get_prop() [`2933`](https://github.com/littlevgl/lvgl/pull/2933) -- fix(dropdown): in lv_dropdown_get_selected_str handle if there are no options [`2925`](https://github.com/littlevgl/lvgl/pull/2925) -- fix: lv_deinit/lv_init crash or hang [`2910`](https://github.com/littlevgl/lvgl/pull/2910) -- fix(rt-thread): improve the structure [`2912`](https://github.com/littlevgl/lvgl/pull/2912) -- fix: removed string format warnings for int32_t and uint32_t [`2924`](https://github.com/littlevgl/lvgl/pull/2924) -- fix(lv_fs_win32): add missing include of <stdio.h> [`2918`](https://github.com/littlevgl/lvgl/pull/2918) -- fix: use unsigned integer literal for bit shifing. [`2888`](https://github.com/littlevgl/lvgl/pull/2888) -- chore(lottie) move rlottie_capi.h to lv_rlottie.c [`2902`](https://github.com/littlevgl/lvgl/pull/2902) -- fix(qrcodegen) add brackets around assert calls [`2897`](https://github.com/littlevgl/lvgl/pull/2897) -- fix(list) guard image creation with LV_USE_IMG [`2881`](https://github.com/littlevgl/lvgl/pull/2881) -- fix(snapshot): make fake display size big enough to avoid align issue. [`2883`](https://github.com/littlevgl/lvgl/pull/2883) -- fix(sdl) correct makefile [`2884`](https://github.com/littlevgl/lvgl/pull/2884) -- fix(draw): fix set_px_cb memory write overflow crash. [`2882`](https://github.com/littlevgl/lvgl/pull/2882) -- fix(freetype): fix memset error [`2877`](https://github.com/littlevgl/lvgl/pull/2877) -- fix(span): fix align and break word [`2861`](https://github.com/littlevgl/lvgl/pull/2861) -- fix(refr): swap buffers only on the last area with direct mode [`2867`](https://github.com/littlevgl/lvgl/pull/2867) -- fix(arc) free memory when drawing full-circle arc [`2869`](https://github.com/littlevgl/lvgl/pull/2869) -- fix(indev): update lv_indev_drv_update to free the read_timer [`2850`](https://github.com/littlevgl/lvgl/pull/2850) -- fix(draw): fix memory access out of bounds when using blend subtract [`2860`](https://github.com/littlevgl/lvgl/pull/2860) -- fix(chart) add lv_chart_refresh() to the functions which modify the data [`2841`](https://github.com/littlevgl/lvgl/pull/2841) -- fix(conf) mismatched macro judgment [`2843`](https://github.com/littlevgl/lvgl/pull/2843) -- fix(ffmpeg): when disabled LV_FFMPEG_AV_DUMP_FORMAT makes av_log quiet [`2838`](https://github.com/littlevgl/lvgl/pull/2838) -- fix(rt-thread): fix a bug of log [`2811`](https://github.com/littlevgl/lvgl/pull/2811) -- fix(log): to allow printf and custom_print_cb to work at same time [`2837`](https://github.com/littlevgl/lvgl/pull/2837) -- fix(keyboard): add missing functions [`2835`](https://github.com/littlevgl/lvgl/pull/2835) -- fix(checkbox) remove unnecessary events [`2829`](https://github.com/littlevgl/lvgl/pull/2829) -- fix(qrcode): replace memcpy() with lv_memcpy() and delete useless macros [`2827`](https://github.com/littlevgl/lvgl/pull/2827) -- fix(font) improve builtin font source files generation process [`2825`](https://github.com/littlevgl/lvgl/pull/2825) -- fix(CMake) split CMakeLists.txt, add options, includes and dependencies [`2753`](https://github.com/littlevgl/lvgl/pull/2753) -- fix(obj): make lv_obj_fade_in/out use the current opa as start value [`2819`](https://github.com/littlevgl/lvgl/pull/2819) -- fix(qrcode):minimize margins as much as possible [`2804`](https://github.com/littlevgl/lvgl/pull/2804) -- fix(scripts): switch all scripts to python3 [`2820`](https://github.com/littlevgl/lvgl/pull/2820) -- fix(event): event_send_core crash in special case. [`2807`](https://github.com/littlevgl/lvgl/pull/2807) -- fix(Kconfig) remove duplicate LV_BUILD_EXAMPLES configuration [`2813`](https://github.com/littlevgl/lvgl/pull/2813) -- fix(obj): in obj event use the current target instead of target [`2785`](https://github.com/littlevgl/lvgl/pull/2785) -- fix(draw_label): radius Mask doesn't work in Specific condition [`2784`](https://github.com/littlevgl/lvgl/pull/2784) -- fix(draw_mask): will crash if get_width/height < 0 [`2793`](https://github.com/littlevgl/lvgl/pull/2793) -- fix(theme) make the basic theme really basic [`a369f18`](https://github.com/littlevgl/lvgl/commit/a369f18c57c6b9d20a37959d621f9cb16348ef99) -- fix(arc): fix knob invalidation [`345f688`](https://github.com/littlevgl/lvgl/commit/345f6882c9802dd9be55dfda5fe50c17e8c002b0) -- fix(theme): add arc, spinner and colorwheel to basic theme [`adc218a`](https://github.com/littlevgl/lvgl/commit/adc218a7b303c564da021714e5a109a5d003fc30) -- fix(conf) define LV_LOG_TRACE_... to 0 in lv_conf_internal.h to avoid warnings [`305284c`](https://github.com/littlevgl/lvgl/commit/305284c2b5aadec7bcfa68c6517c98d44be7c8a9) -- fix(draw): consider opa and clip corner on bg_img [`d51aea4`](https://github.com/littlevgl/lvgl/commit/d51aea4dffc706876ac729373c33a74743bc05e9) -- fix(draw): add grad_cache_mem to GC_ROOTs [`138db9c`](https://github.com/littlevgl/lvgl/commit/138db9c5d6b1f1d42c48d1307f5f508149ab0fda) -- fix(bar, slider): fix shadow drawing on short indicators [`364ca3c`](https://github.com/littlevgl/lvgl/commit/364ca3ca1763fb732a049bfce689e2f588593cd4) -- fix(theme): fix theme initialization issue introduced in 6e0072479 [`d231644`](https://github.com/littlevgl/lvgl/commit/d2316447c5c240960236d41814ef20e63cd56f00) -- fix(draw): add lv_draw_sw_bg [`49642d3`](https://github.com/littlevgl/lvgl/commit/49642d3891c563b6c82bb407bacc4b73329a8c93) -- fix(draw) border_draw crash is special case [`075831a`](https://github.com/littlevgl/lvgl/commit/075831a54c30d294879619c90ca4d16676c0775a) -- fix(theme): fix crash in lv_theme_basic_init [`ca5f04c`](https://github.com/littlevgl/lvgl/commit/ca5f04cfe33e1db0b72a07812557634b86028c27) -- fix(draw): fix indexed image drawing [`5a0dbcc`](https://github.com/littlevgl/lvgl/commit/5a0dbccf890b7a86315140dfe052da6b6aeca531) -- fix(roller): clip overflowing text [`5709528`](https://github.com/littlevgl/lvgl/commit/5709528550f7bdb0a16da1c05ea8094fc085db08) -- fix(align) fix LV_SIZE_CONTENT size calculation with not LEFT or TOP alignment [`9c67642`](https://github.com/littlevgl/lvgl/commit/9c676421ff159de1a96409f5557d36090c1728f9) -- fix(draw): futher bg_img draw fixes [`81bfb76`](https://github.com/littlevgl/lvgl/commit/81bfb765e5baba359e61dcb030f3ee96160a6335) -- fix(btnmatrix): keep the selected button even on release [`d47cd1d`](https://github.com/littlevgl/lvgl/commit/d47cd1d7fe910efc189e2f43f046a09184cfff13) -- fix(sw): make knob size calculation more intuitive [`5ec532d`](https://github.com/littlevgl/lvgl/commit/5ec532dfd5ffa0d47a1ac80c9a468d6362f3d933) -- fix(switch): make knob height calculation similar to slider [`0921dfc`](https://github.com/littlevgl/lvgl/commit/0921dfc8cd9d00e70ead8cbef8a898711af8f43e) -- fix(span): explicitly set span->txt to the return value of lv_mem_realloc(#3005) [`a9a6cb8`](https://github.com/littlevgl/lvgl/commit/a9a6cb8efd16c55a175791a43a3f4043a3a5e01f) -- fix(example): update LVGL_Arduino.ino [`d79283c`](https://github.com/littlevgl/lvgl/commit/d79283c145f92124c800453bcaf1caf1f9684bc5) -- fix(draw) simplify how outline_pad is compnesated [`81d8be1`](https://github.com/littlevgl/lvgl/commit/81d8be13d67d6b17b663bc703c1e0e18a18890a7) -- fix(obj) make LV_OBJ_FLAG_SCROLL_CHAIN part of the enum instead of define [`f8d8856`](https://github.com/littlevgl/lvgl/commit/f8d88567f635f325d6738ce2343f3b3c29f1e40a) -- fix(label): dot not add dots if the label height > 1 font line height [`4d61f38`](https://github.com/littlevgl/lvgl/commit/4d61f3802013b31b0af5f08f66bb86f5179db141) -- fix(event): crash if an object was deleted in an event [`9810920`](https://github.com/littlevgl/lvgl/commit/9810920fc5d34a984bddf6e41156e87e509cfd27) -- fix(build) fix sdl build with make [`43729d1`](https://github.com/littlevgl/lvgl/commit/43729d1502dad0ca797b4b6fb8c69a48c81a2af7) -- fix(config): fix anonymous choice [`71c739c`](https://github.com/littlevgl/lvgl/commit/71c739cc2dbcebf16e8adc805dda182011e725da) -- chore(docs): fix lv_list_add_text [`a5fbf22`](https://github.com/littlevgl/lvgl/commit/a5fbf22d415a52cb2641c6dfda6937a10e4952cc) -- fix(png) check png magic number to be sure it's a png image [`1092550`](https://github.com/littlevgl/lvgl/commit/1092550775c464f9ae8c406786fe02115776d5c6) -- fix(btnmatrix): fix crash if an empty btnmatrix is pressed [`2392f58`](https://github.com/littlevgl/lvgl/commit/2392f585bb9317153f6fb648d2a660cbdc3e276f) -- fix(mem/perf monitor): fix issue introduced in #2910 [`0788d91`](https://github.com/littlevgl/lvgl/commit/0788d918990fd1c03bd7a04941cfbbdf6d21987c) -- fix(layout) fix layout recalculation trigger in lv_obj_add/clear_fleg [`ee65410`](https://github.com/littlevgl/lvgl/commit/ee65410c3725070ed1779c95fb8742107cdd9267) -- fix(obj) fix lv_obj_fade_in [`4931384`](https://github.com/littlevgl/lvgl/commit/49313840ee9b249f2ef9142e872657856810acfc) -- fix(draw): fix clipping children to parent [`5c98ac8`](https://github.com/littlevgl/lvgl/commit/5c98ac85117c24f4da61803f0dc5a9bb6cfd1fdc) -- fix: remove symlinks to be accepted as an Ardunio library [`6701d36`](https://github.com/littlevgl/lvgl/commit/6701d36afe40130479dc83efc05d4860f3f29636) -- chore: fix typos in FATFS config [`74091c4`](https://github.com/littlevgl/lvgl/commit/74091c42f7cf4e85e46e706692accb65879741e2) -- fix(refr): fix missed buffer switch in double full-screen buffer + direct_mode [`731ef5a`](https://github.com/littlevgl/lvgl/commit/731ef5a75ea7feb7319315bd15bc1a43b899c1ca) -- chore(qrcode): fix warnings [`e9d7080`](https://github.com/littlevgl/lvgl/commit/e9d70803e11378eddf435e66c2181c0fa77211c7) -- docs(event): tell to not adjust widgets in draw events [`933d67f`](https://github.com/littlevgl/lvgl/commit/933d67fe5b8596da203c318aa9551aad1c2887e6) -- fix(table, chart): fix memory leaks [`8d52de1`](https://github.com/littlevgl/lvgl/commit/8d52de14b33262a11de87f5d782611a38726a1a7) -- fix(event): handle object deletion in indev->fedback_cb [`bfc8edf`](https://github.com/littlevgl/lvgl/commit/bfc8edf802382f78e96125c886427c99c7f9a600) -- fix(roller): snap on press lost [`fa9340c`](https://github.com/littlevgl/lvgl/commit/fa9340c45fd4a86b4a44878286850f3f67133bf4) -- fix(dropdown) be sure the list is the top object on the screen [`cb7fc2b`](https://github.com/littlevgl/lvgl/commit/cb7fc2bb59f788ce8024d62a5b1e821575a9cb74) -- fix(img) fix invalidation issue on transformations [`d5ede0e`](https://github.com/littlevgl/lvgl/commit/d5ede0ebc6685d4857b5ac554d53c0a7373d7532) -- fix(obj) fix comments of lv_obj_set_pos/x/y [`b9a5078`](https://github.com/littlevgl/lvgl/commit/b9a5078cd9d57662fc6e684d57a0ee4e70ca49c0) - -### Examples - -- example: add non-null judgment to lv_example_obj_2 [`2799`](https://github.com/littlevgl/lvgl/pull/2799) -- example(table): fix text alignment [`b03dc9c`](https://github.com/littlevgl/lvgl/commit/b03dc9cf862584c2e2be2c900fa4ff6e67b336f8) - -### Docs - -- docs(demos) update information to reflect new layout [`3029`](https://github.com/littlevgl/lvgl/pull/3029) -- docs(porting): remove duplicated content [`2984`](https://github.com/littlevgl/lvgl/pull/2984) -- docs(display) fix typo [`2946`](https://github.com/littlevgl/lvgl/pull/2946) -- docs(get-started) add introduction for Tasmota and Berry [`2874`](https://github.com/littlevgl/lvgl/pull/2874) -- docs fix spelling, parameter descriptions, comments, etc [`2865`](https://github.com/littlevgl/lvgl/pull/2865) -- docs: spelling fixes [`2828`](https://github.com/littlevgl/lvgl/pull/2828) -- docs(style) minor style fix [`2818`](https://github.com/littlevgl/lvgl/pull/2818) -- docs(porting/display) fix formatting [`2812`](https://github.com/littlevgl/lvgl/pull/2812) -- docs(roadmap) update [`084439e`](https://github.com/littlevgl/lvgl/commit/084439e9476339ff571820e38bb677157edef135) -- docs(widgets) fix edit links [`7ed1a56`](https://github.com/littlevgl/lvgl/commit/7ed1a5625a5139ede832c0058b2bc6309b395321) -- docs(contributing) update commit message format [`1cd851f`](https://github.com/littlevgl/lvgl/commit/1cd851f8c09e813d75feaf9bf312f887f5ba76f0) -- docs(porting): add more details about adding lvgl to your project [`6ce7348`](https://github.com/littlevgl/lvgl/commit/6ce73486d319bfdb1c379d090036a7eeaabf5b43) -- docs(indev): add description about gestures [`2719862`](https://github.com/littlevgl/lvgl/commit/2719862fc3065b5d72c74c3f5f0923c3f6cc82c6) -- docs(style): describe const styles [`28ffae8`](https://github.com/littlevgl/lvgl/commit/28ffae8c931ff01a4e5d426a2e496053e840c094) -- docs(faq): add "LVGL doesn't start, nothing is drawn on the display" section [`0388d92`](https://github.com/littlevgl/lvgl/commit/0388d9218a36debf6c989eb999ae68478d8f6b02) -- docs add demos [`02a6614`](https://github.com/littlevgl/lvgl/commit/02a6614b38b7d94e56d8fc1f858b0e40a46c024d) -- docs(fs): update fs interface description to the latest API [`285e6b3`](https://github.com/littlevgl/lvgl/commit/285e6b39f99c078e57a611cf84cbfc3b546e112e) -- docs(format) let wrap [`4bf49a8`](https://github.com/littlevgl/lvgl/commit/4bf49a82a3df422ebbfc4e47d4a93c945afdf0fa) -- docs(imgbtn) fix typo [`d792c5f`](https://github.com/littlevgl/lvgl/commit/d792c5f6c2e9d85c693e4f8089cb59c82d8cf805) -- docs(porting) clarify that displays must be registered before input devices [`1c64b78`](https://github.com/littlevgl/lvgl/commit/1c64b78866b4bb920db75a4b19f8ff1eb7f68a76) -- docs(event) fix lv_event_get_original_target vs lv_event_get_current_target [`cdd5128`](https://github.com/littlevgl/lvgl/commit/cdd5128bc0e17b2ffa3f9fc8f5f133d35fca4e35) -- docs(events) rename LV_EVENT_APPLY to LV_EVENT_READY (#2791) [`bf6837f`](https://github.com/littlevgl/lvgl/commit/bf6837f4c045b01144842ae63c4052e4cac7dafb) -- docs(gpu): link style properties and boxing model [`6266851`](https://github.com/littlevgl/lvgl/commit/6266851381d3b1f1e350dc4689e6bc71ece2f5c1) -- docs(gesture): clarify gesture triggering with scrolling [`e3b43ee`](https://github.com/littlevgl/lvgl/commit/e3b43eec943db48f7cbee83e07e531d41bc61ac0) -- docs(contributing): remove the mentioning of the dev branch [`00d4ef3`](https://github.com/littlevgl/lvgl/commit/00d4ef3c53d9b53e993c76d1eb0bafa7b1c9b721) -- docs(bar) fix default range [`eeee48b`](https://github.com/littlevgl/lvgl/commit/eeee48b1c943fc288521e4479d874348f4690842) -- docs(event): tell to not adjust widgets in draw events [`933d67f`](https://github.com/littlevgl/lvgl/commit/933d67fe5b8596da203c318aa9551aad1c2887e6) -- docs(switch) improve wording [`b4986ab`](https://github.com/littlevgl/lvgl/commit/b4986ab5dceb47f934c0a44a58152367f1bf8f43) -- docs(font) fix example to match v8 [`2f80896`](https://github.com/littlevgl/lvgl/commit/2f808965a1892e11cb84f50c6546871d2f2aa122) - -### CI and tests - -- test(bar): add unit tests [`2845`](https://github.com/littlevgl/lvgl/pull/2845) -- test(switch): add initial unit test [`2794`](https://github.com/littlevgl/lvgl/pull/2794) -- test(demo) add tests for widget and stress demos [`3bd6ad8`](https://github.com/littlevgl/lvgl/commit/3bd6ad80e7e7d0936b6e54ca88760db551f7848b) -- test(dropdown) fix to pass again [`918b3de`](https://github.com/littlevgl/lvgl/commit/918b3defd78245136da92f46fac937815ef35a1a) -- test add support for using system heap [`446b1eb`](https://github.com/littlevgl/lvgl/commit/446b1ebf2bc1ba38b5349c660534f113a9a066a9) -- ci remove formatting request workflow [`6de89e4`](https://github.com/littlevgl/lvgl/commit/6de89e4b7b0a0f72cf53e59a90bd22362088eb71) -- ci initial support for cross-architecture tests [`7008770`](https://github.com/littlevgl/lvgl/commit/7008770261903170d19472a52b54fedaafa7bbda) -- ci create handler for formatting requests [`7af7849`](https://github.com/littlevgl/lvgl/commit/7af78498a898cba6263b51094ffbc486d6b30b3a) -- test(style) add test for gradient [`da8f345`](https://github.com/littlevgl/lvgl/commit/da8f34566b0c0f3335c471c518f0766bdeb65766) -- test(event) add test for #2886 [`51ef9c2`](https://github.com/littlevgl/lvgl/commit/51ef9c242ccfff37905d71132aab33d2f642b427) -- ci add workflow to check code formatting [`a2b555e`](https://github.com/littlevgl/lvgl/commit/a2b555e096f7d401b5d8e877a6b5e81ff81c747a) -- ci attempt to speed up cross tests [`80408f7`](https://github.com/littlevgl/lvgl/commit/80408f704e8442a27f6dca96c41f1d3bded7ce52) -- ci apply my updates to the verify-formatting action [`02f02fa`](https://github.com/littlevgl/lvgl/commit/02f02fa78fc4101b1cde87fe912cb3105a689195) -- ci: add arduino linter action [`f79b00c`](https://github.com/littlevgl/lvgl/commit/f79b00cce0d31c7e5519a871b27d803fdb30fdfd) -- ci update action [`be9722c`](https://github.com/littlevgl/lvgl/commit/be9722c420a1ac2e9efde79135bf96bc508edb33) -- ci more formatting action updates [`1f6037c`](https://github.com/littlevgl/lvgl/commit/1f6037ce98c8617221d321d3371ad6dc8649553a) -- ci disable LeakSanitizer on dockerized tests [`c9e1927`](https://github.com/littlevgl/lvgl/commit/c9e19272c62f01544ff7cb5ef15d65b0d4fce5a5) -- ci one last try at this for tonight [`dddafae`](https://github.com/littlevgl/lvgl/commit/dddafaec942b7886722cdec28e2bd0f20f2a3413) -- ci try alternate checkout mechanism [`cb3de30`](https://github.com/littlevgl/lvgl/commit/cb3de308fdcdebb9c980df1d167a6be3657b2540) -- test(style) fix compile error [`ba083df`](https://github.com/littlevgl/lvgl/commit/ba083dfd6dc31d1d9127542cd1aff860d5a0153c) -- test(template) simplify _test_template.c [`b279f63`](https://github.com/littlevgl/lvgl/commit/b279f63d6bf84159aab855b962a9f431d5c40eb3) -- ci force ccache to be saved every time [`a7c590f`](https://github.com/littlevgl/lvgl/commit/a7c590f10d4c39ae33d89ad86ef608092030654b) -- ci switch to codecov v2 [`6b84155`](https://github.com/littlevgl/lvgl/commit/6b841555cd847d07375b92b54a814c41ccb522de) -- ci more debugging for formatting action [`2f8e4bc`](https://github.com/littlevgl/lvgl/commit/2f8e4bc4c43fa395676e2be5d3d55999206190b4) -- ci inline apt-get commands [`90e2b9f`](https://github.com/littlevgl/lvgl/commit/90e2b9f05e73527dfa2b2df0b1da30512827b8a8) -- ci(micropython) use ESP-IDF 4.4 [`b34fe9e`](https://github.com/littlevgl/lvgl/commit/b34fe9ed8b945fd83a1956cf4ddf2d40485a62ca) -- ci add 5k stack limit [`4122dda`](https://github.com/littlevgl/lvgl/commit/4122dda399679baa3b8bbd2e7055412b132227ab) -- ci force use of ccache in PATH [`6de3fa8`](https://github.com/littlevgl/lvgl/commit/6de3fa8004639ea02d45c1be2985290e65a3d6c0) -- ci add back stack usage check at 4 kilobytes [`89135d6`](https://github.com/littlevgl/lvgl/commit/89135d663daca34c9d9695a4c12b4208ef4ba217) -- ci temporarily disable stack usage check [`1900c21`](https://github.com/littlevgl/lvgl/commit/1900c215482b9b1b5af1dd7c5cb8a95e89906b77) -- ci(cross) use python3 instead of python [`df7eaa0`](https://github.com/littlevgl/lvgl/commit/df7eaa020d656c519b5197cd3d19c587cb1dd234) -- ci use specific version tag [`59b4769`](https://github.com/littlevgl/lvgl/commit/59b476934452d5821424c70954aa32be6f476608) -- ci fix check style action [`5bb3686`](https://github.com/littlevgl/lvgl/commit/5bb3686ea8b6feb55d6bb2b345f5c6cee52d514a) -- ci fix typo in formatting action [`d1ccbf6`](https://github.com/littlevgl/lvgl/commit/d1ccbf607fd3aec61c4606a8f2c268225654b792) -- ci test formatting action [`065d821`](https://github.com/littlevgl/lvgl/commit/065d821c7050af6ad94c7d6dc2d4976a817e54a0) -- ci(micropython) switch to newer GCC action [`1fa7257`](https://github.com/littlevgl/lvgl/commit/1fa7257801f4e0d3c184be438fd7ecb067818c48) -- ci(style) force color on diff to help highlight whitespace changes [`04f47ea`](https://github.com/littlevgl/lvgl/commit/04f47eae0d40c8385535428566d1851ff8ea20eb) -- ci(cross) install build-essential [`772f219`](https://github.com/littlevgl/lvgl/commit/772f219c0af4ba013ee9b71883e7dc265e5d22f9) -- ci force pushing to upstream branch [`8277f78`](https://github.com/littlevgl/lvgl/commit/8277f78d132b4c397f39a9e17cdb7bdd381d1778) -- ci ensure lvgl-bot is used to make commits [`9fcf52a`](https://github.com/littlevgl/lvgl/commit/9fcf52a82bb4dbcfc47e69b7875d66a3d25ba87f) - - - - -## [v8.1.0](https://github.com/lvgl/lvgl/compare/v8.0.2...v8.1.0) 10 November 2021 - -### Overview -v8.1 is a minor release, so besides many fixes it contains a lot of new features too. - -Some of the most important features are -- Built in support for SDL based GPU drawing -- Much faster circle drawing in the software renderer -- Several [3rd party libraries](https://docs.lvgl.io/master/libs/index.html) are merged directly into LVGL. -- Add LVGL as an [RT-Thread](https://packages.rt-thread.org/en/detail.html?package=LVGL) and [ESP32](https://components.espressif.com/component/lvgl/lvgl) component - -### Breaking Changes - -- :warning: feat(calendar): add the header directly into the calendar widget [`2e08f80`](https://github.com/lvgl/lvgl/commit/2e08f80361a9d7e5b97f49af6afc3549ffbf2758) - -### Architectural - -- arch add small 3rd party libs to lvgl [`2569`](https://github.com/lvgl/lvgl/pull/2569) - -### New Features - -- feat(display) add direct_mode drawing mode [`2460`](https://github.com/lvgl/lvgl/pull/2460) -- feat(conf): make LV_MEM_BUF_MAX_NUM configurable [`2747`](https://github.com/lvgl/lvgl/pull/2747) -- feat(disp): add non-fullscreen display utilities [`2724`](https://github.com/lvgl/lvgl/pull/2724) -- feat(rlottie) add LVGL-Rlottie interface as 3rd party lib [`2700`](https://github.com/lvgl/lvgl/pull/2700) -- feat(rtthread): prepare for porting the device-driver of rt-thread [`2719`](https://github.com/lvgl/lvgl/pull/2719) -- feat(fsdrv) add driver based on Win32 API [`2701`](https://github.com/lvgl/lvgl/pull/2701) -- feat(span) indent supports percent for fix and break mode [`2693`](https://github.com/lvgl/lvgl/pull/2693) -- feat(rt-thread): implement rt-thread sconscirpt [`2674`](https://github.com/lvgl/lvgl/pull/2674) -- feat(lv_spinbox) support both right-to-left and left-to-right digit steps when clicking encoder button [`2644`](https://github.com/lvgl/lvgl/pull/2644) -- feat add support for rt-thread RTOS [`2660`](https://github.com/lvgl/lvgl/pull/2660) -- feat(disp): Enable rendering to display subsection [`2583`](https://github.com/lvgl/lvgl/pull/2583) -- feat(keyboard): add user-defined modes [`2651`](https://github.com/lvgl/lvgl/pull/2651) -- feat(event) add LV_EVENT_CHILD_CREATED/DELETED [`2618`](https://github.com/lvgl/lvgl/pull/2618) -- feat(btnmatrix/keyboard): add option to show popovers on button press [`2537`](https://github.com/lvgl/lvgl/pull/2537) -- feat(msgbox) add a content area for custom content [`2561`](https://github.com/lvgl/lvgl/pull/2561) -- feat(tests): Include debug information to test builds [`2568`](https://github.com/lvgl/lvgl/pull/2568) -- feat(drawing) hardware accelerated rendering by SDL2 [`2484`](https://github.com/lvgl/lvgl/pull/2484) -- feat(msgbox): omit title label unless needed [`2539`](https://github.com/lvgl/lvgl/pull/2539) -- feat(msgbox): add function to get selected button index [`2538`](https://github.com/lvgl/lvgl/pull/2538) -- feat(make) add lvgl interface target for micropython [`2529`](https://github.com/lvgl/lvgl/pull/2529) -- feat(obj) add lv_obj_move_to_index(obj, index), renamed lv_obj_get_child_id(obj) to lv_obj_get_index(obj) [`2514`](https://github.com/lvgl/lvgl/pull/2514) -- feat(obj) add lv_obj_swap() function [`2461`](https://github.com/lvgl/lvgl/pull/2461) -- feat(mem) LV_MEM_POOL_ALLOC [`2458`](https://github.com/lvgl/lvgl/pull/2458) -- feat(switch) add smooth animation when changing state [`2442`](https://github.com/lvgl/lvgl/pull/2442) -- feat(anim) add interface for handling lv_anim user data. [`2415`](https://github.com/lvgl/lvgl/pull/2415) -- feat(obj) add lv_is_initialized [`2402`](https://github.com/lvgl/lvgl/pull/2402) -- feat(obj) Backport keypad and encoder scrolling from v7 `lv_page` to v8 `lv_obj` [`2390`](https://github.com/lvgl/lvgl/pull/2390) -- feat(snapshot) add API to take snapshot for object [`2353`](https://github.com/lvgl/lvgl/pull/2353) -- feat(anim) add anim timeline [`2309`](https://github.com/lvgl/lvgl/pull/2309) -- feat(span) Add missing spangroup functions [`2379`](https://github.com/lvgl/lvgl/pull/2379) -- feat(img) add img_size property [`2284`](https://github.com/lvgl/lvgl/pull/2284) -- feat(calendar) improve MicroPython example [`2366`](https://github.com/lvgl/lvgl/pull/2366) -- feat(spinbox ) add function to set cursor to specific position [`2314`](https://github.com/lvgl/lvgl/pull/2314) - -- feat(timer) check if lv_tick_inc is called [`aa6641a`](https://github.com/lvgl/lvgl/commit/aa6641a6f1c1311ce7e0f94783ee7f582452a88f) -- feat(event, widgets) improve the parameter of LV_EVENT_DRAW_PART_BEGIN/END [`88c4859`](https://github.com/lvgl/lvgl/commit/88c485949fca2686357a7dee88d5730678ba9bc7) -- feat(docs) improvements to examples [`4b8c73a`](https://github.com/lvgl/lvgl/commit/4b8c73a5770657ab55bbe825f7887e28c55a8a4a) -- feat(obj) send LV_EVENT_DRAW_PART_BEGIN/END for MAIN and SCROLLBAR parts [`b203167`](https://github.com/lvgl/lvgl/commit/b203167c7583905e2cb4006e57a16432841a2353) -- feat(led) send LV_EVENT_DRAW_PART_BEGIN/END [`fcd4aa3`](https://github.com/lvgl/lvgl/commit/fcd4aa3924469c2a92ab6a04b7bc6de6304cc54a) -- feat(chart) send LV_EVENT_DRAW_PART_BEGIN/END before/after the division line drawing section. [`e0ae2aa`](https://github.com/lvgl/lvgl/commit/e0ae2aa106874b1cf60ba54dd043cde8f834f7e9) -- feat(tests) upload coverage to codecov [`4fff99d`](https://github.com/lvgl/lvgl/commit/4fff99da1dd2f8bd0c1e0012d81d46aaadb0d5a3) -- feat(conf) add better check for Kconfig default [`f8fe536`](https://github.com/lvgl/lvgl/commit/f8fe5366bb051cd5090e4a06658eb0d32decc0b3) -- feat(draw) add LV_BLEND_MODE_MULTIPLY [`cc78ef4`](https://github.com/lvgl/lvgl/commit/cc78ef450649a10f260649dc3ba19ac8a6b88e86) -- feat(test) add assert for screenshot compare [`2f7a005`](https://github.com/lvgl/lvgl/commit/2f7a005bd31c10d0a048f55641e4af11bcb5bbfa) -- feat(event) pass the scroll animation to LV_EVENT_SCROLL_BEGIN [`ca54ecf`](https://github.com/lvgl/lvgl/commit/ca54ecfe0eac880203d23b2d2244b9b63b9f7b77) -- feat(obj) place the scrollbar to the left with RTL base dir. [`906448e`](https://github.com/lvgl/lvgl/commit/906448ef6321f160859f21c5937180bb89d8ef1e) -- feat(log) allow overwriting LV_LOG_... macros [`17b8a76`](https://github.com/lvgl/lvgl/commit/17b8a76c4a887c9cf464484406a6631ea0194ad5) -- feat(arc) add support to LV_OBJ_FLAG_ADV_HITTEST [`dfa4f5c`](https://github.com/lvgl/lvgl/commit/dfa4f5cff561a60b4ffcec17e025f1e056854fff) -- feat(event) add LV_SCREEN_(UN)LOAD_START [`7bae9e3`](https://github.com/lvgl/lvgl/commit/7bae9e3ddde9d6bdc06ae437f20a789cd330a556) -- feat(obj) add lv_obj_del_delayed() [`c6a2e15`](https://github.com/lvgl/lvgl/commit/c6a2e15ec23c8e96f71bafa8e43ef67fc4a73d0a) -- feat(docs) add view on GitHub link [`a716ac6`](https://github.com/lvgl/lvgl/commit/a716ac6ed267e0a2e019fe7d2fda1bef0046cdc7) -- feat(event) add LV_EVENT_SCREEN_LOADED/UNLOADED events [`ee5369e`](https://github.com/lvgl/lvgl/commit/ee5369e2d2ce12f47c78a2bf339aa6fb2421ba2b) -- feat(textarea) remove the need of lv_textarea_set_align [`56ebb1a`](https://github.com/lvgl/lvgl/commit/56ebb1a4c8cc988482ac9f118fa3c654553db941) -- feat(rt-thread): support LVGL projects with GCC/Keil(AC5)/Keil(AC6)/IAR [`32d33fe`](https://github.com/lvgl/lvgl/commit/32d33fe4d9a38f6c215a6b9a631eb987339677ae) -- feat(docs) lazy load individual examples as well [`918d948`](https://github.com/lvgl/lvgl/commit/918d94801f2ee4ad7b6c075d96d2e9195459fbb8) - -- feat: add LV_USE_MEM_PERF/MONITOR_POS [`acd0f4f`](https://github.com/lvgl/lvgl/commit/acd0f4fbc71ffbfeb382b7af1fa52caf3cdcda6c) -- feat(canvas) add lv_canvas_set_px_opa [`b3b3ffc`](https://github.com/lvgl/lvgl/commit/b3b3ffc2b3b322f7401d15c4ba2ef0cdb00e2990) -- feat(event) add lv_obj_remove_event_cb_with_user_data [`4eddeb3`](https://github.com/lvgl/lvgl/commit/4eddeb35abee1f9cd2d1fd210f11cc096cb609c7) -- feat(obj) add lv_obj_get_x/y_aligned [`98bc1fe`](https://github.com/lvgl/lvgl/commit/98bc1fe09e12a64333e91b4c25327c283a700af5) - -### Performance - -- perf(draw) reimplement circle drawing algorithms [`2374`](https://github.com/lvgl/lvgl/pull/2374) -- perf(anim_timeline) add lv_anim_timeline_stop() [`2411`](https://github.com/lvgl/lvgl/pull/2411) - -- perf(obj) remove lv_obj_get_child_cnt from cycle limit checks [`ebb9ce9`](https://github.com/lvgl/lvgl/commit/ebb9ce913e604055724fd5f72562c9de0933ff73) -- perf(draw) reimplement rectangle drawing algorithms [`5b3d3dc`](https://github.com/lvgl/lvgl/commit/5b3d3dc8b35bdd16e5dea00ffc40b7a20471079d) -- perf(draw) ignore masks if they don't affect the current draw area [`a842791`](https://github.com/lvgl/lvgl/commit/a8427915c747dfe562f7f7e80adb6d1be5b2eeae) -- perf(refresh) optimize where to wait for lv_disp_flush_ready with 2 buffers [`d0172f1`](https://github.com/lvgl/lvgl/commit/d0172f14a454c98e6979322e7c2622a7001bb3e6) -- perf(draw) speed up additive blending [`3abe517`](https://github.com/lvgl/lvgl/commit/3abe517abf3b62366f2eb4bed77d5c7a691f7ed5) - -### Fixes - -- fix(bidi): add weak characters to the previous strong character's run [`2777`](https://github.com/lvgl/lvgl/pull/2777) -- fix(draw_img): radius mask doesn't work in specific condition [`2786`](https://github.com/lvgl/lvgl/pull/2786) -- fix(border_post): ignore bg_img_opa draw when draw border_post [`2788`](https://github.com/lvgl/lvgl/pull/2788) -- fix(refresh) switch to portable format specifiers [`2781`](https://github.com/lvgl/lvgl/pull/2781) -- fix(stm32) Mark unused variable in stm32 DMA2D driver [`2782`](https://github.com/lvgl/lvgl/pull/2782) -- fix(conf): Make LV_COLOR_MIX_ROUND_OFS configurable [`2766`](https://github.com/lvgl/lvgl/pull/2766) -- fix(misc): correct the comment and code style [`2769`](https://github.com/lvgl/lvgl/pull/2769) -- fix(draw_map) use existing variables instead function calls [`2776`](https://github.com/lvgl/lvgl/pull/2776) -- fix(draw_img): fix typos in API comments [`2773`](https://github.com/lvgl/lvgl/pull/2773) -- fix(draw_img):radius Mask doesn't work in Specific condition [`2775`](https://github.com/lvgl/lvgl/pull/2775) -- fix(proto) Remove redundant prototype declarations [`2771`](https://github.com/lvgl/lvgl/pull/2771) -- fix(conf) better support bool option from Kconfign [`2555`](https://github.com/lvgl/lvgl/pull/2555) -- fix(draw_border):draw error if radius == 0 and parent clip_corner == true [`2764`](https://github.com/lvgl/lvgl/pull/2764) -- fix(msgbox) add declaration for lv_msgbox_content_class [`2761`](https://github.com/lvgl/lvgl/pull/2761) -- fix(core) add L suffix to enums to ensure 16-bit compatibility [`2760`](https://github.com/lvgl/lvgl/pull/2760) -- fix(anim): add lv_anim_get_playtime [`2745`](https://github.com/lvgl/lvgl/pull/2745) -- fix(area) minor fixes [`2749`](https://github.com/lvgl/lvgl/pull/2749) -- fix(mem): ALIGN_MASK should equal 0x3 on 32bit platform [`2748`](https://github.com/lvgl/lvgl/pull/2748) -- fix(template) prototype error [`2755`](https://github.com/lvgl/lvgl/pull/2755) -- fix(anim): remove time_orig from lv_anim_t [`2744`](https://github.com/lvgl/lvgl/pull/2744) -- fix(draw_rect):bottom border lost if enable clip_corner [`2742`](https://github.com/lvgl/lvgl/pull/2742) -- fix(anim) and improvement [`2738`](https://github.com/lvgl/lvgl/pull/2738) -- fix(draw border):border draw error if border width > radius [`2739`](https://github.com/lvgl/lvgl/pull/2739) -- fix(fsdrv): remove the seek call in fs_open [`2736`](https://github.com/lvgl/lvgl/pull/2736) -- fix(fsdrv): skip the path format if LV_FS_xxx_PATH not defined [`2726`](https://github.com/lvgl/lvgl/pull/2726) -- fix: mark unused variable with LV_UNUSED(xxx) instead of (void)xxx [`2734`](https://github.com/lvgl/lvgl/pull/2734) -- fix(fsdrv): fix typo error in commit 752fba34f677ad73aee [`2732`](https://github.com/lvgl/lvgl/pull/2732) -- fix(fsdrv): return error in case of the read/write failure [`2729`](https://github.com/lvgl/lvgl/pull/2729) -- fix(refr) silence compiler warning due to integer type mismatch [`2722`](https://github.com/lvgl/lvgl/pull/2722) -- fix(fs): fix the off-by-one error in the path function [`2725`](https://github.com/lvgl/lvgl/pull/2725) -- fix(timer): remove the code duplication in lv_timer_exec [`2708`](https://github.com/lvgl/lvgl/pull/2708) -- fix(async): remove the wrong comment from lv_async_call [`2707`](https://github.com/lvgl/lvgl/pull/2707) -- fix(kconfig): change CONFIG_LV_THEME_DEFAULT_FONT to CONFIG_LV_FONT_DEFAULT [`2703`](https://github.com/lvgl/lvgl/pull/2703) -- fix add MP support for LVGL 3rd party libraries [`2666`](https://github.com/lvgl/lvgl/pull/2666) -- fix(png) memory leak for sjpg and use lv_mem_... in lv_png [`2704`](https://github.com/lvgl/lvgl/pull/2704) -- fix(gif) unified whence and remove off_t [`2690`](https://github.com/lvgl/lvgl/pull/2690) -- fix(rt-thread): include the rt-thread configuration header file [`2692`](https://github.com/lvgl/lvgl/pull/2692) -- fix(rt-thread): fix the ci error [`2691`](https://github.com/lvgl/lvgl/pull/2691) -- fix(fsdrv) minor fs issue [`2682`](https://github.com/lvgl/lvgl/pull/2682) -- fix(hal) fix typos and wording in docs for lv_hal_indev.h [`2685`](https://github.com/lvgl/lvgl/pull/2685) -- fix(hal tick): add precompile !LV_TICK_CUSTOM for global variables and lv_tick_inc() [`2675`](https://github.com/lvgl/lvgl/pull/2675) -- fix(anim_timeline) avoid calling lv_anim_del(NULL, NULL) [`2628`](https://github.com/lvgl/lvgl/pull/2628) -- fix(kconfig) sync Kconfig with the latest lv_conf_template.h [`2662`](https://github.com/lvgl/lvgl/pull/2662) -- fix(log) reduce the stack usage in log function [`2649`](https://github.com/lvgl/lvgl/pull/2649) -- fix(conf) make a better style alignment in lv_conf_internal.h [`2652`](https://github.com/lvgl/lvgl/pull/2652) -- fix(span) eliminate warning in lv_get_snippet_cnt() [`2659`](https://github.com/lvgl/lvgl/pull/2659) -- fix(config): remove the nonexistent Kconfig [`2654`](https://github.com/lvgl/lvgl/pull/2654) -- fix(Kconfig): add LV_MEM_ADDR config [`2653`](https://github.com/lvgl/lvgl/pull/2653) -- fix(log): replace printf with fwrite to save the stack size [`2655`](https://github.com/lvgl/lvgl/pull/2655) -- fix typos [`2634`](https://github.com/lvgl/lvgl/pull/2634) -- fix LV_FORMAT_ATTRIBUTE fix for gnu > 4.4 [`2631`](https://github.com/lvgl/lvgl/pull/2631) -- fix(meter) make lv_meter_indicator_type_t of type uint8_t [`2632`](https://github.com/lvgl/lvgl/pull/2632) -- fix(span):crash if span->txt = "" [`2616`](https://github.com/lvgl/lvgl/pull/2616) -- fix(disp) set default theme also for non-default displays [`2596`](https://github.com/lvgl/lvgl/pull/2596) -- fix(label):LONG_DOT mode crash if text Utf-8 encode > 1 [`2591`](https://github.com/lvgl/lvgl/pull/2591) -- fix( example) in lv_example_scroll_3.py float_btn should only be created once [`2602`](https://github.com/lvgl/lvgl/pull/2602) -- fix lv_deinit when LV_USE_GPU_SDL is enabled [`2598`](https://github.com/lvgl/lvgl/pull/2598) -- fix add missing LV_ASSERT_OBJ checks [`2575`](https://github.com/lvgl/lvgl/pull/2575) -- fix(lv_conf_internal_gen.py) formatting fixes on the generated file [`2542`](https://github.com/lvgl/lvgl/pull/2542) -- fix(span) opa bug [`2584`](https://github.com/lvgl/lvgl/pull/2584) -- fix(snapshot) snapshot is affected by parent's style because of wrong coords [`2579`](https://github.com/lvgl/lvgl/pull/2579) -- fix(label):make draw area contain ext_draw_size [`2587`](https://github.com/lvgl/lvgl/pull/2587) -- fix(btnmatrix): make ORed values work correctly with lv_btnmatrix_has_btn_ctrl [`2571`](https://github.com/lvgl/lvgl/pull/2571) -- fix compiling of examples when cmake is used [`2572`](https://github.com/lvgl/lvgl/pull/2572) -- fix(lv_textarea) fix crash while delete non-ascii character in pwd mode [`2549`](https://github.com/lvgl/lvgl/pull/2549) -- fix(lv_log.h): remove the duplicated semicolon from LV_LOG_xxx [`2544`](https://github.com/lvgl/lvgl/pull/2544) -- fix(zoom) multiplication overflow on 16-bit platforms [`2536`](https://github.com/lvgl/lvgl/pull/2536) -- fix(printf) use __has_include for more accurate limits information [`2532`](https://github.com/lvgl/lvgl/pull/2532) -- fix(font) add assert in lv_font.c if the font is NULL [`2533`](https://github.com/lvgl/lvgl/pull/2533) -- fix(lv_types.h): remove c/c++ compiler version check [`2525`](https://github.com/lvgl/lvgl/pull/2525) -- fix(lv_utils.c): remove the unneeded header inclusion [`2526`](https://github.com/lvgl/lvgl/pull/2526) -- fix(Kconfig) fix the comment in LV_THEME_DEFAULT_DARK [`2524`](https://github.com/lvgl/lvgl/pull/2524) -- fix(sprintf) add format string for rp2 port [`2512`](https://github.com/lvgl/lvgl/pull/2512) -- fix(span) fix some bugs (overflow,decor,align) [`2518`](https://github.com/lvgl/lvgl/pull/2518) -- fix(color) Bad cast in lv_color_mix() caused UB with 16bpp or less [`2509`](https://github.com/lvgl/lvgl/pull/2509) -- fix(imgbtn) displayed incorrect when the coordinate is negative [`2501`](https://github.com/lvgl/lvgl/pull/2501) -- fix(event) be sure to move all elements in copy “lv_obj_remove_event_cb” [`2492`](https://github.com/lvgl/lvgl/pull/2492) -- fix(draw) use correct pointer in lv_draw_mask assertion [`2483`](https://github.com/lvgl/lvgl/pull/2483) -- feat(mem) LV_MEM_POOL_ALLOC [`2458`](https://github.com/lvgl/lvgl/pull/2458) -- fix(cmake) require 'main' for Micropython [`2444`](https://github.com/lvgl/lvgl/pull/2444) -- fix(docs) add static keyword to driver declaration [`2452`](https://github.com/lvgl/lvgl/pull/2452) -- fix(build) remove main component dependency [`2420`](https://github.com/lvgl/lvgl/pull/2420) -- fix circle drawing algorithms [`2413`](https://github.com/lvgl/lvgl/pull/2413) -- fix(docs) wrong spelling of words in pictures [`2409`](https://github.com/lvgl/lvgl/pull/2409) -- fix(chart) fixed point-following cursor during vertical scroll in charts [`2400`](https://github.com/lvgl/lvgl/pull/2400) -- fix(chart) fixed cursor positioning with large Y rescaling without LV_USE_LARGE_COORD [`2399`](https://github.com/lvgl/lvgl/pull/2399) -- fix(grid.h) typos [`2395`](https://github.com/lvgl/lvgl/pull/2395) -- fix(anim_timeline) heap use after free [`2394`](https://github.com/lvgl/lvgl/pull/2394) -- fix(snapshot) add missing import on MicroPython example [`2389`](https://github.com/lvgl/lvgl/pull/2389) -- fix(disp) Fix assert failure in lv_disp_remove [`2382`](https://github.com/lvgl/lvgl/pull/2382) -- fix(span) modify the underline position [`2376`](https://github.com/lvgl/lvgl/pull/2376) -- fix(color) remove extraneous _LV_COLOR_MAKE_TYPE_HELPER [`2372`](https://github.com/lvgl/lvgl/pull/2372) -- fix(spinner) should not be clickable [`2373`](https://github.com/lvgl/lvgl/pull/2373) -- fix(workflow) silence SDL warning for MicroPython [`2367`](https://github.com/lvgl/lvgl/pull/2367) -- fix (span) fill LV_EVENT_GET_SELF_SIZE [`2360`](https://github.com/lvgl/lvgl/pull/2360) -- fix(workflow) change MicroPython workflow to use master [`2358`](https://github.com/lvgl/lvgl/pull/2358) -- fix(disp) fix memory leak in lv_disp_remove [`2355`](https://github.com/lvgl/lvgl/pull/2355) -- fix(lv_obj.h)typos [`2350`](https://github.com/lvgl/lvgl/pull/2350) -- fix(obj) delete useless type conversion [`2343`](https://github.com/lvgl/lvgl/pull/2343) -- fix(lv_obj_scroll.h) typos [`2345`](https://github.com/lvgl/lvgl/pull/2345) -- fix(txt) enhance the function of break_chars [`2327`](https://github.com/lvgl/lvgl/pull/2327) - -- fix(vglite): update for v8 [`e3e3eea`](https://github.com/lvgl/lvgl/commit/e3e3eeaf8c1593d384c6537244a301cdc1abd3d9) -- fix(widgets) use lv_obj_class for all the widgets [`3fb8baf`](https://github.com/lvgl/lvgl/commit/3fb8baf503411e006765020f60f295a4be16ba2d) -- fix(refr) reduce the nesting level in lv_refr_area [`2df1282`](https://github.com/lvgl/lvgl/commit/2df12827dda3f217fa26d2c98445a9b3f1ff22ab) -- fix(pxp): update for v8 [`8a2a4a1`](https://github.com/lvgl/lvgl/commit/8a2a4a11c81d029ff737980b883c62dfbb4b44c6) -- fix(obj) move clean ups from lv_obj_del to lv_obj_destructor [`b063937`](https://github.com/lvgl/lvgl/commit/b06393747f61e36996a0cb22f9309c951f900ded) -- fix (draw) fix arc bg image drawing with full arcs [`c3b6c6d`](https://github.com/lvgl/lvgl/commit/c3b6c6dc64735e1bde492a8d5570f3e3a9500a0b) -- fix(pxp): update RTOS macro for SDK 2.10 [`00c3eb1`](https://github.com/lvgl/lvgl/commit/00c3eb197cb85e480809d97eb722589d75d81d94) -- fix(textarea) style update in oneline mode + improve sroll to cursor [`60d9a5e`](https://github.com/lvgl/lvgl/commit/60d9a5e493bf17ee9887ba44890d00905bc55970) -- feat(led) send LV_EVENT_DRAW_PART_BEGIN/END [`fcd4aa3`](https://github.com/lvgl/lvgl/commit/fcd4aa3924469c2a92ab6a04b7bc6de6304cc54a) -- fix warnings introduced by 3fb8baf5 [`e302403`](https://github.com/lvgl/lvgl/commit/e3024032dc5de2ece4fa17059ebad4189a5fa670) -- fix(roller) fix partial redraw of the selected area [`6bc40f8`](https://github.com/lvgl/lvgl/commit/6bc40f8c4417a94ab26b25220324e471e03ce443) -- fix(flex) fix layout update and invalidation issues [`5bd82b0`](https://github.com/lvgl/lvgl/commit/5bd82b038b841c0f7c93bbdacdbd61d6b9585846) -- fix(indev) focus on objects on release instead of press [`76a8293`](https://github.com/lvgl/lvgl/commit/76a8293375b705a5e02e4f9c8f8a42d99db762e2) -- fix tests [`449952e`](https://github.com/lvgl/lvgl/commit/449952e3b78d02802960dabb0207b960c82e8e5a) -- fix(dropdown) forget the selected option on encoder longpress [`e66b935`](https://github.com/lvgl/lvgl/commit/e66b9350617eee15e94fb6a353283433e4c2c494) -- fix(obj) improve how the focusing indev is determined [`a04f2de`](https://github.com/lvgl/lvgl/commit/a04f2dea644787ea25ef988a43e10c5005c57066) -- fix(workflow) speed up MicroPython workflow [`38ad5d5`](https://github.com/lvgl/lvgl/commit/38ad5d548b2024f0f742ba769a6715fc376541a1) -- fix(test) do not including anything in test files when not running tests [`9043860`](https://github.com/lvgl/lvgl/commit/90438603ad020799b14bc9839a51dceedfdabd7a) -- fix tests [`36b9db3`](https://github.com/lvgl/lvgl/commit/36b9db38b728b40096b9ee613f4482ef9654d570) -- fix(scroll) fire LV_EVENT_SCROLL_BEGIN in the same spot for both axes [`b158932`](https://github.com/lvgl/lvgl/commit/b1589326d41924292fbc2c62b474dec288bc9da5) -- fix(btnmatrix) fix button invalidation on focus change [`77cedfa`](https://github.com/lvgl/lvgl/commit/77cedfa08f3f8aec67c6a2fe8e5ae9bab5a0e7c7) -- fix(tlsf) do not use <assert.h> [`c9745b9`](https://github.com/lvgl/lvgl/commit/c9745b9c4ea9e7c6de4bd8ad9a0d8001bfb91165) -- fix(template) include lvgl.h in lv_port_*_template.c files [`0ae15bd`](https://github.com/lvgl/lvgl/commit/0ae15bd470548ff159f44e7c3f4b225ab3eec928) -- fix(docs) add margin for example description [`b5f632e`](https://github.com/lvgl/lvgl/commit/b5f632ee7a265ce4f2472522b422b8cd5366aaa9) -- fix(imgbtn) use the correct src in LV_EVENT_GET_SELF_SIZE [`04c515a`](https://github.com/lvgl/lvgl/commit/04c515adac764761e60094db789269130ac89b36) -- fix(color) remove extraneous cast for 8-bit color [`157534c`](https://github.com/lvgl/lvgl/commit/157534cdbfaa7b769114126f74c38661b99d025b) -- fix(workflow) use same Unix port variant for MicroPython submodules [`ac68b10`](https://github.com/lvgl/lvgl/commit/ac68b10e539ddb8bde47ec453a99f2b876e12c65) -- fix(README) improve grammar [`de81889`](https://github.com/lvgl/lvgl/commit/de81889cbdc889360e8bc00684f9ca77ff97d89f) -- fix(printf) skip defining attribute if pycparser is used [`ee9bbea`](https://github.com/lvgl/lvgl/commit/ee9bbea29c807707353e8b9ec09048990de18e4e) -- fix(README) spelling correction [`41869f2`](https://github.com/lvgl/lvgl/commit/41869f238e773e599959c9ef2fee0b7206712ee2) -- fix(color) overflow with 16-bit color depth [`fe6d8d7`](https://github.com/lvgl/lvgl/commit/fe6d8d7636ae283afda68e85b2d1f143d8d05462) -- fix(docs) consider an example to be visible over a wider area [`145a0fa`](https://github.com/lvgl/lvgl/commit/145a0fad0857dad7f2066e7d22436827e0d3fd7d) -- fix(codecov) disable uploading coverage for pull requests [`27d88de`](https://github.com/lvgl/lvgl/commit/27d88de899e91cd5bb9fc69fe9d71cb180cfb44b) -- fix(arc) disable LV_OBJ_FLAG_SCROLL_CHAIN by default [`f172eb3`](https://github.com/lvgl/lvgl/commit/f172eb3fd78481d6076ead395abfd765646ad21e) -- fix(template) update lv_objx_template to v8 [`38bb8af`](https://github.com/lvgl/lvgl/commit/38bb8afc16720e8d8fe6e72be6fae4f9da593bbc) -- fix(align) avoid circular references with LV_SIZE_CONTENT [`038b781`](https://github.com/lvgl/lvgl/commit/038b78122e72db67cec886d09eb2d21aaa019df7) -- fix(draw) with additive blending with 32-bit color depth [`786db2a`](https://github.com/lvgl/lvgl/commit/786db2afe6458e24681b8a40fa798429956d3420) -- fix(arc) fix arc invalidation again [`5ced080`](https://github.com/lvgl/lvgl/commit/5ced08001c384bf7c840750c0e254b5f0115a070) -- fix(align) fix lv_obj_align_to [`93b38e9`](https://github.com/lvgl/lvgl/commit/93b38e92be9ed3ae050a1ee6e5b680ab43fd4850) -- fix(scroll) keep the scroll position on object deleted [`52edbb4`](https://github.com/lvgl/lvgl/commit/52edbb46b0741d2761a11ef1b3d516ec96a7c8b3) -- fix(dropdown) handle LV_KEY_ENTER [`8a50edd`](https://github.com/lvgl/lvgl/commit/8a50edd0689c7133ca18fd476596ddc4088f86a9) -- fix various minor warnings [`924bc75`](https://github.com/lvgl/lvgl/commit/924bc754adcbabaf3518bac6067e7ea37f2f0f04) -- fix(textarea) various cursor drawing fixes [`273a0eb`](https://github.com/lvgl/lvgl/commit/273a0eb32f04e81f326288a71682bea1c812c76a) -- fix(label) consider base dir lv_label_get_letter_pos in special cases [`6df5122`](https://github.com/lvgl/lvgl/commit/6df51225c261b252f0935804b0357d6e585da53d) -- fix(imgbtn) add lv_imgbtn_set_state [`26e15fa`](https://github.com/lvgl/lvgl/commit/26e15fa577f97d510b218fb95fc9a4bd440b00bc) -- fix(printf) add (int) casts to log messages to avoid warnings on %d [`d9d3f27`](https://github.com/lvgl/lvgl/commit/d9d3f271267e760c8459b65c392914143a58b89c) -- fix(test) silence make [`7610d38`](https://github.com/lvgl/lvgl/commit/7610d38bb044b1bd95dd68ab57f79f82e2527cca) -- fix(test) silence make [`37fd9d8`](https://github.com/lvgl/lvgl/commit/37fd9d8a24c276079ed26b5d6704bcefc9f8dc70) -- fix(calendar) update the MP example [`0bab4a7`](https://github.com/lvgl/lvgl/commit/0bab4a72cf769872a9adfd5bfa1c4536e6f909a8) -- fix(scroll) fix scroll_area_into_view with objects larger than the parent [`5240fdd`](https://github.com/lvgl/lvgl/commit/5240fdda5ccc33d166f8201818868add5d1d6d0d) -- fix(msgbox) handle NULL btn map parameter [`769c4a3`](https://github.com/lvgl/lvgl/commit/769c4a30cf962be1f74e0b1cd7ebaefbd6ba8a8b) -- fix (scroll) do not send unnecessary scroll end events [`3ce5226`](https://github.com/lvgl/lvgl/commit/3ce5226c9d9db279904c4f076ae77e6e03572e4c) -- fix(obj_pos) consider all alignments in content size calculation but only if x and y = 0 [`5b27ebb`](https://github.com/lvgl/lvgl/commit/5b27ebb4097166f8c4a50ee5d39249939bf79814) -- fix(img decoder) add error handling if the dsc->data = NULL [`d0c1c67`](https://github.com/lvgl/lvgl/commit/d0c1c673a8ec17b842ebf97d5f21938ec8901346) -- fix(txt): skip basic arabic vowel characters when processing conjunction [`5b54800`](https://github.com/lvgl/lvgl/commit/5b548006eda0695cabf2ee237a7faee8c69e4659) -- fix(typo) rename LV_OBJ_FLAG_SNAPABLE to LV_OBJ_FLAG_SNAPPABLE [`e697807`](https://github.com/lvgl/lvgl/commit/e697807cf5c01be2531fc52df78ecad75ce39a7a) -- fix(lv_printf.h): to eliminate the errors in Keil and IAR [`f6d7dc7`](https://github.com/lvgl/lvgl/commit/f6d7dc7f00d0a20f7f1966ed890a225b1fc87107) -- fix(draw) fix horizontal gradient drawing [`4c034e5`](https://github.com/lvgl/lvgl/commit/4c034e56e049ad3d9bca5eb4b3e8721e60c11d36) -- fix(dropdown) use LV_EVENT_READY/CANCEL on list open/close [`4dd1d56`](https://github.com/lvgl/lvgl/commit/4dd1d566fc30bbaf1424dda8b78df97c6bf07402) -- fix(table) clip overflowing content [`8c15933`](https://github.com/lvgl/lvgl/commit/8c15933030cad6cdbfe4967f566ed6959547fada) -- fix(test) add #if guard to exclude test related files from the build [`c12a22e`](https://github.com/lvgl/lvgl/commit/c12a22ee87681d1344696a3b9531e9100808eb85) -- fix(test) add #if guard to exclude test related files from the build [`fc364a4`](https://github.com/lvgl/lvgl/commit/fc364a466c0693aefa0401f5eddee2bbc3037ef0) -- fix(freetype) fix underline calculation [`76c8ee6`](https://github.com/lvgl/lvgl/commit/76c8ee6b7e81d8640aa5ba620947660a1c90482b) -- fix(style) refresh ext. draw pad for padding and bg img [`37a5d0c`](https://github.com/lvgl/lvgl/commit/37a5d0c85ac28718f4f32eadff3ddaf6b474cf75) -- fix(draw) underflow in subpixel font drawing [`6d5ac70`](https://github.com/lvgl/lvgl/commit/6d5ac702ad20ac3092c224ca36e412b0d6cec321) -- fix(scrollbar) hide the scrollbar if the scrollble flag is removed [`188a946`](https://github.com/lvgl/lvgl/commit/188a9467b1bd45d42368a687736a9151d081c1e8) -- fix(color): minor fixes(#2767) [`a4978d0`](https://github.com/lvgl/lvgl/commit/a4978d0913be705caffe3c080524bb7915a5e3e2) -- fix(group) skip object if an of the parents is hidden [`5799c10`](https://github.com/lvgl/lvgl/commit/5799c1084398b365c7a9669406d4fbe258a501ef) -- fix(obj) fix size invalidation issue on padding change [`33ba722`](https://github.com/lvgl/lvgl/commit/33ba7225f55f0cb17f73ce891466c7ebe1327898) -- fix(label) do not bidi process text in lv_label_ins_text [`e95efc1`](https://github.com/lvgl/lvgl/commit/e95efc152f52b7495acb011353a55b3663f7860e) -- fix(refr) set disp_drv->draw_buf->flushing_last correctly with sw rotation [`c514bdd`](https://github.com/lvgl/lvgl/commit/c514bddd9b4064e2eba0c3ec4c7a51415acd74e4) -- fix(draw) fix drawing small arcs [`8081599`](https://github.com/lvgl/lvgl/commit/8081599e9b65c758bbdc0168f857515bebaf1c80) -- fix(chart) invalidation with LV_CHART_UPDATE_MODE_SHIFT [`d61617c`](https://github.com/lvgl/lvgl/commit/d61617cd67f792908a1554a44c663c73a41bb357) -- fix(build) fix micropython build error [`54338f6`](https://github.com/lvgl/lvgl/commit/54338f6e57518a59615bdd191fcf5af1365eabea) -- fix(draw) fix border width of simple (radius=0, no masking) borders [`20f1867`](https://github.com/lvgl/lvgl/commit/20f186759664f31f07d6613ea8d77df256cd4597) -- fix(calendar) fix calculation today and highlighted day [`8f0b5ab`](https://github.com/lvgl/lvgl/commit/8f0b5ab0230007fa72127b78db500b9ceb84bf35) -- fix(style) initialize colors to black instead of zero [`524f8dd`](https://github.com/lvgl/lvgl/commit/524f8dd50b4407c78fa6cd947c42e73eab401da1) -- fix(sjpg) remove unnecessary typedefs [`c2d93f7`](https://github.com/lvgl/lvgl/commit/c2d93f78b98ba347001bd29d58b6654492bb8d70) -- fix(label) fix clipped italic letters [`2efa6dc`](https://github.com/lvgl/lvgl/commit/2efa6dce78604cdf422ff233a99f7dd5f06b821c) -- fix(draw) shadow drawing with large shadow width [`f810265`](https://github.com/lvgl/lvgl/commit/f810265c0d91135b71ae110d33d43841ec0e44f8) -- fix(dropdown) add missing invalidations [`33b5d4a`](https://github.com/lvgl/lvgl/commit/33b5d4a4fe6f28962ee7988f74d5ae842dc49b04) -- fix(dropdown) adjust the handling of keys sent to the dropdown [`e41c507`](https://github.com/lvgl/lvgl/commit/e41c50780495c7d6ac6a2b0edf12fc98c9d85a6b) -- fix(disp) be sure the pending scr load animation is finished in lv_scr_load_anim [`eb6ae52`](https://github.com/lvgl/lvgl/commit/eb6ae526432453e4b9dbc7a760cd65d164050548) -- fix(color) fox color premult precision with 16-bit color depth [`f334226`](https://github.com/lvgl/lvgl/commit/f3342269f272c474265700527f52d3ba92111531) -- fix(obj_pos) save x,y even if the object is on a layout [`a9b660c`](https://github.com/lvgl/lvgl/commit/a9b660c278658224f05fbe43d0199c48711db9fd) -- fix(scrollbar) hide the scrollbar if the scrollable flag is removed [`d9c6ad0`](https://github.com/lvgl/lvgl/commit/d9c6ad0425e761d605124e4555adc72854fec4a6) -- fix(dropdown) fix list position with RTL base direction [`79edb37`](https://github.com/lvgl/lvgl/commit/79edb37b0ab5015111bade6074fda81ae101b91b) -- fix(obj) fix lv_obj_align_to with RTL base direction [`531afcc`](https://github.com/lvgl/lvgl/commit/531afcc6cec7f67df06e369a185aef6fdc85af7b) -- fix(chart) fix sending LV_EVENT_DRAW_PART_BEGIN/END for the cursor [`34b8cd9`](https://github.com/lvgl/lvgl/commit/34b8cd9c12604bc1029efa39bd66322b8b771dbe) -- fix(arduino) fix the prototype of my_touchpad_read in the LVGL_Arduino.ino [`1a62f7a`](https://github.com/lvgl/lvgl/commit/1a62f7a619faa93406bc5895ac3338c232de2226) -- fix(checkbox) consider the bg border when positioning the indicator [`a39dac9`](https://github.com/lvgl/lvgl/commit/a39dac9e5c82ecabd135953acafa335941ca0a89) -- fix(dropdown) send LV_EVENT_VALUE_CHANGED to allow styling of the list [`dae7039`](https://github.com/lvgl/lvgl/commit/dae7039803030f908986602b3ce308dc1c3974af) -- fix(group) fix infinite loop [`bdce0bc`](https://github.com/lvgl/lvgl/commit/bdce0bc60cb6e938ce39a0defe5b24249bc66a99) -- fix(keyboard) use LVGL heap functions instead of POSIX [`b20a706`](https://github.com/lvgl/lvgl/commit/b20a706112a3107db13bbd405991ece4cbe00a88) -- fix(blend) fix green channel with additive blending [`78158f0`](https://github.com/lvgl/lvgl/commit/78158f039f19eb17bf1b7c173922c1af26c1e528) -- fix(btnmatrix) do not show pressed, focused or focus key states on disabled buttons [`3df2a74`](https://github.com/lvgl/lvgl/commit/3df2a7444758d2df023f321ccb5931de44af2a48) -- fix(font) handle the last pixel of the glyphs in font loader correctly [`fa98989`](https://github.com/lvgl/lvgl/commit/fa9898941f8efa1966cb6f326d1eebdd31211d04) -- fix(table) fix an off-by-one issue in self size calculation [`ea2545a`](https://github.com/lvgl/lvgl/commit/ea2545ae5dade0845889174737d072137bbb6591) -- fix shadowed variable [`e209260`](https://github.com/lvgl/lvgl/commit/e20926056b28bb64f38abc764a4fca045757e800) -- fix shadowed variable [`df60018`](https://github.com/lvgl/lvgl/commit/df600183f211bde0ff34add973a7a401a1da9af1) -- fix(chart) be sure the chart doesn't remain scrolled out on zoom out [`ad5b1bd`](https://github.com/lvgl/lvgl/commit/ad5b1bdc00a4a44e775a280f8b686353ef4f2a38) -- fix(docs) commit to meta repo as lvgl-bot instead of actual commit author [`f0e8549`](https://github.com/lvgl/lvgl/commit/f0e8549fe14d4e95aedcc98a63acce5a4ad1145b) -- fix(table) invalidate the table on cell value change [`cb3692e`](https://github.com/lvgl/lvgl/commit/cb3692e3029ae452eab04dce21715b7863a9f2a1) -- fix(group) allow refocusing objects [`1520208`](https://github.com/lvgl/lvgl/commit/1520208b14c38713719f507273024624a0f54f1a) -- fix(tabview) fix with left and right tabs [`17c5744`](https://github.com/lvgl/lvgl/commit/17c57449eeae8a693ad5601cf4169cf44d57d5c9) -- fix(msgbox) create modals on top layer instead of act screen [`5cf6303`](https://github.com/lvgl/lvgl/commit/5cf6303e741ec22e2e87f69af4109855eb637e63) -- fix(theme) show disabled state on buttons of btnmatrix, msgbox and keyboard [`0be582b`](https://github.com/lvgl/lvgl/commit/0be582b391e60774d6158411b835b679b010a99b) -- fix(label) update lv_label_get_letter_pos to work with LV_BASE_DIR_AUTO too [`580e05a`](https://github.com/lvgl/lvgl/commit/580e05a0e1531d86d5229ade4ced2c336fbce634) -- fix(label) fix in lv_label_get_letter_pos with when pos==line_start [`58f3f56`](https://github.com/lvgl/lvgl/commit/58f3f5625c2b29278c3e122d8eeba4d9bc597db9) -- fix(gif) replace printf statement with LVGL logging [`56f62b8`](https://github.com/lvgl/lvgl/commit/56f62b8d7356017319d21d44a8f450705ec6486b) -- fix(docs) add fsdrv back [`64527a5`](https://github.com/lvgl/lvgl/commit/64527a5a1ba9d37883c1303a3d4ee1a41e9b4ed3) -- fix(table) remove unnecessary invalidation on pressing [`6f90f9c`](https://github.com/lvgl/lvgl/commit/6f90f9cefba0bc1ea74e737e0e659402f0309cf7) -- fix(chart) draw line chart indicator (bullet) [`fba37a3`](https://github.com/lvgl/lvgl/commit/fba37a30abd1b4d7af78a288fb61dccacc99da08) -- fix(anim) return the first anim if exec_cb is NULL in lv_anim_get() [`fb7ea10`](https://github.com/lvgl/lvgl/commit/fb7ea1040153bd0f2d5c282f9fb31add32c55ce9) -- fix(label) fix lv_label_get_letter_on with BIDI enabled [`192419e`](https://github.com/lvgl/lvgl/commit/192419e7bb300bd64b51d684827719fe1c22cfdb) -- fix(checkbox) add missing invalidations [`bb39e9d`](https://github.com/lvgl/lvgl/commit/bb39e9d6f95235445e3ea1bc52b0d5a1b7a2e24a) -- fix(draw) fix gradient calculation of the rectangle is clipped [`13e3470`](https://github.com/lvgl/lvgl/commit/13e347055bd54c37e7fcb645120ea9ab3134ebec) -- fix(chart) fix typo in 655f42b8 [`6118d63`](https://github.com/lvgl/lvgl/commit/6118d63c2f23e2a157c84a010dcfa0d1fa851382) -- fix(example) fix lv_example_chart_2 [`89081c2`](https://github.com/lvgl/lvgl/commit/89081c2d6ee418b326538e1f39345d43864993c8) -- fix(calendar) fix the position calculation today [`ad05e19`](https://github.com/lvgl/lvgl/commit/ad05e196fb3937ebcba211495013700c0022f777) -- fix(tick) minor optimization on lv_tick_inc call test [`b4305df`](https://github.com/lvgl/lvgl/commit/b4305df5745684a785be071149de8dd342817db4) -- fix(docs) use let instead of const for variable which gets changed [`3cf5751`](https://github.com/lvgl/lvgl/commit/3cf5751461d6a85974da4e5c66593736ae140a1a) -- fix(theme) fix the switch style in the default theme [`0c0dc8e`](https://github.com/lvgl/lvgl/commit/0c0dc8ea30289254732cbba7ada7fd4f092caf22) -- fix(tlsf) undef printf before define-ing it [`cc935b8`](https://github.com/lvgl/lvgl/commit/cc935b87f69e6107d12d9ba4a2c83103f7dd4356) -- fix(msgbox) prevent the buttons being wider than the msgbox [`73e036b`](https://github.com/lvgl/lvgl/commit/73e036bba748e8677f219f573cba5f82c4158a17) -- fix(chart) don't draw series lines with < 1 points [`655f42b`](https://github.com/lvgl/lvgl/commit/655f42b852669f27ab8bfde84bf70cf0b7ea027d) -- fix(tests) remove src/test_runners when cleaning [`6726b0f`](https://github.com/lvgl/lvgl/commit/6726b0f5df3f4689368782b601bb01f76498123b) -- fix(label) remove duplicated lv_obj_refresh_self_size [`a070ecf`](https://github.com/lvgl/lvgl/commit/a070ecfe8c1cf7c07c035ba6c35c3ffaef56d6e1) -- fix(colorwheel) disable LV_OBJ_FLAG_SCROLL_CHAIN by default [`48d1c29`](https://github.com/lvgl/lvgl/commit/48d1c292a3c19380d5669baf911954cc1b083d43) - -- fix(obj) do not set the child's position in lv_obj_set_parent [`d89a5fb`](https://github.com/lvgl/lvgl/commit/d89a5fbbd2af33cf759c120e6a14b334099c4c98) -- feat: add LV_USE_MEM_PERF/MONITOR_POS [`acd0f4f`](https://github.com/lvgl/lvgl/commit/acd0f4fbc71ffbfeb382b7af1fa52caf3cdcda6c) -- fix(scroll) in scroll to view functions respect disabled LV_OBJ_FLAG_SCROLLABLE [`9318e02`](https://github.com/lvgl/lvgl/commit/9318e02ef5e29d2f6ce0ab4b2aa67c6542752822) -- fix(flex) remove unused variable [`747b6a2`](https://github.com/lvgl/lvgl/commit/747b6a2a9af9bafe4e6c778cca23e278cb7e4ea4) -- feat(canvas) add lv_canvas_set_px_opa [`b3b3ffc`](https://github.com/lvgl/lvgl/commit/b3b3ffc2b3b322f7401d15c4ba2ef0cdb00e2990) -- fix(textarea) allow using cursor with not full bg_opa [`c9d3965`](https://github.com/lvgl/lvgl/commit/c9d396571d0726aab5d011f37df648d337e5bc12) -- fix(txt) _lv_txt_get_next_line return 0 on empty texts [`82f3fbc`](https://github.com/lvgl/lvgl/commit/82f3fbcad7b710a89b876c32f3583090c99e847c) -- fix(btnmatrix) always update row_cnt [`86012ae`](https://github.com/lvgl/lvgl/commit/86012aefc7197209357290c780029aa39b3738dc) -- fix(scroll) minor fixes on obj scroll handling [`a4128a8`](https://github.com/lvgl/lvgl/commit/a4128a83562e0daacd949333ba7cbfec650f8050) -- fix(table) consider border width for cell positions [`f2987b6`](https://github.com/lvgl/lvgl/commit/f2987b6591046f1384b0089187fd81da10834021) -- fix(log) be sure LV_LOG_... is not empty if logs are disabled [`47734c4`](https://github.com/lvgl/lvgl/commit/47734c4abedf6b6005069d15a8c4c2fcff73f85e) -- fix(arc) fix LV_ARC_MODE_REVERSE [`df3b969`](https://github.com/lvgl/lvgl/commit/df3b96900b1266ed4856438d9121e39905d510bb) -- fix(obj) in lv_obj_move_to_index() do not send LV_EVENT_CHILD_CHANGED on all changed child [`32e8276`](https://github.com/lvgl/lvgl/commit/32e8276db7403d8dc9c9b9f0c77d331049e8c07d) -- feat(event) add lv_obj_remove_event_cb_with_user_data [`4eddeb3`](https://github.com/lvgl/lvgl/commit/4eddeb35abee1f9cd2d1fd210f11cc096cb609c7) -- fix(draw) fix shadow drawing with radius=0 [`4250e3c`](https://github.com/lvgl/lvgl/commit/4250e3c62737697cd8bc78d991a3d66216efa437) -- fix(msgbox) directly store the pointer of all children [`eb5eaa3`](https://github.com/lvgl/lvgl/commit/eb5eaa39406473cd90a7f78d710ce950cbf47548) -- fix(draw) use the filtered colors in lv_obj_init_draw_xxx_dsc() functions [`78725f2`](https://github.com/lvgl/lvgl/commit/78725f23da24fe22543ab3388c87bf3cfbd0e51a) -- fix(arc) fix full arc invalidation [`98b9ce5`](https://github.com/lvgl/lvgl/commit/98b9ce599751c9de0421acd419430cc6ccd7cad9) -- chore(led) expose LV_LED_BRIGHT_MIN/MAX in led.h [`3f18b23`](https://github.com/lvgl/lvgl/commit/3f18b234f601edefb16b1ffdb0c539e823b1c025) -- fix(group) keep the focused object in lv_group_swap_obj [`a997147`](https://github.com/lvgl/lvgl/commit/a9971471ba34352a1d7b307977cb2f635b28a031) -- fix(obj) swap objects in the group too in lv_obj_swap() [`52c7558`](https://github.com/lvgl/lvgl/commit/52c7558ab46a7024e05499edb483f115b13086f0) -- fix(theme) use opacity on button's shadow in the default theme [`c5342e9`](https://github.com/lvgl/lvgl/commit/c5342e9324c492c70b65f8c228d44b7a290cf110) -- fix(win) enable clip_corner and border_post by default [`493ace3`](https://github.com/lvgl/lvgl/commit/493ace352fea0eaa37abccaa0938c0c4a12a995a) -- fix(draw) fix rectangle drawing with clip_corner enabled [`01237da`](https://github.com/lvgl/lvgl/commit/01237da474b9703fb544163db5f66645c2b6935c) -- fix(arc) fix other invalidation issues [`b0a7337`](https://github.com/lvgl/lvgl/commit/b0a733766daee1edfabaec8df4a5fedd0180ccaf) -- feat(obj) add lv_obj_get_x/y_aligned [`98bc1fe`](https://github.com/lvgl/lvgl/commit/98bc1fe09e12a64333e91b4c25327c283a700af5) -- fix(calendar) fix incorrect highlight of today [`adbac52`](https://github.com/lvgl/lvgl/commit/adbac5220b2d75f08de110b3f426066e24f46998) -- fix(arc, meter) fix invalidation in special cases [`0f14f49`](https://github.com/lvgl/lvgl/commit/0f14f49465ca701c98f76ac95bda4a537c0fadfa) -- fix(canvas) invalidate the image on delete [`a1b362c`](https://github.com/lvgl/lvgl/commit/a1b362c98622ecbc063cfb17fb091fdab4522e8a) -- fix(msgbox) return the correct pointer from lv_msgbox_get_text [`50ea6fb`](https://github.com/lvgl/lvgl/commit/50ea6fb3fefb3a6edc958154c575dcdcacbfdb3a) -- fix(bidi) fix the handling of LV_BASE_DIR_AUTO in several widgets [`7672847`](https://github.com/lvgl/lvgl/commit/7672847ce325e909981582b4153993025da7fe50) -- fix(build) remove main component dependency (#2420) [`f2c2393`](https://github.com/lvgl/lvgl/commit/f2c2393b305cd71d2fc01ff8945965dccb8488b4) -- fix(meter) fix inner mask usage [`c28c146`](https://github.com/lvgl/lvgl/commit/c28c14631040fd08da122e192458cb0c65bc9faf) -- fix(log) fix warning for empty log macros [`4dba8df`](https://github.com/lvgl/lvgl/commit/4dba8df2a196fc7a2b7a8686efb6e47fc6cf0fc6) -- fix(theme) improve button focus of keyboard [`2504b7e`](https://github.com/lvgl/lvgl/commit/2504b7e4361ad8009e005faf112987585c2e8356) -- fix(tabview) send LV_EVENT_VALUE_CHANGED only once [`933d282`](https://github.com/lvgl/lvgl/commit/933d2829aca8bc269c0b481f2a535274626374bc) -- fix(obj style) fix children reposition if the parent's padding changes. [`57cf661`](https://github.com/lvgl/lvgl/commit/57cf6610a9ec2e6458035abfdaa5554f4296c89c) -- fix(template) update indev template for v8 [`d8a3d3d`](https://github.com/lvgl/lvgl/commit/d8a3d3d0d759ad0145f134a3f08433f3fdffcb75) -- fix(obj) detecting which indev sent LV_EVENT_FOCUS [`f03d4b8`](https://github.com/lvgl/lvgl/commit/f03d4b8cb9928077a04b839db0bd5c625919d903) -- fix(roller) adjust the size of the selected area correctly [`01d1c87`](https://github.com/lvgl/lvgl/commit/01d1c873e19d0d77e1444ba79468db63f26a448a) -- fix(imgbtn) consider width==LV_SIZE_CONTENT if only mid. img is set [`7e49f48`](https://github.com/lvgl/lvgl/commit/7e49f48894c5c3eb9793dbf1c8630f3cfdc3c091) -- fix(flex) fix NULL pointer dereference [`97ba12f`](https://github.com/lvgl/lvgl/commit/97ba12f280f0fa5400ff18c5317b9736063d8391) -- fix(obj, switch) do not send LV_EVENT_VALUE_CHANGED twice [`713b39e`](https://github.com/lvgl/lvgl/commit/713b39ecdb7e8e219cc295bad7d953ff2136f138) -- fix(coords) fix using large coordinates [`428db94`](https://github.com/lvgl/lvgl/commit/428db9494dc43d65026a9c1fb42c50daede82fc2) -- fix(chart) fix crash if no series are added [`c728b5c`](https://github.com/lvgl/lvgl/commit/c728b5ceda0a5a93d5a0859eb88261db582cf1eb) -- fix(meter) fix needle image invalidation [`54d8e81`](https://github.com/lvgl/lvgl/commit/54d8e8170bd4964909cee15a256408e7f08ccf21) -- fix(mem) add lv_ prefix to tlsf functions and types [`0d52b59`](https://github.com/lvgl/lvgl/commit/0d52b59cb16dda377f8a1ac581a851b830b7bf53) -- fix(pxp) change LV_COLOR_TRANSP to LV_COLOR_CHROMA_KEY to v8 compatibility [`81f3068`](https://github.com/lvgl/lvgl/commit/81f3068dd77d47e7079e6697ea5d00f69202c1bd) - -### Examples - -- example(chart) add area chart example [`2507`](https://github.com/lvgl/lvgl/pull/2507) -- example(anim) add demo to use cubic-bezier [`2393`](https://github.com/lvgl/lvgl/pull/2393) -- feat(example) add lv_example_chart_9.py [`2604`](https://github.com/lvgl/lvgl/pull/2604) -- feat(example) add lv_example_chart_8.py [`2611`](https://github.com/lvgl/lvgl/pull/2611) -- feat(example) chart example to add gap between the old and new data [`2565`](https://github.com/lvgl/lvgl/pull/2565) -- feat(example) add lv example list 2 [`2545`](https://github.com/lvgl/lvgl/pull/2545) -- feat(examples) add MicroPython version of lv_example_anim_3 and allow loading roller font dynamically [`2412`](https://github.com/lvgl/lvgl/pull/2412) -- feat(examples) added MP version of second tabview example [`2347`](https://github.com/lvgl/lvgl/pull/2347) -- fix(example):format codes [`2731`](https://github.com/lvgl/lvgl/pull/2731) -- fix(example) minor fixes in lv_example_chart_2.py [`2601`](https://github.com/lvgl/lvgl/pull/2601) -- feat(example) add text with gradient example [`462fbcb`](https://github.com/lvgl/lvgl/commit/462fbcbf49f47b9f329b6c15d2ca04ef09806cd9) -- fix(example_roller_3) mask free param bug [`2553`](https://github.com/lvgl/lvgl/pull/2553) -- fix(examples) don't compile assets unless needed [`2523`](https://github.com/lvgl/lvgl/pull/2523) -- fix(example) scroll example sqort types [`2498`](https://github.com/lvgl/lvgl/pull/2498) -- fix(examples) join usage [`2425`](https://github.com/lvgl/lvgl/pull/2425) -- fix(examples) add missing lv.PART.INDICATOR [`2423`](https://github.com/lvgl/lvgl/pull/2423) -- fix(examples) use lv.grid_fr for MicroPython [`2419`](https://github.com/lvgl/lvgl/pull/2419) -- fix(examples) remove symlinks [`2406`](https://github.com/lvgl/lvgl/pull/2406) -- fix(examples) import 'u'-prefixed versions of modules [`2365`](https://github.com/lvgl/lvgl/pull/2365) -- fix(examples) remove cast in MP scripts [`2354`](https://github.com/lvgl/lvgl/pull/2354) -- fix(examples) fix MicroPython examples and run the examples with CI [`2339`](https://github.com/lvgl/lvgl/pull/2339) -- fix(examples) align with renamed Micropython APIs [`2338`](https://github.com/lvgl/lvgl/pull/2338) - -- fix(examples) adjust canvas example for MicroPython API change [`52d1c2e`](https://github.com/lvgl/lvgl/commit/52d1c2e5b53eda4270abc0caa0eb309b35c010c8) -- fix(example) revert test code [`77e2c1f`](https://github.com/lvgl/lvgl/commit/77e2c1ff3d3ff035a3613f2ed0e5538513e8b4a1) -- feat(example) add checkbox example for radio buttons [`d089b36`](https://github.com/lvgl/lvgl/commit/d089b364e700d1216813106f7b4dfa6cee9aa806) -- feat(example) add text with gradient example [`462fbcb`](https://github.com/lvgl/lvgl/commit/462fbcbf49f47b9f329b6c15d2ca04ef09806cd9) -- fix(examples) exclude example animimg images if animimg is disabled [`4d7d306`](https://github.com/lvgl/lvgl/commit/4d7d30677af9ef158fe51fb1d8900d234ea5e181) -- fix(example) adjust the object sizes in lv_example_anim_timeline_1() [`71a10e4`](https://github.com/lvgl/lvgl/commit/71a10e4ecd4acfddcea279a0b5da219dfb002ff7) -- fix(example) revert text code from lv_example_checkbox_2 [`28e9593`](https://github.com/lvgl/lvgl/commit/28e9593e5802a2e7d493515059c6327e60ccbf28) - - -### Docs - -- docs: fix typo [`2765`](https://github.com/lvgl/lvgl/pull/2765) -- docs(colorwheel) fix old API names [`2643`](https://github.com/lvgl/lvgl/pull/2643) -- docs(display) fix typo [`2624`](https://github.com/lvgl/lvgl/pull/2624) -- docs add static for lv_indev_drv_t [`2605`](https://github.com/lvgl/lvgl/pull/2605) -- docs(animimg) add to extra widgets index and fix example [`2610`](https://github.com/lvgl/lvgl/pull/2610) -- docs(animimg) Add missing animation image page [`2609`](https://github.com/lvgl/lvgl/pull/2609) -- docs(group) remove reference to lv_cont which is gone in v8 [`2580`](https://github.com/lvgl/lvgl/pull/2580) -- docs(style) use correct API name for local styles [`2550`](https://github.com/lvgl/lvgl/pull/2550) -- docs(all) Proofread, fix typos and add clarifications in confusing areas [`2528`](https://github.com/lvgl/lvgl/pull/2528) -- docs(flex) update flex.md [`2517`](https://github.com/lvgl/lvgl/pull/2517) -- docs more spelling fixes [`2499`](https://github.com/lvgl/lvgl/pull/2499) -- docs fix typo: arae -> area [`2488`](https://github.com/lvgl/lvgl/pull/2488) -- docs(readme) fix typo: hosing → hosting. [`2477`](https://github.com/lvgl/lvgl/pull/2477) -- docs update company name and year [`2476`](https://github.com/lvgl/lvgl/pull/2476) -- docs fix typos [`2472`](https://github.com/lvgl/lvgl/pull/2472) -- docs(overview) fix typo [`2465`](https://github.com/lvgl/lvgl/pull/2465) -- docs(bar) fix typos in widget examples [`2463`](https://github.com/lvgl/lvgl/pull/2463) -- docs(overview) fix typo [`2454`](https://github.com/lvgl/lvgl/pull/2454) -- docs(chart) typos [`2427`](https://github.com/lvgl/lvgl/pull/2427) -- docs(layout) add internal padding paragraph to grid and flex layout p… [`2392`](https://github.com/lvgl/lvgl/pull/2392) -- docs(porting) fix indev example to remove v7 bool return [`2381`](https://github.com/lvgl/lvgl/pull/2381) -- docs(README) fix broken references [`2329`](https://github.com/lvgl/lvgl/pull/2329) -- docs(grid) typo fix [`2310`](https://github.com/lvgl/lvgl/pull/2310) -- docs(color) language fixes [`2302`](https://github.com/lvgl/lvgl/pull/2302) -- docs(lv_obj_style) update add_style and remove_style function headers [`2287`](https://github.com/lvgl/lvgl/pull/2287) - -- docs(contributing) add commit message format section [`3668e54`](https://github.com/lvgl/lvgl/commit/3668e54f06b9e51f407b6f6eb24829c03e3d0ac5) -- docs minor typo fixes [`84c0086`](https://github.com/lvgl/lvgl/commit/84c00862ae0213a54469e08900da7acf435ed5fe) -- docs(arduino) update some outdated information [`9a77102`](https://github.com/lvgl/lvgl/commit/9a77102c40f68140d0ba2c6c5e493e51a8773f64) -- docs(keyboard) add note regarding event handler [`255f729`](https://github.com/lvgl/lvgl/commit/255f7294d387d65bbc56c0f8af84f7fa2f3cfdfa) -- docs minor CSS fix [`acbb680`](https://github.com/lvgl/lvgl/commit/acbb680683fc726e942f59d4296501838e90bde1) -- docs minor CSS improvements [`7f367d6`](https://github.com/lvgl/lvgl/commit/7f367d6956c4d87b75a90cf1798550e986c5c248) -- docs(keyboard) change `LV_KEYBOARD_MODE_NUM` to `LV_KEYBOARD_MODE_NUMBER` [`6e83d37`](https://github.com/lvgl/lvgl/commit/6e83d378e933c426550a7d6bc8fd0dd7fa9ba051) -- docs(textarea) clarify the use of text selection bg_color [`65673c0`](https://github.com/lvgl/lvgl/commit/65673c0e15c48b5926da26ae1a1b8d0a0a8161a3) -- docs list all examples on one page [`25acaf4`](https://github.com/lvgl/lvgl/commit/25acaf45ca87271106b23b52d0d941228e117859) -- docs(examples) add MicroPython examples [`6f37c4f`](https://github.com/lvgl/lvgl/commit/6f37c4fc560c13545177e15576c5b3085c8f2c2a) -- docs(filesystem) update to v8 [`7971ade`](https://github.com/lvgl/lvgl/commit/7971ade47b15898efb6fca17d34ca30f1ee5c926) -- docs(style) complete the description of style the properties [`55e8846`](https://github.com/lvgl/lvgl/commit/55e8846871f812f888c8354e4ec8974ac0650165) -- docs example list fixes [`cd600d1`](https://github.com/lvgl/lvgl/commit/cd600d105650bae08f9732a654c6a2c85e610cd5) -- docs(style) complete the description of style the properties [`ff087da`](https://github.com/lvgl/lvgl/commit/ff087dafb4ecd016ee4920bfe4f162b1db58f7cb) -- docs(README) update links, examples, and add services menu [`3471bd1`](https://github.com/lvgl/lvgl/commit/3471bd1c698ee58f6632415559dcc34e9d2ee3c0) -- docs(color) update colors' docs [`9056b5e`](https://github.com/lvgl/lvgl/commit/9056b5ee1bfea6796307bdf983a4a00ea47fe9f0) -- docs update lv_fs.h, layer and align.png to v8 [`31ab062`](https://github.com/lvgl/lvgl/commit/31ab0628d5cfc57e55f42e5f59689388b034177c) -- docs(color) minor fix [`ac8f453`](https://github.com/lvgl/lvgl/commit/ac8f4534a51b418377c2eac62dbd731b9be71977) -- docs update changelog [`c386110`](https://github.com/lvgl/lvgl/commit/c386110e2390399ab97936622e59c510ba414e19) -- docs(extra) add extra/README.md [`8cd504d`](https://github.com/lvgl/lvgl/commit/8cd504d58bb679fe1f260e3eee59fcb0b85cb589) -- docs add lazy load to the iframes of the examples [`c49e830`](https://github.com/lvgl/lvgl/commit/c49e830aad2c847611f3398767e85c193909559a) -- docs(os) add example and clarify some points [`d996453`](https://github.com/lvgl/lvgl/commit/d996453207caa50a90a66d05565431fa288be96b) -- docs(rlottie) fix build error [`ce0b564`](https://github.com/lvgl/lvgl/commit/ce0b56458846daa65288f901e9b8ef1083eab468) -- docs include paths in libs [`f5f9562`](https://github.com/lvgl/lvgl/commit/f5f956233657f95b45a45d872e5d6e68c05eecd4) -- docs libs fixes [`8e7bba6`](https://github.com/lvgl/lvgl/commit/8e7bba6acec66a4f6b80496de9fd21a8e3c4c6ee) -- docs(obj) add comment lv_obj_get_x/y/width/height about postponed layout recalculation [`533066e`](https://github.com/lvgl/lvgl/commit/533066e6accbe2cbe1b60556eb61ebb2a07185a2) -- docs fix example list [`ed77ed1`](https://github.com/lvgl/lvgl/commit/ed77ed1dae088ef29194cf3c6bb552e1ee67d78b) -- docs describe the options to include or skip lv_conf.h [`174ef66`](https://github.com/lvgl/lvgl/commit/174ef6692e0b05338890a1cf524d9dcbf5c25f6c) -- docs(overview) spelling fixes [`d2efb8c`](https://github.com/lvgl/lvgl/commit/d2efb8c6e5ceedbb9d9c1a1c89ef709e6570e360) -- docs(table) describe keypad/encoder navigation [`749d1b3`](https://github.com/lvgl/lvgl/commit/749d1b3ec31ec2ef27f594ed0a4af93edb2c10f0) -- docs update CHANGELOG [`0f8bc18`](https://github.com/lvgl/lvgl/commit/0f8bc18f6aacb6a74e0bda59068d3d178fa66434) -- docs(image) mention the frame_id parameter of lv_img_decoder_open [`2433732`](https://github.com/lvgl/lvgl/commit/2433732570a817f566308e025d89227a8c650f5f) -- docs(arduino) update how to use the examples [`06962a5`](https://github.com/lvgl/lvgl/commit/06962a564fd668eced22b2e9bc19e7732abf94ec) -- docs(rlottie): fix typo in commands [`ed9169c`](https://github.com/lvgl/lvgl/commit/ed9169c56dc1f34b1f021457b78c9f3eccba13cf) -- docs(indev, layer) update lv_obj_set_click() to lv_obj_add_flag() [`bcd99e8`](https://github.com/lvgl/lvgl/commit/bcd99e8e438cc1b63762f8933d26bbb38fd42a2d) -- docs update version support table [`e6e98ab`](https://github.com/lvgl/lvgl/commit/e6e98abbc25cc4aa20b05d1002a651e4012ebff7) -- docs fix example list [`c6f99ad`](https://github.com/lvgl/lvgl/commit/c6f99ad200c7862c2f3cca3811bc2bdc2c95e971) -- docs(examples) add <hr/> to better separate examples [`a1b59e3`](https://github.com/lvgl/lvgl/commit/a1b59e34dd23fb12bd6e9ab0ffa92b2bfcec66b3) -- docs(checkbox) update the comment lv_checkbox_set_text_static [`3e0ddd0`](https://github.com/lvgl/lvgl/commit/3e0ddd028511c6c4a0ba33a15526f404b31a50b8) -- docs(grid) fix missing article [`da0c97a`](https://github.com/lvgl/lvgl/commit/da0c97a367746573fa2385d0ddd184f27ca20dbd) -- docs(display) fix grammar in one spot [`5dbea7d`](https://github.com/lvgl/lvgl/commit/5dbea7d72522e78f66fb468e1d5a98fa28179ed1) -- docs(style) fix typo in style property descriptions [`4e3b860`](https://github.com/lvgl/lvgl/commit/4e3b86020fdc8e183335c6c9b8604129e3e3ddcc) -- docs(flex) fix typo in flex grow section [`e5fafc4`](https://github.com/lvgl/lvgl/commit/e5fafc412214ab01d46ebd37e272e3ffc3164ea4) -- docs(indev) clarify purpose of `continue_reading` flag [`706f81e`](https://github.com/lvgl/lvgl/commit/706f81e5862af27fb0b60cdaf02c650c31787c78) -- docs(license) update company name and year [`7c1eb00`](https://github.com/lvgl/lvgl/commit/7c1eb0064535f2d914b9dc885ebb2a2d0d73381d) -- docs fix typo [`8ab8064`](https://github.com/lvgl/lvgl/commit/8ab806459c1b99990b91b4cd6a656ff6736c1b63) -- docs add libs to the main index [`1a8fed5`](https://github.com/lvgl/lvgl/commit/1a8fed5df02545fe97845e3acd86e33f7048cd8e) -- docs add btn_example.png [`8731ef1`](https://github.com/lvgl/lvgl/commit/8731ef141e2ad2f022b1c01e1bf7605f983b013f) - -- docs(btnmatrix) fix typo with set_all/clear_all parameters [`51a82a1`](https://github.com/lvgl/lvgl/commit/51a82a17ffe938d07d94660f49fd18962060943a) - -### CI and tests - -- ci(micropython) fix git fetch [`2757`](https://github.com/lvgl/lvgl/pull/2757) -- test(txt) initial unit tests and general code cleanup/fixes [`2623`](https://github.com/lvgl/lvgl/pull/2623) -- test add setUp and tearDown to test template [`2648`](https://github.com/lvgl/lvgl/pull/2648) -- test(arc) add initial unit tests [`2617`](https://github.com/lvgl/lvgl/pull/2617) -- ci(micropython) add ESP32 and STM32 tests [`2629`](https://github.com/lvgl/lvgl/pull/2629) -- test(checkbox) add initial tests [`2551`](https://github.com/lvgl/lvgl/pull/2551) -- test(ci) build and run tests in parallel. [`2515`](https://github.com/lvgl/lvgl/pull/2515) -- ci(tests) run tests using ctest [`2503`](https://github.com/lvgl/lvgl/pull/2503) -- ci(tests) add dependency on GNU parallel [`2510`](https://github.com/lvgl/lvgl/pull/2510) -- ci(tests) use common script to install development prereqs [`2504`](https://github.com/lvgl/lvgl/pull/2504) -- test convert Makefile to CMake [`2495`](https://github.com/lvgl/lvgl/pull/2495) -- test Refactor unit test scripts. [`2473`](https://github.com/lvgl/lvgl/pull/2473) - -- test(font_loader) migrate the existing font loader test [`bc5b3be`](https://github.com/lvgl/lvgl/commit/bc5b3be61f7751852dc99509a6ab83faaf6d1235) -- test add build test again, add dropdown test, integrate gcov and gvocr [`e35b1d0`](https://github.com/lvgl/lvgl/commit/e35b1d04bdc7d531d72ebce7d1f031be2631e776) -- test(dropdown) add tess for keypad and encoder [`4143b80`](https://github.com/lvgl/lvgl/commit/4143b804c8f4b4324141ad0f529bac4e9acf1442) -- test add keypad and encoder emulators [`e536bb6`](https://github.com/lvgl/lvgl/commit/e536bb6325728db21ef5c729a99f2161a8125625) -- tests add mouse emulator [`2ba810b`](https://github.com/lvgl/lvgl/commit/2ba810b8de19afc3e9ac18e5bd8ab16af10a4433) -- tests add README [`b765643`](https://github.com/lvgl/lvgl/commit/b765643e4902de359e88fdf6d314e9afdb2daa9a) -- test add move tests to test_cases and test_runners directories [`e9e010a`](https://github.com/lvgl/lvgl/commit/e9e010a8468ee307c350e071251f22459173e601) -- test fix CI build error [`c38cae2`](https://github.com/lvgl/lvgl/commit/c38cae22fbf6cef7564fbebe2145a7def20d52e1) -- ci add config for 8bpp [`3eacc59`](https://github.com/lvgl/lvgl/commit/3eacc5923c0a554e7ff4489776a8982dfc142115) -- test move more source files to src folder [`3672f87`](https://github.com/lvgl/lvgl/commit/3672f873328b4471ac9d5d23696f7bc99a87bc43) -- test update CI for the new tests [`a3898b9`](https://github.com/lvgl/lvgl/commit/a3898b931e81860acf197bc88fd3dd6f8885eb2c) -- test cleaned up report folder [`b9b4ba5`](https://github.com/lvgl/lvgl/commit/b9b4ba5b2608f5709678463f62b3d3f937780235) -- test fix build error [`61cda59`](https://github.com/lvgl/lvgl/commit/61cda59cbe8569326ef9d366c520b89be292f5ea) -- test(font_loader) migrate the existing font loader test [`d6dbbaa`](https://github.com/lvgl/lvgl/commit/d6dbbaaa34304b4c889415439ab562056e0840a5) -- test add move tests to test_cases and test_runners directories [`d2e735e`](https://github.com/lvgl/lvgl/commit/d2e735ef36bd99c16ccaa281dcaa5f418e2dec98) -- test add 3rd party libs to all tests and also fix them [`7a95fa9`](https://github.com/lvgl/lvgl/commit/7a95fa9e2de9639a3c2f1990ff63b467be54a7aa) -- test(arc): add test case for adv_hittest [`e83df6f`](https://github.com/lvgl/lvgl/commit/e83df6f14de1a9eb1d137b123fac96c25a1b7715) -- ci create check for lv_conf_internal.h [`5d8285e`](https://github.com/lvgl/lvgl/commit/5d8285e2d37e19670c1daeff229e1dc331f053c4) -- test fix warning and docs build error [`d908f31`](https://github.com/lvgl/lvgl/commit/d908f31f8f50024d8b3c8d0a11aff9cc1b011049) -- ci(micropython) add rp2 port [`1ab5c96`](https://github.com/lvgl/lvgl/commit/1ab5c9689f61fd2991653beec7d023472fc96239) -- test(dropdown) remove dummy test case [`9fb98da`](https://github.com/lvgl/lvgl/commit/9fb98da8a280dc3d5753da1d2aa79eeb1cba47e0) -- ci(codecov) hide statuses on commits for now [`0b7be77`](https://github.com/lvgl/lvgl/commit/0b7be778a29412fe5562a736855121d19350889c) -- ci(docs) run apt-get update before installation [`f215174`](https://github.com/lvgl/lvgl/commit/f215174999a18b0e5904e97bfda48f3b81271aa1) -- test fix LV_USE_LOG_LEVEL -> LV_LOG_LEVEL typo [`80f0b09`](https://github.com/lvgl/lvgl/commit/80f0b09e34596564ca6ec7c23d148f4ce2e17ca3) -- ci(micropython) add GCC problem matcher [`ab316a0`](https://github.com/lvgl/lvgl/commit/ab316a07bc4d89a633fdd00bc7ff8c5db4b00ad8) - -- test convert Makefile to CMake (#2495) [`9c846ee`](https://github.com/lvgl/lvgl/commit/9c846ee493862ef11b46942a6e5af3c1ed8468d1) - -### Others - -- chore: replace (void)xxx with LV_UNUSED(xxx) [`2779`](https://github.com/lvgl/lvgl/pull/2779) -- animation improvement [`2743`](https://github.com/lvgl/lvgl/pull/2743) -- Improve LV_FORMAT_ATTRIBUTE usage [`2673`](https://github.com/lvgl/lvgl/pull/2673) -- Fix typo in commands to build rlottie [`2723`](https://github.com/lvgl/lvgl/pull/2723) -- del(.gitmodules): delete .gitmodules [`2718`](https://github.com/lvgl/lvgl/pull/2718) -- lv_obj_draw_part_dsc_t.text_length added [`2694`](https://github.com/lvgl/lvgl/pull/2694) -- expose LV_COLOR_DEPTH and LV_COLOR_16_SWAP in micropython [`2679`](https://github.com/lvgl/lvgl/pull/2679) -- sync lvgl/lv_fs_if [`2676`](https://github.com/lvgl/lvgl/pull/2676) -- build: always enable CMake install rule in default configuration [`2636`](https://github.com/lvgl/lvgl/pull/2636) -- build: fix lib name in CMakeLists [`2641`](https://github.com/lvgl/lvgl/pull/2641) -- build: remove use of 'project' keyword in CMakeLists [`2640`](https://github.com/lvgl/lvgl/pull/2640) -- build add install rule to CMakeList.txt [`2621`](https://github.com/lvgl/lvgl/pull/2621) -- Fixed row size calculation [`2633`](https://github.com/lvgl/lvgl/pull/2633) -- arch add small 3rd party libs to lvgl [`2569`](https://github.com/lvgl/lvgl/pull/2569) -- Kconfig: Add missing options [`2597`](https://github.com/lvgl/lvgl/pull/2597) -- Espressif IDF component manager [`2521`](https://github.com/lvgl/lvgl/pull/2521) -- chore(btnmatrix) removed unnecessary semicolon [`2520`](https://github.com/lvgl/lvgl/pull/2520) -- Update README.md [`2516`](https://github.com/lvgl/lvgl/pull/2516) -- Corrected a function name in obj.md [`2511`](https://github.com/lvgl/lvgl/pull/2511) -- Simple spelling fixes [`2496`](https://github.com/lvgl/lvgl/pull/2496) -- added lv_obj_move_up() and lv_obj_move_down() [`2467`](https://github.com/lvgl/lvgl/pull/2467) -- Fix buf name error for "lv_port_disp_template.c" and optimize the arduino example [`2475`](https://github.com/lvgl/lvgl/pull/2475) -- Fix two examples in the docs with new v8 api [`2486`](https://github.com/lvgl/lvgl/pull/2486) -- kconfig: minor fix for default dark theme option [`2426`](https://github.com/lvgl/lvgl/pull/2426) -- doc(table) update doc on cell merging [`2397`](https://github.com/lvgl/lvgl/pull/2397) -- added example lv_example_anim_timeline_1.py [`2387`](https://github.com/lvgl/lvgl/pull/2387) -- refactor(printf) add printf-like function attribute to _lv_txt_set_text_vfmt and lv_label_set_text_fmt [`2332`](https://github.com/lvgl/lvgl/pull/2332) -- Update win.md [`2352`](https://github.com/lvgl/lvgl/pull/2352) -- Nxp pxp vglite v8 dev [`2313`](https://github.com/lvgl/lvgl/pull/2313) -- More Snapable --> Snappable replacements [`2304`](https://github.com/lvgl/lvgl/pull/2304) -- Spelling and other language fixes to documentation [`2293`](https://github.com/lvgl/lvgl/pull/2293) -- Update quick-overview.md [`2295`](https://github.com/lvgl/lvgl/pull/2295) -- adding micropython examples [`2286`](https://github.com/lvgl/lvgl/pull/2286) - -- format run code-formtter.sh [`d67dd94`](https://github.com/lvgl/lvgl/commit/d67dd943cadb3d21a3d9488b6354f669e2e58c65) -- Update ROADMAP.md [`2b1ae3c`](https://github.com/lvgl/lvgl/commit/2b1ae3c107539dec130b988cddca5ddb2b5af652) -- Create .codecov.yml [`e53aa82`](https://github.com/lvgl/lvgl/commit/e53aa82658a1d7324f328c986cb5b7b669803ba2) -- refactor(examples) drop JS-specific code from header.py [`ef41450`](https://github.com/lvgl/lvgl/commit/ef41450ed87f4f4dd936b63349b5a0c9ce880618) -- make test run on master and release/v8.* [`227402a`](https://github.com/lvgl/lvgl/commit/227402a81a1cdd34cd57ec04682166d3961c4481) -- Update release.yml [`0838f12`](https://github.com/lvgl/lvgl/commit/0838f1296b2c55c0b265650ee4310a79730536dd) -- refactor(examples) drop usys import from header.py [`ad1f91a`](https://github.com/lvgl/lvgl/commit/ad1f91ab32c38cab7f0d1448ce3c4e67b47f4526) -- Update ROADMAP.md [`a38fcf2`](https://github.com/lvgl/lvgl/commit/a38fcf2c7aa5fd156d3f2b6965ec4f81d7ff5503) -- Revert "feat(conf) add better check for Kconfig default" [`a5793c7`](https://github.com/lvgl/lvgl/commit/a5793c70a9a60340a5f1c5d33ba1d118af0a76e2) -- remove temporary test file [`a958c29`](https://github.com/lvgl/lvgl/commit/a958c29af7df66f84520036766929232e0c437c4) -- start to implement release/patch [`1626a0c`](https://github.com/lvgl/lvgl/commit/1626a0c029504f26e568677debcb7ab0f6053f83) -- chore(indev) minor formatting [`79ab3d2`](https://github.com/lvgl/lvgl/commit/79ab3d29b01e5f0bff1c754fdc36230584aeaaae) -- add basic patch release script [`1c3ecf1`](https://github.com/lvgl/lvgl/commit/1c3ecf1cc14f5501a345472278cc485a24b8ab9c) -- chore(example) minor improvements on lv_example_list_2 [`bb6d6b7`](https://github.com/lvgl/lvgl/commit/bb6d6b77999fde33f560bde92b394a8811303868) -- tool: add changelog_gen.sh to automatically generate changelog [`6d95521`](https://github.com/lvgl/lvgl/commit/6d955210765de972f78b8c307df2f2387e4580ed) -- update version numbers to v8.1.0-dev [`8691611`](https://github.com/lvgl/lvgl/commit/8691611de2206669cd22e3e97c844fdf2bf494b0) -- chore(test) improve prints [`ea8bed3`](https://github.com/lvgl/lvgl/commit/ea8bed34b49343a4e881bdd42096f69d245ef66e) -- chore(test) improve prints [`0c4bca0`](https://github.com/lvgl/lvgl/commit/0c4bca0f9cbeefaf20fd41e3a561d0e1799bc6b0) -- chore: update lv_conf_internal.h [`41c2dd1`](https://github.com/lvgl/lvgl/commit/41c2dd16ee87f85338603399bb92e1f6eab84bf6) -- chore(format) lv_conf_template.h minor formatting [`3c86d77`](https://github.com/lvgl/lvgl/commit/3c86d777c10c80ec9a4c5d3d403bd1395834004a) -- chore(docs) always deploy master to docs/master as well [`6d05692`](https://github.com/lvgl/lvgl/commit/6d05692d7820a2b833751d6881704b283f1fe618) -- Update CHANGELOG.md [`48fd73d`](https://github.com/lvgl/lvgl/commit/48fd73d20da4f19556660a9fca7faf042c965f56) -- Fix compile errors [`6c956cc`](https://github.com/lvgl/lvgl/commit/6c956cc0f402b96512ed07f8a93003a0319fc49c) -- Update textarea.md [`6d8799f`](https://github.com/lvgl/lvgl/commit/6d8799fbbfb1477ad2e0887644fb4cd900817199) -- chore(assert) add warning about higher memory usage if LV_USE_ASSERT_STYLE is enabled [`33e4330`](https://github.com/lvgl/lvgl/commit/33e433008e23b48540e83bc5399fd0ccb9e90630) -- Update page.html [`9573bab`](https://github.com/lvgl/lvgl/commit/9573bab5cbe2da643f5146e62c176bdd0113d954) -- chore(docs) force docs rebuild [`4a0f413`](https://github.com/lvgl/lvgl/commit/4a0f4139eb98e73b37abf62f66e2cf1c5d4e58db) -- Fix typo error in color.md [`572880c`](https://github.com/lvgl/lvgl/commit/572880ccd3374ccbe81cf09a0620bf95659ca883) -- Update arc.md [`2a9b9e6`](https://github.com/lvgl/lvgl/commit/2a9b9e6e1119db8294fdc63d93548fe06e2b6aa2) -- Update index.rst [`9ce2c77`](https://github.com/lvgl/lvgl/commit/9ce2c7702d15d74f64b7d4bf6273cba442b48c09) -- chore(docs) minor formatting on example's GitHub link [`75209e8`](https://github.com/lvgl/lvgl/commit/75209e893e89b6aa9d6a231af4661ce6a6dd6161) -- chore(lv_conf_template) fix spelling mistake [`9d134a9`](https://github.com/lvgl/lvgl/commit/9d134a99e3f59412ee4a941f20bf70053dd4326d) -- Update CHANGELOG.md [`8472360`](https://github.com/lvgl/lvgl/commit/847236044da01096beae4a586c874b4980f21a55) -- chore(stale) disable on forks [`93c1303`](https://github.com/lvgl/lvgl/commit/93c1303ee7989d25216262e1d0ea244b59b975f6) -- Revert "fix(tests) remove src/test_runners when cleaning" [`ae15a1b`](https://github.com/lvgl/lvgl/commit/ae15a1bbfe122115e5c8ac1f707929673843ad37) - -- style fix usage of clang-format directives [`2122583`](https://github.com/lvgl/lvgl/commit/2122583ec23d82422e1e3d6f2b5a20745fa5dd6d) -- Revert "fix(indev) focus on objects on release instead of press" [`f61b2ca`](https://github.com/lvgl/lvgl/commit/f61b2ca45502472cde8ac0983b73dbf153de2b20) - -## v8.0.2 (16.07.2021) -- fix(theme) improve button focus of keyboard -- fix(tabview) send LV_EVENT_VALUE_CHANGED only once -- fix(imgbtn) use the correct src in LV_EVENT_GET_SELF_SIZE -- fix(color) remove extraneous cast for 8-bit color -- fix(obj style) fix children reposition if the parent's padding changes. -- fix(color) remove extraneous _LV_COLOR_MAKE_TYPE_HELPER (#2372) -- fix(spinner) should not be clickable (#2373) -- fix(obj) improve how the focusing indev is determined -- fix(template) update indev template for v8 -- fix(printf) skip defining attribute if pycparser is used -- refactor(printf) add printf-like function attribute to _lv_txt_set_text_vfmt and lv_label_set_text_fmt (#2332) -- fix(template) include lvgl.h in lv_port_*_template.c files -- fix(obj) detecting which indev sent LV_EVENT_FOCUS -- fix (span) fill LV_EVENT_GET_SELF_SIZE (#2360) -- fix(arc) disable LV_OBJ_FLAG_SCROLL_CHAIN by default -- fix (draw) fix arc bg image drawing with full arcs -- fix(disp) fix memory leak in lv_disp_remove (#2355) -- fix warnings introduced by 3fb8baf5 -- fix(widgets) use lv_obj_class for all the widgets -- fix(obj) move clean ups from lv_obj_del to lv_obj_destructor -- fix(roller) fix partial redraw of the selected area -- fix(roller) adjust the size of the selected area correctly -- fix(obj) delete useless type conversion (#2343) -- fix(lv_obj_scroll.h) typos (#2345) -- fix(scroll) fire LV_EVENT_SCROLL_BEGIN in the same spot for both axes -- fix(btnmatrix) fix button invalidation on focus change -- fix(textarea) style update in oneline mode + improve scroll to cursor -- fix(tlsf) do not use -- fix(imgbtn) consider width==LV_SIZE_CONTENT if only mid. img is set -- fix(refr) reduce the nesting level in lv_refr_area -- fix(txt) enhance the function of break_chars (#2327) -- fix(pxp): update RTOS macro for SDK 2.10 -- fix(vglite): update for v8 -- fix(pxp): update for v8 -- fix(flex) fix layout update and invalidation issues -- fix(flex) fix NULL pointer dereference -- fix(obj, switch) do not send LV_EVENT_VALUE_CHANGED twice -- fix(color) overflow with 16-bit color depth -- fix(coords) fix using large coordinates -- fix(chart) fix crash if no series are added -- fix(chart) invalidation with LV_CHART_UPDATE_MODE_SHIFT -- fix(align) fix lv_obj_align_to G -- fix(table) invalidate the table on cell value change -- fix(label) remove duplicated lv_obj_refresh_self_size -- fix(draw) underflow in subpixel font drawing -- fix (scroll) do not send unnecessary scroll end events - - -## v8.0.1 (14.06.2021) -- docs(filesystem) update to v8 7971ade4 -- fix(msgbox) create modals on top layer instead of act screen 5cf6303e -- fix(colorwheel) disable LV_OBJ_FLAG_SCROLL_CHAIN by default 48d1c292 -- docs(grid) typo fix (#2310) 69d109d2 -- fix(arduino) fix the prototype of my_touchpad_read in the LVGL_Arduino.ino 1a62f7a6 -- fix(meter) fix needle image invalidation 54d8e817 -- fix(mem) add lv_ prefix to tlsf functions and types 0d52b59c -- fix(calendar) fix the position calculation today ad05e196 -- fix(typo) rename LV_OBJ_FLAG_SNAPABLE to LV_OBJ_FLAG_SNAPPABLE e697807c -- docs(color) language fixes (#2302) 07ecc9f1 -- fix(tick) minor optimization on lv_tick_inc call test b4305df5 -- Spelling and other language fixes to documentation (#2293) d0aaacaf -- fix(theme) show disabled state on buttons of btnmatrix, msgbox and keyboard 0be582b3 -- fix(scroll) keep the scroll position on object deleted 52edbb46 -- fix(msgbox) handle NULL btn map parameter 769c4a30 -- fix(group) allow refocusing objects 1520208b -- docs(overview) spelling fixes d2efb8c6 -- Merge branch 'master' of https://github.com/lvgl/lvgl 45960838 -- feat(timer) check if lv_tick_inc is called aa6641a6 -- feat(docs) add view on GitHub link a716ac6e -- fix(theme) fix the switch style in the default theme 0c0dc8ea -- docs fix typo 8ab80645 -- Merge branch 'master' of https://github.com/lvgl/lvgl e796448f -- feat(event) pass the scroll animation to LV_EVENT_SCROLL_BEGIN ca54ecfe -- fix(tabview) fix with left and right tabs 17c57449 -- chore(docs) force docs rebuild 4a0f4139 -- chore(docs) always deploy master to docs/master as well 6d05692d -- fix(template) update lv_objx_template to v8 38bb8afc -- docs(extra) add extra/README.md 8cd504d5 -- Update CHANGELOG.md 48fd73d2 -- Update quick-overview.md (#2295) 5616471c -- fix(pxp) change LV_COLOR_TRANSP to LV_COLOR_CHROMA_KEY to v8 compatibility 81f3068d -- adding micropython examples (#2286) c60ed68e -- docs(color) minor fix ac8f4534 -- fix(example) revert test code 77e2c1ff -- fix(draw) with additive blending with 32-bit color depth 786db2af -- docs(color) update colors' docs 9056b5ee -- Merge branch 'master' of https://github.com/lvgl/lvgl a711a1dd -- perf(refresh) optimize where to wait for lv_disp_flush_ready with 2 buffers d0172f14 -- docs(lv_obj_style) update add_style and remove_style function headers (#2287) 60f7bcbf -- fix memory leak of spangroup (#2285) 33e0926a -- fix make lv_img_cache.h public because cache invalidation is public 38ebcd81 -- Merge branch 'master' of https://github.com/lvgl/lvgl 2b292495 -- fix(btnmatrix) fix focus event handling 3b58ef14 -- Merge pull request #2280 from lvgl/dependabot/pip/docs/urllib3-1.26.5 a2f45b26 -- fix(label) calculating the clip area 57e211cc -- chore(deps): bump urllib3 from 1.26.4 to 1.26.5 in /docs b2f77dfc -- fix(docs) add docs about the default group 29bfe604 - -## v8.0.0 (01.06.2021) - -v8.0 brings many new features like simplified and more powerful scrolling, new layouts inspired by CSS Flexbox and Grid, simplified and improved widgets, more powerful events, hookable drawing, and more. - -v8 is a major change and therefore it's not backward compatible with v7. - -### Directory structure -- The `lv_` prefix is removed from the folder names -- The `docs` is moved to the `lvgl` repository -- The `examples` are moved to the `lvgl` repository -- Create an `src/extra` folder for complex widgets: - - It makes the core LVGL leaner - - In `extra` we can have a lot and specific widgets - - Good place for contributions - -### Widget changes -- `lv_cont` removed, layout features are moved to `lv_obj` -- `lv_page` removed, scroll features are moved to `lv_obj` -- `lv_objmask` the same can be achieved by events -- `lv_meter` added as the union of `lv_linemeter` and `lv_gauge` -- `lv_span` new widget mimicking HTML `` -- `lv_animing` new widget for simple slideshow animations -- \+ many minor changes and improvements - -### New scrolling -- Support "elastic" scrolling when scrolled in -- Support scroll chaining among any objects types (not only `lv_pages`s) -- Remove `lv_drag`. Similar effect can be achieved by setting the position in `LV_EVENT_PRESSING` -- Add snapping -- Add snap stop to scroll max 1 snap point - -### New layouts -- [CSS Grid](https://css-tricks.com/snippets/css/a-guide-to-grid/)-like layout support -- [CSS Flexbox](https://css-tricks.com/snippets/css/a-guide-to-flexbox/)-like layout support - -### Styles -- Optimize and simplify styles -- State is saved in the object instead of the style property -- Object size and position can be set in styles too - -### Events -- Allow adding multiple events to an object -- A `user_data` can be attached to the added events - -### Driver changes -- `lv_disp_drv_t`, `lv_indev_drv_t`, `lv_fs_drv_t` needs to be `static` -- `...disp_buf...` is renamed to `draw_buf`. See an initialization example [here](https://github.com/lvgl/lv_sim_eclipse_sdl/blob/release/v8.0/main.c#L128-L141). -- No partial update if two screen sized buffers are set -- `disp_drv->full_refresh = 1` makes always the whole display redraw. -- `hor_res` and `ver_res` need to be set in `disp_drv` -- `indev_read_cb` returns `void`. To indicate that there is more that to read set `data->continue_reading = 1` in the `read_cb` - -### Other changes -- Remove the copy parameter from create functions -- Simplified File system interface API -- Use a more generic inheritance -- The built-in themes are reworked -- `lv_obj_align` now saved the alignment and realigns the object automatically but can't be used to align to other than the parent -- `lv_obj_align_to` can align to an object but doesn't save the alignment -- `lv_pct(x)` can be used to set the size and position in percentage -- There are many other changes in widgets that are not detailed here. Please refer to the documentation of the widgets. - -### New release policy -- We will follow [Release branches with GitLab flow](https://docs.gitlab.com/ee/topics/gitlab_flow.html#release-branches-with-gitlab-flow) -- Minor releases are expected in every 3-4 month -- `master` will always contain the latest changes - -### Migrating from v7 to v8 -- First and foremost, create a new `lv_conf.h` based on `lv_conf_template.h`. -- To try the new version it's recommended to use a simulator project and see the examples. -- When migrating your project to v8 - - Update the drivers are described above - - Update the styles - - Update the events - - Use the new layouts instead of `lv_cont` features - - Use `lv_obj` instead of `lv_page` - - See the changes in [Colors](https://docs.lvgl.io/8.0/overview/color.html) - - The other parts are mainly minor renames and refactoring. See the functions' documentation for descriptions. - -## v7.11.0 (16.03.2021) - -### New features -- Add better screen orientation management with software rotation support -- Decide text animation's direction based on base_dir (when using LV_USE_BIDI) - -### Bugfixes -- fix(gauge) fix needle invalidation -- fix(bar) correct symmetric handling for vertical sliders - -## v7.10.1 (16.02.2021) - -### Bugfixes -- fix(draw) overlap outline with background to prevent aliasing artifacts -- fix(indev) clear the indev's `act_obj` in `lv_indev_reset` -- fix(text) fix out of bounds read in `_lv_txt_get_width` -- fix(list) scroll list when button is focused using LV_KEY_NEXT/PREV -- fix(text) improve Arabic contextual analysis by adding hyphen processing and proper handling of lam-alef sequence -- fix(delete) delete animation after the children are deleted -- fix(gauge) consider paddings for needle images - -## v7.10.0 (02.02.2021) - -### New features -- feat(indev) allow input events to be passed to disabled objects -- feat(spinbox) add inline get_step function for MicroPython support - -### Bugfixes -- fix(btnmatrix) fix lv_btnmatrix_get_active_btn_text() when used in a group - -## v7.9.1 (19.01.2021) - -### Bugfixes -- fix(cpicker) fix division by zero -- fix(dropdown) fix selecting options after the last one -- fix(msgbox) use the animation time provided -- fix(gpu_nxp_pxp) fix incorrect define name -- fix(indev) don't leave edit mode if there is only one object in the group -- fix(draw_rect) fix draw pattern stack-use-after-scope error - - -## v7.9.0 (05.01.2021) - -### New features -- feat(chart) add lv_chart_remove_series and lv_chart_hide_series -- feat(img_cache) allow disabling image caching -- calendar: make get_day_of_week() public -- Added support for Zephyr integration - -### Bugfixes -- fix(draw_rect) free buffer used for arabic processing -- fix(win) arabic process the title of the window -- fix(dropdown) arabic process the option in lv_dropdown_add_option -- fix(textarea) buffer overflow in password mode with UTF-8 characters -- fix(textarea) cursor position after hiding character in password mode -- fix(linemeter) draw critical lines with correct color -- fix(lv_conf_internal) be sure Kconfig defines are always uppercase -- fix(kconfig) handle disable sprintf float correctly. -- fix(layout) stop layout after recursion threshold is reached -- fix(gauge) fix redraw with image needle - -## v7.8.1 (15.12.2020) - -### Bugfixes -- fix(lv_scr_load_anim) fix when multiple screens are loaded at the same time with delay -- fix(page) fix LV_SCROLLBAR_MODE_DRAG - -## v7.8.0 (01.12.2020) - -### New features -- make DMA2D non blocking -- add unscii-16 built-in font -- add KConfig -- add lv_refr_get_fps_avg() - -### Bugfixes -- fix(btnmatrix) handle arabic texts in button matrices -- fix(indev) disabled object shouldn't absorb clicks but let the parent to be clicked -- fix(arabic) support processing again already processed texts with _lv_txt_ap_proc -- fix(textarea) support Arabic letter connections -- fix(dropdown) support Arabic letter connections -- fix(value_str) support Arabic letter connections in value string property -- fix(indev) in LV_INDEV_TYPE_BUTTON recognize 1 cycle long presses too -- fix(arc) make arc work with encoder -- fix(slider) adjusting the left knob too with encoder -- fix reference to LV_DRAW_BUF_MAX_NUM in lv_mem.c -- fix(polygon draw) join adjacent points if they are on the same coordinate -- fix(linemeter) fix invalidation when setting new value -- fix(table) add missing invalidation when changing cell type -- refactor(roller) rename LV_ROLLER_MODE_INIFINITE -> LV_ROLLER_MODE_INFINITE - -## v7.7.2 (17.11.2020) -### Bugfixes -- fix(draw_triangle): fix polygon/triangle drawing when the order of points is counter-clockwise -- fix(btnmatrix): fix setting the same map with modified pointers -- fix(arc) fix and improve arc dragging -- label: Repair calculate back `dot` character logical error which cause infinite loop. -- fix(theme_material): remove the bottom border from tabview header -- fix(imgbtn) guess the closest available state with valid src -- fix(spinbox) update cursor position in lv_spinbox_set_step - -## v7.7.1 (03.11.2020) -### Bugfixes -- Respect btnmatrix's `one_check` in `lv_btnmatrix_set_btn_ctrl` -- Gauge: make the needle images to use the styles from `LV_GAUGE_PART_PART` -- Group: fix in `lv_group_remove_obj` to handle deleting hidden objects correctly - -## v7.7.0 (20.10.2020) - -### New features -- Add PXP GPU support (for NXP MCUs) -- Add VG-Lite GPU support (for NXP MCUs) -- Allow max. 16 cell types for table -- Add `lv_table_set_text_fmt()` -- Use margin on calendar header to set distances and padding to the size of the header -- Add `text_sel_bg` style property - -### Bugfixes -- Theme update to support text selection background -- Fix imgbtn state change -- Support RTL in table (draw columns right to left) -- Support RTL in pretty layout (draw columns right to left) -- Skip objects in groups if they are in disabled state -- Fix dropdown selection with RTL basedirection -- Fix rectangle border drawing with large width -- Fix `lv_win_clean()` - -## v7.6.1 (06.10.2020) - -### Bugfixes -- Fix BIDI support in dropdown list -- Fix copying base dir in `lv_obj_create` -- Handle sub pixel rendering in font loader -- Fix transitions with style caching -- Fix click focus -- Fix imgbtn image switching with empty style -- Material theme: do not set the text font to allow easy global font change - -## v7.6.0 (22.09.2020) - -### New features -- Check whether any style property has changed on a state change to decide if any redraw is required - -### Bugfixes -- Fix selection of options with non-ASCII letters in dropdown list -- Fix font loader to support LV_FONT_FMT_TXT_LARGE - -## v7.5.0 (15.09.2020) - -### New features -- Add `clean_dcache_cb` and `lv_disp_clean_dcache` to enable users to use their own cache management function -- Add `gpu_wait_cb` to wait until the GPU is working. It allows to run CPU a wait only when the rendered data is needed. -- Add 10px and 8ox built in fonts - -### Bugfixes -- Fix unexpected DEFOCUS on lv_page when clicking to bg after the scrollable -- Fix `lv_obj_del` and `lv_obj_clean` if the children list changed during deletion. -- Adjust button matrix button width to include padding when spanning multiple units. -- Add rounding to btnmatrix line height calculation -- Add `decmopr_buf` to GC roots -- Fix division by zero in draw_pattern (lv_draw_rect.c) if the image or letter is not found -- Fix drawing images with 1 px height or width - -## v7.4.0 (01.09.2020) - -The main new features of v7.4 are run-time font loading, style caching and arc knob with value setting by click. - -### New features -- Add `lv_font_load()` function - Loads a `lv_font_t` object from a binary font file -- Add `lv_font_free()` function - Frees the memory allocated by the `lv_font_load()` function -- Add style caching to reduce access time of properties with default value -- arc: add set value by click feature -- arc: add `LV_ARC_PART_KNOB` similarly to slider -- send gestures event if the object was dragged. User can check dragging with `lv_indev_is_dragging(lv_indev_act())` in the event function. - -### Bugfixes -- Fix color bleeding on border drawing -- Fix using 'LV_SCROLLBAR_UNHIDE' after 'LV_SCROLLBAR_ON' -- Fix cropping of last column/row if an image is zoomed -- Fix zooming and rotating mosaic images -- Fix deleting tabview with LEFT/RIGHT tab position -- Fix btnmatrix to not send event when CLICK_TRIG = true and the cursor slid from a pressed button -- Fix roller width if selected text is larger than the normal - -## v7.3.1 (18.08.2020) - -### Bugfixes -- Fix drawing value string twice -- Rename `lv_chart_clear_serie` to `lv_chart_clear_series` and `lv_obj_align_origo` to `lv_obj_align_mid` -- Add linemeter's mirror feature again -- Fix text decor (underline strikethrough) with older versions of font converter -- Fix setting local style property multiple times -- Add missing background drawing and radius handling to image button -- Allow adding extra label to list buttons -- Fix crash if `lv_table_set_col_cnt` is called before `lv_table_set_row_cnt` for the first time -- Fix overflow in large image transformations -- Limit extra button click area of button matrix's buttons. With large paddings it was counter-intuitive. (Gaps are mapped to button when clicked). -- Fix `lv_btnmatrix_set_one_check` not forcing exactly one button to be checked -- Fix color picker invalidation in rectangle mode -- Init disabled days to gray color in calendar - -## v7.3.0 (04.08.2020) - -### New features -- Add `lv_task_get_next` -- Add `lv_event_send_refresh`, `lv_event_send_refresh_recursive` to easily send `LV_EVENT_REFRESH` to object -- Add `lv_tabview_set_tab_name()` function - used to change a tab's name -- Add `LV_THEME_MATERIAL_FLAG_NO_TRANSITION` and `LV_THEME_MATERIAL_FLAG_NO_FOCUS` flags -- Reduce code size by adding: `LV_USE_FONT_COMPRESSED` and `LV_FONT_USE_SUBPX` and applying some optimization -- Add `LV_MEMCPY_MEMSET_STD` to use standard `memcpy` and `memset` - -### Bugfixes -- Do not print warning for missing glyph if its height OR width is zero. -- Prevent duplicated sending of `LV_EVENT_INSERT` from text area -- Tidy outer edges of cpicker widget. -- Remove duplicated lines from `lv_tabview_add_tab` -- btnmatrix: handle combined states of buttons (e.g. checked + disabled) -- textarea: fix typo in lv_textarea_set_scrollbar_mode -- gauge: fix image needle drawing -- fix using freed memory in _lv_style_list_remove_style - -## v7.2.0 (21.07.2020) - -### New features -- Add screen transitions with `lv_scr_load_anim()` -- Add display background color, wallpaper and opacity. Shown when the screen is transparent. Can be used with `lv_disp_set_bg_opa/color/image()`. -- Add `LV_CALENDAR_WEEK_STARTS_MONDAY` -- Add `lv_chart_set_x_start_point()` function - Set the index of the x-axis start point in the data array -- Add `lv_chart_set_ext_array()` function - Set an external array of data points to use for the chart -- Add `lv_chart_set_point_id()` function - Set an individual point value in the chart series directly based on index -- Add `lv_chart_get_x_start_point()` function - Get the current index of the x-axis start point in the data array -- Add `lv_chart_get_point_id()` function - Get an individual point value in the chart series directly based on index -- Add `ext_buf_assigned` bit field to `lv_chart_series_t` structure - it's true if external buffer is assigned to series -- Add `lv_chart_set_series_axis()` to assign series to primary or secondary axis -- Add `lv_chart_set_y_range()` to allow setting range of secondary y-axis (based on `lv_chart_set_range` but extended with an axis parameter) -- Allow setting different font for the selected text in `lv_roller` -- Add `theme->apply_cb` to replace `theme->apply_xcb` to make it compatible with the MicroPython binding -- Add `lv_theme_set_base()` to allow easy extension of built-in (or any) themes -- Add `lv_obj_align_x()` and `lv_obj_align_y()` functions -- Add `lv_obj_align_origo_x()` and `lv_obj_align_origo_y()` functions - -### Bugfixes -- `tileview` fix navigation when not screen sized -- Use 14px font by default to for better compatibility with smaller displays -- `linemeter` fix conversation of current value to "level" -- Fix drawing on right border -- Set the cursor image non-clickable by default -- Improve mono theme when used with keyboard or encoder - -## v7.1.0 (07.07.2020) - -### New features -- Add `focus_parent` attribute to `lv_obj` -- Allow using buttons in encoder input device -- Add lv_btnmatrix_set/get_align capability -- DMA2D: Remove dependency on ST CubeMX HAL -- Added `max_used` propriety to `lv_mem_monitor_t` struct -- In `lv_init` test if the strings are UTF-8 encoded. -- Add `user_data` to themes -- Add LV_BIG_ENDIAN_SYSTEM flag to lv_conf.h in order to fix displaying images on big endian systems. -- Add inline function lv_checkbox_get_state(const lv_obj_t * cb) to extend the checkbox functionality. -- Add inline function lv_checkbox_set_state(const lv_obj_t * cb, lv_btn_state_t state ) to extend the checkbox functionality. - -### Bugfixes -- `lv_img` fix invalidation area when angle or zoom changes -- Update the style handling to support Big endian MCUs -- Change some methods to support big endian hardware. -- remove use of c++ keyword 'new' in parameter of function lv_theme_set_base(). -- Add LV_BIG_ENDIAN_SYSTEM flag to lv_conf.h in order to fix displaying images on big endian systems. -- Fix inserting chars in text area in big endian hardware. - -## v7.0.2 (16.06.2020) - -### Bugfixes -- `lv_textarea` fix wrong cursor position when clicked after the last character -- Change all text related indices from 16-bit to 32-bit integers throughout whole library. #1545 -- Fix gestures -- Do not call `set_px_cb` for transparent pixel -- Fix list button focus in material theme -- Fix crash when a text area is cleared with the backspace of a keyboard -- Add version number to `lv_conf_template.h` -- Add log in true double buffering mode with `set_px_cb` -- `lv_dropdown`: fix missing `LV_EVENT_VALUE_CHANGED` event when used with encoder -- `lv_tileview`: fix if not the {0;0} tile is created first -- `lv_debug`: restructure to allow asserting in from `lv_misc` too -- add assert if `_lv_mem_buf_get()` fails -- `lv_textarea`: fix character delete in password mode -- Update `LV_OPA_MIN` and `LV_OPA_MAX` to widen the opacity processed range -- `lv_btnm` fix sending events for hidden buttons -- `lv_gaguge` make `lv_gauge_set_angle_offset` offset the labels and needles too -- Fix typo in the API `scrllable` -> `scrollable` -- `tabview` by default allow auto expanding the page only to right and bottom (#1573) -- fix crash when drawing gradient to the same color -- chart: fix memory leak -- `img`: improve hit test for transformed images - -## v7.0.1 (01.06.2020) - -### Bugfixes -- Make Micropython working by adding the required variables as GC_ROOT -- Prefix some internal API functions with `_` to reduce the API of LVGL -- Fix built-in SimSun CJK font -- Fix UTF-8 encoding when `LV_USE_ARABIC_PERSIAN_CHARS` is enabled -- Fix DMA2D usage when 32 bit images directly blended -- Fix lv_roller in infinite mode when used with encoder -- Add `lv_theme_get_color_secondary()` -- Add `LV_COLOR_MIX_ROUND_OFS` to adjust color mixing to make it compatible with the GPU -- Improve DMA2D blending -- Remove memcpy from `lv_ll` (caused issues with some optimization settings) -- `lv_chart` fix X tick drawing -- Fix vertical dashed line drawing -- Some additional minor fixes and formattings - -## v7.0.0 (18.05.2020) - -### Documentation -The docs for v7 is available at https://docs.littlevgl.com/v7/en/html/index.html - -### Legal changes - -The name of the project is changed to LVGL and the new website is on https://lvgl.io - -LVGL remains free under the same conditions (MIT license) and a company is created to manage LVGL and offer services. - -### New drawing system -Complete rework of LVGL's draw engine to use "masks" for more advanced and higher quality graphical effects. -A possible use-case of this system is to remove the overflowing content from the rounded edges. -It also allows drawing perfectly anti-aliased circles, lines, and arcs. -Internally, the drawings happen by defining masks (such as rounded rectangle, line, angle). -When something is drawn the currently active masks can make some pixels transparent. -For example, rectangle borders are drawn by using 2 rectangle masks: one mask removes the inner part and another the outer part. - -The API in this regard remained the same but some new functions were added: -- `lv_img_set_zoom`: set image object's zoom factor -- `lv_img_set_angle`: set image object's angle without using canvas -- `lv_img_set_pivot`: set the pivot point of rotation - -The new drawing engine brought new drawing features too. They are highlighted in the "style" section. - -### New style system -The old style system is replaced with a new more flexible and lightweighted one. -It uses an approach similar to CSS: support cascading styles, inheriting properties and local style properties per object. -As part of these updates, a lot of objects were reworked and the APIs have been changed. - -- more shadows options: *offset* and *spread* -- gradient stop position to shift the gradient area and horizontal gradient -- `LV_BLEND_MODE_NORMAL/ADDITIVE/SUBTRACTIVE` blending modes -- *clip corner*: crop the content on the rounded corners -- *text underline* and *strikethrough* -- dashed vertical and horizontal lines (*dash gap*, *dash_width*) -- *outline*: a border-like part drawn out of the background. Can have spacing to the background. -- *pattern*: display and image in the middle of the background or repeat it -- *value* display a text which is stored in the style. It can be used e.g. as a light-weighted text on buttons too. -- *margin*: similar to *padding* but used to keep space outside the object - -Read the [Style](https://docs.littlevgl.com/v7/en/html/overview/style.html) section of the documentation to learn how the new styles system works. - -### GPU integration -To better utilize GPUs, from this version GPU usage can be integrated into LVGL. In `lv_conf.h` any supported GPUs can be enabled with a single configuration option. - -Right now, only ST's DMA2D (Chrom-ART) is integrated. More will in the upcoming releases. - -### Renames -The following object types are renamed: -- sw -> switch -- ta -> textarea -- cb -> checkbox -- lmeter -> linemeter -- mbox -> msgbox -- ddlist -> dropdown -- btnm -> btnmatrix -- kb -> keyboard -- preload -> spinner -- lv_objx folder -> lv_widgets -- LV_FIT_FILL -> LV_FIT_PARENT -- LV_FIT_FLOOD -> LV_FLOOD_MAX -- LV_LAYOUT_COL_L/M/R -> LV_LAYOUT_COLUMN_LEFT/MID/RIGHT -- LV_LAYOUT_ROW_T/M/B -> LV_LAYOUT_ROW_TOP/MID/BOTTOM - -### Reworked and improved object -- `dropdown`: Completely reworked. Now creates a separate list when opened and can be dropped to down/up/left/right. -- `label`: `body_draw` is removed, instead, if its style has a visible background/border/shadow etc it will be drawn. Padding really makes the object larger (not just virtually as before) -- `arc`: can draw background too. -- `btn`: doesn't store styles for each state because it's done naturally in the new style system. -- `calendar`: highlight the pressed datum. The used styles are changed: use `LV_CALENDAR_PART_DATE` normal for normal dates, checked for highlighted, focused for today, pressed for the being pressed. (checked+pressed, focused+pressed also work) -- `chart`: only has `LINE` and `COLUMN` types because with new styles all the others can be described. LV_CHART_PART_SERIES sets the style of the series. bg_opa > 0 draws an area in LINE mode. `LV_CHART_PART_SERIES_BG` also added to set a different style for the series area. Padding in `LV_CHART_PART_BG` makes the series area smaller, and it ensures space for axis labels/numbers. -- `linemeter`, `gauge`: can have background if the related style properties are set. Padding makes the scale/lines smaller. scale_border_width and scale_end_border_width allow to draw an arc on the outer part of the scale lines. -- `gauge`: `lv_gauge_set_needle_img` allows use image as needle -- `canvas`: allow drawing to true color alpha and alpha only canvas, add `lv_canvas_blur_hor/ver` and rename `lv_canvas_rotate` to `lv_canvas_transform` -- `textarea`: If available in the font use bullet (`U+2022`) character in text area password - -### New object types -- `lv_objmask`: masks can be added to it. The children will be masked accordingly. - -### Others -- Change the built-in fonts to [Montserrat](https://fonts.google.com/specimen/Montserrat) and add built-in fonts from 12 px to 48 px for every 2nd size. -- Add example CJK and Arabic/Persian/Hebrew built-in font -- Add ° and "bullet" to the built-in fonts -- Add Arabic/Persian script support: change the character according to its position in the text. -- Add `playback_time` to animations. -- Add `repeat_count` to animations instead of the current "repeat forever". -- Replace `LV_LAYOUT_PRETTY` with `LV_LAYOUT_PRETTY_TOP/MID/BOTTOM` - -### Demos -- [lv_examples](https://github.com/littlevgl/lv_examples) was reworked and new examples and demos were added - -### New release policy -- Maintain this Changelog for every release -- Save old major version in new branches. E.g. `release/v6` -- Merge new features and fixes directly into `master` and release a patch or minor releases every 2 weeks. - -### Migrating from v6 to v7 -- First and foremost, create a new `lv_conf.h` based on `lv_conf_template.h`. -- To try the new version it suggested using a simulator project and see the examples. -- If you have a running project, the most difficult part of the migration is updating to the new style system. Unfortunately, there is no better way than manually updating to the new format. -- The other parts are mainly minor renames and refactoring as described above. diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/_static/js/custom.js b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/_static/js/custom.js deleted file mode 100644 index d16e00b..0000000 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/_static/js/custom.js +++ /dev/null @@ -1,18 +0,0 @@ -/* API collapsing */ -document.addEventListener('DOMContentLoaded', (event) => { - document.querySelectorAll("dl.cpp").forEach(cppListing => { - const dt = cppListing.querySelector("dt"); - let shouldBeExpanded = false; - if(dt.id == document.location.hash.substring(1)) - shouldBeExpanded = true; - cppListing.classList.add(shouldBeExpanded ? "expanded" : "unexpanded"); - const button = document.createElement("span"); - button.classList.add("lv-api-expansion-button"); - button.addEventListener("click", () => { - cppListing.classList.toggle("unexpanded"); - cppListing.classList.toggle("expanded"); - }); - - dt.insertBefore(button, dt.firstChild); - }); -}) \ No newline at end of file diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/get-started/platforms/nxp.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/get-started/platforms/nxp.md deleted file mode 100644 index 9767fbf..0000000 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/get-started/platforms/nxp.md +++ /dev/null @@ -1,168 +0,0 @@ -# NXP -NXP has integrated LVGL into the MCUXpresso SDK packages for several of their general purpose and crossover -microcontrollers, allowing easy evaluation and migration into your product design. -[Download an SDK for a supported board](https://www.nxp.com/design/software/embedded-software/littlevgl-open-source-graphics-library:LITTLEVGL-OPEN-SOURCE-GRAPHICS-LIBRARY?&tid=vanLITTLEVGL-OPEN-SOURCE-GRAPHICS-LIBRARY) -today and get started with your next GUI application. - -## Creating new project with LVGL -Downloading the MCU SDK example project is recommended as a starting point. It comes fully configured with LVGL (and -with PXP/VGLite support if the modules are present), no additional integration work is required. - -## HW acceleration for NXP iMX RT platforms -Depending on the RT platform used, the acceleration can be done by NXP PXP (PiXel Pipeline) and/or the Verisilicon GPU -through an API named VGLite. There is a single NXP draw context that covers both GPUs allowing to have enabled either -one or even both at the same time. While enableing both 2D accelerators, the VGLite can be used to accelerate widget -drawing while the PXP accelerated blit and fill operations. - -Supported draw callbacks are available in "src/draw/nxp/lv_gpu_nxp.c": -```c - nxp_draw_ctx->base_draw.draw_arc = lv_draw_nxp_arc; - nxp_draw_ctx->base_draw.draw_rect = lv_draw_nxp_rect; - nxp_draw_ctx->base_draw.draw_img_decoded = lv_draw_nxp_img_decoded; - nxp_draw_ctx->blend = lv_draw_nxp_blend; -``` - -If enabled both GPUs, the PXP is the preffered one to be used for drawing operation. A fallback mechanism is -implemented so that if the feature is not supported by PXP (or if PXP fails), the VGLite will take over to handle the -task. At the end, the CPU will assure that every widget drawing is fully covered (if not already done by GPU). - -### PXP accelerator -Several drawing features in LVGL can be offloaded to the PXP engine. The VGLite (if supported) and CPU are available for -other operations while the PXP is running. An RTOS is required to block the LVGL drawing thread and switch to another -task or suspend the CPU for power savings. - -#### Features supported: - - RGB565 and ARGB8888 color formats - - Area fill + optional transparency - - BLIT (BLock Image Transfer) + optional transparency - - Color keying + optional transparency - - Recoloring (color tint) + optional transparency - - Image Rotation (90, 180, 270 degree) + optional transparency - - Recoloring (color tint) + Image Rotation (90, 180, 270 degree) + optional transparency - - Screen Rotation (90, 180, 270 degree) - - RTOS integration layer - - Default FreeRTOS and bare metal code provided - - - Combination of recolor and/or rotation + color key/alpha blend/transparency is supported but PXP needs two steps. - First step is to recolor/rotate the image to a temporarly buffer (please check LV_MEM_SIZE value for allocation limit) - and another step is required to handle color keying, alpha chanel or to apply transparency. - -#### Known limitations: - - Rotation is not supported for images unaligned to blocks of 16x16 pixels. -PXP is set to process 16x16 blocks to optimize the system for memory bandwidth and image processing time. -The output engine essentially truncates any output pixels after the desired number of pixels has been written. -When rotating a source image and the output is not divisible by the block size, the incorrect pixels could be truncated -and the final output image can look shifted. - -#### Basic configuration: - - Select NXP PXP engine in lv_conf.h: Set `LV_USE_GPU_NXP_PXP` to 1 - - Enable default implementation for interrupt handling, PXP start function and automatic initialization: - Set `LV_USE_GPU_NXP_PXP_AUTO_INIT` to 1 - - If `SDK_OS_FREE_RTOS` symbol is defined, FreeRTOS implementation will be used, otherwise bare metal code will be - included - -#### Basic initialization: - - If `LV_USE_GPU_NXP_PXP_AUTO_INIT` is enabled, no user code is required; PXP is initialized automatically in - `lv_init()` - - For manual PXP initialization, default configuration structure for callbacks can be used. Initialize PXP before - calling `lv_init()` -```c - #if LV_USE_GPU_NXP_PXP - #include "src/draw/nxp/pxp/lv_gpu_nxp_pxp.h" - #endif - . . . - #if LV_USE_GPU_NXP_PXP - PXP_COND_STOP(!lv_gpu_nxp_pxp_init(), "PXP init failed."); - #endif -``` - -#### Project setup: - - Add PXP related files to project: - - src/draw/nxp/pxp/lv_gpu_nxp_pxp.c, src/draw/nxp/pxp/lv_gpu_nxp_pxp.h: init, uninit, run/wait PXP device, log/trace - - src/draw/nxp/pxp/lv_draw_pxp_blend.c, src/draw/nxp/pxp/lv_draw_pxp_blend.h: fill and blit (w/o transformation) - - src/draw/nxp/pxp/lv_gpu_nxp_osa.c, src/draw/nxp/pxp/lv_gpu_osa.h: default implementation of OS-specific functions - (bare metal and FreeRTOS only) - - optional, required only if `LV_USE_GPU_NXP_PXP_AUTO_INIT` is set to 1 - - PXP related code depends on two drivers provided by MCU SDK. These drivers need to be added to project: - - fsl_pxp.c, fsl_pxp.h: PXP driver - - fsl_cache.c, fsl_cache.h: CPU cache handling functions - -#### Logging: - - By default, LV_GPU_NXP_PXP_LOG_ERRORS is enabled so that any PXP error will be seen on LVGL output - - For tracing logs about the PXP limitations or size thresholds, the user can enable LV_GPU_NXP_PXP_LOG_TRACES - -#### Advanced configuration: - - Implementation depends on multiple OS-specific functions. The struct `lv_nxp_pxp_cfg_t` with callback pointers is - used as a parameter for the `lv_gpu_nxp_pxp_init()` function. Default implementation for FreeRTOS and baremetal is - provided in lv_gpu_nxp_osa.c - - `pxp_interrupt_init()`: Initialize PXP interrupt (HW setup, OS setup) - - `pxp_interrupt_deinit()`: Deinitialize PXP interrupt (HW setup, OS setup) - - `pxp_run()`: Start PXP job. Use OS-specific mechanism to block drawing thread. PXP must finish drawing before - leaving this function. - - There are configurable area thresholds which are used to decide whether the area will be processed by CPU or by PXP. - Areas smaller than a defined value will be processed by CPU and those bigger than the threshold will be processed by - PXP. These thresholds may be defined as preprocessor variables. Default values are defined in lv_draw_pxp_blend.h - - `LV_GPU_NXP_PXP_BLIT_SIZE_LIMIT`: size threshold for image BLIT, BLIT with color keying, BLIT with recolor and - BLIT with rotation (OPA >= LV_OPA_MAX) - - `LV_GPU_NXP_PXP_BLIT_OPA_SIZE_LIMIT`: size threshold for image BLIT, BLIT with color keying, BLIT with recolor - and BLIT with rotation and transparency (OPA < LV_OPA_MAX) - - `LV_GPU_NXP_PXP_FILL_SIZE_LIMIT`: size threshold for fill operation (OPA >= LV_OPA_MAX) - - `LV_GPU_NXP_PXP_FILL_OPA_SIZE_LIMIT`: size threshold for fill operation with transparency (OPA < LV_OPA_MAX) - -### VGLite accelerator -Extra drawing features in LVGL can be handled by the VGLite engine. The PXP (if supported) and CPU are available for -other operations while the VGLite is running. An RTOS is required to block the LVGL drawing thread and switch to another -task or suspend the CPU for power savings. - -#### Features supported: - - RGB565 and ARGB8888 color formats - - Area fill + optional transparency - - BLIT (BLock Image Transfer) + optional transparency - - Image Rotation (any degree with decimal) + optional transparency - - Image Scale + optional transparency - - Draw background rectangle with radius or gradient - - Draw arc - - RTOS integration layer - -#### Basic configuration: - - Select NXP VGLite engine in lv_conf.h: Set `LV_USE_GPU_NXP_VG_LITE` to 1 - - `SDK_OS_FREE_RTOS` symbol needs to be defined so that the FreeRTOS implementation will be used - -#### Basic initialization: - - Initialize VGLite before calling `lv_init()` by specifying the width/height of tessellation window. Value should be - a multiple of 16; minimum value is 16 pixels, maximum cannot be greater than frame width. If less than or equal to 0, - then no tessellation buffer is created, in which case the function is used for a blit init. -```c - #if LV_USE_GPU_NXP_VG_LITE - #include "vg_lite.h" - #endif - . . . - #if LV_USE_GPU_NXP_VG_LITE - VG_LITE_COND_STOP(vg_lite_init(64, 64) != VG_LITE_SUCCESS, "VGLite init failed."); - #endif -``` - -#### Project setup: - - Add VGLite related files to project: - - src/draw/nxp/vglite/lv_gpu_nxp_vglite.c, src/draw/nxp/vglite/lv_gpu_nxp_vglite.h: buffer init, log/trace - - src/draw/nxp/vglite/lv_draw_vglite_blend.c, src/draw/nxp/vglite/lv_draw_vglite_blend.h: fill and blit - (w/o transformation) - - src/draw/nxp/vglite/lv_draw_vglite_rect.c, src/draw/nxp/vglite/lv_draw_vglite_rect.h: rectangle draw - - src/draw/nxp/vglite/lv_draw_vglite_arc.c, src/draw/nxp/vglite/lv_draw_vglite_arc.h: arc draw - -#### Logging: - - By default, LV_GPU_NXP_VG_LITE_LOG_ERRORS is enabled so that any VGLite error will be seen on LVGL output - - For tracing logs about the VGLite limitations, size thresholds or stride alignment, the user can enable - LV_GPU_NXP_VG_LITE_LOG_TRACES - -#### Advanced configuration: - - There are configurable area thresholds which are used to decide whether the area will be processed by CPU or by - VGLite. Areas smaller than a defined value will be processed by CPU and those bigger than the threshold will be - processed by VGLite. These thresholds may be defined as preprocessor variables. Default values are defined in - lv_draw_vglite_blend.h - - `LV_GPU_NXP_VG_LITE_BLIT_SIZE_LIMIT`: size threshold for image BLIT, BLIT with scale and BLIT with rotation - (OPA >= LV_OPA_MAX) - - `LV_GPU_NXP_VG_LITE_BLIT_OPA_SIZE_LIMIT`: size threshold for image BLIT, BLIT with scale and BLIT with rotation - and transparency (OPA < LV_OPA_MAX) - - `LV_GPU_NXP_VG_LITE_FILL_SIZE_LIMIT`: size threshold for fill operation (OPA >= LV_OPA_MAX) - - `LV_GPU_NXP_VG_LITE_FILL_OPA_SIZE_LIMIT`: size threshold for fill operation with transparency (OPA < LV_OPA_MAX) diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/libs/fsdrv.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/libs/fsdrv.md deleted file mode 100644 index 7b9015a..0000000 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/libs/fsdrv.md +++ /dev/null @@ -1,21 +0,0 @@ - -# File System Interfaces - -LVGL has a [File system](https://docs.lvgl.io/master/overview/file-system.html) module to provide an abstraction layer for various file system drivers. - -LVG has built in support for: -- [FATFS](http://elm-chan.org/fsw/ff/00index_e.html) -- STDIO (Linux and Windows using C standard function .e.g fopen, fread) -- POSIX (Linux and Windows using POSIX function .e.g open, read) -- WIN32 (Windows using Win32 API function .e.g CreateFileA, ReadFile) - -You still need to provide the drivers and libraries, this extension provides only the bridge between FATFS, STDIO, POSIX, WIN32 and LVGL. - -## Usage - -In `lv_conf.h` enable `LV_USE_FS_...` and assign an upper cased letter to `LV_FS_..._LETTER` (e.g. `'S'`). -After that you can access files using that driver letter. E.g. `"S:path/to/file.txt"`. - -The work directory can be set with `LV_FS_..._PATH`. E.g. `"/home/joe/projects/"` The actual file/directory paths will be appended to it. - -Cached reading is also supported if `LV_FS_..._CACHE_SIZE` is set to not `0` value. `lv_fs_read` caches this size of data to lower the number of actual reads from the storage. diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/overview/renderers/arm-2d.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/overview/renderers/arm-2d.md deleted file mode 100644 index d655477..0000000 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/overview/renderers/arm-2d.md +++ /dev/null @@ -1,4 +0,0 @@ -# ARM-2D GPU - -TODO - diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/env_support/rt-thread/squareline/SConscript b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/env_support/rt-thread/squareline/SConscript deleted file mode 100644 index 89a5099..0000000 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/env_support/rt-thread/squareline/SConscript +++ /dev/null @@ -1,13 +0,0 @@ -from building import * - -cwd = GetCurrentDir() -group = [] -src = [] -CPPPATH =[] - -src += Glob(cwd + '/ui/*.c') -CPPPATH += [cwd+'/ui'] - -group = group + DefineGroup('LVGL-SquareLine', src, depend = ['PKG_USING_LVGL_SQUARELINE'], CPPPATH = CPPPATH) - -Return('group') diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/chart/lv_example_chart_5.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/chart/lv_example_chart_5.c deleted file mode 100644 index c175e37..0000000 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/chart/lv_example_chart_5.c +++ /dev/null @@ -1,99 +0,0 @@ -#include "../../lv_examples.h" -#if LV_USE_CHART && LV_USE_SLIDER && LV_BUILD_EXAMPLES - -static lv_obj_t * chart; -/* Source: https://github.com/ankur219/ECG-Arrhythmia-classification/blob/642230149583adfae1e4bd26c6f0e1fd8af2be0e/sample.csv*/ -static const lv_coord_t ecg_sample[] = { - -2, 2, 0, -15, -39, -63, -71, -68, -67, -69, -84, -95, -104, -107, -108, -107, -107, -107, -107, -114, -118, -117, - -112, -100, -89, -83, -71, -64, -58, -58, -62, -62, -58, -51, -46, -39, -27, -10, 4, 7, 1, -3, 0, 14, 24, 30, 25, 19, - 13, 7, 12, 15, 18, 21, 13, 6, 9, 8, 17, 19, 13, 11, 11, 11, 23, 30, 37, 34, 25, 14, 15, 19, 28, 31, 26, 23, 25, 31, - 39, 37, 37, 34, 30, 32, 22, 29, 31, 33, 37, 23, 13, 7, 2, 4, -2, 2, 11, 22, 33, 19, -1, -27, -55, -67, -72, -71, -63, - -49, -18, 35, 113, 230, 369, 525, 651, 722, 730, 667, 563, 454, 357, 305, 288, 274, 255, 212, 173, 143, 117, 82, 39, - -13, -53, -78, -91, -101, -113, -124, -131, -131, -131, -129, -128, -129, -125, -123, -123, -129, -139, -148, -153, - -159, -166, -183, -205, -227, -243, -248, -246, -254, -280, -327, -381, -429, -473, -517, -556, -592, -612, -620, - -620, -614, -604, -591, -574, -540, -497, -441, -389, -358, -336, -313, -284, -222, -167, -114, -70, -47, -28, -4, 12, - 38, 52, 58, 56, 56, 57, 68, 77, 86, 86, 80, 69, 67, 70, 82, 85, 89, 90, 89, 89, 88, 91, 96, 97, 91, 83, 78, 82, 88, 95, - 96, 105, 106, 110, 102, 100, 96, 98, 97, 101, 98, 99, 100, 107, 113, 119, 115, 110, 96, 85, 73, 64, 69, 76, 79, - 78, 75, 85, 100, 114, 113, 105, 96, 84, 74, 66, 60, 75, 85, 89, 83, 67, 61, 67, 73, 79, 74, 63, 57, 56, 58, 61, 55, - 48, 45, 46, 55, 62, 55, 49, 43, 50, 59, 63, 57, 40, 31, 23, 25, 27, 31, 35, 34, 30, 36, 34, 42, 38, 36, 40, 46, 50, - 47, 32, 30, 32, 52, 67, 73, 71, 63, 54, 53, 45, 41, 28, 13, 3, 1, 4, 4, -8, -23, -32, -31, -19, -5, 3, 9, 13, 19, - 24, 27, 29, 25, 22, 26, 32, 42, 51, 56, 60, 57, 55, 53, 53, 54, 59, 54, 49, 26, -3, -11, -20, -47, -100, -194, -236, - -212, -123, 8, 103, 142, 147, 120, 105, 98, 93, 81, 61, 40, 26, 28, 30, 30, 27, 19, 17, 21, 20, 19, 19, 22, 36, 40, - 35, 20, 7, 1, 10, 18, 27, 22, 6, -4, -2, 3, 6, -2, -13, -14, -10, -2, 3, 2, -1, -5, -10, -19, -32, -42, -55, -60, - -68, -77, -86, -101, -110, -117, -115, -104, -92, -84, -85, -84, -73, -65, -52, -50, -45, -35, -20, -3, 12, 20, 25, - 26, 28, 28, 30, 28, 25, 28, 33, 42, 42, 36, 23, 9, 0, 1, -4, 1, -4, -4, 1, 5, 9, 9, -3, -1, -18, -50, -108, -190, - -272, -340, -408, -446, -537, -643, -777, -894, -920, -853, -697, -461, -251, -60, 58, 103, 129, 139, 155, 170, 173, - 178, 185, 190, 193, 200, 208, 215, 225, 224, 232, 234, 240, 240, 236, 229, 226, 224, 232, 233, 232, 224, 219, 219, - 223, 231, 226, 223, 219, 218, 223, 223, 223, 233, 245, 268, 286, 296, 295, 283, 271, 263, 252, 243, 226, 210, 197, - 186, 171, 152, 133, 117, 114, 110, 107, 96, 80, 63, 48, 40, 38, 34, 28, 15, 2, -7, -11, -14, -18, -29, -37, -44, -50, - -58, -63, -61, -52, -50, -48, -61, -59, -58, -54, -47, -52, -62, -61, -64, -54, -52, -59, -69, -76, -76, -69, -67, - -74, -78, -81, -80, -73, -65, -57, -53, -51, -47, -35, -27, -22, -22, -24, -21, -17, -13, -10, -11, -13, -20, -20, - -12, -2, 7, -1, -12, -16, -13, -2, 2, -4, -5, -2, 9, 19, 19, 14, 11, 13, 19, 21, 20, 18, 19, 19, 19, 16, 15, 13, 14, - 9, 3, -5, -9, -5, -3, -2, -3, -3, 2, 8, 9, 9, 5, 6, 8, 8, 7, 4, 3, 4, 5, 3, 5, 5, 13, 13, 12, 10, 10, 15, 22, 17, - 14, 7, 10, 15, 16, 11, 12, 10, 13, 9, -2, -4, -2, 7, 16, 16, 17, 16, 7, -1, -16, -18, -16, -9, -4, -5, -10, -9, -8, - -3, -4, -10, -19, -20, -16, -9, -9, -23, -40, -48, -43, -33, -19, -21, -26, -31, -33, -19, 0, 17, 24, 9, -17, -47, - -63, -67, -59, -52, -51, -50, -49, -42, -26, -21, -15, -20, -23, -22, -19, -12, -8, 5, 18, 27, 32, 26, 25, 26, 22, - 23, 17, 14, 17, 21, 25, 2, -45, -121, -196, -226, -200, -118, -9, 73, 126, 131, 114, 87, 60, 42, 29, 26, 34, 35, 34, - 25, 12, 9, 7, 3, 2, -8, -11, 2, 23, 38, 41, 23, 9, 10, 13, 16, 8, -8, -17, -23, -26, -25, -21, -15, -10, -13, -13, - -19, -22, -29, -40, -48, -48, -54, -55, -66, -82, -85, -90, -92, -98, -114, -119, -124, -129, -132, -146, -146, -138, - -124, -99, -85, -72, -65, -65, -65, -66, -63, -64, -64, -58, -46, -26, -9, 2, 2, 4, 0, 1, 4, 3, 10, 11, 10, 2, -4, - 0, 10, 18, 20, 6, 2, -9, -7, -3, -3, -2, -7, -12, -5, 5, 24, 36, 31, 25, 6, 3, 7, 12, 17, 11, 0, -6, -9, -8, -7, -5, - -6, -2, -2, -6, -2, 2, 14, 24, 22, 15, 8, 4, 6, 7, 12, 16, 25, 20, 7, -16, -41, -60, -67, -65, -54, -35, -11, 30, - 84, 175, 302, 455, 603, 707, 743, 714, 625, 519, 414, 337, 300, 281, 263, 239, 197, 163, 136, 109, 77, 34, -18, -50, - -66, -74, -79, -92, -107, -117, -127, -129, -135, -139, -141, -155, -159, -167, -171, -169, -174, -175, -178, -191, - -202, -223, -235, -243, -237, -240, -256, -298, -345, -393, -432, -475, -518, -565, -596, -619, -623, -623, -614, - -599, -583, -559, -524, -477, -425, -383, -357, -331, -301, -252, -198, -143, -96, -57, -29, -8, 10, 31, 45, 60, 65, - 70, 74, 76, 79, 82, 79, 75, 62, - }; - -static void slider_x_event_cb(lv_event_t * e) -{ - lv_obj_t * obj = lv_event_get_target(e); - int32_t v = lv_slider_get_value(obj); - lv_chart_set_zoom_x(chart, v); -} - -static void slider_y_event_cb(lv_event_t * e) -{ - lv_obj_t * obj = lv_event_get_target(e); - int32_t v = lv_slider_get_value(obj); - lv_chart_set_zoom_y(chart, v); -} - -/** - * Display 1000 data points with zooming and scrolling. - * See how the chart changes drawing mode (draw only vertical lines) when - * the points get too crowded. - */ -void lv_example_chart_5(void) -{ - /*Create a chart*/ - chart = lv_chart_create(lv_scr_act()); - lv_obj_set_size(chart, 200, 150); - lv_obj_align(chart, LV_ALIGN_CENTER, -30, -30); - lv_chart_set_range(chart, LV_CHART_AXIS_PRIMARY_Y, -1000, 1000); - - /*Do not display points on the data*/ - lv_obj_set_style_size(chart, 0, LV_PART_INDICATOR); - - lv_chart_series_t * ser = lv_chart_add_series(chart, lv_palette_main(LV_PALETTE_RED), LV_CHART_AXIS_PRIMARY_Y); - - uint32_t pcnt = sizeof(ecg_sample) / sizeof(ecg_sample[0]); - lv_chart_set_point_count(chart, pcnt); - lv_chart_set_ext_y_array(chart, ser, (lv_coord_t *)ecg_sample); - - lv_obj_t * slider; - slider = lv_slider_create(lv_scr_act()); - lv_slider_set_range(slider, LV_IMG_ZOOM_NONE, LV_IMG_ZOOM_NONE * 10); - lv_obj_add_event_cb(slider, slider_x_event_cb, LV_EVENT_VALUE_CHANGED, NULL); - lv_obj_set_size(slider, 200, 10); - lv_obj_align_to(slider, chart, LV_ALIGN_OUT_BOTTOM_MID, 0, 20); - - slider = lv_slider_create(lv_scr_act()); - lv_slider_set_range(slider, LV_IMG_ZOOM_NONE, LV_IMG_ZOOM_NONE * 10); - lv_obj_add_event_cb(slider, slider_y_event_cb, LV_EVENT_VALUE_CHANGED, NULL); - lv_obj_set_size(slider, 10, 150); - lv_obj_align_to(slider, chart, LV_ALIGN_OUT_RIGHT_MID, 20, 0); -} - -#endif diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/idf_component.yml b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/idf_component.yml deleted file mode 100644 index ba3fff1..0000000 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/idf_component.yml +++ /dev/null @@ -1,2 +0,0 @@ -description: LVGL - Light and Versatile Graphics Library -url: https://github.com/lvgl/lvgl \ No newline at end of file diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/nxp/lv_gpu_nxp.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/nxp/lv_gpu_nxp.c deleted file mode 100644 index 46da933..0000000 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/nxp/lv_gpu_nxp.c +++ /dev/null @@ -1,418 +0,0 @@ -/** - * @file lv_gpu_nxp.c - * - */ - -/** - * MIT License - * - * Copyright 2022 NXP - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights to - * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of - * the Software, and to permit persons to whom the Software is furnished to do so, - * subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next paragraph) - * shall be included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, - * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A - * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF - * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE - * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -/********************* - * INCLUDES - *********************/ - -#include "lv_gpu_nxp.h" - -#if LV_USE_GPU_NXP_PXP || LV_USE_GPU_NXP_VG_LITE - -/* - * allow to use both PXP and VGLITE - - * both 2D accelerators can be used at the same time: - * thus VGLITE can be used to accelerate widget drawing - * while PXP accelerates Blit & Fill operations. - */ -#if LV_USE_GPU_NXP_PXP - #include "pxp/lv_draw_pxp_blend.h" -#endif -#if LV_USE_GPU_NXP_VG_LITE - #include "vglite/lv_draw_vglite_blend.h" - #include "vglite/lv_draw_vglite_rect.h" - #include "vglite/lv_draw_vglite_arc.h" -#endif - -#if LV_COLOR_DEPTH != 32 - #include "../../core/lv_refr.h" -#endif - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ - -static void lv_draw_nxp_img_decoded(lv_draw_ctx_t * draw_ctx, const lv_draw_img_dsc_t * dsc, - const lv_area_t * coords, const uint8_t * map_p, lv_img_cf_t cf); - -static void lv_draw_nxp_blend(lv_draw_ctx_t * draw_ctx, const lv_draw_sw_blend_dsc_t * dsc); - -static void lv_draw_nxp_rect(lv_draw_ctx_t * draw_ctx, const lv_draw_rect_dsc_t * dsc, const lv_area_t * coords); - -static lv_res_t draw_nxp_bg(lv_draw_ctx_t * draw_ctx, const lv_draw_rect_dsc_t * dsc, const lv_area_t * coords); - -static void lv_draw_nxp_arc(lv_draw_ctx_t * draw_ctx, const lv_draw_arc_dsc_t * dsc, const lv_point_t * center, - uint16_t radius, uint16_t start_angle, uint16_t end_angle); - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -void lv_draw_nxp_ctx_init(lv_disp_drv_t * drv, lv_draw_ctx_t * draw_ctx) -{ - lv_draw_sw_init_ctx(drv, draw_ctx); - - lv_draw_nxp_ctx_t * nxp_draw_ctx = (lv_draw_sw_ctx_t *)draw_ctx; - - nxp_draw_ctx->base_draw.draw_arc = lv_draw_nxp_arc; - nxp_draw_ctx->base_draw.draw_rect = lv_draw_nxp_rect; - nxp_draw_ctx->base_draw.draw_img_decoded = lv_draw_nxp_img_decoded; - nxp_draw_ctx->blend = lv_draw_nxp_blend; - //nxp_draw_ctx->base_draw.wait_for_finish = lv_draw_nxp_wait_cb; -} - -void lv_draw_nxp_ctx_deinit(lv_disp_drv_t * drv, lv_draw_ctx_t * draw_ctx) -{ - lv_draw_sw_deinit_ctx(drv, draw_ctx); -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -/** - * During rendering, LVGL might initializes new draw_ctxs and start drawing into - * a separate buffer (called layer). If the content to be rendered has "holes", - * e.g. rounded corner, LVGL temporarily sets the disp_drv.screen_transp flag. - * It means the renderers should draw into an ARGB buffer. - * With 32 bit color depth it's not a big problem but with 16 bit color depth - * the target pixel format is ARGB8565 which is not supported by the GPU. - * In this case, the NXP callbacks should fallback to SW rendering. - */ -static inline bool need_argb8565_support() -{ -#if LV_COLOR_DEPTH != 32 - lv_disp_t * disp = _lv_refr_get_disp_refreshing(); - - if(disp->driver->screen_transp == 1) - return true; -#endif - - return false; -} - -static void lv_draw_nxp_blend(lv_draw_ctx_t * draw_ctx, const lv_draw_sw_blend_dsc_t * dsc) -{ - lv_area_t blend_area; - - /*Let's get the blend area which is the intersection of the area to fill and the clip area.*/ - if(!_lv_area_intersect(&blend_area, dsc->blend_area, draw_ctx->clip_area)) - return; /*Fully clipped, nothing to do*/ - - /*Make the blend area relative to the buffer*/ - lv_area_move(&blend_area, -draw_ctx->buf_area->x1, -draw_ctx->buf_area->y1); - - bool done = false; - - /*Fill/Blend only non masked, normal blended*/ - if(dsc->mask_buf == NULL && dsc->blend_mode == LV_BLEND_MODE_NORMAL && !need_argb8565_support()) { - lv_color_t * dest_buf = draw_ctx->buf; - lv_coord_t dest_stride = lv_area_get_width(draw_ctx->buf_area); -#if LV_USE_GPU_NXP_VG_LITE - lv_coord_t dest_width = lv_area_get_width(draw_ctx->buf_area); - lv_coord_t dest_height = lv_area_get_height(draw_ctx->buf_area); -#endif - - const lv_color_t * src_buf = dsc->src_buf; - - if(src_buf == NULL) { -#if LV_USE_GPU_NXP_PXP - done = (lv_gpu_nxp_pxp_fill(dest_buf, dest_stride, &blend_area, - dsc->color, dsc->opa) == LV_RES_OK); - if(!done) - PXP_LOG_TRACE("PXP fill failed. Fallback."); - -#endif -#if LV_USE_GPU_NXP_VG_LITE - if(!done) { - done = (lv_gpu_nxp_vglite_fill(dest_buf, dest_width, dest_height, &blend_area, - dsc->color, dsc->opa) == LV_RES_OK); - if(!done) - VG_LITE_LOG_TRACE("VG-Lite fill failed. Fallback."); - } -#endif - } - else { -#if LV_USE_GPU_NXP_PXP - done = (lv_gpu_nxp_pxp_blit(dest_buf, &blend_area, dest_stride, src_buf, dsc->blend_area, - dsc->opa, LV_DISP_ROT_NONE) == LV_RES_OK); - if(!done) - PXP_LOG_TRACE("PXP blit failed. Fallback."); -#endif -#if LV_USE_GPU_NXP_VG_LITE - if(!done) { - lv_gpu_nxp_vglite_blit_info_t blit; - lv_coord_t src_stride = lv_area_get_width(dsc->blend_area); - - blit.src = src_buf; - blit.src_width = lv_area_get_width(dsc->blend_area); - blit.src_height = lv_area_get_height(dsc->blend_area); - blit.src_stride = src_stride * (int32_t)sizeof(lv_color_t); - blit.src_area.x1 = (blend_area.x1 - (dsc->blend_area->x1 - draw_ctx->buf_area->x1)); - blit.src_area.y1 = (blend_area.y1 - (dsc->blend_area->y1 - draw_ctx->buf_area->y1)); - blit.src_area.x2 = blit.src_area.x1 + blit.src_width - 1; - blit.src_area.y2 = blit.src_area.y1 + blit.src_height - 1; - - blit.dst = dest_buf; - blit.dst_width = dest_width; - blit.dst_height = dest_height; - blit.dst_stride = dest_stride * (int32_t)sizeof(lv_color_t); - blit.dst_area.x1 = blend_area.x1; - blit.dst_area.y1 = blend_area.y1; - blit.dst_area.x2 = blend_area.x2; - blit.dst_area.y2 = blend_area.y2; - - blit.opa = dsc->opa; - blit.zoom = LV_IMG_ZOOM_NONE; - blit.angle = 0; - - done = (lv_gpu_nxp_vglite_blit(&blit) == LV_RES_OK); - - if(!done) - VG_LITE_LOG_TRACE("VG-Lite blit failed. Fallback."); - } -#endif - } - } - - if(!done) - lv_draw_sw_blend_basic(draw_ctx, dsc); -} - -static void lv_draw_nxp_img_decoded(lv_draw_ctx_t * draw_ctx, const lv_draw_img_dsc_t * dsc, - const lv_area_t * coords, const uint8_t * map_p, lv_img_cf_t cf) -{ - /*Use the clip area as draw area*/ - lv_area_t draw_area; - lv_area_copy(&draw_area, draw_ctx->clip_area); - bool mask_any = lv_draw_mask_is_any(&draw_area); -#if LV_USE_GPU_NXP_VG_LITE - bool recolor = (dsc->recolor_opa != LV_OPA_TRANSP); -#endif -#if LV_USE_GPU_NXP_PXP - bool scale = (dsc->zoom != LV_IMG_ZOOM_NONE); -#endif - bool done = false; - - lv_area_t blend_area; - /*Let's get the blend area which is the intersection of the area to fill and the clip area.*/ - if(!_lv_area_intersect(&blend_area, coords, draw_ctx->clip_area)) - return; /*Fully clipped, nothing to do*/ - - /*Make the blend area relative to the buffer*/ - lv_area_move(&blend_area, -draw_ctx->buf_area->x1, -draw_ctx->buf_area->y1); - - const lv_color_t * src_buf = (const lv_color_t *)map_p; - if(!src_buf) { - lv_draw_sw_img_decoded(draw_ctx, dsc, coords, map_p, cf); - return; - } - - lv_color_t * dest_buf = draw_ctx->buf; - lv_coord_t dest_stride = lv_area_get_width(draw_ctx->buf_area); - -#if LV_USE_GPU_NXP_PXP - if(!mask_any && !scale && !need_argb8565_support() -#if LV_COLOR_DEPTH!=32 - && !lv_img_cf_has_alpha(cf) -#endif - ) { - done = (lv_gpu_nxp_pxp_blit_transform(dest_buf, &blend_area, dest_stride, src_buf, coords, - dsc, cf) == LV_RES_OK); - if(!done) - PXP_LOG_TRACE("PXP blit transform failed. Fallback."); - } -#endif - -#if LV_USE_GPU_NXP_VG_LITE - if(!done && !mask_any && !need_argb8565_support() && - !lv_img_cf_is_chroma_keyed(cf) && !recolor -#if LV_COLOR_DEPTH!=32 - && !lv_img_cf_has_alpha(cf) -#endif - ) { - lv_gpu_nxp_vglite_blit_info_t blit; - lv_coord_t src_stride = lv_area_get_width(coords); - - blit.src = src_buf; - blit.src_width = lv_area_get_width(coords); - blit.src_height = lv_area_get_height(coords); - blit.src_stride = src_stride * (int32_t)sizeof(lv_color_t); - blit.src_area.x1 = (blend_area.x1 - (coords->x1 - draw_ctx->buf_area->x1)); - blit.src_area.y1 = (blend_area.y1 - (coords->y1 - draw_ctx->buf_area->y1)); - blit.src_area.x2 = blit.src_area.x1 + blit.src_width - 1; - blit.src_area.y2 = blit.src_area.y1 + blit.src_height - 1; - - blit.dst = dest_buf; - blit.dst_width = lv_area_get_width(draw_ctx->buf_area); - blit.dst_height = lv_area_get_height(draw_ctx->buf_area); - blit.dst_stride = dest_stride * (int32_t)sizeof(lv_color_t); - blit.dst_area.x1 = blend_area.x1; - blit.dst_area.y1 = blend_area.y1; - blit.dst_area.x2 = blend_area.x2; - blit.dst_area.y2 = blend_area.y2; - - blit.opa = dsc->opa; - blit.angle = dsc->angle; - blit.pivot = dsc->pivot; - blit.zoom = dsc->zoom; - - done = (lv_gpu_nxp_vglite_blit_transform(&blit) == LV_RES_OK); - - if(!done) - VG_LITE_LOG_TRACE("VG-Lite blit transform failed. Fallback."); - } -#endif - - if(!done) - lv_draw_sw_img_decoded(draw_ctx, dsc, coords, map_p, cf); -} - -static void lv_draw_nxp_rect(lv_draw_ctx_t * draw_ctx, const lv_draw_rect_dsc_t * dsc, const lv_area_t * coords) -{ - bool done = false; - lv_draw_rect_dsc_t nxp_dsc; - - lv_memcpy(&nxp_dsc, dsc, sizeof(nxp_dsc)); -#if LV_DRAW_COMPLEX - /* Draw only the shadow */ - nxp_dsc.bg_opa = 0; - nxp_dsc.bg_img_opa = 0; - nxp_dsc.border_opa = 0; - nxp_dsc.outline_opa = 0; - - lv_draw_sw_rect(draw_ctx, &nxp_dsc, coords); - - /* Draw the background */ - nxp_dsc.shadow_opa = 0; - nxp_dsc.bg_opa = dsc->bg_opa; - done = (draw_nxp_bg(draw_ctx, &nxp_dsc, coords) == LV_RES_OK); -#endif /*LV_DRAW_COMPLEX*/ - - /* Draw the remaining parts */ - nxp_dsc.shadow_opa = 0; - if(done) - nxp_dsc.bg_opa = 0; - nxp_dsc.bg_img_opa = dsc->bg_img_opa; - nxp_dsc.border_opa = dsc->border_opa; - nxp_dsc.outline_opa = dsc->outline_opa; - - lv_draw_sw_rect(draw_ctx, &nxp_dsc, coords); -} - -static lv_res_t draw_nxp_bg(lv_draw_ctx_t * draw_ctx, const lv_draw_rect_dsc_t * dsc, const lv_area_t * coords) -{ - if(dsc->bg_opa <= LV_OPA_MIN) - return LV_RES_INV; - - lv_area_t bg_coords; - lv_area_copy(&bg_coords, coords); - - /*If the border fully covers make the bg area 1px smaller to avoid artifacts on the corners*/ - if(dsc->border_width > 1 && dsc->border_opa >= (lv_opa_t)LV_OPA_MAX && dsc->radius != 0) { - bg_coords.x1 += (dsc->border_side & LV_BORDER_SIDE_LEFT) ? 1 : 0; - bg_coords.y1 += (dsc->border_side & LV_BORDER_SIDE_TOP) ? 1 : 0; - bg_coords.x2 -= (dsc->border_side & LV_BORDER_SIDE_RIGHT) ? 1 : 0; - bg_coords.y2 -= (dsc->border_side & LV_BORDER_SIDE_BOTTOM) ? 1 : 0; - } - - lv_area_t clipped_coords; - if(!_lv_area_intersect(&clipped_coords, &bg_coords, draw_ctx->clip_area)) - return LV_RES_INV; - - lv_grad_dir_t grad_dir = dsc->bg_grad.dir; - lv_color_t bg_color = grad_dir == LV_GRAD_DIR_NONE ? dsc->bg_color : dsc->bg_grad.stops[0].color; - if(bg_color.full == dsc->bg_grad.stops[1].color.full) grad_dir = LV_GRAD_DIR_NONE; - - bool mask_any = lv_draw_mask_is_any(&bg_coords); - - /* - * Most simple case: just a plain rectangle (no mask, no radius, no gradient) - * shall fallback to lv_draw_sw_blend(). - * - * Complex case: gradient or radius but no mask. - */ - if(!mask_any && ((dsc->radius != 0) || (grad_dir != LV_GRAD_DIR_NONE)) && !need_argb8565_support()) { -#if LV_USE_GPU_NXP_VG_LITE - lv_res_t res = lv_gpu_nxp_vglite_draw_bg(draw_ctx, dsc, &bg_coords); - if(res != LV_RES_OK) - VG_LITE_LOG_TRACE("VG-Lite draw bg failed. Fallback."); - - return res; -#endif - } - - return LV_RES_INV; -} - -static void lv_draw_nxp_arc(lv_draw_ctx_t * draw_ctx, const lv_draw_arc_dsc_t * dsc, const lv_point_t * center, - uint16_t radius, uint16_t start_angle, uint16_t end_angle) -{ - bool done = false; - -#if LV_DRAW_COMPLEX - if(dsc->opa <= LV_OPA_MIN) - return; - if(dsc->width == 0) - return; - if(start_angle == end_angle) - return; - -#if LV_USE_GPU_NXP_VG_LITE - if(!need_argb8565_support()) { - done = (lv_gpu_nxp_vglite_draw_arc(draw_ctx, dsc, center, (int32_t)radius, - (int32_t)start_angle, (int32_t)end_angle) == LV_RES_OK); - if(!done) - VG_LITE_LOG_TRACE("VG-Lite draw arc failed. Fallback."); - } -#endif -#endif/*LV_DRAW_COMPLEX*/ - - if(!done) - lv_draw_sw_arc(draw_ctx, dsc, center, radius, start_angle, end_angle); -} - -#endif /*LV_USE_GPU_NXP_PXP || LV_USE_GPU_NXP_VG_LITE*/ diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/nxp/pxp/lv_draw_pxp_blend.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/nxp/pxp/lv_draw_pxp_blend.h deleted file mode 100644 index 43a6440..0000000 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/nxp/pxp/lv_draw_pxp_blend.h +++ /dev/null @@ -1,143 +0,0 @@ -/** - * @file lv_draw_pxp_blend.h - * - */ - -/** - * MIT License - * - * Copyright 2020-2022 NXP - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights to - * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of - * the Software, and to permit persons to whom the Software is furnished to do so, - * subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next paragraph) - * shall be included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, - * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A - * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF - * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE - * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -#ifndef LV_DRAW_PXP_BLEND_H -#define LV_DRAW_PXP_BLEND_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ - -#include "../../../lv_conf_internal.h" - -#if LV_USE_GPU_NXP_PXP -#include "lv_gpu_nxp_pxp.h" -#include "../../sw/lv_draw_sw.h" - -/********************* - * DEFINES - *********************/ - -#ifndef LV_GPU_NXP_PXP_BLIT_SIZE_LIMIT -/** Minimum area (in pixels) for image copy with 100% opacity to be handled by PXP*/ -#define LV_GPU_NXP_PXP_BLIT_SIZE_LIMIT 5000 -#endif - -#ifndef LV_GPU_NXP_PXP_BLIT_OPA_SIZE_LIMIT -/** Minimum area (in pixels) for image copy with transparency to be handled by PXP*/ -#define LV_GPU_NXP_PXP_BLIT_OPA_SIZE_LIMIT 5000 -#endif - -#ifndef LV_GPU_NXP_PXP_BUFF_SYNC_BLIT_SIZE_LIMIT -/** Minimum invalidated area (in pixels) to be synchronized by PXP during buffer sync */ -#define LV_GPU_NXP_PXP_BUFF_SYNC_BLIT_SIZE_LIMIT 5000 -#endif - -#ifndef LV_GPU_NXP_PXP_FILL_SIZE_LIMIT -/** Minimum area (in pixels) to be filled by PXP with 100% opacity*/ -#define LV_GPU_NXP_PXP_FILL_SIZE_LIMIT 5000 -#endif - -#ifndef LV_GPU_NXP_PXP_FILL_OPA_SIZE_LIMIT -/** Minimum area (in pixels) to be filled by PXP with transparency*/ -#define LV_GPU_NXP_PXP_FILL_OPA_SIZE_LIMIT 5000 -#endif - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Fill area, with optional opacity. - * - * @param[in/out] dest_buf destination buffer - * @param[in] dest_stride width (stride) of destination buffer in pixels - * @param[in] fill_area area to fill - * @param[in] color color - * @param[in] opa transparency of the color - * @retval LV_RES_OK Fill completed - * @retval LV_RES_INV Error occurred (\see LV_GPU_NXP_PXP_LOG_ERRORS) - */ -lv_res_t lv_gpu_nxp_pxp_fill(lv_color_t * dest_buf, lv_coord_t dest_stride, const lv_area_t * fill_area, - lv_color_t color, lv_opa_t opa); - -/** - * BLock Image Transfer - copy rectangular image from src_buf to dst_buf with effects. - * By default, image is copied directly, with optional opacity. This function can also - * rotate the display output buffer to a specified angle (90x step). - * - * @param[in/out] dest_buf destination buffer - * @param[in] dest_area destination area - * @param[in] dest_stride width (stride) of destination buffer in pixels - * @param[in] src_buf source buffer - * @param[in] src_area source area with absolute coordinates to draw on destination buffer - * @param[in] opa opacity of the result - * @param[in] angle display rotation angle (90x) - * @retval LV_RES_OK Fill completed - * @retval LV_RES_INV Error occurred (\see LV_GPU_NXP_PXP_LOG_ERRORS) - */ -lv_res_t lv_gpu_nxp_pxp_blit(lv_color_t * dest_buf, const lv_area_t * dest_area, lv_coord_t dest_stride, - const lv_color_t * src_buf, const lv_area_t * src_area, lv_opa_t opa, lv_disp_rot_t angle); - -/** - * BLock Image Transfer - copy rectangular image from src_buf to dst_buf with transformation. - * - * - * @param[in/out] dest_buf destination buffer - * @param[in] dest_area destination area - * @param[in] dest_stride width (stride) of destination buffer in pixels - * @param[in] src_buf source buffer - * @param[in] src_area source area with absolute coordinates to draw on destination buffer - * @param[in] dsc image descriptor - * @param[in] cf color format - * @retval LV_RES_OK Fill completed - * @retval LV_RES_INV Error occurred (\see LV_GPU_NXP_PXP_LOG_ERRORS) - */ -lv_res_t lv_gpu_nxp_pxp_blit_transform(lv_color_t * dest_buf, const lv_area_t * dest_area, lv_coord_t dest_stride, - const lv_color_t * src_buf, const lv_area_t * src_area, const lv_draw_img_dsc_t * dsc, lv_img_cf_t cf); - -/********************** - * MACROS - **********************/ - -#endif /*LV_USE_GPU_NXP_PXP*/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_DRAW_PXP_BLEND_H*/ diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/nxp/vglite/lv_draw_vglite_blend.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/nxp/vglite/lv_draw_vglite_blend.c deleted file mode 100644 index b59b143..0000000 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/nxp/vglite/lv_draw_vglite_blend.c +++ /dev/null @@ -1,618 +0,0 @@ -/** - * @file lv_draw_vglite_blend.c - * - */ - -/** - * MIT License - * - * Copyright 2020-2022 NXP - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights to - * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of - * the Software, and to permit persons to whom the Software is furnished to do so, - * subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next paragraph) - * shall be included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, - * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A - * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF - * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE - * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -/********************* - * INCLUDES - *********************/ - -#include "lv_draw_vglite_blend.h" - -#if LV_USE_GPU_NXP_VG_LITE - -/********************* - * DEFINES - *********************/ - -/* Enable BLIT quality degradation workaround for RT595, recommended for screen's dimension > 352 pixels */ -#define RT595_BLIT_WRKRND_ENABLED 1 - -/* Internal compound symbol */ -#if (defined(CPU_MIMXRT595SFFOB) || defined(CPU_MIMXRT595SFFOB_cm33) || \ - defined(CPU_MIMXRT595SFFOC) || defined(CPU_MIMXRT595SFFOC_cm33)) && \ - RT595_BLIT_WRKRND_ENABLED -#define VG_LITE_BLIT_SPLIT_ENABLED 1 -#else -#define VG_LITE_BLIT_SPLIT_ENABLED 0 -#endif - -/** - * BLIT split threshold - BLITs with width or height higher than this value will be done - * in multiple steps. Value must be 16-aligned. Don't change. - */ -#define LV_GPU_NXP_VG_LITE_BLIT_SPLIT_THR 352 - - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ - -/** - * BLock Image Transfer - single direct BLIT. - * - * @param[in] blit Description of the transfer - * @retval LV_RES_OK Transfer complete - * @retval LV_RES_INV Error occurred (\see LV_GPU_NXP_VG_LITE_LOG_ERRORS) - */ -static lv_res_t _lv_gpu_nxp_vglite_blit_single(lv_gpu_nxp_vglite_blit_info_t * blit); - -#if VG_LITE_BLIT_SPLIT_ENABLED - - /** - * Move buffer pointer as close as possible to area, but with respect to alignment requirements. X-axis only. - * - * @param[in,out] area Area to be updated - * @param[in,out] buf Pointer to be updated - */ - static void _align_x(lv_area_t * area, lv_color_t ** buf); - - /** - * Move buffer pointer to the area start and update variables, Y-axis only. - * - * @param[in,out] area Area to be updated - * @param[in,out] buf Pointer to be updated - * @param[in] stridePx Buffer stride in pixels - */ - static void _align_y(lv_area_t * area, lv_color_t ** buf, uint32_t stridePx); - - /** - * Software BLIT as a fall-back scenario. - * - * @param[in] blit BLIT configuration - */ - static void _sw_blit(lv_gpu_nxp_vglite_blit_info_t * blit); - - /** - * Verify BLIT structure - widths, stride, pointer alignment - * - * @param[in] blit BLIT configuration - * @retval LV_RES_OK - * @retval LV_RES_INV Error occurred (\see LV_GPU_NXP_VG_LITE_LOG_ERRORS) - */ - static lv_res_t _lv_gpu_nxp_vglite_check_blit(lv_gpu_nxp_vglite_blit_info_t * blit); - - /** - * BLock Image Transfer - split BLIT. - * - * @param[in] blit BLIT configuration - * @retval LV_RES_OK Transfer complete - * @retval LV_RES_INV Error occurred (\see LV_GPU_NXP_VG_LITE_LOG_ERRORS) - */ - static lv_res_t _lv_gpu_nxp_vglite_blit_split(lv_gpu_nxp_vglite_blit_info_t * blit); -#endif - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -lv_res_t lv_gpu_nxp_vglite_fill(lv_color_t * dest_buf, lv_coord_t dest_width, lv_coord_t dest_height, - const lv_area_t * fill_area, lv_color_t color, lv_opa_t opa) -{ - uint32_t area_size = lv_area_get_size(fill_area); - lv_coord_t area_w = lv_area_get_width(fill_area); - lv_coord_t area_h = lv_area_get_height(fill_area); - - if(opa >= (lv_opa_t)LV_OPA_MAX) { - if(area_size < LV_GPU_NXP_VG_LITE_FILL_SIZE_LIMIT) - VG_LITE_RETURN_INV("Area size %d smaller than limit %d.", area_size, LV_GPU_NXP_VG_LITE_FILL_SIZE_LIMIT); - } - else { - if(area_size < LV_GPU_NXP_VG_LITE_FILL_OPA_SIZE_LIMIT) - VG_LITE_RETURN_INV("Area size %d smaller than limit %d.", area_size, LV_GPU_NXP_VG_LITE_FILL_OPA_SIZE_LIMIT); - } - - vg_lite_buffer_t vgbuf; - vg_lite_rectangle_t rect; - vg_lite_error_t err = VG_LITE_SUCCESS; - lv_color32_t col32 = {.full = lv_color_to32(color)}; /*Convert color to RGBA8888*/ - vg_lite_color_t vgcol; /* vglite takes ABGR */ - - if(lv_vglite_init_buf(&vgbuf, (uint32_t)dest_width, (uint32_t)dest_height, (uint32_t)dest_width * sizeof(lv_color_t), - (const lv_color_t *)dest_buf, false) != LV_RES_OK) - VG_LITE_RETURN_INV("Init buffer failed."); - - if(opa >= (lv_opa_t)LV_OPA_MAX) { /*Opaque fill*/ - rect.x = fill_area->x1; - rect.y = fill_area->y1; - rect.width = area_w; - rect.height = area_h; - - /*Clean & invalidate cache*/ - lv_vglite_invalidate_cache(); - -#if LV_COLOR_DEPTH==16 - vgcol = col32.full; -#else /*LV_COLOR_DEPTH==32*/ - vgcol = ((uint32_t)col32.ch.alpha << 24) | ((uint32_t)col32.ch.blue << 16) | ((uint32_t)col32.ch.green << 8) | - (uint32_t)col32.ch.red; -#endif - - err = vg_lite_clear(&vgbuf, &rect, vgcol); - VG_LITE_ERR_RETURN_INV(err, "Clear failed."); - - err = vg_lite_finish(); - VG_LITE_ERR_RETURN_INV(err, "Finish failed."); - } - else { /*fill with transparency*/ - - vg_lite_path_t path; - int32_t path_data[] = { /*VG rectangular path*/ - VLC_OP_MOVE, fill_area->x1, fill_area->y1, - VLC_OP_LINE, fill_area->x2 + 1, fill_area->y1, - VLC_OP_LINE, fill_area->x2 + 1, fill_area->y2 + 1, - VLC_OP_LINE, fill_area->x1, fill_area->y2 + 1, - VLC_OP_LINE, fill_area->x1, fill_area->y1, - VLC_OP_END - }; - - err = vg_lite_init_path(&path, VG_LITE_S32, VG_LITE_LOW, sizeof(path_data), path_data, - (vg_lite_float_t) fill_area->x1, (vg_lite_float_t) fill_area->y1, - ((vg_lite_float_t) fill_area->x2) + 1.0f, ((vg_lite_float_t) fill_area->y2) + 1.0f); - VG_LITE_ERR_RETURN_INV(err, "Init path failed."); - - /* Only pre-multiply color if hardware pre-multiplication is not present */ - if(!vg_lite_query_feature(gcFEATURE_BIT_VG_PE_PREMULTIPLY)) { - col32.ch.red = (uint8_t)(((uint16_t)col32.ch.red * opa) >> 8); - col32.ch.green = (uint8_t)(((uint16_t)col32.ch.green * opa) >> 8); - col32.ch.blue = (uint8_t)(((uint16_t)col32.ch.blue * opa) >> 8); - } - col32.ch.alpha = opa; - -#if LV_COLOR_DEPTH==16 - vgcol = col32.full; -#else /*LV_COLOR_DEPTH==32*/ - vgcol = ((uint32_t)col32.ch.alpha << 24) | ((uint32_t)col32.ch.blue << 16) | ((uint32_t)col32.ch.green << 8) | - (uint32_t)col32.ch.red; -#endif - - /*Clean & invalidate cache*/ - lv_vglite_invalidate_cache(); - - vg_lite_matrix_t matrix; - vg_lite_identity(&matrix); - - /*Draw rectangle*/ - err = vg_lite_draw(&vgbuf, &path, VG_LITE_FILL_EVEN_ODD, &matrix, VG_LITE_BLEND_SRC_OVER, vgcol); - VG_LITE_ERR_RETURN_INV(err, "Draw rectangle failed."); - - err = vg_lite_finish(); - VG_LITE_ERR_RETURN_INV(err, "Finish failed."); - - err = vg_lite_clear_path(&path); - VG_LITE_ERR_RETURN_INV(err, "Clear path failed."); - } - - return LV_RES_OK; -} - -lv_res_t lv_gpu_nxp_vglite_blit(lv_gpu_nxp_vglite_blit_info_t * blit) -{ - uint32_t dest_size = lv_area_get_size(&blit->dst_area); - - if(blit->opa >= (lv_opa_t)LV_OPA_MAX) { - if(dest_size < LV_GPU_NXP_VG_LITE_BLIT_SIZE_LIMIT) - VG_LITE_RETURN_INV("Area size %d smaller than limit %d.", dest_size, LV_GPU_NXP_VG_LITE_BLIT_SIZE_LIMIT); - } - else { - if(dest_size < LV_GPU_NXP_VG_LITE_BLIT_OPA_SIZE_LIMIT) - VG_LITE_RETURN_INV("Area size %d smaller than limit %d.", dest_size, LV_GPU_NXP_VG_LITE_BLIT_OPA_SIZE_LIMIT); - } - -#if VG_LITE_BLIT_SPLIT_ENABLED - return _lv_gpu_nxp_vglite_blit_split(blit); -#endif /* non RT595 */ - - /* Just pass down */ - return _lv_gpu_nxp_vglite_blit_single(blit); -} - -lv_res_t lv_gpu_nxp_vglite_blit_transform(lv_gpu_nxp_vglite_blit_info_t * blit) -{ - uint32_t dest_size = lv_area_get_size(&blit->dst_area); - - if(blit->opa >= (lv_opa_t)LV_OPA_MAX) { - if(dest_size < LV_GPU_NXP_VG_LITE_BLIT_SIZE_LIMIT) - VG_LITE_RETURN_INV("Area size %d smaller than limit %d.", dest_size, LV_GPU_NXP_VG_LITE_BLIT_SIZE_LIMIT); - } - else { - if(dest_size < LV_GPU_NXP_VG_LITE_BLIT_OPA_SIZE_LIMIT) - VG_LITE_RETURN_INV("Area size %d smaller than limit %d.", dest_size, LV_GPU_NXP_VG_LITE_BLIT_OPA_SIZE_LIMIT); - } - - return _lv_gpu_nxp_vglite_blit_single(blit); -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -#if VG_LITE_BLIT_SPLIT_ENABLED -static lv_res_t _lv_gpu_nxp_vglite_blit_split(lv_gpu_nxp_vglite_blit_info_t * blit) -{ - lv_res_t rv = LV_RES_INV; - - if(_lv_gpu_nxp_vglite_check_blit(blit) != LV_RES_OK) { - PRINT_BLT("Blit check failed\n"); - return LV_RES_INV; - } - - PRINT_BLT("BLIT from: " - "Area: %03d,%03d - %03d,%03d " - "Addr: %d\n\n", - blit->src_area.x1, blit->src_area.y1, - blit->src_area.x2, blit->src_area.y2, - (uintptr_t) blit->src); - - PRINT_BLT("BLIT to: " - "Area: %03d,%03d - %03d,%03d " - "Addr: %d\n\n", - blit->dst_area.x1, blit->dst_area.y1, - blit->dst_area.x2, blit->dst_area.y2, - (uintptr_t) blit->src); - - /* Stage 1: Move starting pointers as close as possible to [x1, y1], so coordinates are as small as possible. */ - _align_x(&blit->src_area, (lv_color_t **)&blit->src); - _align_y(&blit->src_area, (lv_color_t **)&blit->src, blit->src_stride / sizeof(lv_color_t)); - _align_x(&blit->dst_area, (lv_color_t **)&blit->dst); - _align_y(&blit->dst_area, (lv_color_t **)&blit->dst, blit->dst_stride / sizeof(lv_color_t)); - - /* Stage 2: If we're in limit, do a single BLIT */ - if((blit->src_area.x2 < LV_GPU_NXP_VG_LITE_BLIT_SPLIT_THR) && - (blit->src_area.y2 < LV_GPU_NXP_VG_LITE_BLIT_SPLIT_THR)) { - PRINT_BLT("Simple blit!\n"); - return _lv_gpu_nxp_vglite_blit_single(blit); - }; - - /* Stage 3: Split the BLIT into multiple tiles */ - PRINT_BLT("Split blit!\n"); - - PRINT_BLT("Blit " - "([%03d,%03d], [%03d,%03d]) -> " - "([%03d,%03d], [%03d,%03d]) | " - "([%03dx%03d] -> [%03dx%03d]) | " - "A:(%d -> %d)\n", - blit->src_area.x1, blit->src_area.y1, blit->src_area.x2, blit->src_area.y2, - blit->dst_area.x1, blit->dst_area.y1, blit->dst_area.x2, blit->dst_area.y2, - lv_area_get_width(&blit->src_area), lv_area_get_height(&blit->src_area), - lv_area_get_width(&blit->dst_area), lv_area_get_height(&blit->dst_area), - (uintptr_t) blit->src, (uintptr_t) blit->dst); - - - lv_coord_t totalWidth = lv_area_get_width(&blit->src_area); - lv_coord_t totalHeight = lv_area_get_height(&blit->src_area); - - lv_gpu_nxp_vglite_blit_info_t tileBlit; - - /* Number of tiles needed */ - int totalTilesX = (blit->src_area.x1 + totalWidth + LV_GPU_NXP_VG_LITE_BLIT_SPLIT_THR - 1) / - LV_GPU_NXP_VG_LITE_BLIT_SPLIT_THR; - int totalTilesY = (blit->src_area.y1 + totalHeight + LV_GPU_NXP_VG_LITE_BLIT_SPLIT_THR - 1) / - LV_GPU_NXP_VG_LITE_BLIT_SPLIT_THR; - - /* src and dst buffer shift against each other. Src buffer real data [0,0] may start actually at [3,0] in buffer, as - * the buffer pointer has to be aligned, while dst buffer real data [0,0] may start at [1,0] in buffer. alignment may be - * different */ - int shiftSrcX = (blit->src_area.x1 > blit->dst_area.x1) ? (blit->src_area.x1 - blit->dst_area.x1) : 0; - int shiftDstX = (blit->src_area.x1 < blit->dst_area.x1) ? (blit->dst_area.x1 - blit->src_area.x1) : 0; - - PRINT_BLT("\n"); - PRINT_BLT("Align shift: src: %d, dst: %d\n", shiftSrcX, shiftDstX); - - tileBlit = *blit; - - for(int tileY = 0; tileY < totalTilesY; tileY++) { - - tileBlit.src_area.y1 = 0; /* no vertical alignment, always start from 0 */ - tileBlit.src_area.y2 = totalHeight - tileY * LV_GPU_NXP_VG_LITE_BLIT_SPLIT_THR - 1; - if(tileBlit.src_area.y2 >= LV_GPU_NXP_VG_LITE_BLIT_SPLIT_THR) { - tileBlit.src_area.y2 = LV_GPU_NXP_VG_LITE_BLIT_SPLIT_THR - 1; /* Should never happen */ - } - tileBlit.src = blit->src + tileY * LV_GPU_NXP_VG_LITE_BLIT_SPLIT_THR * blit->src_stride / sizeof( - lv_color_t); /* stride in px! */ - - tileBlit.dst_area.y1 = tileBlit.src_area.y1; /* y has no alignment, always in sync with src */ - tileBlit.dst_area.y2 = tileBlit.src_area.y2; - - tileBlit.dst = blit->dst + tileY * LV_GPU_NXP_VG_LITE_BLIT_SPLIT_THR * blit->dst_stride / sizeof( - lv_color_t); /* stride in px! */ - - for(int tileX = 0; tileX < totalTilesX; tileX++) { - - if(tileX == 0) { - /* 1st tile is special - there may be a gap between buffer start pointer - * and area.x1 value, as the pointer has to be aligned. - * tileBlit.src pointer - keep init value from Y-loop. - * Also, 1st tile start is not shifted! shift is applied from 2nd tile */ - tileBlit.src_area.x1 = blit->src_area.x1; - tileBlit.dst_area.x1 = blit->dst_area.x1; - } - else { - /* subsequent tiles always starts from 0, but shifted*/ - tileBlit.src_area.x1 = 0 + shiftSrcX; - tileBlit.dst_area.x1 = 0 + shiftDstX; - /* and advance start pointer + 1 tile size */ - tileBlit.src += LV_GPU_NXP_VG_LITE_BLIT_SPLIT_THR; - tileBlit.dst += LV_GPU_NXP_VG_LITE_BLIT_SPLIT_THR; - } - - /* Clip tile end coordinates */ - tileBlit.src_area.x2 = totalWidth + blit->src_area.x1 - tileX * LV_GPU_NXP_VG_LITE_BLIT_SPLIT_THR - 1; - if(tileBlit.src_area.x2 >= LV_GPU_NXP_VG_LITE_BLIT_SPLIT_THR) { - tileBlit.src_area.x2 = LV_GPU_NXP_VG_LITE_BLIT_SPLIT_THR - 1; - } - - tileBlit.dst_area.x2 = totalWidth + blit->dst_area.x1 - tileX * LV_GPU_NXP_VG_LITE_BLIT_SPLIT_THR - 1; - if(tileBlit.dst_area.x2 >= LV_GPU_NXP_VG_LITE_BLIT_SPLIT_THR) { - tileBlit.dst_area.x2 = LV_GPU_NXP_VG_LITE_BLIT_SPLIT_THR - 1; - } - - if(tileX < (totalTilesX - 1)) { - /* And adjust end coords if shifted, but not for last tile! */ - tileBlit.src_area.x2 += shiftSrcX; - tileBlit.dst_area.x2 += shiftDstX; - } - - rv = _lv_gpu_nxp_vglite_blit_single(&tileBlit); - -#if BLIT_DBG_AREAS - lv_vglite_dbg_draw_rectangle((lv_color_t *) tileBlit.dst, tileBlit.dst_width, tileBlit.dst_height, &tileBlit.dst_area, - LV_COLOR_RED); - lv_vglite_dbg_draw_rectangle((lv_color_t *) tileBlit.src, tileBlit.src_width, tileBlit.src_height, &tileBlit.src_area, - LV_COLOR_GREEN); -#endif - - PRINT_BLT("Tile [%d, %d]: " - "([%d,%d], [%d,%d]) -> " - "([%d,%d], [%d,%d]) | " - "([%dx%d] -> [%dx%d]) | " - "A:(0x%8X -> 0x%8X) %s\n", - tileX, tileY, - tileBlit.src_area.x1, tileBlit.src_area.y1, tileBlit.src_area.x2, tileBlit.src_area.y2, - tileBlit.dst_area.x1, tileBlit.dst_area.y1, tileBlit.dst_area.x2, tileBlit.dst_area.y2, - lv_area_get_width(&tileBlit.src_area), lv_area_get_height(&tileBlit.src_area), - lv_area_get_width(&tileBlit.dst_area), lv_area_get_height(&tileBlit.dst_area), - (uintptr_t) tileBlit.src, (uintptr_t) tileBlit.dst, - rv == LV_RES_OK ? "OK!" : "!!! FAILED !!!"); - - if(rv != LV_RES_OK) { /* if anything goes wrong... */ -#if LV_GPU_NXP_VG_LITE_LOG_ERRORS - LV_LOG_ERROR("Split blit failed. Trying SW blit instead."); -#endif - _sw_blit(&tileBlit); - rv = LV_RES_OK; /* Don't report error, as SW BLIT was performed */ - } - - } - PRINT_BLT(" \n"); - } - - return rv; /* should never fail */ -} -#endif /* VG_LITE_BLIT_SPLIT_ENABLED */ - -static lv_res_t _lv_gpu_nxp_vglite_blit_single(lv_gpu_nxp_vglite_blit_info_t * blit) -{ - vg_lite_buffer_t src_vgbuf, dst_vgbuf; - vg_lite_error_t err = VG_LITE_SUCCESS; - uint32_t rect[4]; - vg_lite_float_t scale = 1.0; - - if(blit == NULL) { - /*Wrong parameter*/ - return LV_RES_INV; - } - - if(blit->opa < (lv_opa_t) LV_OPA_MIN) { - return LV_RES_OK; /*Nothing to BLIT*/ - } - - /*Wrap src/dst buffer into VG-Lite buffer*/ - if(lv_vglite_init_buf(&src_vgbuf, (uint32_t)blit->src_width, (uint32_t)blit->src_height, (uint32_t)blit->src_stride, - blit->src, true) != LV_RES_OK) - VG_LITE_RETURN_INV("Init buffer failed."); - - if(lv_vglite_init_buf(&dst_vgbuf, (uint32_t)blit->dst_width, (uint32_t)blit->dst_height, (uint32_t)blit->dst_stride, - blit->dst, false) != LV_RES_OK) - VG_LITE_RETURN_INV("Init buffer failed."); - - rect[0] = (uint32_t)blit->src_area.x1; /* start x */ - rect[1] = (uint32_t)blit->src_area.y1; /* start y */ - rect[2] = (uint32_t)blit->src_area.x2 - (uint32_t)blit->src_area.x1 + 1U; /* width */ - rect[3] = (uint32_t)blit->src_area.y2 - (uint32_t)blit->src_area.y1 + 1U; /* height */ - - vg_lite_matrix_t matrix; - vg_lite_identity(&matrix); - vg_lite_translate((vg_lite_float_t)blit->dst_area.x1, (vg_lite_float_t)blit->dst_area.y1, &matrix); - - if((blit->angle != 0) || (blit->zoom != LV_IMG_ZOOM_NONE)) { - vg_lite_translate(blit->pivot.x, blit->pivot.y, &matrix); - vg_lite_rotate(blit->angle / 10.0f, &matrix); /* angle is 1/10 degree */ - scale = 1.0f * blit->zoom / LV_IMG_ZOOM_NONE; - vg_lite_scale(scale, scale, &matrix); - vg_lite_translate(0.0f - blit->pivot.x, 0.0f - blit->pivot.y, &matrix); - } - - /*Clean & invalidate cache*/ - lv_vglite_invalidate_cache(); - - uint32_t color; - vg_lite_blend_t blend; - if(blit->opa >= (lv_opa_t)LV_OPA_MAX) { - color = 0xFFFFFFFFU; - blend = VG_LITE_BLEND_SRC_OVER; - src_vgbuf.transparency_mode = VG_LITE_IMAGE_TRANSPARENT; - } - else { - uint32_t opa = (uint32_t)blit->opa; - if(vg_lite_query_feature(gcFEATURE_BIT_VG_PE_PREMULTIPLY)) { - color = (opa << 24) | 0x00FFFFFFU; - } - else { - color = (opa << 24) | (opa << 16) | (opa << 8) | opa; - } - blend = VG_LITE_BLEND_SRC_OVER; - src_vgbuf.image_mode = VG_LITE_MULTIPLY_IMAGE_MODE; - src_vgbuf.transparency_mode = VG_LITE_IMAGE_TRANSPARENT; - } - - err = vg_lite_blit_rect(&dst_vgbuf, &src_vgbuf, rect, &matrix, blend, color, VG_LITE_FILTER_POINT); - VG_LITE_ERR_RETURN_INV(err, "Blit rectangle failed."); - - err = vg_lite_finish(); - VG_LITE_ERR_RETURN_INV(err, "Finish failed."); - - return LV_RES_OK; -} - -#if VG_LITE_BLIT_SPLIT_ENABLED - -static void _sw_blit(lv_gpu_nxp_vglite_blit_info_t * blit) -{ - int x, y; - - lv_coord_t w = lv_area_get_width(&blit->src_area); - lv_coord_t h = lv_area_get_height(&blit->src_area); - - int32_t srcStridePx = blit->src_stride / (int32_t)sizeof(lv_color_t); - int32_t dstStridePx = blit->dst_stride / (int32_t)sizeof(lv_color_t); - - lv_color_t * src = (lv_color_t *)blit->src + blit->src_area.y1 * srcStridePx + blit->src_area.x1; - lv_color_t * dst = (lv_color_t *)blit->dst + blit->dst_area.y1 * dstStridePx + blit->dst_area.x1; - - if(blit->opa >= (lv_opa_t)LV_OPA_MAX) { - /* simple copy */ - for(y = 0; y < h; y++) { - lv_memcpy(dst, src, (uint32_t)w * sizeof(lv_color_t)); - src += srcStridePx; - dst += dstStridePx; - } - } - else if(blit->opa >= LV_OPA_MIN) { - /* alpha blending */ - for(y = 0; y < h; y++) { - for(x = 0; x < w; x++) { - dst[x] = lv_color_mix(src[x], dst[x], blit->opa); - } - src += srcStridePx; - dst += dstStridePx; - } - } -} - -static lv_res_t _lv_gpu_nxp_vglite_check_blit(lv_gpu_nxp_vglite_blit_info_t * blit) -{ - - /* Test for minimal width */ - if(lv_area_get_width(&blit->src_area) < (lv_coord_t)LV_GPU_NXP_VG_LITE_STRIDE_ALIGN_PX) - VG_LITE_RETURN_INV("Src area width (%d) is smaller than required (%d).", lv_area_get_width(&blit->src_area), - LV_GPU_NXP_VG_LITE_STRIDE_ALIGN_PX); - - /* Test for minimal width */ - if(lv_area_get_width(&blit->dst_area) < (lv_coord_t)LV_GPU_NXP_VG_LITE_STRIDE_ALIGN_PX) - VG_LITE_RETURN_INV("Dest area width (%d) is smaller than required (%d).", lv_area_get_width(&blit->dst_area), - LV_GPU_NXP_VG_LITE_STRIDE_ALIGN_PX); - - /* Test for pointer alignment */ - if((((uintptr_t) blit->src) % LV_ATTRIBUTE_MEM_ALIGN_SIZE) != 0x0) - VG_LITE_RETURN_INV("Src buffer ptr (0x%X) not aligned to %d.", (size_t) blit->src, LV_ATTRIBUTE_MEM_ALIGN_SIZE); - - /* No alignment requirement for destination pixel buffer when using mode VG_LITE_LINEAR */ - - /* Test for stride alignment */ - if((blit->src_stride % (LV_GPU_NXP_VG_LITE_STRIDE_ALIGN_PX * LV_COLOR_DEPTH / 8)) != 0x0) - VG_LITE_RETURN_INV("Src buffer stride (%d px) not aligned to %d px.", blit->src_stride, - LV_GPU_NXP_VG_LITE_STRIDE_ALIGN_PX); - - /* Test for stride alignment */ - if((blit->dst_stride % (LV_GPU_NXP_VG_LITE_STRIDE_ALIGN_PX * LV_COLOR_DEPTH / 8)) != 0x0) - VG_LITE_RETURN_INV("Dest buffer stride (%d px) not aligned to %d px.", blit->dst_stride, - LV_GPU_NXP_VG_LITE_STRIDE_ALIGN_PX); - - if((lv_area_get_width(&blit->src_area) != lv_area_get_width(&blit->dst_area)) || - (lv_area_get_height(&blit->src_area) != lv_area_get_height(&blit->dst_area))) - VG_LITE_RETURN_INV("Src and dest buffer areas are not equal."); - - return LV_RES_OK; -} - -static void _align_x(lv_area_t * area, lv_color_t ** buf) -{ - - int alignedAreaStartPx = area->x1 - (area->x1 % (LV_ATTRIBUTE_MEM_ALIGN_SIZE * 8 / LV_COLOR_DEPTH)); - VG_LITE_COND_STOP(alignedAreaStartPx < 0, "Negative X alignment."); - - area->x1 -= alignedAreaStartPx; - area->x2 -= alignedAreaStartPx; - *buf += alignedAreaStartPx; -} - -static void _align_y(lv_area_t * area, lv_color_t ** buf, uint32_t stridePx) -{ - int LineToAlignMem; - int alignedAreaStartPy; - /* find how many lines of pixels will respect memory alignment requirement */ - if(stridePx % (uint32_t)LV_ATTRIBUTE_MEM_ALIGN_SIZE == 0U) { - alignedAreaStartPy = area->y1; - } - else { - LineToAlignMem = LV_ATTRIBUTE_MEM_ALIGN_SIZE / (sizeof(lv_color_t) * LV_GPU_NXP_VG_LITE_STRIDE_ALIGN_PX); - VG_LITE_COND_STOP(LV_ATTRIBUTE_MEM_ALIGN_SIZE % (sizeof(lv_color_t) * LV_GPU_NXP_VG_LITE_STRIDE_ALIGN_PX), - "Complex case: need gcd function."); - alignedAreaStartPy = area->y1 - (area->y1 % LineToAlignMem); - VG_LITE_COND_STOP(alignedAreaStartPy < 0, "Negative Y alignment."); - } - - area->y1 -= alignedAreaStartPy; - area->y2 -= alignedAreaStartPy; - *buf += (uint32_t)alignedAreaStartPy * stridePx; -} -#endif /*VG_LITE_BLIT_SPLIT_ENABLED*/ - -#endif /*LV_USE_GPU_NXP_VG_LITE*/ diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/nxp/vglite/lv_draw_vglite_blend.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/nxp/vglite/lv_draw_vglite_blend.h deleted file mode 100644 index bc448c6..0000000 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/nxp/vglite/lv_draw_vglite_blend.h +++ /dev/null @@ -1,149 +0,0 @@ -/** - * @file lv_draw_vglite_blend.h - * - */ - -/** - * MIT License - * - * Copyright 2020-2022 NXP - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights to - * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of - * the Software, and to permit persons to whom the Software is furnished to do so, - * subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next paragraph) - * shall be included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, - * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A - * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF - * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE - * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -#ifndef LV_DRAW_VGLITE_BLEND_H -#define LV_DRAW_VGLITE_BLEND_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ - -#include "../../../lv_conf_internal.h" - -#if LV_USE_GPU_NXP_VG_LITE -#include "lv_gpu_nxp_vglite.h" - -/********************* - * DEFINES - *********************/ - -#ifndef LV_GPU_NXP_VG_LITE_FILL_SIZE_LIMIT -/** Minimum area (in pixels) to be filled by VG-Lite with 100% opacity*/ -#define LV_GPU_NXP_VG_LITE_FILL_SIZE_LIMIT 5000 -#endif - -#ifndef LV_GPU_NXP_VG_LITE_FILL_OPA_SIZE_LIMIT -/** Minimum area (in pixels) to be filled by VG-Lite with transparency*/ -#define LV_GPU_NXP_VG_LITE_FILL_OPA_SIZE_LIMIT 5000 -#endif - -#ifndef LV_GPU_NXP_VG_LITE_BLIT_SIZE_LIMIT -/** Minimum area (in pixels) for image copy with 100% opacity to be handled by VG-Lite*/ -#define LV_GPU_NXP_VG_LITE_BLIT_SIZE_LIMIT 5000 -#endif - -#ifndef LV_GPU_NXP_VG_LITE_BUFF_SYNC_BLIT_SIZE_LIMIT -/** Minimum invalidated area (in pixels) to be synchronized by VG-Lite during buffer sync */ -#define LV_GPU_NXP_VG_LITE_BUFF_SYNC_BLIT_SIZE_LIMIT 5000 -#endif - -#ifndef LV_GPU_NXP_VG_LITE_BLIT_OPA_SIZE_LIMIT -/** Minimum area (in pixels) for image copy with transparency to be handled by VG-Lite*/ -#define LV_GPU_NXP_VG_LITE_BLIT_OPA_SIZE_LIMIT 5000 -#endif - -/********************** - * TYPEDEFS - **********************/ - -/** - * BLock Image Transfer descriptor structure - */ -typedef struct { - - const lv_color_t * src; /**< Source buffer pointer (must be aligned on 32 bytes)*/ - lv_area_t src_area; /**< Area to be copied from source*/ - lv_coord_t src_width; /**< Source buffer width*/ - lv_coord_t src_height; /**< Source buffer height*/ - int32_t src_stride; /**< Source buffer stride in bytes (must be aligned on 16 px)*/ - - const lv_color_t * dst; /**< Destination buffer pointer (must be aligned on 32 bytes)*/ - lv_area_t dst_area; /**< Target area in destination buffer (must be the same as src_area)*/ - lv_coord_t dst_width; /**< Destination buffer width*/ - lv_coord_t dst_height; /**< Destination buffer height*/ - int32_t dst_stride; /**< Destination buffer stride in bytes (must be aligned on 16 px)*/ - - lv_opa_t opa; /**< Opacity - alpha mix (0 = source not copied, 255 = 100% opaque)*/ - uint32_t angle; /**< Rotation angle (1/10 of degree)*/ - uint32_t zoom; /**< 256 = no zoom (1:1 scale ratio)*/ - lv_point_t pivot; /**< The coordinates of rotation pivot in source image buffer*/ -} lv_gpu_nxp_vglite_blit_info_t; - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Fill area, with optional opacity. - * - * @param[in/out] dest_buf Destination buffer pointer (must be aligned on 32 bytes) - * @param[in] dest_width Destination buffer width in pixels (must be aligned on 16 px) - * @param[in] dest_height Destination buffer height in pixels - * @param[in] fill_area Area to be filled - * @param[in] color Fill color - * @param[in] opa Opacity (255 = full, 128 = 50% background/50% color, 0 = no fill) - * @retval LV_RES_OK Fill completed - * @retval LV_RES_INV Error occurred (\see LV_GPU_NXP_VG_LITE_LOG_ERRORS) - */ -lv_res_t lv_gpu_nxp_vglite_fill(lv_color_t * dest_buf, lv_coord_t dest_width, lv_coord_t dest_height, - const lv_area_t * fill_area, lv_color_t color, lv_opa_t opa); - -/** - * BLock Image Transfer. - * - * @param[in] blit Description of the transfer - * @retval LV_RES_OK Transfer complete - * @retval LV_RES_INV Error occurred (\see LV_GPU_NXP_VG_LITE_LOG_ERRORS) - */ -lv_res_t lv_gpu_nxp_vglite_blit(lv_gpu_nxp_vglite_blit_info_t * blit); - -/** - * BLock Image Transfer with transformation. - * - * @param[in] blit Description of the transfer - * @retval LV_RES_OK Transfer complete - * @retval LV_RES_INV Error occurred (\see LV_GPU_NXP_VG_LITE_LOG_ERRORS) - */ -lv_res_t lv_gpu_nxp_vglite_blit_transform(lv_gpu_nxp_vglite_blit_info_t * blit); - -/********************** - * MACROS - **********************/ - -#endif /*LV_USE_GPU_NXP_VG_LITE*/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_DRAW_VGLITE_BLEND_H*/ diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/nxp/vglite/lv_draw_vglite_rect.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/nxp/vglite/lv_draw_vglite_rect.c deleted file mode 100644 index bc1d55c..0000000 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/nxp/vglite/lv_draw_vglite_rect.c +++ /dev/null @@ -1,244 +0,0 @@ -/** - * @file lv_draw_vglite_rect.c - * - */ - -/** - * MIT License - * - * Copyright 2021, 2022 NXP - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights to - * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of - * the Software, and to permit persons to whom the Software is furnished to do so, - * subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next paragraph) - * shall be included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, - * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A - * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF - * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE - * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -/********************* - * INCLUDES - *********************/ - -#include "lv_draw_vglite_rect.h" - -#if LV_USE_GPU_NXP_VG_LITE - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -lv_res_t lv_gpu_nxp_vglite_draw_bg(lv_draw_ctx_t * draw_ctx, const lv_draw_rect_dsc_t * dsc, const lv_area_t * coords) -{ - vg_lite_buffer_t vgbuf; - vg_lite_error_t err = VG_LITE_SUCCESS; - lv_coord_t dest_width = lv_area_get_width(draw_ctx->buf_area); - lv_coord_t dest_height = lv_area_get_height(draw_ctx->buf_area); - vg_lite_path_t path; - vg_lite_color_t vgcol; /* vglite takes ABGR */ - vg_lite_matrix_t matrix; - lv_coord_t width = lv_area_get_width(coords); - lv_coord_t height = lv_area_get_height(coords); - vg_lite_linear_gradient_t gradient; - vg_lite_matrix_t * grad_matrix; - - if(dsc->radius < 0) - return LV_RES_INV; - - /* Make areas relative to draw buffer */ - lv_area_t rel_coords; - lv_area_copy(&rel_coords, coords); - lv_area_move(&rel_coords, -draw_ctx->buf_area->x1, -draw_ctx->buf_area->y1); - - lv_area_t rel_clip; - lv_area_copy(&rel_clip, draw_ctx->clip_area); - lv_area_move(&rel_clip, -draw_ctx->buf_area->x1, -draw_ctx->buf_area->y1); - - /*** Init destination buffer ***/ - if(lv_vglite_init_buf(&vgbuf, (uint32_t)dest_width, (uint32_t)dest_height, (uint32_t)dest_width * sizeof(lv_color_t), - (const lv_color_t *)draw_ctx->buf, false) != LV_RES_OK) - VG_LITE_RETURN_INV("Init buffer failed."); - - /*** Init path ***/ - int32_t rad = dsc->radius; - if(dsc->radius == LV_RADIUS_CIRCLE) { - rad = (width > height) ? height / 2 : width / 2; - } - - if((dsc->radius == LV_RADIUS_CIRCLE) && (width == height)) { - float tang = ((float)rad * BEZIER_OPTIM_CIRCLE); - int32_t cpoff = (int32_t)tang; - int32_t circle_path[] = { /*VG circle path*/ - VLC_OP_MOVE, rel_coords.x1 + rad, rel_coords.y1, - VLC_OP_CUBIC_REL, cpoff, 0, rad, rad - cpoff, rad, rad, /* top-right */ - VLC_OP_CUBIC_REL, 0, cpoff, cpoff - rad, rad, 0 - rad, rad, /* bottom-right */ - VLC_OP_CUBIC_REL, 0 - cpoff, 0, 0 - rad, cpoff - rad, 0 - rad, 0 - rad, /* bottom-left */ - VLC_OP_CUBIC_REL, 0, 0 - cpoff, rad - cpoff, 0 - rad, rad, 0 - rad, /* top-left */ - VLC_OP_END - }; - err = vg_lite_init_path(&path, VG_LITE_S32, VG_LITE_HIGH, sizeof(circle_path), circle_path, - (vg_lite_float_t) rel_clip.x1, (vg_lite_float_t) rel_clip.y1, - ((vg_lite_float_t) rel_clip.x2) + 1.0f, ((vg_lite_float_t) rel_clip.y2) + 1.0f); - } - else if(dsc->radius > 0) { - float tang = ((float)rad * BEZIER_OPTIM_CIRCLE); - int32_t cpoff = (int32_t)tang; - int32_t rounded_path[] = { /*VG rounded rectangular path*/ - VLC_OP_MOVE, rel_coords.x1 + rad, rel_coords.y1, - VLC_OP_LINE, rel_coords.x2 - rad + 1, rel_coords.y1, /* top */ - VLC_OP_CUBIC_REL, cpoff, 0, rad, rad - cpoff, rad, rad, /* top-right */ - VLC_OP_LINE, rel_coords.x2 + 1, rel_coords.y2 - rad + 1, /* right */ - VLC_OP_CUBIC_REL, 0, cpoff, cpoff - rad, rad, 0 - rad, rad, /* bottom-right */ - VLC_OP_LINE, rel_coords.x1 + rad, rel_coords.y2 + 1, /* bottom */ - VLC_OP_CUBIC_REL, 0 - cpoff, 0, 0 - rad, cpoff - rad, 0 - rad, 0 - rad, /* bottom-left */ - VLC_OP_LINE, rel_coords.x1, rel_coords.y1 + rad, /* left */ - VLC_OP_CUBIC_REL, 0, 0 - cpoff, rad - cpoff, 0 - rad, rad, 0 - rad, /* top-left */ - VLC_OP_END - }; - err = vg_lite_init_path(&path, VG_LITE_S32, VG_LITE_HIGH, sizeof(rounded_path), rounded_path, - (vg_lite_float_t) rel_clip.x1, (vg_lite_float_t) rel_clip.y1, - ((vg_lite_float_t) rel_clip.x2) + 1.0f, ((vg_lite_float_t) rel_clip.y2) + 1.0f); - } - else { - int32_t rect_path[] = { /*VG rectangular path*/ - VLC_OP_MOVE, rel_coords.x1, rel_coords.y1, - VLC_OP_LINE, rel_coords.x2 + 1, rel_coords.y1, - VLC_OP_LINE, rel_coords.x2 + 1, rel_coords.y2 + 1, - VLC_OP_LINE, rel_coords.x1, rel_coords.y2 + 1, - VLC_OP_LINE, rel_coords.x1, rel_coords.y1, - VLC_OP_END - }; - err = vg_lite_init_path(&path, VG_LITE_S32, VG_LITE_LOW, sizeof(rect_path), rect_path, - (vg_lite_float_t) rel_clip.x1, (vg_lite_float_t) rel_clip.y1, - ((vg_lite_float_t) rel_clip.x2) + 1.0f, ((vg_lite_float_t) rel_clip.y2) + 1.0f); - } - - VG_LITE_ERR_RETURN_INV(err, "Init path failed."); - vg_lite_identity(&matrix); - - /*** Init Color/Gradient ***/ - if(dsc->bg_grad.dir != (lv_grad_dir_t)LV_GRAD_DIR_NONE) { - uint32_t colors[2]; - uint32_t stops[2]; - lv_color32_t col32[2]; - - /* Gradient setup */ - uint8_t cnt = MAX(dsc->bg_grad.stops_count, 2); - for(uint8_t i = 0; i < cnt; i++) { - col32[i].full = lv_color_to32(dsc->bg_grad.stops[i].color); /*Convert color to RGBA8888*/ - stops[i] = dsc->bg_grad.stops[i].frac; -#if LV_COLOR_DEPTH==16 - colors[i] = ((uint32_t)col32[i].ch.alpha << 24) | ((uint32_t)col32[i].ch.blue << 16) | - ((uint32_t)col32[i].ch.green << 8) | (uint32_t)col32[i].ch.red; -#else /*LV_COLOR_DEPTH==32*/ - /* watchout: red and blue color components are inverted versus vg_lite_color_t order */ - colors[i] = ((uint32_t)col32[i].ch.alpha << 24) | ((uint32_t)col32[i].ch.red << 16) | - ((uint32_t)col32[i].ch.green << 8) | (uint32_t)col32[i].ch.blue; -#endif - } - - lv_memset_00(&gradient, sizeof(vg_lite_linear_gradient_t)); - - err = vg_lite_init_grad(&gradient); - VG_LITE_ERR_RETURN_INV(err, "Init gradient failed"); - - err = vg_lite_set_grad(&gradient, cnt, colors, stops); - VG_LITE_ERR_RETURN_INV(err, "Set gradient failed."); - - err = vg_lite_update_grad(&gradient); - VG_LITE_ERR_RETURN_INV(err, "Update gradient failed."); - - grad_matrix = vg_lite_get_grad_matrix(&gradient); - vg_lite_identity(grad_matrix); - vg_lite_translate((float)rel_coords.x1, (float)rel_coords.y1, grad_matrix); - - if(dsc->bg_grad.dir == (lv_grad_dir_t)LV_GRAD_DIR_VER) { - vg_lite_scale(1.0f, (float)height / 256.0f, grad_matrix); - vg_lite_rotate(90.0f, grad_matrix); - } - else { /*LV_GRAD_DIR_HOR*/ - vg_lite_scale((float)width / 256.0f, 1.0f, grad_matrix); - } - } - - lv_opa_t bg_opa = dsc->bg_opa; - lv_color32_t bg_col32 = {.full = lv_color_to32(dsc->bg_color)}; /*Convert color to RGBA8888*/ - if(bg_opa <= (lv_opa_t)LV_OPA_MAX) { - /* Only pre-multiply color if hardware pre-multiplication is not present */ - if(!vg_lite_query_feature(gcFEATURE_BIT_VG_PE_PREMULTIPLY)) { - bg_col32.ch.red = (uint8_t)(((uint16_t)bg_col32.ch.red * bg_opa) >> 8); - bg_col32.ch.green = (uint8_t)(((uint16_t)bg_col32.ch.green * bg_opa) >> 8); - bg_col32.ch.blue = (uint8_t)(((uint16_t)bg_col32.ch.blue * bg_opa) >> 8); - } - bg_col32.ch.alpha = bg_opa; - } - -#if LV_COLOR_DEPTH==16 - vgcol = bg_col32.full; -#else /*LV_COLOR_DEPTH==32*/ - vgcol = ((uint32_t)bg_col32.ch.alpha << 24) | ((uint32_t)bg_col32.ch.blue << 16) | - ((uint32_t)bg_col32.ch.green << 8) | (uint32_t)bg_col32.ch.red; -#endif - - /*Clean & invalidate cache*/ - lv_vglite_invalidate_cache(); - - /*** Draw rectangle ***/ - if(dsc->bg_grad.dir == (lv_grad_dir_t)LV_GRAD_DIR_NONE) { - err = vg_lite_draw(&vgbuf, &path, VG_LITE_FILL_EVEN_ODD, &matrix, VG_LITE_BLEND_SRC_OVER, vgcol); - } - else { - err = vg_lite_draw_gradient(&vgbuf, &path, VG_LITE_FILL_EVEN_ODD, &matrix, &gradient, VG_LITE_BLEND_SRC_OVER); - } - VG_LITE_ERR_RETURN_INV(err, "Draw gradient failed."); - - err = vg_lite_finish(); - VG_LITE_ERR_RETURN_INV(err, "Finish failed."); - - err = vg_lite_clear_path(&path); - VG_LITE_ERR_RETURN_INV(err, "Clear path failed."); - - if(dsc->bg_grad.dir != (lv_grad_dir_t)LV_GRAD_DIR_NONE) { - err = vg_lite_clear_grad(&gradient); - VG_LITE_ERR_RETURN_INV(err, "Clear gradient failed."); - } - - return LV_RES_OK; -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -#endif /*LV_USE_GPU_NXP_VG_LITE*/ diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/nxp/vglite/lv_gpu_nxp_vglite.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/nxp/vglite/lv_gpu_nxp_vglite.c deleted file mode 100644 index f65ec1d..0000000 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/nxp/vglite/lv_gpu_nxp_vglite.c +++ /dev/null @@ -1,153 +0,0 @@ -/** - * @file lv_gpu_nxp_vglite.c - * - */ - -/** - * MIT License - * - * Copyright 2020-2022 NXP - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights to - * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of - * the Software, and to permit persons to whom the Software is furnished to do so, - * subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next paragraph) - * shall be included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, - * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A - * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF - * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE - * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -/********************* - * INCLUDES - *********************/ - -#include "lv_gpu_nxp_vglite.h" - -#if LV_USE_GPU_NXP_VG_LITE -#include "../../../core/lv_refr.h" -#if BLIT_DBG_AREAS - #include "lv_draw_vglite_blend.h" -#endif - -/********************* - * DEFINES - *********************/ - -#if LV_COLOR_DEPTH==16 - #define VG_LITE_PX_FMT VG_LITE_RGB565 -#elif LV_COLOR_DEPTH==32 - #define VG_LITE_PX_FMT VG_LITE_BGRA8888 -#else - #error Only 16bit and 32bit color depth are supported. Set LV_COLOR_DEPTH to 16 or 32. -#endif - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -lv_res_t lv_vglite_init_buf(vg_lite_buffer_t * vgbuf, uint32_t width, uint32_t height, uint32_t stride, - const lv_color_t * ptr, bool source) -{ - /*Test for memory alignment*/ - if((((uintptr_t)ptr) % (uintptr_t)LV_ATTRIBUTE_MEM_ALIGN_SIZE) != (uintptr_t)0x0U) - VG_LITE_RETURN_INV("%s buffer (0x%x) not aligned to %d.", source ? "Src" : "Dest", - (size_t) ptr, LV_ATTRIBUTE_MEM_ALIGN_SIZE); - - /*Test for stride alignment*/ - if(source && (stride % (LV_GPU_NXP_VG_LITE_STRIDE_ALIGN_PX * sizeof(lv_color_t))) != 0x0U) - VG_LITE_RETURN_INV("Src buffer stride (%d bytes) not aligned to %d bytes.", stride, - LV_GPU_NXP_VG_LITE_STRIDE_ALIGN_PX * sizeof(lv_color_t)); - - vgbuf->format = VG_LITE_PX_FMT; - vgbuf->tiled = VG_LITE_LINEAR; - vgbuf->image_mode = VG_LITE_NORMAL_IMAGE_MODE; - vgbuf->transparency_mode = VG_LITE_IMAGE_OPAQUE; - - vgbuf->width = (int32_t)width; - vgbuf->height = (int32_t)height; - vgbuf->stride = (int32_t)stride; - - lv_memset_00(&vgbuf->yuv, sizeof(vgbuf->yuv)); - - vgbuf->memory = (void *)ptr; - vgbuf->address = (uint32_t)vgbuf->memory; - vgbuf->handle = NULL; - - return LV_RES_OK; -} - -#if BLIT_DBG_AREAS -void lv_vglite_dbg_draw_rectangle(lv_color_t * dest_buf, lv_coord_t dest_width, lv_coord_t dest_height, - lv_area_t * fill_area, lv_color_t color) -{ - lv_area_t a; - - /* top line */ - a.x1 = fill_area->x1; - a.x2 = fill_area->x2; - a.y1 = fill_area->y1; - a.y2 = fill_area->y1; - lv_gpu_nxp_vglite_fill(dest_buf, dest_width, dest_height, &a, color, LV_OPA_COVER); - - - /* bottom line */ - a.x1 = fill_area->x1; - a.x2 = fill_area->x2; - a.y1 = fill_area->y2; - a.y2 = fill_area->y2; - lv_gpu_nxp_vglite_fill(dest_buf, dest_width, dest_height, &a, color, LV_OPA_COVER); - - /* left line */ - a.x1 = fill_area->x1; - a.x2 = fill_area->x1; - a.y1 = fill_area->y1; - a.y2 = fill_area->y2; - lv_gpu_nxp_vglite_fill(dest_buf, dest_width, dest_height, &a, color, LV_OPA_COVER); - - /* right line */ - a.x1 = fill_area->x2; - a.x2 = fill_area->x2; - a.y1 = fill_area->y1; - a.y2 = fill_area->y2; - lv_gpu_nxp_vglite_fill(dest_buf, dest_width, dest_height, &a, color, LV_OPA_COVER); -} -#endif /* BLIT_DBG_AREAS */ - -void lv_vglite_invalidate_cache(void) -{ - lv_disp_t * disp = _lv_refr_get_disp_refreshing(); - if(disp->driver->clean_dcache_cb) - disp->driver->clean_dcache_cb(disp->driver); -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -#endif /*LV_USE_GPU_NXP_VG_LITE*/ diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/stm32_dma2d/lv_gpu_stm32_dma2d.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/stm32_dma2d/lv_gpu_stm32_dma2d.c deleted file mode 100644 index 4eb1940..0000000 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/stm32_dma2d/lv_gpu_stm32_dma2d.c +++ /dev/null @@ -1,265 +0,0 @@ -/** - * @file lv_gpu_stm32_dma2d.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "lv_gpu_stm32_dma2d.h" -#include "../../core/lv_refr.h" - -#if LV_USE_GPU_STM32_DMA2D - -#include LV_GPU_DMA2D_CMSIS_INCLUDE - -/********************* - * DEFINES - *********************/ - -#if LV_COLOR_16_SWAP - // TODO: F7 has red blue swap bit in control register for all layers and output - #error "Can't use DMA2D with LV_COLOR_16_SWAP 1" -#endif - -#if LV_COLOR_DEPTH == 8 - #error "Can't use DMA2D with LV_COLOR_DEPTH == 8" -#endif - -#if LV_COLOR_DEPTH == 16 - #define LV_DMA2D_COLOR_FORMAT LV_DMA2D_RGB565 -#elif LV_COLOR_DEPTH == 32 - #define LV_DMA2D_COLOR_FORMAT LV_DMA2D_ARGB8888 -#else - /*Can't use GPU with other formats*/ -#endif - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ - -static void lv_draw_stm32_dma2d_blend_fill(lv_color_t * dest_buf, lv_coord_t dest_stride, const lv_area_t * fill_area, - lv_color_t color); - - -static void lv_draw_stm32_dma2d_blend_map(lv_color_t * dest_buf, const lv_area_t * dest_area, lv_coord_t dest_stride, - const lv_color_t * src_buf, lv_coord_t src_stride, lv_opa_t opa); - -static void lv_draw_stm32_dma2d_img_decoded(lv_draw_ctx_t * draw, const lv_draw_img_dsc_t * dsc, - const lv_area_t * coords, const uint8_t * map_p, lv_img_cf_t color_format); - - -static void invalidate_cache(void); - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -/** - * Turn on the peripheral and set output color mode, this only needs to be done once - */ -void lv_draw_stm32_dma2d_init(void) -{ - /*Enable DMA2D clock*/ -#if defined(STM32F4) || defined(STM32F7) - RCC->AHB1ENR |= RCC_AHB1ENR_DMA2DEN; -#elif defined(STM32H7) - RCC->AHB3ENR |= RCC_AHB3ENR_DMA2DEN; -#else -# warning "LVGL can't enable the clock of DMA2D" -#endif - - /*Wait for hardware access to complete*/ - __asm volatile("DSB\n"); - - /*Delay after setting peripheral clock*/ - volatile uint32_t temp = RCC->AHB1ENR; - LV_UNUSED(temp); - - /*set output colour mode*/ - DMA2D->OPFCCR = LV_DMA2D_COLOR_FORMAT; -} - - -void lv_draw_stm32_dma2d_ctx_init(lv_disp_drv_t * drv, lv_draw_ctx_t * draw_ctx) -{ - - lv_draw_sw_init_ctx(drv, draw_ctx); - - lv_draw_stm32_dma2d_ctx_t * dma2d_draw_ctx = (lv_draw_sw_ctx_t *)draw_ctx; - - dma2d_draw_ctx->blend = lv_draw_stm32_dma2d_blend; - // dma2d_draw_ctx->base_draw.draw_img_decoded = lv_draw_stm32_dma2d_img_decoded; - dma2d_draw_ctx->base_draw.wait_for_finish = lv_gpu_stm32_dma2d_wait_cb; - dma2d_draw_ctx->base_draw.buffer_copy = lv_draw_stm32_dma2d_buffer_copy; - -} - -void lv_draw_stm32_dma2d_ctx_deinit(lv_disp_drv_t * drv, lv_draw_ctx_t * draw_ctx) -{ - LV_UNUSED(drv); - LV_UNUSED(draw_ctx); -} - - -void lv_draw_stm32_dma2d_blend(lv_draw_ctx_t * draw_ctx, const lv_draw_sw_blend_dsc_t * dsc) -{ - lv_area_t blend_area; - if(!_lv_area_intersect(&blend_area, dsc->blend_area, draw_ctx->clip_area)) return; - - bool done = false; - - if(dsc->mask_buf == NULL && dsc->blend_mode == LV_BLEND_MODE_NORMAL && lv_area_get_size(&blend_area) > 100) { - lv_coord_t dest_stride = lv_area_get_width(draw_ctx->buf_area); - - lv_color_t * dest_buf = draw_ctx->buf; - dest_buf += dest_stride * (blend_area.y1 - draw_ctx->buf_area->y1) + (blend_area.x1 - draw_ctx->buf_area->x1); - - const lv_color_t * src_buf = dsc->src_buf; - if(src_buf) { - lv_draw_sw_blend_basic(draw_ctx, dsc); - lv_coord_t src_stride; - src_stride = lv_area_get_width(dsc->blend_area); - src_buf += src_stride * (blend_area.y1 - dsc->blend_area->y1) + (blend_area.x1 - dsc->blend_area->x1); - lv_area_move(&blend_area, -draw_ctx->buf_area->x1, -draw_ctx->buf_area->y1); - lv_draw_stm32_dma2d_blend_map(dest_buf, &blend_area, dest_stride, src_buf, src_stride, dsc->opa); - done = true; - } - else if(dsc->opa >= LV_OPA_MAX) { - lv_area_move(&blend_area, -draw_ctx->buf_area->x1, -draw_ctx->buf_area->y1); - lv_draw_stm32_dma2d_blend_fill(dest_buf, dest_stride, &blend_area, dsc->color); - done = true; - } - } - - if(!done) lv_draw_sw_blend_basic(draw_ctx, dsc); -} - -void lv_draw_stm32_dma2d_buffer_copy(lv_draw_ctx_t * draw_ctx, - void * dest_buf, lv_coord_t dest_stride, const lv_area_t * dest_area, - void * src_buf, lv_coord_t src_stride, const lv_area_t * src_area) -{ - LV_UNUSED(draw_ctx); - lv_draw_stm32_dma2d_blend_map(dest_buf, dest_area, dest_stride, src_buf, src_stride, LV_OPA_MAX); -} - - -static void lv_draw_stm32_dma2d_img_decoded(lv_draw_ctx_t * draw_ctx, const lv_draw_img_dsc_t * dsc, - const lv_area_t * coords, const uint8_t * map_p, lv_img_cf_t color_format) -{ - /*TODO basic ARGB8888 image can be handles here*/ - - lv_draw_sw_img_decoded(draw_ctx, dsc, coords, map_p, color_format); -} - -static void lv_draw_stm32_dma2d_blend_fill(lv_color_t * dest_buf, lv_coord_t dest_stride, const lv_area_t * fill_area, - lv_color_t color) -{ - /*Simply fill an area*/ - int32_t area_w = lv_area_get_width(fill_area); - int32_t area_h = lv_area_get_height(fill_area); - invalidate_cache(); - - DMA2D->CR = 0x30000; - DMA2D->OMAR = (uint32_t)dest_buf; - /*as input color mode is same as output we don't need to convert here do we?*/ - DMA2D->OCOLR = color.full; - DMA2D->OOR = dest_stride - area_w; - DMA2D->NLR = (area_w << DMA2D_NLR_PL_Pos) | (area_h << DMA2D_NLR_NL_Pos); - - /*start transfer*/ - DMA2D->CR |= DMA2D_CR_START_Msk; - -} - - -static void lv_draw_stm32_dma2d_blend_map(lv_color_t * dest_buf, const lv_area_t * dest_area, lv_coord_t dest_stride, - const lv_color_t * src_buf, lv_coord_t src_stride, lv_opa_t opa) -{ - - /*Simple copy*/ - int32_t dest_w = lv_area_get_width(dest_area); - int32_t dest_h = lv_area_get_height(dest_area); - - invalidate_cache(); - if(opa >= LV_OPA_MAX) { - DMA2D->CR = 0; - /*copy output colour mode, this register controls both input and output colour format*/ - DMA2D->FGPFCCR = LV_DMA2D_COLOR_FORMAT; - DMA2D->FGMAR = (uint32_t)src_buf; - DMA2D->FGOR = src_stride - dest_w; - DMA2D->OMAR = (uint32_t)dest_buf; - DMA2D->OOR = dest_stride - dest_w; - DMA2D->NLR = (dest_w << DMA2D_NLR_PL_Pos) | (dest_h << DMA2D_NLR_NL_Pos); - - /*start transfer*/ - DMA2D->CR |= DMA2D_CR_START_Msk; - } - else { - DMA2D->CR = 0x20000; - - DMA2D->BGPFCCR = LV_DMA2D_COLOR_FORMAT; - DMA2D->BGMAR = (uint32_t)dest_buf; - DMA2D->BGOR = dest_stride - dest_w; - - DMA2D->FGPFCCR = (uint32_t)LV_DMA2D_COLOR_FORMAT - /*alpha mode 2, replace with foreground * alpha value*/ - | (2 << DMA2D_FGPFCCR_AM_Pos) - /*alpha value*/ - | (opa << DMA2D_FGPFCCR_ALPHA_Pos); - DMA2D->FGMAR = (uint32_t)src_buf; - DMA2D->FGOR = src_stride - dest_w; - - DMA2D->OMAR = (uint32_t)dest_buf; - DMA2D->OOR = dest_stride - dest_w; - DMA2D->NLR = (dest_w << DMA2D_NLR_PL_Pos) | (dest_h << DMA2D_NLR_NL_Pos); - - /*start transfer*/ - DMA2D->CR |= DMA2D_CR_START_Msk; - } -} - -void lv_gpu_stm32_dma2d_wait_cb(lv_draw_ctx_t * draw_ctx) -{ - lv_disp_t * disp = _lv_refr_get_disp_refreshing(); - if(disp->driver && disp->driver->wait_cb) { - while(DMA2D->CR & DMA2D_CR_START_Msk) { - disp->driver->wait_cb(disp->driver); - } - } - else { - while(DMA2D->CR & DMA2D_CR_START_Msk); - } - lv_draw_sw_wait_for_finish(draw_ctx); - -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -static void invalidate_cache(void) -{ - lv_disp_t * disp = _lv_refr_get_disp_refreshing(); - if(disp->driver->clean_dcache_cb) disp->driver->clean_dcache_cb(disp->driver); - else { -#if __CORTEX_M >= 0x07 - if((SCB->CCR) & (uint32_t)SCB_CCR_DC_Msk) - SCB_CleanInvalidateDCache(); -#endif - } -} - -#endif diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/stm32_dma2d/lv_gpu_stm32_dma2d.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/stm32_dma2d/lv_gpu_stm32_dma2d.h deleted file mode 100644 index fa7070e..0000000 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/stm32_dma2d/lv_gpu_stm32_dma2d.h +++ /dev/null @@ -1,70 +0,0 @@ -/** - * @file lv_gpu_stm32_dma2d.h - * - */ - -#ifndef LV_GPU_STM32_DMA2D_H -#define LV_GPU_STM32_DMA2D_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#include "../../misc/lv_color.h" -#include "../../hal/lv_hal_disp.h" -#include "../sw/lv_draw_sw.h" - -#if LV_USE_GPU_STM32_DMA2D - -/********************* - * DEFINES - *********************/ - -#define LV_DMA2D_ARGB8888 0 -#define LV_DMA2D_RGB888 1 -#define LV_DMA2D_RGB565 2 -#define LV_DMA2D_ARGB1555 3 -#define LV_DMA2D_ARGB4444 4 - -/********************** - * TYPEDEFS - **********************/ -typedef lv_draw_sw_ctx_t lv_draw_stm32_dma2d_ctx_t; - -struct _lv_disp_drv_t; - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Turn on the peripheral and set output color mode, this only needs to be done once - */ -void lv_draw_stm32_dma2d_init(void); - -void lv_draw_stm32_dma2d_ctx_init(struct _lv_disp_drv_t * drv, lv_draw_ctx_t * draw_ctx); - -void lv_draw_stm32_dma2d_ctx_deinit(struct _lv_disp_drv_t * drv, lv_draw_ctx_t * draw_ctx); - -void lv_draw_stm32_dma2d_blend(lv_draw_ctx_t * draw_ctx, const lv_draw_sw_blend_dsc_t * dsc); - -void lv_draw_stm32_dma2d_buffer_copy(lv_draw_ctx_t * draw_ctx, - void * dest_buf, lv_coord_t dest_stride, const lv_area_t * dest_area, - void * src_buf, lv_coord_t src_stride, const lv_area_t * src_area); - -void lv_gpu_stm32_dma2d_wait_cb(lv_draw_ctx_t * draw_ctx); - -/********************** - * MACROS - **********************/ - -#endif /*LV_USE_GPU_STM32_DMA2D*/ - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif /*LV_GPU_STM32_DMA2D_H*/ diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/ref_imgs/dropdown_1.png b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/ref_imgs/dropdown_1.png deleted file mode 100644 index 30bf0bb..0000000 Binary files a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/ref_imgs/dropdown_1.png and /dev/null differ diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/unity/unity_support.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/unity/unity_support.c deleted file mode 100644 index 6906bd2..0000000 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/unity/unity_support.c +++ /dev/null @@ -1,237 +0,0 @@ -/** - * @file lv_test_assert.c - * - * Copyright 2002-2010 Guillaume Cottenceau. - * - * This software may be freely redistributed under the terms - * of the X11 license. - * - */ - -/********************* - * INCLUDES - *********************/ -#if LV_BUILD_TEST -#include "../lvgl.h" - -#include -#include -#include -#include -#include -#include "unity.h" -#define PNG_DEBUG 3 -#include - -/********************* - * DEFINES - *********************/ -//#define REF_IMGS_PATH "lvgl/tests/lv_test_ref_imgs/" -#define REF_IMGS_PATH "ref_imgs/" - -/********************** - * TYPEDEFS - **********************/ -typedef struct { - int width, height; - png_byte color_type; - png_byte bit_depth; - - png_structp png_ptr; - png_infop info_ptr; - int number_of_passes; - png_bytep * row_pointers; -}png_img_t; - -/********************** - * STATIC PROTOTYPES - **********************/ -static int read_png_file(png_img_t * p, const char* file_name); -static void png_release(png_img_t * p); - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -bool lv_test_assert_img_eq(const char * fn_ref) -{ - char fn_ref_full[512]; - sprintf(fn_ref_full, "%s%s", REF_IMGS_PATH, fn_ref); - - png_img_t p; - int res = read_png_file(&p, fn_ref_full); - if(res < 0) return false; - uint8_t * screen_buf; - - lv_obj_invalidate(lv_scr_act()); - lv_refr_now(NULL); - - extern lv_color_t test_fb[]; - - screen_buf = (uint8_t *)test_fb; - - uint8_t * ptr_act = NULL; - const png_byte* ptr_ref = NULL; - - bool err = false; - int x, y, i_buf = 0; - for (y = 0; y < p.height; y++) { - png_byte* row = p.row_pointers[y]; - - for (x = 0; x < p.width; x++) { - ptr_ref = &(row[x*3]); - ptr_act = &(screen_buf[i_buf*4]); - - uint32_t ref_px = 0; - uint32_t act_px = 0; - memcpy(&ref_px, ptr_ref, 3); - memcpy(&act_px, ptr_act, 3); - //printf("0xFF%06x, ", act_px); - - uint8_t act_swap[3] = {ptr_act[2], ptr_act[1], ptr_act[0]}; - - if(memcmp(act_swap, ptr_ref, 3) != 0) { - err = true; - break; - } - i_buf++; - } - if(err) break; - } - - if(err) { - uint32_t ref_px = 0; - uint32_t act_px = 0; - memcpy(&ref_px, ptr_ref, 3); - memcpy(&act_px, ptr_act, 3); - - FILE * f = fopen("../test_screenshot_error.h", "w"); - - fprintf(f, "//Diff in %s at (%d;%d), %x instead of %x)\n\n", fn_ref, x, y, act_px, ref_px); - fprintf(f, "static const uint32_t test_screenshot_error_data[] = {\n"); - - i_buf = 0; - for (y = 0; y < 480; y++) { - fprintf(f, "\n"); - for (x = 0; x < 800; x++) { - ptr_act = &(screen_buf[i_buf * 4]); - act_px = 0; - memcpy(&act_px, ptr_act, 3); - fprintf(f, "0xFF%06X, ", act_px); - i_buf++; - } - } - fprintf(f, "};\n\n"); - - fprintf(f, "static lv_img_dsc_t test_screenshot_error_dsc = { \n" - " .header.w = 800,\n" - " .header.h = 480,\n" - " .header.always_zero = 0,\n" - " .header.cf = LV_IMG_CF_TRUE_COLOR,\n" - " .data_size = 800 * 480 * 4,\n" - " .data = test_screenshot_error_data};\n\n" - "static inline void test_screenshot_error_show(void)\n" - "{\n" - " lv_obj_t * img = lv_img_create(lv_scr_act());\n" - " lv_img_set_src(img, &test_screenshot_error_dsc);\n" - "}\n"); - - fclose(f); - - } - - - png_release(&p); - - return !err; - -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -static int read_png_file(png_img_t * p, const char* file_name) -{ - char header[8]; // 8 is the maximum size that can be checked - - /*open file and test for it being a png*/ - FILE *fp = fopen(file_name, "rb"); - if (!fp) { - TEST_PRINTF("%s", "PNG file %s could not be opened for reading"); - return -1; - } - - size_t rcnt = fread(header, 1, 8, fp); - if (rcnt != 8 || png_sig_cmp((png_const_bytep)header, 0, 8)) { - TEST_PRINTF("%s is not recognized as a PNG file", file_name); - return -1; - } - - /*initialize stuff*/ - p->png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); - - if (!p->png_ptr) { - TEST_PRINTF("%s", "png_create_read_struct failed"); - return -1; - } - - p->info_ptr = png_create_info_struct(p->png_ptr); - if (!p->info_ptr) { - TEST_PRINTF("%s", "png_create_info_struct failed"); - return -1; - } - if (setjmp(png_jmpbuf(p->png_ptr))) { - TEST_PRINTF("%s", "Error during init_io"); - return -1; - } - png_init_io(p->png_ptr, fp); - png_set_sig_bytes(p->png_ptr, 8); - - png_read_info(p->png_ptr, p->info_ptr); - - p->width = png_get_image_width(p->png_ptr, p->info_ptr); - p->height = png_get_image_height(p->png_ptr, p->info_ptr); - p->color_type = png_get_color_type(p->png_ptr, p->info_ptr); - p->bit_depth = png_get_bit_depth(p->png_ptr, p->info_ptr); - - p->number_of_passes = png_set_interlace_handling(p->png_ptr); - png_read_update_info(p->png_ptr, p->info_ptr); - - /*read file*/ - if (setjmp(png_jmpbuf(p->png_ptr))) { - TEST_PRINTF("%s", "Error during read_image"); - return -1; - } - p->row_pointers = (png_bytep*) malloc(sizeof(png_bytep) * p->height); - - int y; - for (y=0; yheight; y++) - p->row_pointers[y] = (png_byte*) malloc(png_get_rowbytes(p->png_ptr,p->info_ptr)); - - png_read_image(p->png_ptr, p->row_pointers); - - fclose(fp); - return 0; -} - -static void png_release(png_img_t * p) -{ - int y; - for (y=0; yheight; y++) free(p->row_pointers[y]); - - free(p->row_pointers); - - png_destroy_read_struct(&p->png_ptr, &p->info_ptr, NULL); -} - - -#endif diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/.codecov.yml b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/.codecov.yml similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/.codecov.yml rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/.codecov.yml diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/.editorconfig b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/.editorconfig similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/.editorconfig rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/.editorconfig diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/.github/FUNDING.yml b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/.github/FUNDING.yml new file mode 100644 index 0000000..1353007 --- /dev/null +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/.github/FUNDING.yml @@ -0,0 +1 @@ +open_collective: lvgl diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/.github/ISSUE_TEMPLATE/bug-report.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/.github/ISSUE_TEMPLATE/bug-report.md new file mode 100644 index 0000000..5f32762 --- /dev/null +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/.github/ISSUE_TEMPLATE/bug-report.md @@ -0,0 +1,44 @@ +--- +name: Bug report +about: Create a bug report to help us improve +title: '' +labels: '' +assignees: '' + +--- + + + +### Perform all steps below and tick them with [x] +- [ ] Read the [FAQ](https://docs.lvgl.io/master/intro/index.html#faq) +- [ ] Check the related part of the [Documentation](https://docs.lvgl.io/) +- [ ] Update lvgl to the latest version +- [ ] Reproduce the issue in a [Simulator](https://docs.lvgl.io/latest/en/html/get-started/pc-simulator.html) + +### Describe the bug + + +### To Reproduce + + +### Expected behavior + + +### Screenshots or video + diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/.github/ISSUE_TEMPLATE/config.yml b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 0000000..2228ff1 --- /dev/null +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1,14 @@ +blank_issues_enabled: false +contact_links: + - name: Documentation + url: https://docs.lvgl.io + about: Be sure to read to documentation first + - name: Forum + url: https://forum.lvgl.io + about: For topics like How-to, Getting started, Feature request + - name: CONTIBUTING.md + url: https://github.com/lvgl/lvgl/blob/master/docs/CONTRIBUTING.md#faq-about-contributing + about: The basic rules of contributing + - name: CODING_STYLE.md + url: https://github.com/lvgl/lvgl/blob/master/docs/CODING_STYLE.md + about: Quick summary of LVGL's code style diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/.github/ISSUE_TEMPLATE/dev-discussion.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/.github/ISSUE_TEMPLATE/dev-discussion.md new file mode 100644 index 0000000..7c9f6c0 --- /dev/null +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/.github/ISSUE_TEMPLATE/dev-discussion.md @@ -0,0 +1,29 @@ +--- +name: Development discussion +about: Discussion strictly related to the development of the LVGL. +title: '' +labels: '' +assignees: '' + +--- + + +### Introduce the problem + + +### Examples and cases + + +### Suggested solution + diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/.github/auto-comment.yml b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/.github/auto-comment.yml new file mode 100644 index 0000000..a141fb5 --- /dev/null +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/.github/auto-comment.yml @@ -0,0 +1,12 @@ +# Comment to a new issue. +pullRequestOpened: | + Thank you for raising your pull request. + + To ensure that all licensing criteria is met all repositories of the LVGL project apply a process called DCO (Developer's Certificate of Origin). + + The text of DCO can be read here: https://developercertificate.org/ + For a more detailed description see the [Documentation](https://docs.lvgl.io/latest/en/html/contributing/index.html#developer-certification-of-origin-dco) site. + + By contributing to any repositories of the LVGL project you state that your contribution corresponds with the DCO. + + No further action is required if your contribution fulfills the DCO. If you are not sure about it feel free to ask us in a comment. diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/.github/pull_request_template.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/.github/pull_request_template.md new file mode 100644 index 0000000..7c598e6 --- /dev/null +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/.github/pull_request_template.md @@ -0,0 +1,10 @@ +A clear and concise description of what the bug or new feature is. + +- Update the [Documentation](https://github.com/lvgl/lvgl/tree/master/docs) if needed. +- Add [Examples](https://github.com/lvgl/lvgl/tree/master/examples) if relevant. +- Add [Tests](https://github.com/lvgl/lvgl/blob/master/tests/README.md) if applicable. +- If you added new options to `lv_conf_template.h` run [lv_conf_internal_gen.py](https://github.com/lvgl/lvgl/blob/master/scripts/lv_conf_internal_gen.py) and update [Kconfig](https://github.com/lvgl/lvgl/blob/master/Kconfig). +- Run `scripts/code-format.py` (`astyle v3.4.12` needs to installed by running `cd scripts; ./install_astyle.sh`) and follow the [Code Conventions](https://docs.lvgl.io/master/CODING_STYLE.html). +- Mark the Pull request as [Draft](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/changing-the-stage-of-a-pull-request) while you are working on the first version, and mark is as _Ready_ when it's ready for review. +- When changes were requested, [re-request review](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/requesting-a-pull-request-review) to notify the maintainers. +- Help us to review this Pull Request! Anyone can [approve or request changes](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/reviewing-changes-in-pull-requests/approving-a-pull-request-with-required-reviews). diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/.github/workflows/arduino.yml b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/.github/workflows/arduino.yml new file mode 100644 index 0000000..a6fbba1 --- /dev/null +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/.github/workflows/arduino.yml @@ -0,0 +1,15 @@ +name: Arduino Lint +on: + push: + branches: [ master, release/v8.* ] + pull_request: + branches: [ master, release/v8.* ] +jobs: + lint: + if: ${{ github.event_name != 'pull_request' || github.repository != github.event.pull_request.head.repo.full_name }} + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - uses: arduino/arduino-lint-action@v1 + with: + library-manager: update diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/.github/workflows/build_micropython.yml b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/.github/workflows/build_micropython.yml new file mode 100644 index 0000000..a8bb912 --- /dev/null +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/.github/workflows/build_micropython.yml @@ -0,0 +1,74 @@ +name: Micropython CI + +on: + push: + pull_request: + +jobs: + build: + if: ${{ github.event_name != 'pull_request' || github.repository != github.event.pull_request.head.repo.full_name }} + name: Build ${{ matrix.port }} port + runs-on: ubuntu-20.04 + continue-on-error: true + strategy: + matrix: + port: ['unix', 'esp32', 'stm32', 'rp2'] + steps: + - uses: ammaraskar/gcc-problem-matcher@master + - name: Install Dependencies + run: | + sudo add-apt-repository -y "deb http://archive.ubuntu.com/ubuntu `lsb_release -sc` main universe restricted multiverse" + sudo apt-get update -y -qq + sudo apt-get install libsdl2-dev parallel libfreetype-dev librlottie-dev + - name: Clone lv_micropython + run: | + git clone https://github.com/lvgl/lv_micropython.git . + git checkout release/v8 + - name: Initialize lv_bindings submodule + run: git submodule update --init --recursive lib/lv_bindings + - name: Update ${{ matrix.port }} port submodules + if: matrix.port != 'esp32' + # VARIANT needed for unix + run: make -C ports/${{ matrix.port }} VARIANT=dev DEBUG=1 USER_C_MODULES=../../lib/lv_bindings/bindings.cmake submodules + - name: Checkout LVGL submodule + working-directory: ./lib/lv_bindings/lvgl + run: | + git fetch --force ${{ github.event.repository.html_url }} "+refs/heads/*:refs/remotes/origin/*" + git fetch --force ${{ github.event.repository.html_url }} "+refs/pull/*:refs/remotes/origin/pr/*" + git checkout ${{ github.sha }} || git checkout ${{ github.event.pull_request.head.sha }} + git submodule update --init --recursive + - name: Build mpy-cross + run: make -j $(nproc) -C mpy-cross + + # ESP32 port + - name: Setup ESP-IDF + if: matrix.port == 'esp32' + run: | + source tools/ci.sh && ci_esp32_idf44_setup + - name: Build ESP32 port + if: matrix.port == 'esp32' + run: | + source tools/ci.sh && ci_esp32_build + + # STM32 & RPi Pico port + - name: arm-none-eabi-gcc + if: matrix.port == 'stm32' || matrix.port == 'rp2' + uses: carlosperate/arm-none-eabi-gcc-action@v1.3.0 + with: + release: '9-2019-q4' # The arm-none-eabi-gcc release to use. + - name: Build STM32 port + if: matrix.port == 'stm32' + run: make -j $(nproc) -C ports/stm32 BOARD=STM32F7DISC + - name: Build Raspberry Pi PICO port + if: matrix.port == 'rp2' + run: make -j $(nproc) -C ports/rp2 BOARD=PICO USER_C_MODULES=../../lib/lv_bindings/bindings.cmake + # Unix port + - name: Build Unix port + if: matrix.port == 'unix' + run: make -j $(nproc) -C ports/unix VARIANT=dev DEBUG=1 + - name: Run tests + if: success() && matrix.port == 'unix' + run: | + export XDG_RUNTIME_DIR=/tmp + lib/lv_bindings/tests/run.sh + diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/.github/workflows/ccpp.yml b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/.github/workflows/ccpp.yml new file mode 100644 index 0000000..caf6788 --- /dev/null +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/.github/workflows/ccpp.yml @@ -0,0 +1,109 @@ +name: C/C++ CI + +on: + push: + branches: [ master, release/v8.* ] + pull_request: + branches: [ master, release/v8.* ] + +jobs: + build: + if: ${{ github.event_name != 'pull_request' || github.repository != github.event.pull_request.head.repo.full_name }} + runs-on: ubuntu-latest + strategy: + matrix: + # A valid option parameter to the cmake file. + # See BUILD_OPTIONS in tests/CMakeLists.txt. + build_option: ['OPTIONS_MINIMAL_MONOCHROME', + 'OPTIONS_NORMAL_8BIT', + 'OPTIONS_16BIT', + 'OPTIONS_16BIT_SWAP', + 'OPTIONS_FULL_32BIT'] + name: Build ${{ matrix.build_option }} + steps: + - uses: actions/checkout@v2 + - uses: ammaraskar/gcc-problem-matcher@master + - name: Install prerequisites + run: scripts/install-prerequisites.sh + - name: Building ${{ matrix.build_option }} + run: python tests/main.py --build-option=${{ matrix.build_option }} build + + test-native: + runs-on: ubuntu-latest + name: amd64 Executable Tests + steps: + - uses: actions/checkout@v2 + - uses: ammaraskar/gcc-problem-matcher@master + - name: Install prerequisites + run: scripts/install-prerequisites.sh + - name: Fix kernel mmap rnd bits + # Asan in llvm 14 provided in ubuntu 22.04 is incompatible with + # high-entropy ASLR in much newer kernels that GitHub runners are + # using leading to random crashes: https://reviews.llvm.org/D148280 + run: sudo sysctl vm.mmap_rnd_bits=28 + - name: Run tests + run: python tests/main.py --report test + - name: Upload coverage to Codecov + uses: codecov/codecov-action@v2 + if: github.event_name == 'push' + with: + fail_ci_if_error: true + verbose: true + test-cross: + # The host should always be linux + runs-on: ubuntu-latest + name: ${{ matrix.arch }} Executable Tests + + # Run steps on a matrix of 3 arch/distro combinations + strategy: + matrix: + arch: [ 'aarch64', 'armv6', 'armv7' ] + + steps: + - uses: actions/checkout@v2.1.0 + - uses: ammaraskar/gcc-problem-matcher@master + - name: Setup cache + uses: actions/cache@v2 + with: + path: | + ~/.ccache + key: lvgl_ci_cross_test_ccache_${{ matrix.arch }}_${{ github.sha }} + restore-keys: | + lvgl_ci_cross_test_ccache_${{ matrix.arch }} + - uses: uraimo/run-on-arch-action@v2.1.1 + name: Run tests + id: build + with: + arch: ${{ matrix.arch }} + distro: bullseye + + # Not required, but speeds up builds + githubToken: ${{ github.token }} + + # The shell to run commands with in the container + shell: /bin/bash + + # Create cached/volume directories on host + setup: | + mkdir -p ~/.ccache + + # Mount cached directories in the container for faster builds + dockerRunArgs: | + --volume "${HOME}/.ccache:/root/.ccache" + + install: | + apt-get update -y + apt-get install build-essential ccache python3 libpng-dev ruby-full gcovr cmake -q -y + /usr/sbin/update-ccache-symlinks + echo 'export PATH="/usr/lib/ccache:$PATH"' | tee -a ~/.bashrc + + run: | + if [[ "${{ matrix.distro }}" == "ubuntu22.04" ]]; then + # ASan in llvm 14 provided in ubuntu-22.04 is incompatible with + # high-entropy ASLR configured in much newer kernels that GitHub + # runners are using leading to random crashes: + # https://github.com/actions/runner-images/issues/9491 + # can remove this once the issue is fixed. + sysctl -w vm.mmap_rnd_bits=28 + fi + env PATH="/usr/lib/ccache:$PATH" ASAN_OPTIONS=detect_leaks=0 python3 tests/main.py test diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/.github/workflows/check_conf.yml b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/.github/workflows/check_conf.yml new file mode 100644 index 0000000..4222370 --- /dev/null +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/.github/workflows/check_conf.yml @@ -0,0 +1,24 @@ +name: Verify that lv_conf_internal.h matches repository state +on: + push: + pull_request: + +jobs: + verify-conf-internal: + if: ${{ github.event_name != 'pull_request' || github.repository != github.event.pull_request.head.repo.full_name }} + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v2 + with: + persist-credentials: false + fetch-depth: 0 + - name: Setup Python + uses: actions/setup-python@v1 + with: + python-version: 3.7 + - name: Generate lv_conf_internal.h + run: python lv_conf_internal_gen.py + working-directory: scripts + - name: Check that repository is clean + run: git diff --exit-code >/dev/null 2>&1 || (echo "Please regenerate lv_conf_internal.h using scripts/lv_conf_internal_gen.py"; false) diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/.github/workflows/check_style.yml b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/.github/workflows/check_style.yml new file mode 100644 index 0000000..4a11bf0 --- /dev/null +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/.github/workflows/check_style.yml @@ -0,0 +1,37 @@ +name: Verify code formatting +on: + push: + pull_request: + +jobs: + verify-formatting: + if: ${{ github.event_name != 'pull_request' || github.repository != github.event.pull_request.head.repo.full_name }} + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + persist-credentials: false + fetch-depth: 0 + - name: Checkout astyle + uses: actions/checkout@v4 + with: + repository: lvgl/astyle + path: astyle + - name: Install astyle + run: | + cd astyle/build/gcc/ + make + sudo make install + astyle --version + - name: Format code + run: python code-format.py + working-directory: scripts + - name: Check that repository is clean + shell: bash + run: | + set -o pipefail + if ! (git diff --exit-code --color=always | tee /tmp/lvgl_diff.patch); then + echo "Please apply the preceding diff to your code or run scripts/code-format.py" + exit 1 + fi diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/.github/workflows/close_old_issues.yml b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/.github/workflows/close_old_issues.yml new file mode 100644 index 0000000..7c9d16e --- /dev/null +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/.github/workflows/close_old_issues.yml @@ -0,0 +1,29 @@ +name: 'Close stale issues and PRs' +on: + schedule: + - cron: '30 1 * * *' + workflow_dispatch: + +jobs: + stale: + if: github.repository == 'lvgl/lvgl' + runs-on: ubuntu-latest + steps: + - uses: actions/stale@v5 + with: + repo-token: ${{ secrets.LVGL_BOT_TOKEN }} + stale-issue-message: 'This issue is stale because it has been open 14 days with no activity. Remove stale label or comment or this will be closed in 7 days.' + stale-pr-message: | + We need some feedback on this issue. + + Now we mark this as "stale" because there was no activity here for 14 days. + + Remove the "stale" label or comment else this will be closed in 7 days. + close-issue-message: | + As there was no activity here for a while we close this issue. But don't worry, the conversation is still here and you can get back to it at any time. + + So feel free to comment if you have remarks or ideas on this topic. + days-before-stale: 14 + days-before-close: 7 + exempt-issue-labels: 'pinned' + exempt-pr-labels: 'pinned' diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/.github/workflows/compile_docs.yml b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/.github/workflows/compile_docs.yml new file mode 100644 index 0000000..8e72188 --- /dev/null +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/.github/workflows/compile_docs.yml @@ -0,0 +1,93 @@ +name: Build docs +on: + push: + branches: + - master + - 'release/*' +env: + EM_VERSION: 2.0.4 + EM_CACHE_FOLDER: 'emsdk-cache' +jobs: + build-and-deploy: + if: github.repository == 'lvgl/lvgl' + runs-on: ubuntu-latest + concurrency: docs-build-and-deploy + steps: + - name: Checkout + uses: actions/checkout@v2 + with: + persist-credentials: false + fetch-depth: 0 + - name: Setup Python + uses: actions/setup-python@v1 + with: + python-version: 3.7 + - name: Cache Python packages + uses: actions/cache@v2 + with: + # Cache the Python package environment, excluding pip and setuptools installed by setup-python + path: | + ~/.cache/pip + ${{ env.pythonLocation }}/bin/* + ${{ env.pythonLocation }}/include + ${{ env.pythonLocation }}/lib/python*/site-packages/* + !${{ env.pythonLocation }}/bin/pip* + !${{ env.pythonLocation }}/lib/python*/site-packages/pip* + !${{ env.pythonLocation }}/lib/python*/site-packages/setuptools* + key: ${{ env.pythonLocation }}-${{ hashFiles('docs/requirements.txt') }} + - name: Install Doxygen and Latex dependencies + run: | + sudo apt-get update + sudo apt-get install doxygen texlive-xetex texlive-binaries texlive-lang-english latexmk fonts-freefont-otf + - name: Install requirements + run: | + pip install -r docs/requirements.txt + - name: Setup Emscripten cache + id: cache-system-libraries + uses: actions/cache@v2 + with: + path: ${{env.EM_CACHE_FOLDER}} + key: ${{env.EM_VERSION}}-${{ runner.os }} + - uses: mymindstorm/setup-emsdk@v9 + with: + version: ${{env.EM_VERSION}} + actions-cache-folder: ${{env.EM_CACHE_FOLDER}} + - name: ccache + uses: hendrikmuhs/ccache-action@v1 + - name: Build examples (with cache) + run: scripts/build_html_examples.sh + - name: Build docs + run: docs/build.py + - name: Remove .doctrees + run: rm -rf out_html/.doctrees + - name: Retrieve version + run: | + echo "::set-output name=VERSION_NAME::$(scripts/find_version.sh)" + id: version + - name: Deploy to subfolder + uses: JamesIves/github-pages-deploy-action@3.7.1 + with: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + ACCESS_TOKEN: ${{ secrets.LVGL_BOT_TOKEN }} + REPOSITORY_NAME: lvgl/docs + BRANCH: gh-pages # The branch the action should deploy to. + FOLDER: out_html # The folder the action should deploy. + TARGET_FOLDER: ${{ steps.version.outputs.VERSION_NAME }} + GIT_CONFIG_NAME: lvgl-bot + GIT_CONFIG_EMAIL: lvgl-bot@users.noreply.github.com + PRESERVE: true + SINGLE_COMMIT: true + - name: Deploy to master + if: github.ref == 'refs/heads/master' + uses: JamesIves/github-pages-deploy-action@3.7.1 + with: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + ACCESS_TOKEN: ${{ secrets.LVGL_BOT_TOKEN }} + REPOSITORY_NAME: lvgl/docs + BRANCH: gh-pages # The branch the action should deploy to. + FOLDER: out_html # The folder the action should deploy. + TARGET_FOLDER: master + GIT_CONFIG_NAME: lvgl-bot + GIT_CONFIG_EMAIL: lvgl-bot@users.noreply.github.com + PRESERVE: true + SINGLE_COMMIT: true diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/.github/workflows/esp_upload_component.yml b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/.github/workflows/esp_upload_component.yml new file mode 100644 index 0000000..08edfe2 --- /dev/null +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/.github/workflows/esp_upload_component.yml @@ -0,0 +1,23 @@ +name: Push LVGL release to Espressif Component Service + +# If the commit is tagged, it will be uploaded. Other scenario silently fail. +on: + push: + tags: + - v* + +jobs: + upload_components: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + with: + submodules: "recursive" + + - name: Upload component to component registry + uses: espressif/upload-components-ci-action@v1 + with: + name: "lvgl" + version: ${{ github.ref_name }} + namespace: "lvgl" + api_token: ${{ secrets.ESP_IDF_COMPONENT_API_TOKEN }} diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/.github/workflows/main.yml b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/.github/workflows/main.yml new file mode 100644 index 0000000..9c4fc30 --- /dev/null +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/.github/workflows/main.yml @@ -0,0 +1,16 @@ +on: + issues: + types: [opened, edited] + +jobs: + auto_close_issues: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v1 + - name: Automatically close issues that don't follow the issue template + uses: lucasbento/auto-close-issues@v1.0.2 + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + issue-close-message: "@${issue.user.login}: hello! :wave:\n\nThis issue is being automatically closed because it does not follow the issue template." # optional property + closed-issues-label: "not-template" diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/.github/workflows/makefile.yml b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/.github/workflows/makefile.yml new file mode 100644 index 0000000..39a9a13 --- /dev/null +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/.github/workflows/makefile.yml @@ -0,0 +1,21 @@ +name: Check Makefile + +on: + push: + branches: [ master, release/v8.* ] + pull_request: + branches: [ master, release/v8.* ] + +jobs: + build: + if: ${{ github.event_name != 'pull_request' || github.repository != github.event.pull_request.head.repo.full_name }} + runs-on: ubuntu-latest + name: Build using Makefile + steps: + - uses: actions/checkout@v2 + - uses: ammaraskar/gcc-problem-matcher@master + - name: Install prerequisites + run: scripts/install-prerequisites.sh + - name: Build + working-directory: tests/makefile + run: make test_file diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/.github/workflows/release.yml b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/.github/workflows/release.yml new file mode 100644 index 0000000..cf1d69a --- /dev/null +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/.github/workflows/release.yml @@ -0,0 +1,27 @@ +on: + push: + # Sequence of patterns matched against refs/tags + tags: + - "v[0-9]+.[0-9]+.[0-9]+" # Push events to matching v*, i.e. v1.0, v20.15.10 + +name: Create Release + +jobs: + build: + name: Create Release + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v2 + - name: Create Release + id: create_release + uses: actions/create-release@v1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # This token is provided by Actions, you do not need to create your own token + with: + tag_name: ${{ github.ref }} + release_name: Release ${{ github.ref }} + body: | + See the [CHANGELOG](https://github.com/lvgl/lvgl/blob/master/docs/CHANGELOG.md) + draft: false + prerelease: false diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/.gitignore b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/.gitignore similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/.gitignore rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/.gitignore diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/.pre-commit-config.yaml b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/.pre-commit-config.yaml similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/.pre-commit-config.yaml rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/.pre-commit-config.yaml diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/CMakeLists.txt b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/CMakeLists.txt similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/CMakeLists.txt rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/CMakeLists.txt diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/Kconfig b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/Kconfig similarity index 97% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/Kconfig rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/Kconfig index 8940464..ccbbc7b 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/Kconfig +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/Kconfig @@ -1,4 +1,4 @@ -# Kconfig file for LVGL v8.0 +# Kconfig file for LVGL v8.4 menu "LVGL configuration" @@ -228,6 +228,16 @@ menu "LVGL configuration" Must be defined to include path of CMSIS header of target processor e.g. "stm32f769xx.h" or "stm32f429xx.h" + config LV_USE_GPU_RA6M3_G2D + bool "Enable RA6M3 G2D GPU." + config LV_GPU_RA6M3_G2D_INCLUDE + string "include path of target processor" + depends on LV_USE_GPU_RA6M3_G2D + default "hal_data.h" + help + Must be defined to include path of target processor + e.g. "hal_data.h" + config LV_USE_GPU_SWM341_DMA2D bool "Enable SWM341 DMA2D GPU." config LV_GPU_SWM341_DMA2D_INCLUDE @@ -911,7 +921,8 @@ menu "LVGL configuration" string "Set the working directory" depends on LV_USE_FS_STDIO config LV_FS_STDIO_CACHE_SIZE - string ">0 to cache this number of bytes in lv_fs_read()" + int ">0 to cache this number of bytes in lv_fs_read()" + default 0 depends on LV_USE_FS_STDIO config LV_USE_FS_POSIX @@ -953,6 +964,17 @@ menu "LVGL configuration" default 0 depends on LV_USE_FS_FATFS + config LV_USE_FS_LITTLEFS + bool "File system on top of LittleFS" + config LV_FS_LITTLEFS_LETTER + int "Set an upper cased letter on which the drive will accessible (e.g. 'A' i.e. 65)" + default 0 + depends on LV_USE_FS_LITTLEFS + config LV_FS_LITTLEFS_CACHE_SIZE + int ">0 to cache this number of bytes in lv_fs_read()" + default 0 + depends on LV_USE_FS_LITTLEFS + config LV_USE_PNG bool "PNG decoder library" @@ -989,6 +1011,13 @@ menu "LVGL configuration" endmenu endif + config LV_USE_TINY_TTF + bool "Tiny TTF library" + config LV_TINY_TTF_FILE_SUPPORT + bool "Load TTF data from files" + depends on LV_USE_TINY_TTF + default n + config LV_USE_RLOTTIE bool "Lottie library" diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/LICENCE.txt b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/LICENCE.txt similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/LICENCE.txt rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/LICENCE.txt diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/Makefile b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/Makefile similarity index 67% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/Makefile rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/Makefile index 49835d8..b1a4592 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/Makefile +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/Makefile @@ -2,8 +2,8 @@ TOP_DIR = ../.. sinclude $(TOP_DIR)/tools/w800/conf.mk ifndef PDIR -GEN_LIBS = liblvglv8_3$(LIB_EXT) -COMPONENTS_liblvglv8_3 = src/liblvglsrc$(LIB_EXT) \ +GEN_LIBS = liblvglv8_4$(LIB_EXT) +COMPONENTS_liblvglv8_4 = src/liblvglsrc$(LIB_EXT) \ demos/liblvgldemos$(LIB_EXT) endif diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/README.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/README.md similarity index 99% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/README.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/README.md index aea07a8..256b964 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/README.md +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/README.md @@ -16,10 +16,8 @@ LVGL provides everything you need to create an embedded GUI with easy-to-use gra Interactive examples - **English** | [中文](./README_zh.md) | [Português do Brasil](./README_pt_BR.md) - --- #### Table of content diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/README_pt_BR.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/README_pt_BR.md similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/README_pt_BR.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/README_pt_BR.md diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/README_zh.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/README_zh.md similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/README_zh.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/README_zh.md diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/SConscript b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/SConscript similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/SConscript rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/SConscript diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/component.mk b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/component.mk similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/component.mk rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/component.mk diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/Makefile b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/Makefile similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/Makefile rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/Makefile diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/README.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/README.md similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/README.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/README.md diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/benchmark/Makefile b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/benchmark/Makefile similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/benchmark/Makefile rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/benchmark/Makefile diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/benchmark/README.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/benchmark/README.md similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/benchmark/README.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/benchmark/README.md diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/benchmark/assets/Makefile b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/benchmark/assets/Makefile similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/benchmark/assets/Makefile rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/benchmark/assets/Makefile diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/benchmark/assets/img_benchmark_cogwheel_alpha16.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/benchmark/assets/img_benchmark_cogwheel_alpha16.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/benchmark/assets/img_benchmark_cogwheel_alpha16.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/benchmark/assets/img_benchmark_cogwheel_alpha16.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/benchmark/assets/img_benchmark_cogwheel_argb.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/benchmark/assets/img_benchmark_cogwheel_argb.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/benchmark/assets/img_benchmark_cogwheel_argb.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/benchmark/assets/img_benchmark_cogwheel_argb.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/benchmark/assets/img_benchmark_cogwheel_chroma_keyed.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/benchmark/assets/img_benchmark_cogwheel_chroma_keyed.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/benchmark/assets/img_benchmark_cogwheel_chroma_keyed.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/benchmark/assets/img_benchmark_cogwheel_chroma_keyed.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/benchmark/assets/img_benchmark_cogwheel_indexed16.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/benchmark/assets/img_benchmark_cogwheel_indexed16.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/benchmark/assets/img_benchmark_cogwheel_indexed16.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/benchmark/assets/img_benchmark_cogwheel_indexed16.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/benchmark/assets/img_benchmark_cogwheel_rgb.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/benchmark/assets/img_benchmark_cogwheel_rgb.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/benchmark/assets/img_benchmark_cogwheel_rgb.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/benchmark/assets/img_benchmark_cogwheel_rgb.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/benchmark/assets/img_benchmark_cogwheel_rgb565a8.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/benchmark/assets/img_benchmark_cogwheel_rgb565a8.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/benchmark/assets/img_benchmark_cogwheel_rgb565a8.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/benchmark/assets/img_benchmark_cogwheel_rgb565a8.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/benchmark/assets/img_cogwheel_argb.png b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/benchmark/assets/img_cogwheel_argb.png similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/benchmark/assets/img_cogwheel_argb.png rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/benchmark/assets/img_cogwheel_argb.png diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/benchmark/assets/img_cogwheel_chroma_keyed.png b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/benchmark/assets/img_cogwheel_chroma_keyed.png similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/benchmark/assets/img_cogwheel_chroma_keyed.png rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/benchmark/assets/img_cogwheel_chroma_keyed.png diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/benchmark/assets/img_cogwheel_indexed16.png b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/benchmark/assets/img_cogwheel_indexed16.png similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/benchmark/assets/img_cogwheel_indexed16.png rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/benchmark/assets/img_cogwheel_indexed16.png diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/benchmark/assets/img_cogwheel_rgb.png b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/benchmark/assets/img_cogwheel_rgb.png similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/benchmark/assets/img_cogwheel_rgb.png rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/benchmark/assets/img_cogwheel_rgb.png diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/benchmark/assets/lv_font_bechmark_montserrat_12_compr_az.c.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/benchmark/assets/lv_font_bechmark_montserrat_12_compr_az.c.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/benchmark/assets/lv_font_bechmark_montserrat_12_compr_az.c.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/benchmark/assets/lv_font_bechmark_montserrat_12_compr_az.c.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/benchmark/assets/lv_font_bechmark_montserrat_16_compr_az.c.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/benchmark/assets/lv_font_bechmark_montserrat_16_compr_az.c.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/benchmark/assets/lv_font_bechmark_montserrat_16_compr_az.c.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/benchmark/assets/lv_font_bechmark_montserrat_16_compr_az.c.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/benchmark/assets/lv_font_bechmark_montserrat_28_compr_az.c.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/benchmark/assets/lv_font_bechmark_montserrat_28_compr_az.c.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/benchmark/assets/lv_font_bechmark_montserrat_28_compr_az.c.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/benchmark/assets/lv_font_bechmark_montserrat_28_compr_az.c.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/benchmark/lv_demo_benchmark.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/benchmark/lv_demo_benchmark.c similarity index 97% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/benchmark/lv_demo_benchmark.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/benchmark/lv_demo_benchmark.c index cb7d863..76047f3 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/benchmark/lv_demo_benchmark.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/benchmark/lv_demo_benchmark.c @@ -89,7 +89,7 @@ LV_FONT_DECLARE(lv_font_benchmark_montserrat_16_compr_az); LV_FONT_DECLARE(lv_font_benchmark_montserrat_28_compr_az); static void monitor_cb(lv_disp_drv_t * drv, uint32_t time, uint32_t px); -static void scene_next_task_cb(lv_timer_t * timer); +static void next_scene_timer_cb(lv_timer_t * timer); static void rect_create(lv_style_t * style); static void img_create(lv_style_t * style, const void * src, bool rotate, bool zoom, bool aa); static void txt_create(lv_style_t * style); @@ -226,7 +226,6 @@ static void shadow_small_ofs_cb(void) rect_create(&style_common); } - static void shadow_large_cb(void) { lv_style_reset(&style_common); @@ -250,7 +249,6 @@ static void shadow_large_ofs_cb(void) rect_create(&style_common); } - static void img_rgb_cb(void) { lv_style_reset(&style_common); @@ -293,7 +291,6 @@ static void img_alpha_cb(void) img_create(&style_common, &img_benchmark_cogwheel_alpha16, false, false, false); } - static void img_rgb_recolor_cb(void) { lv_style_reset(&style_common); @@ -382,7 +379,6 @@ static void img_rgb_zoom_aa_cb(void) lv_style_set_img_opa(&style_common, opa_mode ? LV_OPA_50 : LV_OPA_COVER); img_create(&style_common, &img_benchmark_cogwheel_rgb, false, true, true); - } static void img_argb_zoom_cb(void) @@ -396,7 +392,6 @@ static void img_argb_zoom_cb(void) #endif } - static void img_argb_zoom_aa_cb(void) { lv_style_reset(&style_common); @@ -462,7 +457,6 @@ static void txt_large_compr_cb(void) } - static void line_cb(void) { lv_style_reset(&style_common); @@ -490,7 +484,6 @@ static void arc_thick_cb(void) } - static void sub_rectangle_cb(void) { lv_style_reset(&style_common); @@ -563,8 +556,6 @@ static void sub_text_cb(void) txt_create(&style_common); } - - /********************** * STATIC VARIABLES **********************/ @@ -636,7 +627,7 @@ static lv_obj_t * scene_bg; static lv_obj_t * title; static lv_obj_t * subtitle; static uint32_t rnd_act; - +static lv_timer_t * next_scene_timer; static const uint32_t rnd_map[] = { 0xbd13204f, 0x67d8167f, 0x20211c99, 0xb0a7cc05, @@ -702,15 +693,26 @@ static void benchmark_init(void) lv_obj_update_layout(scr); } - void lv_demo_benchmark(void) { benchmark_init(); /*Manually start scenes*/ - scene_next_task_cb(NULL); + next_scene_timer_cb(NULL); } +void lv_demo_benchmark_close(void) +{ + if(next_scene_timer) lv_timer_del(next_scene_timer); + next_scene_timer = NULL; + + lv_anim_del(NULL, NULL); + + lv_style_reset(&style_common); + + lv_obj_clean(lv_scr_act()); + +} void lv_demo_benchmark_run_scene(int_fast16_t scene_no) { @@ -725,8 +727,8 @@ void lv_demo_benchmark_run_scene(int_fast16_t scene_no) scene_act = scene_no >> 1; if(scenes[scene_act].create_cb) { - lv_label_set_text_fmt(title, "%"LV_PRId32"/"LV_PRId32": %s%s", scene_act * 2 + (opa_mode ? 1 : 0), - (int)(dimof(scenes) * 2) - 2, + lv_label_set_text_fmt(title, "%"LV_PRId32"/%"LV_PRId32": %s%s", scene_act * 2 + (opa_mode ? 1 : 0), + (int32_t)(dimof(scenes) * 2) - 2, scenes[scene_act].name, opa_mode ? " + opa" : ""); lv_label_set_text(subtitle, ""); @@ -738,7 +740,6 @@ void lv_demo_benchmark_run_scene(int_fast16_t scene_no) } } - void lv_demo_benchmark_set_finished_cb(finished_cb_t * finished_cb) { benchmark_finished_cb = finished_cb; @@ -787,7 +788,6 @@ static void generate_report(void) weight_opa_sum += w; } - fps_sum = fps_normal_sum + fps_opa_sum; weight_sum = weight_normal_sum + weight_opa_sum; @@ -804,7 +804,6 @@ static void generate_report(void) lv_obj_clean(lv_scr_act()); scene_bg = NULL; - lv_obj_set_flex_flow(lv_scr_act(), LV_FLEX_FLOW_COLUMN); title = lv_label_create(lv_scr_act()); @@ -840,7 +839,6 @@ static void generate_report(void) // lv_obj_add_style(table, LV_TABLE_PART_CELL3, &style_cell_very_slow); // lv_obj_add_style(table, LV_TABLE_PART_CELL4, &style_cell_title); - uint16_t row = 0; lv_table_add_cell_ctrl(table, row, 0, LV_TABLE_CELL_CTRL_MERGE_RIGHT); lv_table_set_cell_value(table, row, 0, "Slow but common cases"); @@ -927,7 +925,6 @@ static void generate_report(void) lv_snprintf(buf, sizeof(buf), "%"LV_PRIu32, scenes[i].fps_opa); lv_table_set_cell_value(table, row, 1, buf); - if(scenes[i].fps_opa < 10) { // lv_table_set_cell_type(table, row, 0, 3); // lv_table_set_cell_type(table, row, 1, 3); @@ -973,11 +970,13 @@ static void report_cb(lv_timer_t * timer) } } -static void scene_next_task_cb(lv_timer_t * timer) +static void next_scene_timer_cb(lv_timer_t * timer) { LV_UNUSED(timer); lv_obj_clean(scene_bg); + next_scene_timer = NULL; + if(opa_mode) { if(scene_act >= 0) { if(scenes[scene_act].time_sum_opa == 0) scenes[scene_act].time_sum_opa = 1; @@ -996,8 +995,8 @@ static void scene_next_task_cb(lv_timer_t * timer) } if(scenes[scene_act].create_cb) { - lv_label_set_text_fmt(title, "%"LV_PRId32"/"LV_PRId32": %s%s", scene_act * 2 + (opa_mode ? 1 : 0), - (int)(dimof(scenes) * 2) - 2, scenes[scene_act].name, opa_mode ? " + opa" : ""); + lv_label_set_text_fmt(title, "%"LV_PRId32"/%"LV_PRId32": %s%s", scene_act * 2 + (opa_mode ? 1 : 0), + (int32_t)(dimof(scenes) * 2) - 2, scenes[scene_act].name, opa_mode ? " + opa" : ""); if(opa_mode) { lv_label_set_text_fmt(subtitle, "Result of \"%s\": %"LV_PRId32" FPS", scenes[scene_act].name, scenes[scene_act].fps_normal); @@ -1014,8 +1013,8 @@ static void scene_next_task_cb(lv_timer_t * timer) rnd_reset(); scenes[scene_act].create_cb(); - lv_timer_t * t = lv_timer_create(scene_next_task_cb, SCENE_TIME, NULL); - lv_timer_set_repeat_count(t, 1); + next_scene_timer = lv_timer_create(next_scene_timer_cb, SCENE_TIME, NULL); + lv_timer_set_repeat_count(next_scene_timer, 1); } /*Ready*/ @@ -1037,7 +1036,6 @@ static void scene_next_task_cb(lv_timer_t * timer) } } - static void rect_create(lv_style_t * style) { uint32_t i; @@ -1055,7 +1053,6 @@ static void rect_create(lv_style_t * style) } } - static void img_create(lv_style_t * style, const void * src, bool rotate, bool zoom, bool aa) { uint32_t i; @@ -1074,7 +1071,6 @@ static void img_create(lv_style_t * style, const void * src, bool rotate, bool z } } - static void txt_create(lv_style_t * style) { uint32_t i; @@ -1090,7 +1086,6 @@ static void txt_create(lv_style_t * style) } } - static void line_create(lv_style_t * style) { static lv_point_t points[OBJ_NUM][LINE_POINT_NUM]; @@ -1105,7 +1100,6 @@ static void line_create(lv_style_t * style) points[i][j].y = rnd_next(LINE_POINT_DIFF_MIN, LINE_POINT_DIFF_MAX); } - lv_obj_t * obj = lv_line_create(scene_bg); lv_obj_remove_style_all(obj); lv_obj_add_style(obj, style, 0); @@ -1118,7 +1112,6 @@ static void line_create(lv_style_t * style) } } - static void arc_anim_end_angle_cb(void * var, int32_t v) { lv_arc_set_end_angle(var, v); @@ -1152,7 +1145,6 @@ static void arc_create(lv_style_t * style) } } - static void fall_anim_y_cb(void * var, int32_t v) { lv_obj_set_y(var, v); diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/benchmark/lv_demo_benchmark.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/benchmark/lv_demo_benchmark.h similarity index 96% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/benchmark/lv_demo_benchmark.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/benchmark/lv_demo_benchmark.h index 6a0a4f6..693861e 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/benchmark/lv_demo_benchmark.h +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/benchmark/lv_demo_benchmark.h @@ -24,12 +24,13 @@ extern "C" { **********************/ typedef void finished_cb_t(void); - /********************** * GLOBAL PROTOTYPES **********************/ void lv_demo_benchmark(void); +void lv_demo_benchmark_close(void); + void lv_demo_benchmark_run_scene(int_fast16_t scene_no); void lv_demo_benchmark_set_finished_cb(finished_cb_t * finished_cb); diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/benchmark/screenshot1.png b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/benchmark/screenshot1.png similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/benchmark/screenshot1.png rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/benchmark/screenshot1.png diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/benchmark/screenshot2.png b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/benchmark/screenshot2.png similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/benchmark/screenshot2.png rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/benchmark/screenshot2.png diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/keypad_encoder/README.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/keypad_encoder/README.md similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/keypad_encoder/README.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/keypad_encoder/README.md diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/keypad_encoder/lv_demo_keypad_encoder.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/keypad_encoder/lv_demo_keypad_encoder.c similarity index 96% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/keypad_encoder/lv_demo_keypad_encoder.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/keypad_encoder/lv_demo_keypad_encoder.c index fdb9b94..0f4006e 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/keypad_encoder/lv_demo_keypad_encoder.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/keypad_encoder/lv_demo_keypad_encoder.c @@ -46,8 +46,11 @@ static lv_obj_t * t2; void lv_demo_keypad_encoder(void) { - g = lv_group_create(); - lv_group_set_default(g); + g = lv_group_get_default(); + if(g == NULL) { + g = lv_group_create(); + lv_group_set_default(g); + } lv_indev_t * cur_drv = NULL; for(;;) { @@ -76,6 +79,12 @@ void lv_demo_keypad_encoder(void) msgbox_create(); } +void lv_demo_keypad_encoder_close(void) +{ + lv_obj_clean(lv_scr_act()); + lv_obj_clean(lv_layer_top()); +} + /********************** * STATIC FUNCTIONS **********************/ diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/keypad_encoder/lv_demo_keypad_encoder.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/keypad_encoder/lv_demo_keypad_encoder.h similarity index 93% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/keypad_encoder/lv_demo_keypad_encoder.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/keypad_encoder/lv_demo_keypad_encoder.h index c509d66..1916670 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/keypad_encoder/lv_demo_keypad_encoder.h +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/keypad_encoder/lv_demo_keypad_encoder.h @@ -27,6 +27,7 @@ extern "C" { * GLOBAL PROTOTYPES **********************/ void lv_demo_keypad_encoder(void); +void lv_demo_keypad_encoder_close(void); /********************** * MACROS diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/keypad_encoder/screenshot1.gif b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/keypad_encoder/screenshot1.gif similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/keypad_encoder/screenshot1.gif rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/keypad_encoder/screenshot1.gif diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/keypad_encoder/screenshot1.png b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/keypad_encoder/screenshot1.png similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/keypad_encoder/screenshot1.png rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/keypad_encoder/screenshot1.png diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/lv_demos.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/lv_demos.h similarity index 99% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/lv_demos.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/lv_demos.h index 46053e1..1a45ddc 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/lv_demos.h +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/lv_demos.h @@ -47,7 +47,6 @@ extern "C" { * GLOBAL PROTOTYPES **********************/ - /********************** * MACROS **********************/ diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/lv_demos.mk b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/lv_demos.mk similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/lv_demos.mk rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/lv_demos.mk diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/README.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/README.md similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/README.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/README.md diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/272_png/btn_list_pause.png b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/272_png/btn_list_pause.png new file mode 100644 index 0000000..6dc4dc7 Binary files /dev/null and b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/272_png/btn_list_pause.png differ diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/272_png/btn_list_play.png b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/272_png/btn_list_play.png new file mode 100644 index 0000000..4471fb9 Binary files /dev/null and b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/272_png/btn_list_play.png differ diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/272_png/btn_loop.png b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/272_png/btn_loop.png new file mode 100644 index 0000000..7e011d5 Binary files /dev/null and b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/272_png/btn_loop.png differ diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/272_png/btn_next.png b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/272_png/btn_next.png new file mode 100644 index 0000000..ce8871e Binary files /dev/null and b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/272_png/btn_next.png differ diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/272_png/btn_pause.png b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/272_png/btn_pause.png new file mode 100644 index 0000000..ea6862b Binary files /dev/null and b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/272_png/btn_pause.png differ diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/272_png/btn_play.png b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/272_png/btn_play.png new file mode 100644 index 0000000..d2ae553 Binary files /dev/null and b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/272_png/btn_play.png differ diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/272_png/btn_prev.png b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/272_png/btn_prev.png new file mode 100644 index 0000000..d3f52fd Binary files /dev/null and b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/272_png/btn_prev.png differ diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/272_png/btn_rnd.png b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/272_png/btn_rnd.png new file mode 100644 index 0000000..5fbeb92 Binary files /dev/null and b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/272_png/btn_rnd.png differ diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/272_png/corner_1.png b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/272_png/corner_1.png new file mode 100644 index 0000000..96cb8b8 Binary files /dev/null and b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/272_png/corner_1.png differ diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/272_png/corner_2.png b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/272_png/corner_2.png new file mode 100644 index 0000000..60ead9f Binary files /dev/null and b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/272_png/corner_2.png differ diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/272_png/cover_1.png b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/272_png/cover_1.png new file mode 100644 index 0000000..0793bd3 Binary files /dev/null and b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/272_png/cover_1.png differ diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/272_png/cover_2.png b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/272_png/cover_2.png new file mode 100644 index 0000000..4afb8a7 Binary files /dev/null and b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/272_png/cover_2.png differ diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/272_png/cover_3.png b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/272_png/cover_3.png new file mode 100644 index 0000000..27aa756 Binary files /dev/null and b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/272_png/cover_3.png differ diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/272_png/icn_chart.png b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/272_png/icn_chart.png new file mode 100644 index 0000000..e2c3a0e Binary files /dev/null and b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/272_png/icn_chart.png differ diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/272_png/icn_chat.png b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/272_png/icn_chat.png new file mode 100644 index 0000000..e0cad5b Binary files /dev/null and b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/272_png/icn_chat.png differ diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/272_png/icn_download.png b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/272_png/icn_download.png new file mode 100644 index 0000000..6eeb1da Binary files /dev/null and b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/272_png/icn_download.png differ diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/272_png/icn_heart.png b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/272_png/icn_heart.png new file mode 100644 index 0000000..9f0a770 Binary files /dev/null and b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/272_png/icn_heart.png differ diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/272_png/icn_slider.png b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/272_png/icn_slider.png new file mode 100644 index 0000000..f99ba3a Binary files /dev/null and b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/272_png/icn_slider.png differ diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/272_png/list_border.png b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/272_png/list_border.png new file mode 100644 index 0000000..42885f5 Binary files /dev/null and b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/272_png/list_border.png differ diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/272_png/wave_bottom.png b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/272_png/wave_bottom.png new file mode 100644 index 0000000..2c24009 Binary files /dev/null and b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/272_png/wave_bottom.png differ diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/272_png/wave_top.png b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/272_png/wave_top.png new file mode 100644 index 0000000..463dfaa Binary files /dev/null and b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/272_png/wave_top.png differ diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/480_png/btn_list_pause.png b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/480_png/btn_list_pause.png new file mode 100644 index 0000000..550723c Binary files /dev/null and b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/480_png/btn_list_pause.png differ diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/480_png/btn_list_play.png b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/480_png/btn_list_play.png new file mode 100644 index 0000000..736adf6 Binary files /dev/null and b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/480_png/btn_list_play.png differ diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/480_png/btn_loop.png b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/480_png/btn_loop.png new file mode 100644 index 0000000..55fc201 Binary files /dev/null and b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/480_png/btn_loop.png differ diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/480_png/btn_next.png b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/480_png/btn_next.png new file mode 100644 index 0000000..bcf5af6 Binary files /dev/null and b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/480_png/btn_next.png differ diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/480_png/btn_pause.png b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/480_png/btn_pause.png new file mode 100644 index 0000000..937a0ee Binary files /dev/null and b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/480_png/btn_pause.png differ diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/480_png/btn_play.png b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/480_png/btn_play.png new file mode 100644 index 0000000..d26e1ed Binary files /dev/null and b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/480_png/btn_play.png differ diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/480_png/btn_prev.png b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/480_png/btn_prev.png new file mode 100644 index 0000000..ff33ae4 Binary files /dev/null and b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/480_png/btn_prev.png differ diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/480_png/btn_rnd.png b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/480_png/btn_rnd.png new file mode 100644 index 0000000..a533225 Binary files /dev/null and b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/480_png/btn_rnd.png differ diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/480_png/corner_1.png b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/480_png/corner_1.png new file mode 100644 index 0000000..46f8427 Binary files /dev/null and b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/480_png/corner_1.png differ diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/480_png/corner_2.png b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/480_png/corner_2.png new file mode 100644 index 0000000..d8686ff Binary files /dev/null and b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/480_png/corner_2.png differ diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/480_png/cover_1.png b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/480_png/cover_1.png new file mode 100644 index 0000000..b964685 Binary files /dev/null and b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/480_png/cover_1.png differ diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/480_png/cover_2.png b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/480_png/cover_2.png new file mode 100644 index 0000000..a0092d0 Binary files /dev/null and b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/480_png/cover_2.png differ diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/480_png/cover_3.png b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/480_png/cover_3.png new file mode 100644 index 0000000..f6a3592 Binary files /dev/null and b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/480_png/cover_3.png differ diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/480_png/icn_chart.png b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/480_png/icn_chart.png new file mode 100644 index 0000000..f8488dd Binary files /dev/null and b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/480_png/icn_chart.png differ diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/480_png/icn_chat.png b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/480_png/icn_chat.png new file mode 100644 index 0000000..c1311bf Binary files /dev/null and b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/480_png/icn_chat.png differ diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/480_png/icn_download.png b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/480_png/icn_download.png new file mode 100644 index 0000000..1f4bcfd Binary files /dev/null and b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/480_png/icn_download.png differ diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/480_png/icn_heart.png b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/480_png/icn_heart.png new file mode 100644 index 0000000..85e4f59 Binary files /dev/null and b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/480_png/icn_heart.png differ diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/480_png/icn_slider.png b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/480_png/icn_slider.png new file mode 100644 index 0000000..78d0ca0 Binary files /dev/null and b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/480_png/icn_slider.png differ diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/480_png/list_border.png b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/480_png/list_border.png new file mode 100644 index 0000000..655257c Binary files /dev/null and b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/480_png/list_border.png differ diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/480_png/wave_bottom.png b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/480_png/wave_bottom.png new file mode 100644 index 0000000..b40934f Binary files /dev/null and b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/480_png/wave_bottom.png differ diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/480_png/wave_top.png b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/480_png/wave_top.png new file mode 100644 index 0000000..1f93cea Binary files /dev/null and b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/480_png/wave_top.png differ diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_btn_corner_large.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/img_lv_demo_music_btn_corner_large.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_btn_corner_large.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/img_lv_demo_music_btn_corner_large.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_btn_list_pause.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/img_lv_demo_music_btn_list_pause.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_btn_list_pause.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/img_lv_demo_music_btn_list_pause.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_btn_list_pause_large.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/img_lv_demo_music_btn_list_pause_large.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_btn_list_pause_large.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/img_lv_demo_music_btn_list_pause_large.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_btn_list_play.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/img_lv_demo_music_btn_list_play.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_btn_list_play.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/img_lv_demo_music_btn_list_play.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_btn_list_play_large.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/img_lv_demo_music_btn_list_play_large.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_btn_list_play_large.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/img_lv_demo_music_btn_list_play_large.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_btn_loop.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/img_lv_demo_music_btn_loop.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_btn_loop.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/img_lv_demo_music_btn_loop.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_btn_loop_large.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/img_lv_demo_music_btn_loop_large.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_btn_loop_large.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/img_lv_demo_music_btn_loop_large.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_btn_next.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/img_lv_demo_music_btn_next.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_btn_next.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/img_lv_demo_music_btn_next.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_btn_next_large.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/img_lv_demo_music_btn_next_large.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_btn_next_large.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/img_lv_demo_music_btn_next_large.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_btn_pause.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/img_lv_demo_music_btn_pause.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_btn_pause.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/img_lv_demo_music_btn_pause.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_btn_pause_large.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/img_lv_demo_music_btn_pause_large.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_btn_pause_large.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/img_lv_demo_music_btn_pause_large.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_btn_play.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/img_lv_demo_music_btn_play.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_btn_play.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/img_lv_demo_music_btn_play.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_btn_play_large.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/img_lv_demo_music_btn_play_large.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_btn_play_large.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/img_lv_demo_music_btn_play_large.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_btn_prev.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/img_lv_demo_music_btn_prev.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_btn_prev.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/img_lv_demo_music_btn_prev.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_btn_prev_large.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/img_lv_demo_music_btn_prev_large.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_btn_prev_large.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/img_lv_demo_music_btn_prev_large.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_btn_rnd.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/img_lv_demo_music_btn_rnd.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_btn_rnd.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/img_lv_demo_music_btn_rnd.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_btn_rnd_large.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/img_lv_demo_music_btn_rnd_large.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_btn_rnd_large.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/img_lv_demo_music_btn_rnd_large.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_corner_left.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/img_lv_demo_music_corner_left.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_corner_left.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/img_lv_demo_music_corner_left.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_corner_left_large.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/img_lv_demo_music_corner_left_large.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_corner_left_large.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/img_lv_demo_music_corner_left_large.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_corner_right.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/img_lv_demo_music_corner_right.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_corner_right.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/img_lv_demo_music_corner_right.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_corner_right_large.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/img_lv_demo_music_corner_right_large.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_corner_right_large.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/img_lv_demo_music_corner_right_large.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_cover_1.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/img_lv_demo_music_cover_1.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_cover_1.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/img_lv_demo_music_cover_1.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_cover_1_large.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/img_lv_demo_music_cover_1_large.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_cover_1_large.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/img_lv_demo_music_cover_1_large.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_cover_2.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/img_lv_demo_music_cover_2.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_cover_2.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/img_lv_demo_music_cover_2.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_cover_2_large.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/img_lv_demo_music_cover_2_large.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_cover_2_large.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/img_lv_demo_music_cover_2_large.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_cover_3.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/img_lv_demo_music_cover_3.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_cover_3.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/img_lv_demo_music_cover_3.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_cover_3_large.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/img_lv_demo_music_cover_3_large.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_cover_3_large.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/img_lv_demo_music_cover_3_large.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_icon_1.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/img_lv_demo_music_icon_1.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_icon_1.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/img_lv_demo_music_icon_1.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_icon_1_large.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/img_lv_demo_music_icon_1_large.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_icon_1_large.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/img_lv_demo_music_icon_1_large.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_icon_2.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/img_lv_demo_music_icon_2.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_icon_2.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/img_lv_demo_music_icon_2.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_icon_2_large.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/img_lv_demo_music_icon_2_large.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_icon_2_large.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/img_lv_demo_music_icon_2_large.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_icon_3.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/img_lv_demo_music_icon_3.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_icon_3.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/img_lv_demo_music_icon_3.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_icon_3_large.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/img_lv_demo_music_icon_3_large.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_icon_3_large.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/img_lv_demo_music_icon_3_large.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_icon_4.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/img_lv_demo_music_icon_4.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_icon_4.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/img_lv_demo_music_icon_4.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_icon_4_large.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/img_lv_demo_music_icon_4_large.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_icon_4_large.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/img_lv_demo_music_icon_4_large.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_list_border.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/img_lv_demo_music_list_border.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_list_border.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/img_lv_demo_music_list_border.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_list_border_large.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/img_lv_demo_music_list_border_large.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_list_border_large.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/img_lv_demo_music_list_border_large.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_logo.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/img_lv_demo_music_logo.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_logo.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/img_lv_demo_music_logo.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_slider_knob.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/img_lv_demo_music_slider_knob.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_slider_knob.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/img_lv_demo_music_slider_knob.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_slider_knob_large.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/img_lv_demo_music_slider_knob_large.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_slider_knob_large.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/img_lv_demo_music_slider_knob_large.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_wave_bottom.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/img_lv_demo_music_wave_bottom.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_wave_bottom.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/img_lv_demo_music_wave_bottom.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_wave_bottom_large.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/img_lv_demo_music_wave_bottom_large.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_wave_bottom_large.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/img_lv_demo_music_wave_bottom_large.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_wave_top.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/img_lv_demo_music_wave_top.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_wave_top.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/img_lv_demo_music_wave_top.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_wave_top_large.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/img_lv_demo_music_wave_top_large.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_wave_top_large.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/img_lv_demo_music_wave_top_large.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/spectrum.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/spectrum.py old mode 100644 new mode 100755 similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/spectrum.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/spectrum.py diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/spectrum_1.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/spectrum_1.h similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/spectrum_1.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/spectrum_1.h diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/spectrum_2.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/spectrum_2.h similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/spectrum_2.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/spectrum_2.h diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/spectrum_3.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/spectrum_3.h similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/spectrum_3.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/assets/spectrum_3.h diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/lv_demo_music.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/lv_demo_music.c similarity index 91% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/lv_demo_music.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/lv_demo_music.c index cb72ed1..7393dfd 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/lv_demo_music.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/lv_demo_music.c @@ -103,6 +103,12 @@ static const uint32_t time_list[] = { 2 * 60 + 19, }; +#if LV_DEMO_MUSIC_AUTO_PLAY + static lv_timer_t * auto_step_timer; +#endif + +static lv_color_t original_screen_bg_color; + /********************** * MACROS **********************/ @@ -113,16 +119,33 @@ static const uint32_t time_list[] = { void lv_demo_music(void) { + original_screen_bg_color = lv_obj_get_style_bg_color(lv_scr_act(), 0); lv_obj_set_style_bg_color(lv_scr_act(), lv_color_hex(0x343247), 0); list = _lv_demo_music_list_create(lv_scr_act()); ctrl = _lv_demo_music_main_create(lv_scr_act()); #if LV_DEMO_MUSIC_AUTO_PLAY - lv_timer_create(auto_step_cb, 1000, NULL); + auto_step_timer = lv_timer_create(auto_step_cb, 1000, NULL); #endif } +void lv_demo_music_close(void) +{ + /*Delete all aniamtions*/ + lv_anim_del(NULL, NULL); + +#if LV_DEMO_MUSIC_AUTO_PLAY + lv_timer_del(auto_step_timer); +#endif + _lv_demo_music_list_close(); + _lv_demo_music_main_close(); + + lv_obj_clean(lv_scr_act()); + + lv_obj_set_style_bg_color(lv_scr_act(), original_screen_bg_color, 0); +} + const char * _lv_demo_music_get_title(uint32_t track_id) { if(track_id >= sizeof(title_list) / sizeof(title_list[0])) return NULL; diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/lv_demo_music.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/lv_demo_music.h similarity index 96% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/lv_demo_music.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/lv_demo_music.h index 82917fb..3c393d6 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/lv_demo_music.h +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/lv_demo_music.h @@ -36,6 +36,8 @@ extern "C" { **********************/ void lv_demo_music(void); +void lv_demo_music_close(void); + const char * _lv_demo_music_get_title(uint32_t track_id); const char * _lv_demo_music_get_artist(uint32_t track_id); const char * _lv_demo_music_get_genre(uint32_t track_id); diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/lv_demo_music_list.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/lv_demo_music_list.c similarity index 95% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/lv_demo_music_list.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/lv_demo_music_list.c index 88e79ec..52b9491 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/lv_demo_music_list.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/lv_demo_music_list.c @@ -130,6 +130,18 @@ lv_obj_t * _lv_demo_music_list_create(lv_obj_t * parent) return list; } +void _lv_demo_music_list_close(void) +{ + lv_style_reset(&style_scrollbar); + lv_style_reset(&style_btn); + lv_style_reset(&style_btn_pr); + lv_style_reset(&style_btn_chk); + lv_style_reset(&style_btn_dis); + lv_style_reset(&style_title); + lv_style_reset(&style_artist); + lv_style_reset(&style_time); +} + void _lv_demo_music_list_btn_check(uint32_t track_id, bool state) { lv_obj_t * btn = lv_obj_get_child(list, track_id); @@ -205,7 +217,6 @@ static lv_obj_t * add_list_btn(lv_obj_t * parent, uint32_t track_id) return btn; } - static void btn_click_event_cb(lv_event_t * e) { lv_obj_t * btn = lv_event_get_target(e); @@ -215,4 +226,3 @@ static void btn_click_event_cb(lv_event_t * e) _lv_demo_music_play(idx); } #endif /*LV_USE_DEMO_MUSIC*/ - diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/lv_demo_music_list.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/lv_demo_music_list.h similarity index 95% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/lv_demo_music_list.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/lv_demo_music_list.h index 48e6e17..d03c6d1 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/lv_demo_music_list.h +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/lv_demo_music_list.h @@ -28,6 +28,8 @@ extern "C" { * GLOBAL PROTOTYPES **********************/ lv_obj_t * _lv_demo_music_list_create(lv_obj_t * parent); +void _lv_demo_music_list_close(void); + void _lv_demo_music_list_btn_check(uint32_t track_id, bool state); /********************** diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/lv_demo_music_main.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/lv_demo_music_main.c similarity index 98% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/lv_demo_music_main.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/lv_demo_music_main.c index f7bc4b8..45a8054 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/lv_demo_music_main.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/lv_demo_music_main.c @@ -60,7 +60,7 @@ static void prev_click_event_cb(lv_event_t * e); static void next_click_event_cb(lv_event_t * e); static void timer_cb(lv_timer_t * t); static void track_load(uint32_t id); -static void stop_start_anim(lv_timer_t * t); +static void stop_start_anim_timer_cb(lv_timer_t * t); static void spectrum_end_cb(lv_anim_t * a); static void album_fade_anim_cb(void * var, int32_t v); static int32_t get_cos(int32_t deg, int32_t a); @@ -84,6 +84,7 @@ static uint32_t spectrum_lane_ofs_start = 0; static uint32_t bar_rot = 0; static uint32_t time_act; static lv_timer_t * sec_counter_timer; +static lv_timer_t * stop_start_anim_timer; static const lv_font_t * font_small; static const lv_font_t * font_large; static uint32_t track_id; @@ -232,8 +233,8 @@ lv_obj_t * _lv_demo_music_main_create(lv_obj_t * parent) start_anim = true; - lv_timer_t * timer = lv_timer_create(stop_start_anim, INTRO_TIME + 6000, NULL); - lv_timer_set_repeat_count(timer, 1); + stop_start_anim_timer = lv_timer_create(stop_start_anim_timer_cb, INTRO_TIME + 6000, NULL); + lv_timer_set_repeat_count(stop_start_anim_timer, 1); lv_anim_init(&a); lv_anim_set_path_cb(&a, lv_anim_path_bounce); @@ -292,6 +293,12 @@ lv_obj_t * _lv_demo_music_main_create(lv_obj_t * parent) return main_cont; } +void _lv_demo_music_main_close(void) +{ + if(stop_start_anim_timer) lv_timer_del(stop_start_anim_timer); + lv_timer_del(sec_counter_timer); +} + void _lv_demo_music_album_next(bool next) { uint32_t id = track_id; @@ -762,7 +769,7 @@ static void spectrum_draw_event_cb(lv_event_t * e) lv_obj_t * obj = lv_event_get_target(e); lv_draw_ctx_t * draw_ctx = lv_event_get_draw_ctx(e); - lv_opa_t opa = lv_obj_get_style_opa(obj, LV_PART_MAIN); + lv_opa_t opa = lv_obj_get_style_opa_recursive(obj, LV_PART_MAIN); if(opa < LV_OPA_MIN) return; lv_point_t poly[4]; @@ -974,7 +981,6 @@ static void next_click_event_cb(lv_event_t * e) } } - static void timer_cb(lv_timer_t * t) { LV_UNUSED(t); @@ -989,11 +995,11 @@ static void spectrum_end_cb(lv_anim_t * a) _lv_demo_music_album_next(true); } - -static void stop_start_anim(lv_timer_t * t) +static void stop_start_anim_timer_cb(lv_timer_t * t) { LV_UNUSED(t); start_anim = false; + stop_start_anim_timer = NULL; lv_obj_refresh_ext_draw_size(spectrum_obj); } @@ -1002,4 +1008,3 @@ static void album_fade_anim_cb(void * var, int32_t v) lv_obj_set_style_img_opa(var, v, 0); } #endif /*LV_USE_DEMO_MUSIC*/ - diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/lv_demo_music_main.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/lv_demo_music_main.h similarity index 95% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/lv_demo_music_main.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/lv_demo_music_main.h index a2cf939..a190f00 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/lv_demo_music_main.h +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/lv_demo_music_main.h @@ -28,6 +28,8 @@ extern "C" { * GLOBAL PROTOTYPES **********************/ lv_obj_t * _lv_demo_music_main_create(lv_obj_t * parent); +void _lv_demo_music_main_close(void); + void _lv_demo_music_play(uint32_t id); void _lv_demo_music_resume(void); void _lv_demo_music_pause(void); @@ -38,7 +40,6 @@ void _lv_demo_music_album_next(bool next); **********************/ #endif /*LV_USE_DEMO_MUSIC*/ - #ifdef __cplusplus } /* extern "C" */ #endif diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/screenshot1.gif b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/screenshot1.gif similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/screenshot1.gif rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/music/screenshot1.gif diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/stress/Makefile b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/stress/Makefile similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/stress/Makefile rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/stress/Makefile diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/stress/README.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/stress/README.md similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/stress/README.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/stress/README.md diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/stress/lv_demo_stress.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/stress/lv_demo_stress.c similarity index 96% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/stress/lv_demo_stress.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/stress/lv_demo_stress.c index b247443..2b59707 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/stress/lv_demo_stress.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/stress/lv_demo_stress.c @@ -25,7 +25,7 @@ static void msgbox_del(lv_timer_t * tmr); static void set_y_anim(void * obj, int32_t v); static void set_width_anim(void * obj, int32_t v); static void arc_set_end_angle_anim(void * obj, int32_t v); -static void obj_test_task_cb(lv_timer_t * tmr); +static void obj_test_timer_cb(lv_timer_t * tmr); /********************** * STATIC VARIABLES @@ -34,6 +34,10 @@ static lv_obj_t * main_page; static lv_obj_t * ta; static const char * mbox_btns[] = {"Ok", "Cancel", ""}; static uint32_t mem_free_start = 0; +static lv_timer_t * obj_test_timer; +static int16_t state; +static lv_timer_t * msgbox_tmr; + /********************** * MACROS **********************/ @@ -45,23 +49,34 @@ static uint32_t mem_free_start = 0; void lv_demo_stress(void) { LV_LOG_USER("Starting stress test. (< 100 bytes permanent memory leak is normal due to fragmentation)"); - lv_timer_create(obj_test_task_cb, LV_DEMO_STRESS_TIME_STEP, NULL); + obj_test_timer = lv_timer_create(obj_test_timer_cb, LV_DEMO_STRESS_TIME_STEP, NULL); + state = -1; +} + +void lv_demo_stress_close(void) +{ + lv_timer_del(obj_test_timer); + obj_test_timer = NULL; + if(msgbox_tmr) { + lv_timer_del(msgbox_tmr); + msgbox_tmr = NULL; + } + + lv_obj_clean(lv_scr_act()); + lv_obj_clean(lv_layer_top()); } /********************** * STATIC FUNCTIONS **********************/ -static void obj_test_task_cb(lv_timer_t * tmr) +static void obj_test_timer_cb(lv_timer_t * tmr) { (void) tmr; /*Unused*/ - static int16_t state = -1; lv_anim_t a; lv_obj_t * obj; - // printf("step start: %d\n", state); - switch(state) { case -1: { lv_res_t res = lv_mem_test(); @@ -83,7 +98,6 @@ static void obj_test_task_cb(lv_timer_t * tmr) lv_obj_set_size(main_page, LV_HOR_RES / 2, LV_VER_RES); lv_obj_set_flex_flow(main_page, LV_FLEX_FLOW_COLUMN); - obj = lv_btn_create(main_page); lv_obj_set_size(obj, 100, 70); obj = lv_label_create(obj); @@ -246,8 +260,7 @@ static void obj_test_task_cb(lv_timer_t * tmr) case 14: obj = lv_msgbox_create(NULL, "Title", "Some text on the message box with average length", mbox_btns, true); - - lv_timer_t * msgbox_tmr = lv_timer_create(msgbox_del, LV_DEMO_STRESS_TIME_STEP * 5 + 30, obj); + msgbox_tmr = lv_timer_create(msgbox_del, LV_DEMO_STRESS_TIME_STEP * 5 + 30, obj); lv_timer_set_repeat_count(msgbox_tmr, 1); lv_obj_align(obj, LV_ALIGN_RIGHT_MID, -10, 0); break; @@ -439,6 +452,7 @@ static void auto_del(lv_obj_t * obj, uint32_t delay) static void msgbox_del(lv_timer_t * tmr) { + msgbox_tmr = NULL; lv_msgbox_close(tmr->user_data); } diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/stress/lv_demo_stress.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/stress/lv_demo_stress.h similarity index 94% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/stress/lv_demo_stress.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/stress/lv_demo_stress.h index f718366..aacc9e1 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/stress/lv_demo_stress.h +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/stress/lv_demo_stress.h @@ -30,6 +30,8 @@ extern "C" { **********************/ void lv_demo_stress(void); +void lv_demo_stress_close(void); + /********************** * MACROS **********************/ diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/stress/screenshot1.gif b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/stress/screenshot1.gif similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/stress/screenshot1.gif rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/stress/screenshot1.gif diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/stress/screenshot1.png b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/stress/screenshot1.png similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/stress/screenshot1.png rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/stress/screenshot1.png diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/widgets/Makefile b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/widgets/Makefile similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/widgets/Makefile rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/widgets/Makefile diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/widgets/assets/Makefile b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/widgets/assets/Makefile similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/widgets/assets/Makefile rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/widgets/assets/Makefile diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/widgets/assets/avatar.png b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/widgets/assets/avatar.png similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/widgets/assets/avatar.png rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/widgets/assets/avatar.png diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/widgets/assets/clothes.png b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/widgets/assets/clothes.png similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/widgets/assets/clothes.png rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/widgets/assets/clothes.png diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/widgets/assets/img_clothes.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/widgets/assets/img_clothes.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/widgets/assets/img_clothes.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/widgets/assets/img_clothes.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/widgets/assets/img_demo_widgets_avatar.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/widgets/assets/img_demo_widgets_avatar.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/widgets/assets/img_demo_widgets_avatar.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/widgets/assets/img_demo_widgets_avatar.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/widgets/assets/img_lvgl_logo.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/widgets/assets/img_lvgl_logo.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/widgets/assets/img_lvgl_logo.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/widgets/assets/img_lvgl_logo.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/widgets/assets/lvgl_logo.png b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/widgets/assets/lvgl_logo.png similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/widgets/assets/lvgl_logo.png rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/widgets/assets/lvgl_logo.png diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/widgets/lv_demo_widgets.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/widgets/lv_demo_widgets.c similarity index 99% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/widgets/lv_demo_widgets.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/widgets/lv_demo_widgets.c index 839b999..dad25c3 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/widgets/lv_demo_widgets.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/widgets/lv_demo_widgets.c @@ -86,6 +86,8 @@ static uint32_t session_desktop = 1000; static uint32_t session_tablet = 1000; static uint32_t session_mobile = 1000; +static lv_timer_t * meter2_timer; + /********************** * MACROS **********************/ @@ -196,6 +198,22 @@ void lv_demo_widgets(void) color_changer_create(tv); } +void lv_demo_widgets_close(void) +{ + /*Delete all animation*/ + lv_anim_del(NULL, NULL); + + lv_timer_del(meter2_timer); + meter2_timer = NULL; + + lv_obj_clean(lv_scr_act()); + + lv_style_reset(&style_text_muted); + lv_style_reset(&style_title); + lv_style_reset(&style_icon); + lv_style_reset(&style_bullet); +} + /********************** * STATIC FUNCTIONS **********************/ @@ -340,7 +358,6 @@ static void profile_create(lv_obj_t * parent) LV_GRID_TEMPLATE_LAST }; - lv_obj_set_grid_dsc_array(parent, grid_main_col_dsc, grid_main_row_dsc); lv_obj_set_grid_cell(panel1, LV_GRID_ALIGN_STRETCH, 0, 2, LV_GRID_ALIGN_CENTER, 0, 1); @@ -368,7 +385,6 @@ static void profile_create(lv_obj_t * parent) lv_obj_set_grid_cell(gender, LV_GRID_ALIGN_STRETCH, 0, 1, LV_GRID_ALIGN_CENTER, 6, 1); lv_obj_set_grid_cell(gender_label, LV_GRID_ALIGN_START, 0, 1, LV_GRID_ALIGN_START, 5, 1); - lv_obj_set_grid_cell(panel3, LV_GRID_ALIGN_STRETCH, 1, 1, LV_GRID_ALIGN_STRETCH, 1, 1); lv_obj_set_grid_dsc_array(panel3, grid_2_col_dsc, grid_2_row_dsc); lv_obj_set_grid_cell(panel3_title, LV_GRID_ALIGN_START, 0, 2, LV_GRID_ALIGN_CENTER, 0, 1); @@ -383,7 +399,6 @@ static void profile_create(lv_obj_t * parent) static lv_coord_t grid_main_col_dsc[] = {LV_GRID_FR(1), LV_GRID_FR(1), LV_GRID_TEMPLATE_LAST}; static lv_coord_t grid_main_row_dsc[] = {LV_GRID_CONTENT, LV_GRID_CONTENT, LV_GRID_TEMPLATE_LAST}; - /*Create the top panel*/ static lv_coord_t grid_1_col_dsc[] = {LV_GRID_CONTENT, 1, LV_GRID_CONTENT, LV_GRID_FR(1), LV_GRID_TEMPLATE_LAST}; static lv_coord_t grid_1_row_dsc[] = { @@ -411,7 +426,6 @@ static void profile_create(lv_obj_t * parent) LV_GRID_TEMPLATE_LAST }; - lv_obj_set_grid_dsc_array(parent, grid_main_col_dsc, grid_main_row_dsc); lv_obj_set_grid_cell(panel1, LV_GRID_ALIGN_STRETCH, 0, 2, LV_GRID_ALIGN_CENTER, 0, 1); @@ -456,7 +470,6 @@ static void profile_create(lv_obj_t * parent) static lv_coord_t grid_main_row_dsc[] = {LV_GRID_CONTENT, LV_GRID_CONTENT, LV_GRID_CONTENT, LV_GRID_TEMPLATE_LAST}; lv_obj_set_grid_dsc_array(parent, grid_main_col_dsc, grid_main_row_dsc); - /*Create the top panel*/ static lv_coord_t grid_1_col_dsc[] = {LV_GRID_CONTENT, LV_GRID_FR(1), LV_GRID_TEMPLATE_LAST}; static lv_coord_t grid_1_row_dsc[] = {LV_GRID_CONTENT, /*Avatar*/ @@ -471,7 +484,6 @@ static void profile_create(lv_obj_t * parent) lv_obj_set_grid_dsc_array(panel1, grid_1_col_dsc, grid_1_row_dsc); - static lv_coord_t grid_2_col_dsc[] = {LV_GRID_FR(1), LV_GRID_FR(1), LV_GRID_TEMPLATE_LAST}; static lv_coord_t grid_2_row_dsc[] = { LV_GRID_CONTENT, /*Title*/ @@ -526,7 +538,6 @@ static void profile_create(lv_obj_t * parent) } } - static void analytics_create(lv_obj_t * parent) { lv_obj_set_flex_flow(parent, LV_FLEX_FLOW_ROW_WRAP); @@ -698,7 +709,7 @@ static void analytics_create(lv_obj_t * parent) lv_meter_set_indicator_start_value(meter2, meter2_indic[2], 70); lv_meter_set_indicator_end_value(meter2, meter2_indic[2], 99); - lv_timer_create(meter2_timer_cb, 100, meter2_indic); + meter2_timer = lv_timer_create(meter2_timer_cb, 100, meter2_indic); meter3 = create_meter_box(parent, "Network Speed", "Low speed", "Normal Speed", "High Speed"); if(disp_size < DISP_LARGE) lv_obj_add_flag(lv_obj_get_parent(meter3), LV_OBJ_FLAG_FLEX_IN_NEW_TRACK); @@ -840,7 +851,6 @@ void shop_create(lv_obj_t * parent) lv_obj_set_size(chart3, lv_pct(100), lv_pct(100)); lv_obj_set_style_pad_column(chart3, LV_DPX(30), 0); - lv_obj_set_grid_dsc_array(panel1, grid1_col_dsc, grid1_row_dsc); lv_obj_set_grid_cell(title, LV_GRID_ALIGN_START, 0, 1, LV_GRID_ALIGN_START, 0, 1); lv_obj_set_grid_cell(date, LV_GRID_ALIGN_START, 0, 1, LV_GRID_ALIGN_START, 1, 1); @@ -956,7 +966,6 @@ void shop_create(lv_obj_t * parent) cb = lv_checkbox_create(notifications); lv_checkbox_set_text(cb, "Out of stock"); - } static void color_changer_create(lv_obj_t * parent) @@ -1162,7 +1171,6 @@ static lv_obj_t * create_meter_box(lv_obj_t * parent, const char * title, const lv_obj_set_grid_cell(label3, LV_GRID_ALIGN_STRETCH, 1, 1, LV_GRID_ALIGN_START, 4, 1); } - return meter; } @@ -1380,7 +1388,6 @@ static void chart_event_cb(lv_event_t * e) } #endif - const lv_chart_series_t * ser = dsc->sub_part_ptr; if(lv_chart_get_pressed_point(obj) == dsc->id) { @@ -1446,7 +1453,6 @@ static void chart_event_cb(lv_event_t * e) } } - static void shop_chart_event_cb(lv_event_t * e) { lv_event_code_t code = lv_event_get_code(e); @@ -1498,7 +1504,6 @@ static void shop_chart_event_cb(lv_event_t * e) } } - static void meter1_indic1_anim_cb(void * var, int32_t v) { lv_meter_set_indicator_end_value(meter1, var, v); @@ -1535,7 +1540,6 @@ static void meter2_timer_cb(lv_timer_t * timer) static bool down2 = false; static bool down3 = false; - if(down1) { session_desktop -= 137; if(session_desktop < 1400) down1 = false; diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/widgets/lv_demo_widgets.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/widgets/lv_demo_widgets.h similarity index 94% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/widgets/lv_demo_widgets.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/widgets/lv_demo_widgets.h index 66dddaf..8d70df1 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/widgets/lv_demo_widgets.h +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/widgets/lv_demo_widgets.h @@ -27,6 +27,7 @@ extern "C" { * GLOBAL PROTOTYPES **********************/ void lv_demo_widgets(void); +void lv_demo_widgets_close(void); /********************** * MACROS diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/widgets/lv_demo_widgets.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/widgets/lv_demo_widgets.py old mode 100644 new mode 100755 similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/widgets/lv_demo_widgets.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/widgets/lv_demo_widgets.py diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/widgets/screenshot1.gif b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/widgets/screenshot1.gif similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/widgets/screenshot1.gif rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/widgets/screenshot1.gif diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/widgets/screenshot1.png b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/widgets/screenshot1.png similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/widgets/screenshot1.png rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/demos/widgets/screenshot1.png diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/CHANGELOG.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/CHANGELOG.md new file mode 100644 index 0000000..1851afb --- /dev/null +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/CHANGELOG.md @@ -0,0 +1,43 @@ +# Changelog + +## [v8.4.0](https://github.com/lvgl/lvgl/compare/v8.3.11...v8.4.0) 19 March 2024 + +### Breaking Changes + +### Architectural + +### New Features + +- feat(pxp): add zephyr support [`5838`](https://github.com/lvgl/lvgl/pull/5838) +- feat(calendar): set a custom year list for calendar header [`5275`](https://github.com/lvgl/lvgl/pull/5275) +- feat(build): add pkgconfig file (#4744) [`5067`](https://github.com/lvgl/lvgl/pull/5067) + +### Performance + +### Fixes + +- fix(canvas): lv_canvas_transform negative offset_y parameter [`5846`](https://github.com/lvgl/lvgl/pull/5846) +- fix(st-dma2d): remove unused functions [`5561`](https://github.com/lvgl/lvgl/pull/5561) +- fix(gpu-arm2d): fix a blending issue in blend-normal-with-mask-and-opa [`5163`](https://github.com/lvgl/lvgl/pull/5163) +- fix(screen): fix crash when starting two screen loads with animations [`5062`](https://github.com/lvgl/lvgl/pull/5062) +- fix(chart): fix memory leak in lv_chart_remove_series [`5001`](https://github.com/lvgl/lvgl/pull/5001) +- fix(snapshot): set data_size on returned dsc [`4972`](https://github.com/lvgl/lvgl/pull/4972) +- docs(meter): change LV_PART_TICK -> LV_PART_TICKS [`e277114`](https://github.com/lvgl/lvgl/commit/e277114631da2caf6cebcf020ab19fdce6c068c0) + + +### Docs + +- docs: fixed some typos [`5502`](https://github.com/lvgl/lvgl/pull/5502) +- docs(sjpg): color depth no longer limited to 16 bits [`4971`](https://github.com/lvgl/lvgl/pull/4971) + +- docs: add banner [`b7a20df`](https://github.com/lvgl/lvgl/commit/b7a20df38f76958f3613f9ccf4b82cfab33f72e0) + +- docs(meter): change LV_PART_TICK -> LV_PART_TICKS [`e277114`](https://github.com/lvgl/lvgl/commit/e277114631da2caf6cebcf020ab19fdce6c068c0) + + +### Others + +- chore(group):avoid null pointer access [`5864`](https://github.com/lvgl/lvgl/pull/5864) +- doc(font): update Bidirectional support [`5416`](https://github.com/lvgl/lvgl/pull/5416) +- chore: code formatting [`8588762`](https://github.com/lvgl/lvgl/commit/8588762572804e068d001c0d208d49250862c76e) + diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/CODE_OF_CONDUCT.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/CODE_OF_CONDUCT.md similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/CODE_OF_CONDUCT.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/CODE_OF_CONDUCT.md diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/CODING_STYLE.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/CODING_STYLE.md similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/CODING_STYLE.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/CODING_STYLE.md diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/CONTRIBUTING.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/CONTRIBUTING.md similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/CONTRIBUTING.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/CONTRIBUTING.md diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/ROADMAP.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/ROADMAP.md similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/ROADMAP.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/ROADMAP.md diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/_ext/lv_example.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/_ext/lv_example.py similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/_ext/lv_example.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/_ext/lv_example.py diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/_static/css/custom.css b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/_static/css/custom.css similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/_static/css/custom.css rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/_static/css/custom.css diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/_static/css/fontawesome.min.css b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/_static/css/fontawesome.min.css similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/_static/css/fontawesome.min.css rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/_static/css/fontawesome.min.css diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/_static/img/home_1.png b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/_static/img/home_1.png similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/_static/img/home_1.png rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/_static/img/home_1.png diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/_static/img/home_2.png b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/_static/img/home_2.png similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/_static/img/home_2.png rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/_static/img/home_2.png diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/_static/img/home_3.png b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/_static/img/home_3.png similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/_static/img/home_3.png rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/_static/img/home_3.png diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/_static/img/home_4.png b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/_static/img/home_4.png similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/_static/img/home_4.png rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/_static/img/home_4.png diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/_static/img/home_5.png b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/_static/img/home_5.png similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/_static/img/home_5.png rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/_static/img/home_5.png diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/_static/img/home_6.png b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/_static/img/home_6.png similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/_static/img/home_6.png rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/_static/img/home_6.png diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/_static/img/home_banner.jpg b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/_static/img/home_banner.jpg similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/_static/img/home_banner.jpg rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/_static/img/home_banner.jpg diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/_static/js/custom.js b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/_static/js/custom.js new file mode 100644 index 0000000..fa1327d --- /dev/null +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/_static/js/custom.js @@ -0,0 +1,57 @@ +/* API collapsing */ +document.addEventListener('DOMContentLoaded', (event) => { + document.querySelectorAll("dl.cpp").forEach(cppListing => { + const dt = cppListing.querySelector("dt"); + let shouldBeExpanded = false; + if(dt.id == document.location.hash.substring(1)) + shouldBeExpanded = true; + cppListing.classList.add(shouldBeExpanded ? "expanded" : "unexpanded"); + const button = document.createElement("span"); + button.classList.add("lv-api-expansion-button"); + button.addEventListener("click", () => { + cppListing.classList.toggle("unexpanded"); + cppListing.classList.toggle("expanded"); + }); + + dt.insertBefore(button, dt.firstChild); + }); + + fetch('https://lvgl.io/home-banner.txt') // Replace with your URL + .then(response => { + // Check if the request was successful + if (!response.ok) { + throw new Error(`HTTP error! Status: ${response.status}`); + } + // Read the response as text + return response.text(); + }) + .then(data => { + + const section = document.querySelector('.wy-nav-content-wrap'); + + //Add a div + const newDiv = document.createElement('div'); + newDiv.style="background-image: linear-gradient(45deg, black, #5e5e5e); color: white; border-bottom: 4px solid #e10010; padding-inline:3em" + section.insertBefore(newDiv, section.firstChild); + + + //Add a p to the div + const newP = document.createElement('p'); + newP.style="padding-block:12px; margin-block:0px;align-content: center;align-items: center;" + newP.innerHTML = data + newDiv.insertBefore(newP, newDiv.firstChild); + + const children = newDiv.querySelectorAll('*'); + + // Iterate over each child + children.forEach(child => { + // Check if the child has an id + if (child.id) { + // Prepend 'docs-' to the id + child.id = 'docs-' + child.id; + } + }) + }) .catch(error => { + console.error('Fetch error: ' + error.message); + }); +}) diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/_templates/layout.html b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/_templates/layout.html similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/_templates/layout.html rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/_templates/layout.html diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/_templates/page.html b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/_templates/page.html similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/_templates/page.html rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/_templates/page.html diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/build.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/build.py old mode 100644 new mode 100755 similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/build.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/build.py diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/conf.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/conf.py similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/conf.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/conf.py diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/example_list.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/example_list.py old mode 100644 new mode 100755 similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/example_list.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/example_list.py diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/favicon.png b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/favicon.png similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/favicon.png rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/favicon.png diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/get-started/bindings/cpp.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/get-started/bindings/cpp.md similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/get-started/bindings/cpp.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/get-started/bindings/cpp.md diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/get-started/bindings/index.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/get-started/bindings/index.md similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/get-started/bindings/index.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/get-started/bindings/index.md diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/get-started/bindings/micropython.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/get-started/bindings/micropython.md similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/get-started/bindings/micropython.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/get-started/bindings/micropython.md diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/get-started/index.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/get-started/index.md similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/get-started/index.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/get-started/index.md diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/get-started/os/freertos.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/get-started/os/freertos.md similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/get-started/os/freertos.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/get-started/os/freertos.md diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/get-started/os/index.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/get-started/os/index.md similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/get-started/os/index.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/get-started/os/index.md diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/get-started/os/nuttx.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/get-started/os/nuttx.md similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/get-started/os/nuttx.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/get-started/os/nuttx.md diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/get-started/os/rt-thread.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/get-started/os/rt-thread.md similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/get-started/os/rt-thread.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/get-started/os/rt-thread.md diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/get-started/os/zephyr.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/get-started/os/zephyr.md similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/get-started/os/zephyr.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/get-started/os/zephyr.md diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/get-started/platforms/arduino.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/get-started/platforms/arduino.md similarity index 93% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/get-started/platforms/arduino.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/get-started/platforms/arduino.md index e9ca2e4..2571cac 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/get-started/platforms/arduino.md +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/get-started/platforms/arduino.md @@ -52,9 +52,14 @@ In the INO file you can see how to register a display and a touchpad for LVGL an Note that, there is no dedicated INO file for every example. Instead, you can load an example by calling an `lv_example_...` function. For example `lv_example_btn_1()`. -**IMPORTANT** +**IMPORTANT NOTE 1** Due to some the limitations of Arduino's build system you need to copy `lvgl/examples` to `lvgl/src/examples`. Similarly for the demos `lvgl/demos` to `lvgl/src/demos`. + +**IMPORTANT NOTE 2** +Note that the `lv_examples` library is for LVGL v7 and you shouldn't install it for this version (since LVGL v8) +as the examples and demos are now part of the main LVGL library. + ## Debugging and logging LVGL can display debug information in case of trouble. diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/get-started/platforms/cmake.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/get-started/platforms/cmake.md similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/get-started/platforms/cmake.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/get-started/platforms/cmake.md diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/get-started/platforms/espressif.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/get-started/platforms/espressif.md similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/get-started/platforms/espressif.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/get-started/platforms/espressif.md diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/get-started/platforms/index.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/get-started/platforms/index.md similarity index 92% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/get-started/platforms/index.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/get-started/platforms/index.md index 7ed6a01..7fba951 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/get-started/platforms/index.md +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/get-started/platforms/index.md @@ -9,6 +9,7 @@ nxp stm32 espressif + renesas arduino tasmota-berry cmake diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/get-started/platforms/nxp.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/get-started/platforms/nxp.md new file mode 100644 index 0000000..48e25d2 --- /dev/null +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/get-started/platforms/nxp.md @@ -0,0 +1,182 @@ +# NXP +NXP has integrated LVGL into the MCUXpresso SDK packages for general purpose and crossover microcontrollers, allowing +easy evaluation and migration into your product design. +[Download an SDK for a supported board](https://www.nxp.com/design/software/embedded-software/littlevgl-open-source-graphics-library:LITTLEVGL-OPEN-SOURCE-GRAPHICS-LIBRARY?&tid=vanLITTLEVGL-OPEN-SOURCE-GRAPHICS-LIBRARY) +today and get started with your next GUI application. + +## Creating new project with LVGL +Downloading the MCU SDK example project is recommended as a starting point. It comes fully configured with LVGL (and +with PXP/VGLite support if the modules are present), no additional integration work is required. + +## HW acceleration for NXP iMX RT platforms +Depending on the RT platform used, the acceleration can be done by NXP PXP (PiXel Pipeline) and/or the Verisilicon GPU +through an API named VGLite. Each accelerator has its own context that allows them to be used individually as well +simultaneously (in LVGL multithreading mode). + +### PXP accelerator +Several drawing features in LVGL can be offloaded to the PXP engine. The CPU is available for other operations while the +PXP is running. RTOS is required to block the LVGL drawing thread and switch to another task or suspend the CPU for +power savings. + +Supported draw callbacks are available in "src/draw/nxp/pxp/lv_draw_pxp.c": +```c + pxp_draw_ctx->base_draw.draw_img_decoded = lv_draw_pxp_img_decoded; + pxp_draw_ctx->blend = lv_draw_pxp_blend; + pxp_draw_ctx->base_draw.wait_for_finish = lv_draw_pxp_wait_for_finish; + pxp_draw_ctx->base_draw.buffer_copy = lv_draw_pxp_buffer_copy; +``` + +#### Features supported: + All operations can be used in conjunction with optional transparency. + + - RGB565 and ARGB8888 color formats + - Area fill with color + - BLIT (BLock Image Transfer) + - Screen Rotation (90, 180, 270 degree) + - Color keying + - Recoloring (color tint) + - Image Rotation (90, 180, 270 degree) + - Buffer copy + - RTOS integration layer + - Default FreeRTOS and bare metal code provided + + - Combination of recolor and/or rotation + color key/alpha blend/transparency is supported. + That is achieved by PXP in two steps: + - First step is to recolor/rotate the image to a temporary buffer (statically allocated) + - Second step is required to handle color keying, alpha channel or to apply transparency + +#### Known limitations: + - Rotation is not supported for images unaligned to blocks of 16x16 pixels. +PXP is set to process 16x16 blocks to optimize the system for memory bandwidth and image processing time. +The output engine essentially truncates any output pixels after the desired number of pixels has been written. +When rotating a source image and the output is not divisible by the block size, the incorrect pixels could be truncated +and the final output image can look shifted. + +#### Basic configuration: + - Select NXP PXP engine in lv_conf.h: Set `LV_USE_GPU_NXP_PXP` to 1 + - Enable default implementation for interrupt handling, PXP start function and automatic initialization: + Set `LV_USE_GPU_NXP_PXP_AUTO_INIT` to 1 + - If `SDK_OS_FREE_RTOS` symbol is defined, FreeRTOS implementation will be used, otherwise bare metal code will be + included + +#### Basic initialization: + - If `LV_USE_GPU_NXP_PXP_AUTO_INIT` is enabled, no user code is required; PXP is initialized automatically in + `lv_init()` + - For manual PXP initialization, default configuration structure for callbacks can be used. Initialize PXP before + calling `lv_init()` +```c + #if LV_USE_GPU_NXP_PXP + #include "src/draw/nxp/pxp/lv_gpu_nxp_pxp.h" + #endif + . . . + #if LV_USE_GPU_NXP_PXP + PXP_COND_STOP(!lv_gpu_nxp_pxp_init(), "PXP init failed."); + #endif +``` + +#### Project setup: + - Add PXP related files to project: + - src/draw/nxp/pxp/lv_draw_pxp.c[.h]: draw context callbacks + - src/draw/nxp/pxp/lv_draw_pxp_blend.c[.h]: fill and blit (with optional transformation) + - src/draw/nxp/pxp/lv_gpu_nxp_pxp.c[.h]: init, uninit, run/wait PXP device + - src/draw/nxp/pxp/lv_gpu_nxp_pxp_osa.c[.h]: OS abstraction (FreeRTOS or bare metal) + - optional, required only if `LV_USE_GPU_NXP_PXP_AUTO_INIT` is set to 1 + - PXP related code depends on two drivers provided by MCU SDK. These drivers need to be added to project: + - fsl_pxp.c[.h]: PXP driver + - fsl_cache.c[.h]: CPU cache handling functions + +#### Logging: + - By default, `LV_GPU_NXP_PXP_LOG_ERRORS` is enabled so that any PXP error will be seen on SDK debug console + - By default, `LV_GPU_NXP_PXP_LOG_TRACES` is disabled. Enable it for tracing logs (like PXP limitations) + +#### Advanced configuration: + - Implementation depends on multiple OS-specific functions. The struct `lv_nxp_pxp_cfg_t` with callback pointers is + used as a parameter for the `lv_gpu_nxp_pxp_init()` function. Default implementation for FreeRTOS and bare metal is + provided in lv_gpu_nxp_pxp_osa.c + - `pxp_interrupt_init()`: Initialize PXP interrupt (HW setup, OS setup) + - `pxp_interrupt_deinit()`: Deinitialize PXP interrupt (HW setup, OS setup) + - `pxp_run()`: Start PXP job. Use OS-specific mechanism to block drawing thread. PXP must finish drawing before + leaving this function. + - Area threshold (size limit) is configurable and used to decide whether the area will be processed by PXP or not. + Areas smaller than the defined value will be processed by CPU and those bigger than the threshold will be processed by + PXP. The threshold is defined as a macro in lv_draw_pxp.c + - `LV_GPU_NXP_PXP_SIZE_LIMIT`: size threshold for fill/blit (with optional transformation) + +### VGLite accelerator +Extra drawing features in LVGL can be handled by the VGLite engine. The CPU is available for other operations while the +VGLite is running. An RTOS is required to block the LVGL drawing thread and switch to another task or suspend the CPU +for power savings. + +Supported draw callbacks are available in "src/draw/nxp/vglite/lv_draw_vglite.c": +```c + vglite_draw_ctx->base_draw.init_buf = lv_draw_vglite_init_buf; + vglite_draw_ctx->base_draw.draw_line = lv_draw_vglite_line; + vglite_draw_ctx->base_draw.draw_arc = lv_draw_vglite_arc; + vglite_draw_ctx->base_draw.draw_rect = lv_draw_vglite_rect; + vglite_draw_ctx->base_draw.draw_img_decoded = lv_draw_vglite_img_decoded; + vglite_draw_ctx->blend = lv_draw_vglite_blend; + vglite_draw_ctx->base_draw.wait_for_finish = lv_draw_vglite_wait_for_finish; + vglite_draw_ctx->base_draw.buffer_copy = lv_draw_vglite_buffer_copy; +``` + +#### Features supported: + All operations can be used in conjunction with optional transparency. + + - RGB565 and ARGB8888 color formats + - Area fill with color + - BLIT (BLock Image Transfer) + - Image Rotation (any degree with decimal) + - Image Scale + - Draw rectangle background with optional radius or gradient + - Blit rectangle background image + - Draw rectangle border/outline with optional rounded corners + - Draw arc with optional rounded ending + - Draw line or dashed line with optional rounded ending + - Buffer copy + +#### Known limitations: + - Source image alignment: + The byte alignment requirement for a pixel depends on the specific pixel format. Both buffer address and buffer stride + must be aligned. As general rule, the alignment is set to 16 pixels. This makes the buffer address alignment to be + 32 bytes for RGB565 and 64 bytes for ARGB8888. + - For pixel engine (PE) destination, the alignment should be 64 bytes for all tiled (4x4) buffer layouts. + The pixel engine has no additional alignment requirement for linear buffer layouts (`VG_LITE_LINEAR`). + +#### Basic configuration: + - Select NXP VGLite engine in lv_conf.h: Set `LV_USE_GPU_NXP_VG_LITE` to 1 + - `SDK_OS_FREE_RTOS` symbol needs to be defined so that the FreeRTOS implementation will be used + +#### Basic initialization: + - Initialize VGLite before calling `lv_init()` by specifying the width/height of tessellation window. Value should be + a multiple of 16; minimum value is 16 pixels, maximum cannot be greater than the frame width. If less than or equal + to 0, then no tessellation buffer is created, in which case VGLite is initialized only for blitting. +```c + #if LV_USE_GPU_NXP_VG_LITE + #include "vg_lite.h" + #endif + . . . + #if LV_USE_GPU_NXP_VG_LITE + VG_LITE_COND_STOP(vg_lite_init(64, 64) != VG_LITE_SUCCESS, "VGLite init failed."); + #endif +``` + +#### Project setup: + - Add VGLite related files to project: + - src/draw/nxp/vglite/lv_draw_vglite.c[.h]: draw context callbacks + - src/draw/nxp/vglite/lv_draw_vglite_blend.c[.h]: fill and blit (with optional transformation) + - src/draw/nxp/vglite/lv_draw_vglite_rect.c[.h]: draw rectangle + - src/draw/nxp/vglite/lv_draw_vglite_arc.c[.h]: draw arc + - src/draw/nxp/vglite/lv_draw_vglite_line.c[.h]: draw line + - src/draw/nxp/vglite/lv_vglite_buf.c[.h]: init/get vglite buffer + - src/draw/nxp/vglite/lv_vglite_utils.c[.h]: function helpers + +#### Logging: + - By default, `LV_GPU_NXP_VG_LITE_LOG_ERRORS` is enabled so that any VGLite error will be seen on SDK debug console + - By default, `LV_GPU_NXP_VG_LITE_LOG_TRACES` is disabled. Enable it for tracing logs (like blit split workaround or + VGLite fallback to CPU due to any error on the driver) + +#### Advanced configuration: + - Area threshold (size limit) is configurable and used to decide whether the area will be processed by VGLite or not. + Areas smaller than the defined value will be processed by CPU and those bigger than the threshold will be processed by + VGLite. The threshold is defined as a macro in lv_draw_vglite.c + - `LV_GPU_NXP_VG_LITE_SIZE_LIMIT`: size threshold for fill/blit (with optional transformation) diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/get-started/platforms/pc-simulator.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/get-started/platforms/pc-simulator.md similarity index 98% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/get-started/platforms/pc-simulator.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/get-started/platforms/pc-simulator.md index 3bdc495..95c35ff 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/get-started/platforms/pc-simulator.md +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/get-started/platforms/pc-simulator.md @@ -15,7 +15,7 @@ The simulator is ported to various IDEs (Integrated Development Environments). C - [Eclipse with SDL driver](https://github.com/lvgl/lv_sim_eclipse_sdl): Recommended on Linux and Mac - [CodeBlocks](https://github.com/lvgl/lv_sim_codeblocks_win): Recommended on Windows -- [VisualStudio with SDL driver](https://github.com/lvgl/lv_sim_visual_studio_sdl): For Windows +- [VisualStudio](https://github.com/lvgl/lv_sim_visual_studio_sdl): For Windows - [VSCode with SDL driver](https://github.com/lvgl/lv_sim_vscode_sdl): Recommended on Linux and Mac - [PlatformIO with SDL driver](https://github.com/lvgl/lv_platformio): Recommended on Linux and Mac - [MDK with FastModel](https://github.com/lvgl/lv_port_an547_cm55_sim): For Windows diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/get-started/platforms/renesas.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/get-started/platforms/renesas.md new file mode 100644 index 0000000..b33095f --- /dev/null +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/get-started/platforms/renesas.md @@ -0,0 +1,129 @@ +# Renesas +The [HMI-Board](https://bit.ly/3I9nfUo) development board SDK now comes with LVGL integration for quick evaluation. Simply download the [SDK](https://github.com/RT-Thread-Studio/sdk-bsp-ra6m3-hmi-board/tree/main/projects/hmi-board-lvgl) for the supported motherboard and you’ll be on your way to creating your next GUI application in no time. For more information, check out the [Software design description](https://github.com/RT-Thread-Studio/sdk-bsp-ra6m3-hmi-board/blob/main/projects/hmi-board-lvgl/README.md). + +## Creating new project with LVGL +It is recommended to start your project by downloading the HMI-Board SDK example project. It comes fully equipped with LVGL and dave-2d support (if the modules are present), so you won’t need to do any additional integration work. + +## HW acceleration for Renesas RA6M3 platforms +For RA6M3 platforms, hardware acceleration can be achieved using the dave-2d GPU, depending on the platform used. Each accelerator has its own context, allowing them to be used individually or simultaneously in LVGL’s multithreading mode. + +### Dave-2d accelerator +LVGL can offload several drawing features to the dave-2d engine, freeing up the CPU for other operations while dave-2d runs. An RTOS is required to block the LVGL drawing thread and switch to another task or suspend the CPU for power savings. Supported draw callbacks can be found in “src/draw/renesas/lv_gpu_d2_ra6m3.c”. + +LVGL can offload several drawing features to the dave-2d engine, freeing up the CPU for other operations while dave-2d runs. An RTOS is required to block the LVGL drawing thread and switch to another task or suspend the CPU for power savings. Supported draw callbacks can be found in “src/draw/renesas/lv_gpu_d2_ra6m3.c”. + +```c + ra_2d_draw_ctx->blend = lv_draw_ra6m3_2d_blend; + ra_2d_draw_ctx->base_draw.draw_img_decoded = lv_port_gpu_img_decoded; + ra_2d_draw_ctx->base_draw.wait_for_finish = lv_port_gpu_wait; + ra_2d_draw_ctx->base_draw.draw_letter = lv_draw_gpu_letter; +``` + +### Features supported: + All operations can be used in conjunction with optional transparency. + + - RGB565 and ARGB8888 color formats + - Area fill with color + - BLIT (BLock Image Transfer) + - Color conversion + - Rotate and scale + - Alpha blending + - Bilinear filtering + - RTOS integration layer + - Default RT-Thread code provided + - Subpixel exact placement + +### Basic configuration: + - Select Renesas dave-2d engine in lv_conf.h: Set `LV_USE_GPU_RA6M3_G2D` to 1 + - Set referenced header file in lv_conf.h: `#define LV_GPU_RA6M3_G2D_INCLUDE "hal_data.h"` + +### RT-Thread Example: + +```c +#define COLOR_BUFFER (LV_HOR_RES_MAX * LV_VER_RES_MAX) + +static lv_disp_drv_t disp_drv; + +/*A static or global variable to store the buffers*/ +static lv_color_t buf_1[COLOR_BUFFER]; +``` + +- After initializing your peripherals (such as SPI, GPIOs, and LCD) in the `lv_port_disp_init()` function, you can initialize LVGL using [`lv_init()`.](https://docs.lvgl.io/master/API/core/lv_obj.html#_CPPv47lv_initv) Next, register the frame buffers using `lv_disp_draw_buf_init()` and create a new display driver using `lv_disp_drv_init()`. + +```c +/*Initialize `disp_buf` with the buffer(s). With only one buffer use NULL instead buf_2 */ +lv_disp_draw_buf_init(&disp_buf, buf_1, RT_NULL, COLOR_BUFFER); +lv_disp_drv_init(&disp_drv); /*Basic initialization*/ + +/*Set the resolution of the display*/ +disp_drv.hor_res = LV_HOR_RES_MAX; +disp_drv.ver_res = LV_VER_RES_MAX; + +/*Set a display buffer*/ +disp_drv.draw_buf = &disp_buf; + +/*Used to copy the buffer's content to the display*/ +disp_drv.flush_cb = disp_flush; + +/* Initialize GPU module */ +lv_port_gpu_hw_init(); + +/*Finally register the driver*/ +lv_disp_drv_register(&disp_drv); +``` + +* To run LVGL, you’ll need to create a thread. You can find examples of how to do this using RT-Thread in the `env_support/rt-thread/lv_rt_thread_port.c` file. + +```c +static void lvgl_thread_entry(void *parameter) +{ +#if LV_USE_LOG + lv_log_register_print_cb(lv_rt_log); +#endif /* LV_USE_LOG */ + lv_init(); + lv_port_disp_init(); + lv_port_indev_init(); + lv_user_gui_init(); + + /* handle the tasks of LVGL */ + while(1) + { + lv_task_handler(); + rt_thread_mdelay(LV_DISP_DEF_REFR_PERIOD); + } +} + +static int lvgl_thread_init(void) +{ + rt_err_t err; + + /* create lvgl thread */ + err = rt_thread_init(&lvgl_thread, "LVGL", lvgl_thread_entry, RT_NULL, + &lvgl_thread_stack[0], sizeof(lvgl_thread_stack), PKG_LVGL_THREAD_PRIO, 10); + if(err != RT_EOK) + { + LOG_E("Failed to create LVGL thread"); + return -1; + } + rt_thread_startup(&lvgl_thread); + + return 0; +} +INIT_ENV_EXPORT(lvgl_thread_init); +``` + +- The last step is to create a function to output the frame buffer to your LCD. The specifics of this function will depend on the features of your MCU. Here’s an example for a typical MCU interface: `my_flush_cb`. + +```c +static void my_flush_cb(lv_disp_drv_t *disp_drv, const lv_area_t *area, lv_color_t *color_p) +{ +#ifdef PKG_USING_ILI9341 + lcd_fill_array_spi(area->x1, area->y1, area->x2, area->y2, color_p); +#elif LV_USE_GPU_RA6M3_G2D + lv_port_gpu_blit(area->x1, area->y1, color_p, area); +#else + ...... +#endif + lv_disp_flush_ready(disp_drv); +} +``` diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/get-started/platforms/stm32.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/get-started/platforms/stm32.md similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/get-started/platforms/stm32.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/get-started/platforms/stm32.md diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/get-started/platforms/tasmota-berry.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/get-started/platforms/tasmota-berry.md similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/get-started/platforms/tasmota-berry.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/get-started/platforms/tasmota-berry.md diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/get-started/quick-overview.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/get-started/quick-overview.md similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/get-started/quick-overview.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/get-started/quick-overview.md diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/index.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/index.md similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/index.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/index.md diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/intro/index.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/intro/index.md similarity index 99% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/intro/index.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/intro/index.md index 0d20b28..62508d1 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/intro/index.md +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/intro/index.md @@ -132,7 +132,7 @@ LVGL needs just one simple driver function to copy an array of pixels into a giv If you can do this with your display then you can use it with LVGL. Some examples of the supported display types: -- TFTs with 16 or 24 bit color depth +- TFTs with 16 or 32 bit color depth - Monitors with an HDMI port - Small monochrome displays - Gray-scale displays diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/layouts/flex.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/layouts/flex.md similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/layouts/flex.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/layouts/flex.md diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/layouts/grid.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/layouts/grid.md similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/layouts/grid.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/layouts/grid.md diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/layouts/index.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/layouts/index.md similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/layouts/index.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/layouts/index.md diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/libs/bmp.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/libs/bmp.md similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/libs/bmp.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/libs/bmp.md diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/libs/ffmpeg.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/libs/ffmpeg.md similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/libs/ffmpeg.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/libs/ffmpeg.md diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/libs/freetype.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/libs/freetype.md similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/libs/freetype.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/libs/freetype.md diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/libs/fsdrv.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/libs/fsdrv.md new file mode 100644 index 0000000..8f828d9 --- /dev/null +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/libs/fsdrv.md @@ -0,0 +1,45 @@ + +# File System Interfaces + +LVGL has a [File system](https://docs.lvgl.io/master/overview/file-system.html) module to provide an abstraction layer for various file system drivers. +You still need to provide the drivers and libraries, this extension provides only the bridge between FATFS, LittleFS, STDIO, POSIX, WIN32 and LVGL. + +## Built in wrappers + +### FATFS + +Bridge for [FatFS](http://elm-chan.org/fsw/ff/00index_e.html). FatFS itself is not part of LVGL, but can be added and initialized externally. + + +### LittleFS + +Though `lv_fs_littlefs` uses [LittleFS]((https://github.com/littlefs-project/littlefs)) API, the LittleFS library needs other external libraries that handle the mounting of partitions and low-level accesses, according to the given architecture. The functions for the latter are given to the lfs_t structure as pointers by an external low-level library. + +There's a convenience function called `lv_fs_littlefs_set_driver(LV_FS_LITTLEFS_LETTER, my_lfs)`, specific to `lv_fs_littlefs`, to attach a `lfs_t` object's pointer to a registered driver-letter. See its comments for more info. + + +[esp_littlefs](https://components.espressif.com/components/joltwallet/littlefs) is a wrapper for LittleFS to be used in Espressif ESP-devices. It handles the mounting and has the low-level `littlefs_api` functions to read/write/erase blocks that LittleFS library needs. On mounting by `esp_littlefs` the `lfs_t` structures are created. You need to get a handle to these to use ESP with `lv_fs_littlefs`, as all functions use that `lfs_t` in LittleFS to identify the mounted partition. + + +In case you don't find a special function in the `lv_fs_littlefs` wrapper, you can look for it in the `esp_littlefs` API and use it directly, as `lv_fs_littlefs` and the `esp_littlefs` APIs can be used side-by-side. + +### STDIO + +Bride to C standard functions on Linux and Windows. For example `fopen`, `fread`, etc. + +### POSIX + +Bride to POSIX functions on Linux and Windows. For example `open`, `read`, etc. + +### WIN32 + +Bride to Win32 API function. For example `CreateFileA`, `ReadFile`, etc. + +## Usage + +In `lv_conf.h` enable `LV_USE_FS_...` and assign an upper cased letter to `LV_FS_..._LETTER` (e.g. `'S'`). +After that you can access files using that driver letter. E.g. `"S:path/to/file.txt"`. + +The work directory can be set with `LV_FS_..._PATH`. E.g. `"/home/joe/projects/"` The actual file/directory paths will be appended to it. + +Cached reading is also supported if `LV_FS_..._CACHE_SIZE` is set to not `0` value. `lv_fs_read` caches this size of data to lower the number of actual reads from the storage. diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/libs/gif.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/libs/gif.md similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/libs/gif.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/libs/gif.md diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/libs/index.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/libs/index.md similarity index 92% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/libs/index.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/libs/index.md index 8217e91..f0eb900 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/libs/index.md +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/libs/index.md @@ -12,6 +12,7 @@ png gif freetype + tiny_ttf qrcode rlottie ffmpeg diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/libs/png.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/libs/png.md similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/libs/png.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/libs/png.md diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/libs/qrcode.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/libs/qrcode.md similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/libs/qrcode.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/libs/qrcode.md diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/libs/rlottie.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/libs/rlottie.md similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/libs/rlottie.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/libs/rlottie.md diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/libs/sjpg.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/libs/sjpg.md similarity index 97% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/libs/sjpg.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/libs/sjpg.md index 3ee7858..1c0735e 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/libs/sjpg.md +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/libs/sjpg.md @@ -12,7 +12,6 @@ Allow the use of JPG images in LVGL. Besides that it also allows the use of a cu - File read from file and c-array are implemented. - SJPEG frame fragment cache enables fast fetching of lines if available in cache. - By default the sjpg image cache will be image width * 2 * 16 bytes (can be modified) - - Currently only 16 bit image format is supported (TODO) - Only the required partion of the JPG and SJPG images are decoded, therefore they can't be zoomed or rotated. ## Usage diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/libs/tiny_ttf.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/libs/tiny_ttf.md new file mode 100644 index 0000000..fd795ae --- /dev/null +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/libs/tiny_ttf.md @@ -0,0 +1,35 @@ +# Tiny TTF font engine + +## Usage + +Use https://github.com/nothings/stb to render TrueType fonts in LVGL. + +When enabled in `lv_conf.h` with `LV_USE_TINY_TTF` +`lv_tiny_ttf_create_data(data, data_size, font_size)` can be used to +create a TTF font instance at the specified font size. You can then +use that font anywhere `lv_font_t` is accepted. + +By default, the TTF or OTF file must be embedded as an array, either in +a header, or loaded into RAM in order to function. + +However, if `LV_TINY_TTF_FILE_SUPPORT` is enabled, +`lv_tiny_ttf_create_file(path, font_size)` will also be available, +allowing tiny_ttf to stream from a file. The file must remain open the +entire time the font is being used, and streaming on demand may be +considerably slower. + +After a font is created, you can change the font size in pixels by using +`lv_tiny_ttf_set_size(font, font_size)`. + +By default, a font will use up to 4KB of cache to speed up rendering +glyphs. This maximum can be changed by using +`lv_tiny_ttf_create_data_ex(data, data_size, font_size, cache_size)` +or `lv_tiny_ttf_create_file_ex(path, font_size, cache_size)` (when +available). The cache size is indicated in bytes. + +## API + +```eval_rst +.. doxygenfile:: lv_tiny_ttf.h + :project: lvgl +``` diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/logo_lvgl.png b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/logo_lvgl.png similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/logo_lvgl.png rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/logo_lvgl.png diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/misc/align.png b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/misc/align.png similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/misc/align.png rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/misc/align.png diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/misc/anim-timeline.png b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/misc/anim-timeline.png similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/misc/anim-timeline.png rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/misc/anim-timeline.png diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/misc/bidi.png b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/misc/bidi.png similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/misc/bidi.png rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/misc/bidi.png diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/misc/boxmodel.png b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/misc/boxmodel.png similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/misc/boxmodel.png rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/misc/boxmodel.png diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/misc/btn_example.png b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/misc/btn_example.png similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/misc/btn_example.png rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/misc/btn_example.png diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/misc/button_style_example.gif b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/misc/button_style_example.gif similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/misc/button_style_example.gif rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/misc/button_style_example.gif diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/misc/button_style_example.png b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/misc/button_style_example.png similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/misc/button_style_example.png rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/misc/button_style_example.png diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/misc/codeblocks.jpg b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/misc/codeblocks.jpg similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/misc/codeblocks.jpg rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/misc/codeblocks.jpg diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/misc/eclipse.jpg b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/misc/eclipse.jpg similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/misc/eclipse.jpg rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/misc/eclipse.jpg diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/misc/layers.png b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/misc/layers.png similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/misc/layers.png rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/misc/layers.png diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/misc/par_child1.png b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/misc/par_child1.png similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/misc/par_child1.png rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/misc/par_child1.png diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/misc/par_child2.png b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/misc/par_child2.png similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/misc/par_child2.png rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/misc/par_child2.png diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/misc/par_child3.png b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/misc/par_child3.png similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/misc/par_child3.png rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/misc/par_child3.png diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/misc/platformio.jpg b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/misc/platformio.jpg similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/misc/platformio.jpg rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/misc/platformio.jpg diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/misc/qtcreator.jpg b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/misc/qtcreator.jpg similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/misc/qtcreator.jpg rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/misc/qtcreator.jpg diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/misc/simple_button_example.gif b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/misc/simple_button_example.gif similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/misc/simple_button_example.gif rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/misc/simple_button_example.gif diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/misc/simple_button_example.png b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/misc/simple_button_example.png similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/misc/simple_button_example.png rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/misc/simple_button_example.png diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/misc/symbols.png b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/misc/symbols.png similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/misc/symbols.png rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/misc/symbols.png diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/misc/sys.png b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/misc/sys.png similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/misc/sys.png rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/misc/sys.png diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/misc/visualstudio.jpg b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/misc/visualstudio.jpg similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/misc/visualstudio.jpg rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/misc/visualstudio.jpg diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/others/fragment.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/others/fragment.md similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/others/fragment.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/others/fragment.md diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/others/gridnav.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/others/gridnav.md similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/others/gridnav.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/others/gridnav.md diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/others/ime_pinyin.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/others/ime_pinyin.md similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/others/ime_pinyin.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/others/ime_pinyin.md diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/others/imgfont.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/others/imgfont.md similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/others/imgfont.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/others/imgfont.md diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/others/index.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/others/index.md similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/others/index.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/others/index.md diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/others/monkey.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/others/monkey.md similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/others/monkey.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/others/monkey.md diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/others/msg.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/others/msg.md similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/others/msg.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/others/msg.md diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/others/snapshot.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/others/snapshot.md similarity index 96% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/others/snapshot.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/others/snapshot.md index fc54ca3..65383d0 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/others/snapshot.md +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/others/snapshot.md @@ -37,7 +37,7 @@ void update_snapshot(lv_obj_t * obj, lv_obj_t * img_snapshot) ``` ### Use Existing Buffer -If the snapshot needs update now and then, or simply caller provides memory, use API `lv_res_t lv_snapshot_take_to_buf(lv_obj_t * obj, lv_img_cf_t cf, lv_img_dsc_t * dsc, void * buf, uint32_t buff_size);` for this case. It's caller's responsibility to alloc/free the memory. +If the snapshot needs update now and then, or simply caller provides memory, use API `lv_res_t lv_snapshot_take_to_buf(lv_obj_t * obj, lv_img_cf_t cf, lv_img_dsc_t * dsc, void * buf, uint32_t buf_size);` for this case. It's caller's responsibility to alloc/free the memory. If snapshot is generated successfully, the image descriptor is updated and image data will be stored to provided `buf`. diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/overview/animation.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/overview/animation.md similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/overview/animation.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/overview/animation.md diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/overview/color.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/overview/color.md similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/overview/color.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/overview/color.md diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/overview/coords.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/overview/coords.md similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/overview/coords.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/overview/coords.md diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/overview/display.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/overview/display.md similarity index 98% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/overview/display.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/overview/display.md index b756b77..4626a56 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/overview/display.md +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/overview/display.md @@ -67,7 +67,7 @@ The Alpha channel of 32-bit colors will be 0 where there are no objects and 255 In summary, to enable transparent screens and displays for OSD menu-like UIs: - Enable `LV_COLOR_SCREEN_TRANSP` in `lv_conf.h` -- Set the screen's opacity to `LV_OPA_TRANSP` e.g. with `lv_obj_set_style_local_bg_opa(lv_scr_act(), LV_OBJMASK_PART_MAIN, LV_STATE_DEFAULT, LV_OPA_TRANSP)` +- Set the screen's opacity to `LV_OPA_TRANSP` e.g. with `lv_obj_set_style_bg_opa(lv_scr_act(), LV_OPA_TRANSP, LV_PART_MAIN)` - Set the display opacity to `LV_OPA_TRANSP` with `lv_disp_set_bg_opa(NULL, LV_OPA_TRANSP);` ## Features of displays diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/overview/drawing.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/overview/drawing.md similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/overview/drawing.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/overview/drawing.md diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/overview/event.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/overview/event.md similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/overview/event.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/overview/event.md diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/overview/file-system.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/overview/file-system.md similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/overview/file-system.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/overview/file-system.md diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/overview/font.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/overview/font.md similarity index 97% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/overview/font.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/overview/font.md index 9e1265c..ea6dea0 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/overview/font.md +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/overview/font.md @@ -99,11 +99,12 @@ This means it's enough to set the base direction of a screen and every object wi The default base direction for screens can be set by `LV_BIDI_BASE_DIR_DEF` in *lv_conf.h* and other objects inherit the base direction from their parent. -To set an object's base direction use `lv_obj_set_base_dir(obj, base_dir)`. The possible base directions are: -- `LV_BIDI_DIR_LTR`: Left to Right base direction -- `LV_BIDI_DIR_RTL`: Right to Left base direction -- `LV_BIDI_DIR_AUTO`: Auto detect base direction -- `LV_BIDI_DIR_INHERIT`: Inherit base direction from the parent (or a default value for non-screen objects) +To set an object's base direction use `lv_obj_set_style_base_dir(obj, base_dir,selector)`. The possible base directions are: +- `LV_BASE_DIR_LTR`: Left to Right base direction +- `LV_BASE_DIR_RTL`: Right to Left base direction +- `LV_BASE_DIR_AUTO`: Auto detect base direction +- `LV_BASE_DIR_NEUTRAL` +- `LV_BASE_DIR_WEAK` This list summarizes the effect of RTL base direction on objects: - Create objects by default on the right @@ -112,6 +113,7 @@ This list summarizes the effect of RTL base direction on objects: - `lv_btnmatrix`: Shows buttons from right to left - `lv_list`: Shows icons on the right - `lv_dropdown`: Aligns options to the right +- `lv_bar`: Shows progress from right to left - The texts in `lv_table`, `lv_btnmatrix`, `lv_keyboard`, `lv_tabview`, `lv_dropdown`, `lv_roller` are "BiDi processed" to be displayed correctly ### Arabic and Persian support diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/overview/image.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/overview/image.md similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/overview/image.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/overview/image.md diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/overview/indev.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/overview/indev.md similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/overview/indev.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/overview/indev.md diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/overview/index.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/overview/index.md similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/overview/index.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/overview/index.md diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/overview/layer.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/overview/layer.md similarity index 90% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/overview/layer.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/overview/layer.md index 8cb4645..dd4301b 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/overview/layer.md +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/overview/layer.md @@ -34,11 +34,11 @@ lv_label_set_text(label2, "Button 2"); /*Set the text of the label*/ lv_obj_del(label2); ``` -## Bring to the foreground +## Change order There are four explicit ways to bring an object to the foreground: - Use `lv_obj_move_foreground(obj)` to bring an object to the foreground. Similarly, use `lv_obj_move_background(obj)` to move it to the background. -- Use `lv_obj_move_up(obj)` to move an object one position up in the hierarchy, Similarly, use `lv_obj_move_down(obj)` to move an object one position down in the hierarchy. +- Use `lv_obj_move_to_index(obj, idx)` to move an object to a given index in the order of children. (0: backgroud, child_num - 1: foreground, <0: count from the top, to move forward (up): `lv_obj_move_to_index(obj, lv_obj_get_index(obj) - 1)`) - Use `lv_obj_swap(obj1, obj2)` to swap the relative layer position of two objects. - When `lv_obj_set_parent(obj, new_parent)` is used, `obj` will be on the foreground of the `new_parent`. diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/overview/new_widget.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/overview/new_widget.md similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/overview/new_widget.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/overview/new_widget.md diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/overview/object.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/overview/object.md similarity index 99% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/overview/object.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/overview/object.md index a2849dc..d019c35 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/overview/object.md +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/overview/object.md @@ -173,7 +173,7 @@ All inputs are disabled during the screen animation. Screens are created on the currently selected *default display*. The *default display* is the last registered display with `lv_disp_drv_register`. You can also explicitly select a new default display using `lv_disp_set_default(disp)`. -`lv_scr_act()`, `lv_scr_load()` and `lv_scr_load_anim()` operate on the default screen. +`lv_scr_act()`, `lv_scr_load()` and `lv_scr_load_anim()` operate on the default display. Visit [Multi-display support](/overview/display) to learn more. diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/overview/renderers/arm-2d.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/overview/renderers/arm-2d.md new file mode 100644 index 0000000..85a4dbc --- /dev/null +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/overview/renderers/arm-2d.md @@ -0,0 +1,32 @@ +# Arm-2D GPU + +Arm-2D is not a GPU but **an abstraction layer for 2D GPUs dedicated to Microcontrollers**. It supports all Cortex-M processors ranging from Cortex-M0 to the latest Cortex-M85. + +Arm-2D is an open-source project on Github. For more, please refer to: https://github.com/ARM-software/Arm-2D. + + + +## How to Use + +In general, you can set the macro `LV_USE_GPU_ARM2D` to `1`in `lv_conf.h` to enable Arm-2D acceleration for LVGL. + +If you are using **[CMSIS-Pack](https://github.com/lvgl/lvgl/tree/master/env_support/cmsis-pack)** to deploy the LVGL. You don't have to define the macro `LV_USE_GPU_ARM2D` manually, instead, please select the component `GPU Arm-2D` in the **RTE** dialog. This step will define the macro for us. + + + +## Design Considerations + +As mentioned before, Arm-2D is an abstraction layer for 2D GPU; hence if there is no accelerator or dedicated instruction set (such as Helium or ACI) available for Arm-2D, it provides negligible performance boost for LVGL (sometimes worse) for regular Cortex-M processors. + +**We highly recommend you enable Arm-2D acceleration for LVGL** when: + +- The target processors are **Cortex-M55** and/or **Cortex-M85** +- The target processors support **[Helium](https://developer.arm.com/documentation/102102/0103/?lang=en)**. +- The device vendor provides an arm-2d compliant driver for their propriotory 2D accelerators and/or customized instruction set. +- The target device contains [DMA-350](https://community.arm.com/arm-community-blogs/b/internet-of-things-blog/posts/arm-corelink-dma-350-next-generation-direct-memory-access-for-endpoint-ai) + + + +## Examples + +- [A Cortex-M55 (supports Helium) based MDK Project, PC emulation is available.](https://github.com/lvgl/lv_port_an547_cm55_sim) diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/overview/renderers/dma2d.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/overview/renderers/dma2d.md similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/overview/renderers/dma2d.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/overview/renderers/dma2d.md diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/overview/renderers/index.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/overview/renderers/index.md similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/overview/renderers/index.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/overview/renderers/index.md diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/overview/renderers/pxp-vglite.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/overview/renderers/pxp-vglite.md similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/overview/renderers/pxp-vglite.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/overview/renderers/pxp-vglite.md diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/overview/renderers/sdl.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/overview/renderers/sdl.md similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/overview/renderers/sdl.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/overview/renderers/sdl.md diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/overview/renderers/sw.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/overview/renderers/sw.md similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/overview/renderers/sw.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/overview/renderers/sw.md diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/overview/scroll.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/overview/scroll.md similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/overview/scroll.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/overview/scroll.md diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/overview/style-props.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/overview/style-props.md similarity index 98% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/overview/style-props.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/overview/style-props.md index 74a0cd5..ab08df9 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/overview/style-props.md +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/overview/style-props.md @@ -355,7 +355,7 @@ Set the opacity of the border. Value 0, `LV_OPA_0` or `LV_OPA_TRANSP` means full ### border_width -Set hte width of the border. Only pixel values can be used. +Set the width of the border. Only pixel values can be used.
  • Default 0
  • Inherited No
  • @@ -708,6 +708,15 @@ Scale down all opacity values of the object by this factor. Value 0, `LV_OPA_0`
  • Ext. draw No
+### opa_layered +First draw the object on the layer, then scale down layer opacity factor. Value 0, `LV_OPA_0` or `LV_OPA_TRANSP` means fully transparent, 255, `LV_OPA_100` or `LV_OPA_COVER` means fully covering, other values or LV_OPA_10, LV_OPA_20, etc means semi transparency. +
    +
  • Default `LV_OPA_COVER`
  • +
  • Inherited Yes
  • +
  • Layout No
  • +
  • Ext. draw No
  • +
+ ### color_filter_dsc Mix a color to all colors of the object.
    @@ -772,7 +781,7 @@ Describes how to blend the colors to the background. The possible values are `LV
### layout -Set the layout if the object. The children will be repositioned and resized according to the policies set for the layout. For the possible values see the documentation of the layouts. +Set the layout of the object. The children will be repositioned and resized according to the policies set for the layout. For the possible values see the documentation of the layouts.
  • Default 0
  • Inherited No
  • diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/overview/style.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/overview/style.md similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/overview/style.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/overview/style.md diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/overview/timer.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/overview/timer.md similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/overview/timer.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/overview/timer.md diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/porting/display.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/porting/display.md similarity index 97% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/porting/display.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/porting/display.md index f06d48d..015b902 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/porting/display.md +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/porting/display.md @@ -204,6 +204,10 @@ The default rotation of your display when it is initialized can be set using the Display rotation can also be changed at runtime using the `lv_disp_set_rotation(disp, rot)` API. +If you enable rotation the coordinates of the pointer input devices (e.g. touchpad) will be rotated too. + +Note that when using software rotation, you cannot use neither `direct_mode` nor `full_refresh` in the driver. When using either of these, you will have to rotate the pixels yourself e.g. in the `flush_cb`. + Support for software rotation is a new feature, so there may be some glitches/bugs depending on your configuration. If you encounter a problem please open an issue on [GitHub](https://github.com/lvgl/lvgl/issues). ### Decoupling the display refresh timer diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/porting/gpu.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/porting/gpu.md similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/porting/gpu.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/porting/gpu.md diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/porting/indev.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/porting/indev.md similarity index 98% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/porting/indev.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/porting/indev.md index 0066f56..50958a0 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/porting/indev.md +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/porting/indev.md @@ -114,7 +114,7 @@ You need to have 3 buttons available: - `LV_KEY_RIGHT` will simulate turning encoder right - other keys will be passed to the focused widget -If you hold the keys it will simulate an encoder advance with period specified in `indev_drv.long_press_rep_time`. +If you hold the keys it will simulate an encoder advance with period specified in `indev_drv.long_press_repeat_time`. ```c indev_drv.type = LV_INDEV_TYPE_ENCODER; @@ -172,7 +172,7 @@ The default value of the following parameters can be changed in `lv_indev_drv_t` - `scroll_limit` Number of pixels to slide before actually scrolling the object. - `scroll_throw` Scroll throw (momentum) slow-down in [%]. Greater value means faster slow-down. - `long_press_time` Press time to send `LV_EVENT_LONG_PRESSED` (in milliseconds) -- `long_press_rep_time` Interval of sending `LV_EVENT_LONG_PRESSED_REPEAT` (in milliseconds) +- `long_press_repeat_time` Interval of sending `LV_EVENT_LONG_PRESSED_REPEAT` (in milliseconds) - `read_timer` pointer to the `lv_timer` which reads the input device. Its parameters can be changed by `lv_timer_...()` functions. `LV_INDEV_DEF_READ_PERIOD` in `lv_conf.h` sets the default read period. ### Feedback diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/porting/index.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/porting/index.md similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/porting/index.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/porting/index.md diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/porting/log.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/porting/log.md similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/porting/log.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/porting/log.md diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/porting/os.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/porting/os.md similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/porting/os.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/porting/os.md diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/porting/project.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/porting/project.md similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/porting/project.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/porting/project.md diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/porting/sleep.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/porting/sleep.md similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/porting/sleep.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/porting/sleep.md diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/porting/tick.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/porting/tick.md similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/porting/tick.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/porting/tick.md diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/porting/timer-handler.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/porting/timer-handler.md similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/porting/timer-handler.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/porting/timer-handler.md diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/requirements.txt b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/requirements.txt similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/requirements.txt rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/requirements.txt diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/widgets/core/arc.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/widgets/core/arc.md similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/widgets/core/arc.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/widgets/core/arc.md diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/widgets/core/bar.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/widgets/core/bar.md similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/widgets/core/bar.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/widgets/core/bar.md diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/widgets/core/btn.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/widgets/core/btn.md similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/widgets/core/btn.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/widgets/core/btn.md diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/widgets/core/btnmatrix.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/widgets/core/btnmatrix.md similarity index 98% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/widgets/core/btnmatrix.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/widgets/core/btnmatrix.md index a9ca82e..152ef58 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/widgets/core/btnmatrix.md +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/widgets/core/btnmatrix.md @@ -25,7 +25,7 @@ So in the example the first row will have 2 buttons each with 50% width and a se The buttons' width can be set relative to the other button in the same row with `lv_btnmatrix_set_btn_width(btnm, btn_id, width)` E.g. in a line with two buttons: *btnA, width = 1* and *btnB, width = 2*, *btnA* will have 33 % width and *btnB* will have 66 % width. It's similar to how the [`flex-grow`](https://developer.mozilla.org/en-US/docs/Web/CSS/flex-grow) property works in CSS. -The width must be in the \[1..7\] range and the default width is 1. +The width must be in the \[1..15\] range and the default width is 1. In addition to the width, each button can be customized with the following parameters: - `LV_BTNMATRIX_CTRL_HIDDEN` Makes a button hidden (hidden buttons still take up space in the layout, they are just not visible or clickable) diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/widgets/core/canvas.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/widgets/core/canvas.md similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/widgets/core/canvas.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/widgets/core/canvas.md diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/widgets/core/checkbox.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/widgets/core/checkbox.md similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/widgets/core/checkbox.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/widgets/core/checkbox.md diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/widgets/core/dropdown.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/widgets/core/dropdown.md similarity index 98% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/widgets/core/dropdown.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/widgets/core/dropdown.md index c14b933..7e1e185 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/widgets/core/dropdown.md +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/widgets/core/dropdown.md @@ -43,7 +43,7 @@ Options are passed to the drop-down list as a string with `lv_dropdown_set_optio The `lv_dropdown_add_option(dropdown, "New option", pos)` function inserts a new option to `pos` index. -To save memory the options can set from a static(constant) string too with `lv_dropdown_set_static_options(dropdown, options)`. +To save memory the options can set from a static(constant) string too with `lv_dropdown_set_options_static(dropdown, options)`. In this case the options string should be alive while the drop-down list exists and `lv_dropdown_add_option` can't be used You can select an option manually with `lv_dropdown_set_selected(dropdown, id)`, where `id` is the index of an option. diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/widgets/core/img.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/widgets/core/img.md similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/widgets/core/img.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/widgets/core/img.md diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/widgets/core/index.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/widgets/core/index.md similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/widgets/core/index.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/widgets/core/index.md diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/widgets/core/label.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/widgets/core/label.md similarity index 96% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/widgets/core/label.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/widgets/core/label.md index cf2b3c8..841ef23 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/widgets/core/label.md +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/widgets/core/label.md @@ -44,7 +44,9 @@ This is not the case with `lv_label_set_text_static`. The buffer you pass to `lv ### Text recolor In the text, you can use commands to recolor parts of the text. For example: `"Write a #ff0000 red# word"`. -This feature can be enabled individually for each label by `lv_label_set_recolor()` function. +This feature can be enabled individually for each label by `lv_label_set_recolor()` function, +recoloring is only supported when the text wrapped with `##ff0000 ... #`sintax is in one line, +it is not supported in wrapped text, see example `Line wrap, recoloring and scrolling`. ### Text selection If enabled by `LV_LABEL_TEXT_SELECTION` part of the text can be selected. It's similar to when you use your mouse on a PC to select a text. diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/widgets/core/line.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/widgets/core/line.md similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/widgets/core/line.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/widgets/core/line.md diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/widgets/core/roller.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/widgets/core/roller.md similarity index 91% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/widgets/core/roller.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/widgets/core/roller.md index 491d9d2..fb483aa 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/widgets/core/roller.md +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/widgets/core/roller.md @@ -18,6 +18,8 @@ Options are passed to the Roller as a string with `lv_roller_set_options(roller, You can select an option manually with `lv_roller_set_selected(roller, id, LV_ANIM_ON/OFF)`, where *id* is the index of an option. +If the roller has a lot of options then especially in infinite mode the rendered options of the display might look scrambled. In this case `LV_USE_LARGE_COORD` should be enabled in `lv_conf.h` + ### Get selected option To get the *index* of the currently selected option use `lv_roller_get_selected(roller)`. diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/widgets/core/slider.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/widgets/core/slider.md similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/widgets/core/slider.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/widgets/core/slider.md diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/widgets/core/switch.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/widgets/core/switch.md similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/widgets/core/switch.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/widgets/core/switch.md diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/widgets/core/table.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/widgets/core/table.md similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/widgets/core/table.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/widgets/core/table.md diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/widgets/core/textarea.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/widgets/core/textarea.md similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/widgets/core/textarea.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/widgets/core/textarea.md diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/widgets/extra/animimg.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/widgets/extra/animimg.md similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/widgets/extra/animimg.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/widgets/extra/animimg.md diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/widgets/extra/calendar.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/widgets/extra/calendar.md similarity index 65% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/widgets/extra/calendar.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/widgets/extra/calendar.md index 5dd601d..65f484f 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/widgets/extra/calendar.md +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/widgets/extra/calendar.md @@ -1,5 +1,7 @@ # Calendar (lv_calendar) +**From v8.1 the header is added directly into the Calendar widget and the API of the headers has been changed.** + ## Overview The Calendar object is a classic calendar which can: @@ -13,13 +15,16 @@ The Calendar is added to the default group (if it is set). Calendar is an editab To make the Calendar flexible, by default it doesn't show the current year or month. Instead, there are optional "headers" that can be attached to the calendar. ## Parts and Styles -The calendar object uses the [Button matrix](/widgets/core/btnmatrix) object under the hood to arrange the days into a matrix. -- `LV_PART_MAIN` The background of the calendar. Uses all the background related style properties. -- `LV_PART_ITEMS` Refers to the dates and day names. Button matrix control flags are set to differentiate the buttons and a custom drawer event is added modify the properties of the buttons as follows: - - day names have no border, no background and drawn with a gray color - - days of the previous and next month have `LV_BTNMATRIX_CTRL_DISABLED` flag - - today has a thicker border with the theme's primary color - - highlighted days have some opacity with the theme's primary color. +The Calendar is composed of 3 widegets +- Container: A rectangle which is a container for the *Header* and the *Days*. Uses only `LV_PART_MAIN` where all the background related style properties are working. +- Days: It's a [Button matrix](/widgets/core/btnmatrix) object under the hood to arrange the days into a matrix. `lv_calendar_get_btnmatrix(calendar)` can be used to get it. + - `LV_PART_MAIN` The background of the calendar. Uses all the background related style properties. + - `LV_PART_ITEMS` Refers to the dates and day names. Button matrix control flags are set to differentiate the buttons and a custom drawer event is added modify the properties of the buttons as follows: + - day names have no border, no background and drawn with a gray color + - days of the previous and next month have `LV_BTNMATRIX_CTRL_DISABLED` flag + - today has a thicker border with the theme's primary color + - highlighted days have some opacity with the theme's primary color. +- Header: Not created by default, the details are up to the given header. ## Usage @@ -40,6 +45,13 @@ Only the array's pointer will be saved so the array should be a static or global The name of the days can be adjusted with `lv_calendar_set_day_names(calendar, day_names)` where `day_names` looks like `const char * day_names[7] = {"Su", "Mo", ...};` Only the pointer of the day names is saved so the elements should be static, global or constant variables. +### Custom year list + +Sets a custom year list with `lv_calendar_header_dropdown_set_year_list(calendar, years_list)` +where ``years_list`` is a pointer to the custom years list. It can be a constant string +like ``static const char * years = "2023\n2022\n2021\n2020\n2019";``, +or can be generated dynamically into a buffer as well. + ## Events - `LV_EVENT_VALUE_CHANGED` Sent if a date is clicked. `lv_calendar_get_pressed_date(calendar, &date)` set `date` to the date currently being pressed. Returns `LV_RES_OK` if there is a valid pressed date, else `LV_RES_INV`. @@ -53,8 +65,6 @@ Learn more about [Keys](/overview/indev). ## Headers -**From v8.1 the header is added directly into the Calendar widget and the API of the headers has been changed.** - ### Arrow buttons `lv_calendar_header_arrow_create(calendar)` creates a header that contains a left and right arrow on the sides and a text with the current year and month between them. diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/widgets/extra/chart.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/widgets/extra/chart.md similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/widgets/extra/chart.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/widgets/extra/chart.md diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/widgets/extra/colorwheel.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/widgets/extra/colorwheel.md similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/widgets/extra/colorwheel.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/widgets/extra/colorwheel.md diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/widgets/extra/imgbtn.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/widgets/extra/imgbtn.md similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/widgets/extra/imgbtn.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/widgets/extra/imgbtn.md diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/widgets/extra/index.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/widgets/extra/index.md similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/widgets/extra/index.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/widgets/extra/index.md diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/widgets/extra/keyboard.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/widgets/extra/keyboard.md similarity index 98% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/widgets/extra/keyboard.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/widgets/extra/keyboard.md index 037c0e9..ef13e8b 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/widgets/extra/keyboard.md +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/widgets/extra/keyboard.md @@ -67,7 +67,7 @@ The keyboard has a **default event handler** callback called `lv_keyboard_def_ev Learn more about [Events](/overview/event). ## Keys -- `LV_KEY_RIGHT/UP/LEFT/RIGHT` To navigate among the buttons and select one. +- `LV_KEY_DOWN/UP/LEFT/RIGHT` To navigate among the buttons and select one. - `LV_KEY_ENTER` To press/release the selected button. Learn more about [Keys](/overview/indev). diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/widgets/extra/led.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/widgets/extra/led.md similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/widgets/extra/led.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/widgets/extra/led.md diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/widgets/extra/list.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/widgets/extra/list.md similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/widgets/extra/list.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/widgets/extra/list.md diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/widgets/extra/menu.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/widgets/extra/menu.md similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/widgets/extra/menu.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/widgets/extra/menu.md diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/widgets/extra/meter.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/widgets/extra/meter.md similarity index 92% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/widgets/extra/meter.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/widgets/extra/meter.md index 2d9a0f9..b55b2ce 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/widgets/extra/meter.md +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/widgets/extra/meter.md @@ -1,11 +1,11 @@ # Meter (lv_meter) ## Overview -The Meter widget can visualize data in very flexible ways. In can show arcs, needles, ticks lines and labels. +The Meter widget can visualize data in very flexible ways. It can show arcs, needles, ticks lines and labels. ## Parts and Styles - `LV_PART_MAIN` The background of the Meter. Uses the typical background properties. -- `LV_PART_TICK` The tick lines a labels using the *line* and *text* style properties. +- `LV_PART_TICKS` The tick lines a labels using the *line* and *text* style properties. - `LV_PART_INDICATOR` The needle line or image using the *line* and *img* style properties, as well as the background properties to draw a square (or circle) on the pivot of the needles. Padding makes the square larger. - `LV_PART_ITEMS` The arcs using the *arc* properties. @@ -18,7 +18,7 @@ The Scale has minor and major ticks and labels on the major ticks. Later indicat Any number of scales can be added to Meter. -The minor tick lines can be configured with: `lv_meter_set_scale_ticks(meter, scale, tick_count, line_width, tick_length, ctick_olor)`. +The minor tick lines can be configured with: `lv_meter_set_scale_ticks(meter, scale, tick_count, line_width, tick_length, tick_color)`. To add major tick lines use `lv_meter_set_scale_major_ticks(meter, scale, nth_major, tick_width, tick_length, tick_color, label_gap)`. `nth_major` to specify how many minor ticks to skip to draw a major tick. @@ -46,7 +46,7 @@ All the indicator add functions return `lv_meter_indicator_t *`. `lv_meter_set_indicator_value(meter, inidicator, value)` sets the value of the indicator. #### Arc -`indic = lv_meter_add_arc(meter, scale, arc_width, arc_color, r_mod)` adds and arc indicator. . By default, the radius of the arc is the same as the scale's radius but `r_mod` changes the radius. +`indic = lv_meter_add_arc(meter, scale, arc_width, arc_color, r_mod)` adds an arc indicator. By default, the radius of the arc is the same as the scale's radius but `r_mod` changes the radius. `lv_meter_set_indicator_start_value(meter, indic, value)` and `lv_meter_set_indicator_end_value(meter, inidicator, value)` sets the value of the indicator. diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/widgets/extra/msgbox.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/widgets/extra/msgbox.md similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/widgets/extra/msgbox.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/widgets/extra/msgbox.md diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/widgets/extra/span.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/widgets/extra/span.md similarity index 94% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/widgets/extra/span.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/widgets/extra/span.md index fb18a60..67df95a 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/widgets/extra/span.md +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/widgets/extra/span.md @@ -37,7 +37,7 @@ like label object, the spangroup can be set to one the following modes: use function `lv_spangroup_set_align(spangroup, LV_TEXT_ALIGN_CENTER)` to set text align. ### Modes -The spangroup can be set to one the following modes: +The spangroup can be set to one of the following modes: - `LV_SPAN_MODE_FIXED` fixes the object size. - `LV_SPAN_MODE_EXPAND` Expand the object size to the text size but stay on a single line. - `LV_SPAN_MODE_BREAK` Keep width, break the too long lines and auto expand height. @@ -45,14 +45,14 @@ The spangroup can be set to one the following modes: Use `lv_spangroup_set_mode(spangroup, LV_SPAN_MODE_BREAK)` to set object mode. ### Overflow -The spangroup can be set to one the following modes: +The spangroup can be set to one of the following modes: - `LV_SPAN_OVERFLOW_CLIP` truncates the text at the limit of the area. - `LV_SPAN_OVERFLOW_ELLIPSIS` will display an ellipsis(`...`) when text overflows the area. Use `lv_spangroup_set_overflow(spangroup, LV_SPAN_OVERFLOW_CLIP)` to set object overflow mode. ### first line indent -Use `lv_spangroup_set_indent(spangroup, 20)` to set the indent of the first line. all modes support pixel units, in addition to LV_SPAN_MODE_FIXED and LV_SPAN_MODE_BREAK mode supports percentage units too. +Use `lv_spangroup_set_indent(spangroup, 20)` to set the indent of the first line. All modes support pixel units, in addition to LV_SPAN_MODE_FIXED and LV_SPAN_MODE_BREAK mode supports percentage units too. ### lines Use `lv_spangroup_set_lines(spangroup, 10)` to set the maximum number of lines to be displayed in LV_SPAN_MODE_BREAK mode, negative values indicate no limit. diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/widgets/extra/spinbox.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/widgets/extra/spinbox.md similarity index 96% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/widgets/extra/spinbox.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/widgets/extra/spinbox.md index 425b2c3..9c12769 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/widgets/extra/spinbox.md +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/widgets/extra/spinbox.md @@ -38,7 +38,7 @@ Learn more about [Events](/overview/event). ## Keys - `LV_KEY_LEFT/RIGHT` With *Keypad* move the cursor left/right. With *Encoder* decrement/increment the selected digit. - `LV_KEY_UP/DOWN` With *Keypad* and *Encoder* increment/decrement the value. -- `LV_KEY_ENTER` With *Encoder* got the net digit. Jump to the first after the last. +- `LV_KEY_ENTER` With *Encoder* got the next digit. Jump to the first after the last. ## Example diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/widgets/extra/spinner.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/widgets/extra/spinner.md similarity index 94% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/widgets/extra/spinner.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/widgets/extra/spinner.md index 8c9b37c..197fd51 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/widgets/extra/spinner.md +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/widgets/extra/spinner.md @@ -13,7 +13,7 @@ The parts are identical to the parts of [lv_arc](/widgets/core/arc). To create a spinner use `lv_spinner_create(parent, spin_time, arc_length)`. `spin time` sets the spin time in milliseconds, `arc_length` sets the length of the spinning arc in degrees. ## Events -No special events are sent to the Spinner. +No special events are sent by the Spinner. See the events of the [Arc](/widgets/core/arc) too. diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/widgets/extra/tabview.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/widgets/extra/tabview.md similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/widgets/extra/tabview.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/widgets/extra/tabview.md diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/widgets/extra/tileview.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/widgets/extra/tileview.md similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/widgets/extra/tileview.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/widgets/extra/tileview.md diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/widgets/extra/win.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/widgets/extra/win.md similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/widgets/extra/win.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/widgets/extra/win.md diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/widgets/index.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/widgets/index.md similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/widgets/index.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/widgets/index.md diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/widgets/obj.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/widgets/obj.md similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/widgets/obj.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/docs/widgets/obj.md diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/env_support/cmake/custom.cmake b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/env_support/cmake/custom.cmake similarity index 90% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/env_support/cmake/custom.cmake rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/env_support/cmake/custom.cmake index 5616982..1536710 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/env_support/cmake/custom.cmake +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/env_support/cmake/custom.cmake @@ -63,6 +63,18 @@ install( FILES_MATCHING PATTERN "*.h") +install( + FILES "${LV_CONF_PATH}" + DESTINATION "${CMAKE_INSTALL_PREFIX}/${INC_INSTALL_DIR}/../" + RENAME "lv_conf.h" + OPTIONAL) + +configure_file("${LVGL_ROOT_DIR}/lvgl.pc.in" lvgl.pc @ONLY) + +install( + FILES "${CMAKE_BINARY_DIR}/lvgl.pc" + DESTINATION "${LIB_INSTALL_DIR}/pkgconfig/") + set_target_properties( lvgl PROPERTIES OUTPUT_NAME lvgl diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/env_support/cmake/esp.cmake b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/env_support/cmake/esp.cmake similarity index 89% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/env_support/cmake/esp.cmake rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/env_support/cmake/esp.cmake index e600d58..edc3709 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/env_support/cmake/esp.cmake +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/env_support/cmake/esp.cmake @@ -15,6 +15,7 @@ if(LV_MICROPYTHON) else() if(CONFIG_LV_BUILD_EXAMPLES) file(GLOB_RECURSE EXAMPLE_SOURCES ${LVGL_ROOT_DIR}/examples/*.c) + set_source_files_properties(${EXAMPLE_SOURCES} COMPILE_FLAGS "-Wno-unused-variable -Wno-format") endif() if(CONFIG_LV_USE_DEMO_WIDGETS) @@ -36,11 +37,13 @@ else() if(CONFIG_LV_USE_DEMO_MUSIC) file(GLOB_RECURSE DEMO_MUSIC_SOURCES ${LVGL_ROOT_DIR}/demos/music/*.c) list(APPEND DEMO_SOURCES ${DEMO_MUSIC_SOURCES}) + set_source_files_properties(${DEMO_MUSIC_SOURCES} COMPILE_FLAGS "-Wno-format") endif() idf_component_register(SRCS ${SOURCES} ${EXAMPLE_SOURCES} ${DEMO_SOURCES} INCLUDE_DIRS ${LVGL_ROOT_DIR} ${LVGL_ROOT_DIR}/src ${LVGL_ROOT_DIR}/../ - ${LVGL_ROOT_DIR}/examples ${LVGL_ROOT_DIR}/demos) + ${LVGL_ROOT_DIR}/examples ${LVGL_ROOT_DIR}/demos + REQUIRES esp_timer) endif() target_compile_definitions(${COMPONENT_LIB} PUBLIC "-DLV_CONF_INCLUDE_SIMPLE") diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/env_support/cmake/micropython.cmake b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/env_support/cmake/micropython.cmake similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/env_support/cmake/micropython.cmake rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/env_support/cmake/micropython.cmake diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/env_support/cmake/zephyr.cmake b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/env_support/cmake/zephyr.cmake similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/env_support/cmake/zephyr.cmake rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/env_support/cmake/zephyr.cmake diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/env_support/cmsis-pack/LVGL.lvgl.1.0.6.pack b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/env_support/cmsis-pack/LVGL.lvgl.8.4.0.pack similarity index 80% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/env_support/cmsis-pack/LVGL.lvgl.1.0.6.pack rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/env_support/cmsis-pack/LVGL.lvgl.8.4.0.pack index 049a44e..62e06df 100644 Binary files a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/env_support/cmsis-pack/LVGL.lvgl.1.0.6.pack and b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/env_support/cmsis-pack/LVGL.lvgl.8.4.0.pack differ diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/env_support/cmsis-pack/LVGL.lvgl.pdsc b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/env_support/cmsis-pack/LVGL.lvgl.pdsc similarity index 69% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/env_support/cmsis-pack/LVGL.lvgl.pdsc rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/env_support/cmsis-pack/LVGL.lvgl.pdsc index e5033f3..7099923 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/env_support/cmsis-pack/LVGL.lvgl.pdsc +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/env_support/cmsis-pack/LVGL.lvgl.pdsc @@ -20,7 +20,7 @@ --> - + LVGL lvgl LVGL (Light and Versatile Graphics Library) is a free and open-source graphics library providing everything you need to create an embedded GUI with easy-to-use graphical elements, beautiful visual effects and a low memory footprint. @@ -36,12 +36,51 @@ https://github.com/lvgl/lvgl.git - - - LVGL 8.3.0 release - - Apply patch for memory leaking issue - - Apply patch to speed up non normal blend mode - - Add 9-key input mode to pinyin - - Other minor changes + + - LVGL 8.4.0 + - Some minor fixes + + + - LVGL 8.3.11 + - Add LittleFS Library to LVGL8 + - Backport Tiny TTF to LVGL8 + - Some minor fixes + + + - LVGL 8.3.10 + - Some minor fixes + + + + - LVGL 8.3.10 + - Add snapshot, fragment, imgfont, gridnav, msg and monkey + - Other minor fixes + + + - LVGL 8.3.8 + - Add renesas-ra6m3 gpu adaptation + - Improve performance and add more features for PXP and VGLite + - Minor updates + + + - LVGL 8.3.7 + - Minor updates + + + - LVGL 8.3.6 release + - Various fixes, See CHANGELOG.md + + + - LVGL 8.3.5 release + - Use LVGL version as the cmsis-pack version + - Fix GPU support for NXP PXP and NXP VGLite + - Rework stm32 DMA2D support + - Various fixes + + + - LVGL 8.3.4 release + - Update GPU Arm-2D support + - Various fixes - LVGL 8.3.0-dev @@ -159,6 +198,90 @@ + + Enable LVGL Arm-2D GPU Support + + + + + + + + + + + + Enable LVGL Arm-2D GPU Support + + + + + + + + + + + + Enable LVGL Arm-2D GPU Support + + + + + + + + + + + + Enable LVGL Arm-2D GPU Support + + + + + + + + + + + + Enable LVGL Arm-2D GPU Support + + + + + + + + + + + + Enable LVGL Arm-2D GPU Support + + + + + + + + + + + + Enable LVGL Arm-2D GPU Support + + + + + + + + + + - + LVGL (Light and Versatile Graphics Library) is a free and open-source graphics library providing everything you need to create an embedded GUI with easy-to-use graphical elements, beautiful visual effects and a low memory footprint. @@ -324,10 +447,18 @@ - + + + + + + + + + @@ -360,7 +491,7 @@ - + A 2D image processing library from Arm (i.e. Arm-2D) for All Cortex-M processors including Cortex-M0 @@ -375,7 +506,7 @@ - + An hardware acceleration from STM32-DMA2D @@ -389,7 +520,7 @@ - + An hardware acceleration from SWM341-DMA2D @@ -403,13 +534,13 @@ - + An hardware acceleration from NXP-PXP - - - - + + + + @@ -420,14 +551,16 @@ - + An hardware acceleration from NXP-VGLite - - - - - + + + + + + + @@ -438,6 +571,22 @@ + + + An hardware acceleration from Renesas RA6M3-G2D + + + + + + + +/*! \brief enable RA6M3-G2D */ +#define LV_USE_GPU_RA6M3_G2D 1 + + + + Extra Themes, Widgets and Layouts @@ -583,9 +732,26 @@ + + + + Add Tiny TTF Library + + + + + + + +/*! \brief enable Tiny TTF Library */ +#define LV_USE_TINY_TTF 1 + + + + Add RLOTTIE support, an extra librbary is required. @@ -597,7 +763,7 @@ /*! \brief enable RLOTTIE support */ -#define LV_USE_RLOTTIE 1 +#define LV_USE_RLOTTIE 1 @@ -612,7 +778,7 @@ /*! \brief enable ffmpeg support */ -#define LV_USE_FFMPEG 1 +#define LV_USE_FFMPEG 1 @@ -627,7 +793,98 @@ /*! \brief enable ffmpeg support */ -#define LV_USE_IME_PINYIN 1 +#define LV_USE_IME_PINYIN 1 + + + + + + Add the Snapshot service + + + + + + + +/*! \brief enable snapshot support */ +#define LV_USE_SNAPSHOT 1 + + + + + + Add the Fragment service + + + + + + + + +/*! \brief enable fragment support */ +#define LV_USE_FRAGMENT 1 + + + + + + Add the Grid Navigation service + + + + + + + +/*! \brief enable the Grid Navigation support*/ +#define LV_USE_GRIDNAV 1 + + + + + + Add the Image Font service + + + + + + + +/*! \brief enable the image font support*/ +#define LV_USE_IMGFONT 1 + + + + + + Add the Monkey service + + + + + + + +/*! \brief enable the monkey service support*/ +#define LV_USE_MONKEY 1 + + + + + + Add the Message service + + + + + + + +/*! \brief enable the message service support*/ +#define LV_USE_MSG 1 @@ -656,7 +913,7 @@ /*! \brief enable demo:bencharmk */ -#define LV_USE_DEMO_BENCHMARK 1 +#define LV_USE_DEMO_BENCHMARK 1 @@ -676,7 +933,7 @@ /*! \brief enable demo:widgets support */ -#define LV_USE_DEMO_WIDGETS 1 +#define LV_USE_DEMO_WIDGETS 1 diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/env_support/cmsis-pack/LVGL.pidx b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/env_support/cmsis-pack/LVGL.pidx similarity index 61% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/env_support/cmsis-pack/LVGL.pidx rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/env_support/cmsis-pack/LVGL.pidx index ddfc008..397510b 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/env_support/cmsis-pack/LVGL.pidx +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/env_support/cmsis-pack/LVGL.pidx @@ -2,8 +2,8 @@ LVGL https://raw.githubusercontent.com/lvgl/lvgl/master/env_support/cmsis-pack/ - 2022-07-06T00:09:27 + 2024-3-19 - + \ No newline at end of file diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/env_support/cmsis-pack/README.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/env_support/cmsis-pack/README.md similarity index 74% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/env_support/cmsis-pack/README.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/env_support/cmsis-pack/README.md index 5a73e4e..6a6cf94 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/env_support/cmsis-pack/README.md +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/env_support/cmsis-pack/README.md @@ -35,7 +35,9 @@ remove the misleading guide above this code segment. #define LV_CONF_H #include -#include "RTE_Components.h" +#if defined(_RTE_) + #include "RTE_Components.h" +#endif ... ``` @@ -46,12 +48,33 @@ remove the misleading guide above this code segment. - LV_USE_GPU_SWM341_DMA2D - LV_USE_GPU_ARM2D - LV_USE_IME_PINYIN + - LV_USE_PNG + - LV_USE_BMP + - LV_USE_SJPG + - LV_USE_GIF + - LV_USE_QRCODE + - LV_USE_FREETYPE + - LV_USE_TINY_TTF + - LV_USE_RLOTTIE + - LV_USE_FFMPEG + - LV_USE_SNAPSHOT + - LV_USE_MONKEY + - LV_USE_GRIDNAV + - LV_USE_FRAGMENT + - LV_USE_IMGFONT + - LV_USE_MSG + - LV_USE_IME_PINYIN 5. Update macro `LV_ATTRIBUTE_MEM_ALIGN` and `LV_ATTRIBUTE_MEM_ALIGN_SIZE` to force a WORD alignment. ```c #define LV_ATTRIBUTE_MEM_ALIGN_SIZE 4 #define LV_ATTRIBUTE_MEM_ALIGN __attribute__((aligned(4))) ``` Update macro `LV_MEM_SIZE` to `(64*1024U)`. + +Update macro `LV_FONT_MONTSERRAT_12` to `1`. + +Update macro `LV_FONT_MONTSERRAT_12` to `1`. + 6. Update Theme related macros: ```c @@ -89,25 +112,41 @@ Update macro `LV_MEM_SIZE` to `(64*1024U)`. #define LV_TICK_CUSTOM 1 #if LV_TICK_CUSTOM extern uint32_t SystemCoreClock; - #define LV_TICK_CUSTOM_INCLUDE "perf_counter.h" - - #if __PER_COUNTER_VER__ < 10902ul - #define LV_TICK_CUSTOM_SYS_TIME_EXPR ((uint32_t)get_system_ticks() / (SystemCoreClock / 1000ul)) - #else - #define LV_TICK_CUSTOM_SYS_TIME_EXPR get_system_ms() - #endif + #define LV_TICK_CUSTOM_INCLUDE "perf_counter.h" + #define LV_TICK_CUSTOM_SYS_TIME_EXPR get_system_ms() #endif /*LV_TICK_CUSTOM*/ #else #define LV_TICK_CUSTOM 0 #if LV_TICK_CUSTOM #define LV_TICK_CUSTOM_INCLUDE "Arduino.h" /*Header for the system time function*/ #define LV_TICK_CUSTOM_SYS_TIME_EXPR (millis()) /*Expression evaluating to current system time in ms*/ + /*If using lvgl as ESP32 component*/ + // #define LV_TICK_CUSTOM_INCLUDE "esp_timer.h" + // #define LV_TICK_CUSTOM_SYS_TIME_EXPR ((esp_timer_get_time() / 1000LL)) #endif /*LV_TICK_CUSTOM*/ #endif /*__PERF_COUNTER__*/ ``` -9. Thoroughly remove the `DEMO USAGE` section. -10. Thoroughly remove the '3rd party libraries' section. -10. rename '**lv_conf_template.h**' to '**lv_conf_cmsis.h**'. + + +9. Remove all content in `DEMO USAGE` section but keep the following: + +```c +/*Show some widget. It might be required to increase `LV_MEM_SIZE` */ +#if LV_USE_DEMO_WIDGETS + #define LV_DEMO_WIDGETS_SLIDESHOW 0 +#endif + +/*Benchmark your system*/ +#if LV_USE_DEMO_BENCHMARK +/*Use RGB565A8 images with 16 bit color depth instead of ARGB8565*/ + #define LV_DEMO_BENCHMARK_RGB565A8 1 +#endif +``` + + + +10. Thoroughly remove the `3rd party libraries` section. +11. rename '**lv_conf_template.h**' to '**lv_conf_cmsis.h**'. diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/env_support/cmsis-pack/gen_pack.sh b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/env_support/cmsis-pack/gen_pack.sh similarity index 95% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/env_support/cmsis-pack/gen_pack.sh rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/env_support/cmsis-pack/gen_pack.sh index dedba34..ff17b5e 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/env_support/cmsis-pack/gen_pack.sh +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/env_support/cmsis-pack/gen_pack.sh @@ -21,8 +21,8 @@ if [ `uname -s` = "Linux" ] CMSIS_PACK_PATH="/home/$USER/.arm/Packs/ARM/CMSIS/5.7.0/" PATH_TO_ADD="$CMSIS_PACK_PATH/CMSIS/Utilities/Linux64/" else - CMSIS_PACK_PATH="/C/Users/gabriel/AppData/Local/Arm/Packs/ARM/CMSIS/5.7.0" - PATH_TO_ADD="/C/Program Files (x86)/7-Zip/:$CMSIS_PACK_PATH/CMSIS/Utilities/Win32/:/C/xmllint/" + CMSIS_PACK_PATH="/C/Users/$USER/AppData/Local/Arm/Packs/ARM/CMSIS/5.7.0" + PATH_TO_ADD="/C/Program Files (x86)/7-Zip/:/C/Program Files/7-Zip/:$CMSIS_PACK_PATH/CMSIS/Utilities/Win32/:/C/xmllint/" fi [[ ":$PATH:" != *":$PATH_TO_ADD}:"* ]] && PATH="${PATH}:${PATH_TO_ADD}" echo $PATH_TO_ADD appended to PATH diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/env_support/cmsis-pack/lv_cmsis_pack.txt b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/env_support/cmsis-pack/lv_cmsis_pack.txt similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/env_support/cmsis-pack/lv_cmsis_pack.txt rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/env_support/cmsis-pack/lv_cmsis_pack.txt diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/env_support/cmsis-pack/lv_conf_cmsis.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/env_support/cmsis-pack/lv_conf_cmsis.h similarity index 83% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/env_support/cmsis-pack/lv_conf_cmsis.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/env_support/cmsis-pack/lv_conf_cmsis.h index cec0fc8..d078011 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/env_support/cmsis-pack/lv_conf_cmsis.h +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/env_support/cmsis-pack/lv_conf_cmsis.h @@ -1,6 +1,6 @@ /** * @file lv_conf.h - * Configuration file for v8.3.0 + * Configuration file for v8.4.0 */ /* clang-format off */ @@ -10,7 +10,10 @@ #define LV_CONF_H #include -#include "RTE_Components.h" + +#if defined(_RTE_) + #include "RTE_Components.h" +#endif /*==================== COLOR SETTINGS @@ -76,28 +79,28 @@ /*Input device read period in milliseconds*/ #define LV_INDEV_DEF_READ_PERIOD 30 /*[ms]*/ + /*Use a custom tick source that tells the elapsed time in milliseconds. *It removes the need to manually update the tick with `lv_tick_inc()`)*/ #ifdef __PERF_COUNTER__ #define LV_TICK_CUSTOM 1 #if LV_TICK_CUSTOM extern uint32_t SystemCoreClock; - #define LV_TICK_CUSTOM_INCLUDE "perf_counter.h" - - #if __PER_COUNTER_VER__ < 10902ul - #define LV_TICK_CUSTOM_SYS_TIME_EXPR ((uint32_t)get_system_ticks() / (SystemCoreClock / 1000ul)) - #else - #define LV_TICK_CUSTOM_SYS_TIME_EXPR get_system_ms() - #endif + #define LV_TICK_CUSTOM_INCLUDE "perf_counter.h" + #define LV_TICK_CUSTOM_SYS_TIME_EXPR get_system_ms() #endif /*LV_TICK_CUSTOM*/ #else #define LV_TICK_CUSTOM 0 #if LV_TICK_CUSTOM #define LV_TICK_CUSTOM_INCLUDE "Arduino.h" /*Header for the system time function*/ #define LV_TICK_CUSTOM_SYS_TIME_EXPR (millis()) /*Expression evaluating to current system time in ms*/ + /*If using lvgl as ESP32 component*/ + // #define LV_TICK_CUSTOM_INCLUDE "esp_timer.h" + // #define LV_TICK_CUSTOM_SYS_TIME_EXPR ((esp_timer_get_time() / 1000LL)) #endif /*LV_TICK_CUSTOM*/ #endif /*__PERF_COUNTER__*/ + /*Default Dot Per Inch. Used to initialize default sizes such as widgets sized, style paddings. *(Not so important, you can adjust it to modify default sizes and spaces)*/ #define LV_DPI_DEF 130 /*[px/inch]*/ @@ -180,13 +183,21 @@ * GPU *-----------*/ + /*Use STM32's DMA2D (aka Chrom Art) GPU*/ #if LV_USE_GPU_STM32_DMA2D /*Must be defined to include path of CMSIS header of target processor - e.g. "stm32f769xx.h" or "stm32f429xx.h"*/ + e.g. "stm32f7xx.h" or "stm32f4xx.h"*/ #define LV_GPU_DMA2D_CMSIS_INCLUDE #endif +/*Enable RA6M3 G2D GPU*/ +#if LV_USE_GPU_RA6M3_G2D + /*include path of target processor + e.g. "hal_data.h"*/ + #define LV_GPU_RA6M3_G2D_INCLUDE "hal_data.h" +#endif + /*Use SWM341's DMA2D GPU*/ #if LV_USE_GPU_SWM341_DMA2D #define LV_GPU_SWM341_DMA2D_INCLUDE "SWM341.h" @@ -202,16 +213,6 @@ #define LV_USE_GPU_NXP_PXP_AUTO_INIT 0 #endif -/*Use SDL renderer API*/ -#define LV_USE_GPU_SDL 0 -#if LV_USE_GPU_SDL - #define LV_GPU_SDL_INCLUDE_PATH - /*Texture cache size, 8MB by default*/ - #define LV_GPU_SDL_LRU_SIZE (1024 * 1024 * 8) - /*Custom blend mode for mask drawing, disable if you need to link with older SDL2 lib*/ - #define LV_GPU_SDL_CUSTOM_BLEND_MODE (SDL_VERSION_ATLEAST(2, 0, 6)) -#endif - /*------------- * Logging *-----------*/ @@ -350,9 +351,9 @@ *https://fonts.google.com/specimen/Montserrat*/ #define LV_FONT_MONTSERRAT_8 0 #define LV_FONT_MONTSERRAT_10 0 -#define LV_FONT_MONTSERRAT_12 0 +#define LV_FONT_MONTSERRAT_12 1 #define LV_FONT_MONTSERRAT_14 1 -#define LV_FONT_MONTSERRAT_16 0 +#define LV_FONT_MONTSERRAT_16 1 #define LV_FONT_MONTSERRAT_18 0 #define LV_FONT_MONTSERRAT_20 0 #define LV_FONT_MONTSERRAT_22 0 @@ -584,7 +585,6 @@ #define LV_USE_THEME_BASIC 0 #define LV_USE_THEME_MONO 0 #endif - /*----------- * Layouts *----------*/ @@ -595,28 +595,86 @@ /*A layout similar to Grid in CSS.*/ #define LV_USE_GRID 1 +/*--------------------- + * 3rd party libraries + *--------------------*/ + +/*File system interfaces for common APIs */ + +/*API for fopen, fread, etc*/ +#define LV_USE_FS_STDIO 0 +#if LV_USE_FS_STDIO + #define LV_FS_STDIO_LETTER '\0' /*Set an upper cased letter on which the drive will accessible (e.g. 'A')*/ + #define LV_FS_STDIO_PATH "" /*Set the working directory. File/directory paths will be appended to it.*/ + #define LV_FS_STDIO_CACHE_SIZE 0 /*>0 to cache this number of bytes in lv_fs_read()*/ +#endif + +/*API for open, read, etc*/ +#define LV_USE_FS_POSIX 0 +#if LV_USE_FS_POSIX + #define LV_FS_POSIX_LETTER '\0' /*Set an upper cased letter on which the drive will accessible (e.g. 'A')*/ + #define LV_FS_POSIX_PATH "" /*Set the working directory. File/directory paths will be appended to it.*/ + #define LV_FS_POSIX_CACHE_SIZE 0 /*>0 to cache this number of bytes in lv_fs_read()*/ +#endif + +/*API for CreateFile, ReadFile, etc*/ +#define LV_USE_FS_WIN32 0 +#if LV_USE_FS_WIN32 + #define LV_FS_WIN32_LETTER '\0' /*Set an upper cased letter on which the drive will accessible (e.g. 'A')*/ + #define LV_FS_WIN32_PATH "" /*Set the working directory. File/directory paths will be appended to it.*/ + #define LV_FS_WIN32_CACHE_SIZE 0 /*>0 to cache this number of bytes in lv_fs_read()*/ +#endif + +/*API for FATFS (needs to be added separately). Uses f_open, f_read, etc*/ +#define LV_USE_FS_FATFS 0 +#if LV_USE_FS_FATFS + #define LV_FS_FATFS_LETTER '\0' /*Set an upper cased letter on which the drive will accessible (e.g. 'A')*/ + #define LV_FS_FATFS_CACHE_SIZE 0 /*>0 to cache this number of bytes in lv_fs_read()*/ +#endif + +/*API for LittleFS (library needs to be added separately). Uses lfs_file_open, lfs_file_read, etc*/ +#define LV_USE_FS_LITTLEFS 0 +#if LV_USE_FS_LITTLEFS + #define LV_FS_LITTLEFS_LETTER '\0' /*Set an upper cased letter on which the drive will accessible (e.g. 'A')*/ + #define LV_FS_LITTLEFS_CACHE_SIZE 0 /*>0 to cache this number of bytes in lv_fs_read()*/ +#endif + + + +/*FreeType library*/ +#if LV_USE_FREETYPE + /*Memory used by FreeType to cache characters [bytes] (-1: no caching)*/ + #define LV_FREETYPE_CACHE_SIZE (16 * 1024) + #if LV_FREETYPE_CACHE_SIZE >= 0 + /* 1: bitmap cache use the sbit cache, 0:bitmap cache use the image cache. */ + /* sbit cache:it is much more memory efficient for small bitmaps(font size < 256) */ + /* if font size >= 256, must be configured as image cache */ + #define LV_FREETYPE_SBIT_CACHE 0 + /* Maximum number of opened FT_Face/FT_Size objects managed by this cache instance. */ + /* (0:use system defaults) */ + #define LV_FREETYPE_CACHE_FT_FACES 0 + #define LV_FREETYPE_CACHE_FT_SIZES 0 + #endif +#endif + +/*Tiny TTF library*/ +#if LV_USE_TINY_TTF + /*Load TTF data from files*/ + #define LV_TINY_TTF_FILE_SUPPORT 0 +#endif + + +/*FFmpeg library for image decoding and playing videos + *Supports all major image formats so do not enable other image decoder with it*/ +#if LV_USE_FFMPEG + /*Dump input information to stderr*/ + #define LV_FFMPEG_DUMP_FORMAT 0 +#endif + /*----------- * Others *----------*/ -/*1: Enable API to take snapshot for object*/ -#define LV_USE_SNAPSHOT 0 - -/*1: Enable Monkey test*/ -#define LV_USE_MONKEY 0 - -/*1: Enable grid navigation*/ -#define LV_USE_GRIDNAV 0 - -/*1: Enable lv_obj fragment*/ -#define LV_USE_FRAGMENT 0 - -/*1: Support using images as font in label or span widgets */ -#define LV_USE_IMGFONT 0 - -/*1: Enable a published subscriber based messaging system */ -#define LV_USE_MSG 0 - /*1: Enable Pinyin input method*/ /*Requires: lv_keyboard*/ #if LV_USE_IME_PINYIN @@ -641,6 +699,20 @@ /*Enable the examples to be built with the library*/ #define LV_BUILD_EXAMPLES 1 +/*=================== + * DEMO USAGE + ====================*/ + +/*Show some widget. It might be required to increase `LV_MEM_SIZE` */ +#if LV_USE_DEMO_WIDGETS + #define LV_DEMO_WIDGETS_SLIDESHOW 0 +#endif + +/*Benchmark your system*/ +#if LV_USE_DEMO_BENCHMARK +/*Use RGB565A8 images with 16 bit color depth instead of ARGB8565*/ + #define LV_DEMO_BENCHMARK_RGB565A8 1 +#endif /*--END OF LV_CONF_H--*/ diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/env_support/rt-thread/SConscript b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/env_support/rt-thread/SConscript similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/env_support/rt-thread/SConscript rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/env_support/rt-thread/SConscript diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/env_support/rt-thread/lv_rt_thread_conf.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/env_support/rt-thread/lv_rt_thread_conf.h similarity index 91% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/env_support/rt-thread/lv_rt_thread_conf.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/env_support/rt-thread/lv_rt_thread_conf.h index 92da372..c1458be 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/env_support/rt-thread/lv_rt_thread_conf.h +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/env_support/rt-thread/lv_rt_thread_conf.h @@ -71,7 +71,11 @@ # define LV_BIG_ENDIAN_SYSTEM 0 #endif -#define LV_ATTRIBUTE_MEM_ALIGN ALIGN(4) +#ifdef rt_align /* >= RT-Thread v5.0.0 */ +# define LV_ATTRIBUTE_MEM_ALIGN rt_align(RT_ALIGN_SIZE) +#else +# define LV_ATTRIBUTE_MEM_ALIGN ALIGN(RT_ALIGN_SIZE) +#endif /*================== * EXAMPLES diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/env_support/rt-thread/lv_rt_thread_port.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/env_support/rt-thread/lv_rt_thread_port.c similarity index 91% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/env_support/rt-thread/lv_rt_thread_port.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/env_support/rt-thread/lv_rt_thread_port.c index 98a1439..b28ea30 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/env_support/rt-thread/lv_rt_thread_port.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/env_support/rt-thread/lv_rt_thread_port.c @@ -31,7 +31,13 @@ extern void lv_port_indev_init(void); extern void lv_user_gui_init(void); static struct rt_thread lvgl_thread; -static ALIGN(8) rt_uint8_t lvgl_thread_stack[PKG_LVGL_THREAD_STACK_SIZE]; + +#ifdef rt_align +rt_align(RT_ALIGN_SIZE) +#else +ALIGN(RT_ALIGN_SIZE) +#endif +static rt_uint8_t lvgl_thread_stack[PKG_LVGL_THREAD_STACK_SIZE]; #if LV_USE_LOG static void lv_rt_log(const char *buf) @@ -63,7 +69,7 @@ static int lvgl_thread_init(void) rt_err_t err; err = rt_thread_init(&lvgl_thread, "LVGL", lvgl_thread_entry, RT_NULL, - &lvgl_thread_stack[0], sizeof(lvgl_thread_stack), PKG_LVGL_THREAD_PRIO, 0); + &lvgl_thread_stack[0], sizeof(lvgl_thread_stack), PKG_LVGL_THREAD_PRIO, 10); if(err != RT_EOK) { LOG_E("Failed to create LVGL thread"); diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/env_support/rt-thread/squareline/README.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/env_support/rt-thread/squareline/README.md similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/env_support/rt-thread/squareline/README.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/env_support/rt-thread/squareline/README.md diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/env_support/rt-thread/squareline/SConscript b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/env_support/rt-thread/squareline/SConscript new file mode 100644 index 0000000..2818830 --- /dev/null +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/env_support/rt-thread/squareline/SConscript @@ -0,0 +1,25 @@ +from building import * + +cwd = GetCurrentDir() +src = Glob('*.c') +inc = [cwd] + +# check if .h or .hpp files exsit +def check_h_hpp_exsit(path): + file_dirs = os.listdir(path) + for file_dir in file_dirs: + if os.path.splitext(file_dir)[1] in ['.h', '.hpp']: + return True + return False + +sls_src_cwd = cwd +for root, dirs, files in os.walk(sls_src_cwd): + for dir in dirs: + current_path = os.path.join(root, dir) + src = src + Glob(os.path.join(current_path,'*.c')) # add all .c files + if check_h_hpp_exsit(current_path): # add .h and .hpp path + inc = inc + [current_path] + +group = DefineGroup('LVGL-SquareLine', src, depend = ['PKG_USING_LVGL_SQUARELINE'], CPPPATH = inc) + +Return('group') diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/env_support/rt-thread/squareline/ui/lv_ui_entry.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/env_support/rt-thread/squareline/lv_ui_entry.c similarity index 88% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/env_support/rt-thread/squareline/ui/lv_ui_entry.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/env_support/rt-thread/squareline/lv_ui_entry.c index 838b53c..f08e1f5 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/env_support/rt-thread/squareline/ui/lv_ui_entry.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/env_support/rt-thread/squareline/lv_ui_entry.c @@ -1,7 +1,7 @@ /* * Copyright (c) 2006-2022, RT-Thread Development Team * - * SPDX-License-Identifier: Apache-2.0 + * SPDX-License-Identifier: MIT * * Change Logs: * Date Author Notes diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/env_support/rt-thread/squareline/ui/lvgl/lvgl.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/env_support/rt-thread/squareline/ui/lvgl/lvgl.h new file mode 100644 index 0000000..f2d518f --- /dev/null +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/env_support/rt-thread/squareline/ui/lvgl/lvgl.h @@ -0,0 +1,15 @@ +/* + * Copyright (c) 2006-2021, RT-Thread Development Team + * + * SPDX-License-Identifier: MIT + * + * Change Logs: + * Date Author Notes + * 2022-11-20 Meco Man The first version + */ + +#ifdef __RTTHREAD__ + +#include "../../../../../lvgl.h" /* back to the root folder's lvgl.h */ + +#endif /* __RTTHREAD__ */ diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/env_support/zephyr/module.yml b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/env_support/zephyr/module.yml similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/env_support/zephyr/module.yml rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/env_support/zephyr/module.yml diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/anim/index.rst b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/anim/index.rst similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/anim/index.rst rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/anim/index.rst diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/anim/lv_example_anim.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/anim/lv_example_anim.h similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/anim/lv_example_anim.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/anim/lv_example_anim.h diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/anim/lv_example_anim_1.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/anim/lv_example_anim_1.c similarity index 99% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/anim/lv_example_anim_1.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/anim/lv_example_anim_1.c index 6c16a91..d1a93f4 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/anim/lv_example_anim_1.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/anim/lv_example_anim_1.c @@ -43,7 +43,6 @@ void lv_example_anim_1(void) lv_label_set_text(label, "Hello animations!"); lv_obj_set_pos(label, 100, 10); - lv_obj_t * sw = lv_switch_create(lv_scr_act()); lv_obj_center(sw); lv_obj_add_state(sw, LV_STATE_CHECKED); diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/anim/lv_example_anim_1.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/anim/lv_example_anim_1.py similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/anim/lv_example_anim_1.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/anim/lv_example_anim_1.py diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/anim/lv_example_anim_2.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/anim/lv_example_anim_2.c similarity index 99% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/anim/lv_example_anim_2.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/anim/lv_example_anim_2.c index d030ed6..989738e 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/anim/lv_example_anim_2.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/anim/lv_example_anim_2.c @@ -1,7 +1,6 @@ #include "../lv_examples.h" #if LV_BUILD_EXAMPLES && LV_USE_SWITCH - static void anim_x_cb(void * var, int32_t v) { lv_obj_set_x(var, v); diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/anim/lv_example_anim_2.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/anim/lv_example_anim_2.py similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/anim/lv_example_anim_2.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/anim/lv_example_anim_2.py diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/anim/lv_example_anim_3.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/anim/lv_example_anim_3.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/anim/lv_example_anim_3.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/anim/lv_example_anim_3.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/anim/lv_example_anim_3.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/anim/lv_example_anim_3.py similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/anim/lv_example_anim_3.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/anim/lv_example_anim_3.py diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/anim/lv_example_anim_timeline_1.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/anim/lv_example_anim_timeline_1.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/anim/lv_example_anim_timeline_1.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/anim/lv_example_anim_timeline_1.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/anim/lv_example_anim_timeline_1.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/anim/lv_example_anim_timeline_1.py similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/anim/lv_example_anim_timeline_1.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/anim/lv_example_anim_timeline_1.py diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/arduino/LVGL_Arduino/LVGL_Arduino.ino b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/arduino/LVGL_Arduino/LVGL_Arduino.ino similarity index 65% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/arduino/LVGL_Arduino/LVGL_Arduino.ino rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/arduino/LVGL_Arduino/LVGL_Arduino.ino index 7c40ae8..7aeccbb 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/arduino/LVGL_Arduino/LVGL_Arduino.ino +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/arduino/LVGL_Arduino/LVGL_Arduino.ino @@ -1,19 +1,20 @@ +/*Using LVGL with Arduino requires some extra steps: + *Be sure to read the docs here: https://docs.lvgl.io/master/get-started/platforms/arduino.html */ + #include #include -/*If you want to use the LVGL examples, - make sure to install the lv_examples Arduino library - and uncomment the following line. -#include -*/ -#include +/*To use the built-in examples and demos of LVGL uncomment the includes below respectively. + *You also need to copy `lvgl/examples` to `lvgl/src/examples`. Similarly for the demos `lvgl/demos` to `lvgl/src/demos`. + Note that the `lv_examples` library is for LVGL v7 and you shouldn't install it for this version (since LVGL v8) + as the examples and demos are now part of the main LVGL library. */ /*Change to your screen resolution*/ static const uint16_t screenWidth = 480; static const uint16_t screenHeight = 320; static lv_disp_draw_buf_t draw_buf; -static lv_color_t buf[ screenWidth * 10 ]; +static lv_color_t buf[ screenWidth * screenHeight / 10 ]; TFT_eSPI tft = TFT_eSPI(screenWidth, screenHeight); /* TFT instance */ @@ -27,7 +28,7 @@ void my_print(const char * buf) #endif /* Display flushing */ -void my_disp_flush( lv_disp_drv_t *disp, const lv_area_t *area, lv_color_t *color_p ) +void my_disp_flush( lv_disp_drv_t *disp_drv, const lv_area_t *area, lv_color_t *color_p ) { uint32_t w = ( area->x2 - area->x1 + 1 ); uint32_t h = ( area->y2 - area->y1 + 1 ); @@ -37,11 +38,11 @@ void my_disp_flush( lv_disp_drv_t *disp, const lv_area_t *area, lv_color_t *colo tft.pushColors( ( uint16_t * )&color_p->full, w * h, true ); tft.endWrite(); - lv_disp_flush_ready( disp ); + lv_disp_flush_ready( disp_drv ); } /*Read the touchpad*/ -void my_touchpad_read( lv_indev_drv_t * indev_driver, lv_indev_data_t * data ) +void my_touchpad_read( lv_indev_drv_t * indev_drv, lv_indev_data_t * data ) { uint16_t touchX, touchY; @@ -92,7 +93,7 @@ void setup() uint16_t calData[5] = { 275, 3620, 264, 3532, 1 }; tft.setTouch( calData ); - lv_disp_draw_buf_init( &draw_buf, buf, NULL, screenWidth * 10 ); + lv_disp_draw_buf_init( &draw_buf, buf, NULL, screenWidth * screenHeight / 10 ); /*Initialize the display*/ static lv_disp_drv_t disp_drv; @@ -110,26 +111,25 @@ void setup() indev_drv.type = LV_INDEV_TYPE_POINTER; indev_drv.read_cb = my_touchpad_read; lv_indev_drv_register( &indev_drv ); - -#if 0 + /* Create simple label */ lv_obj_t *label = lv_label_create( lv_scr_act() ); - lv_label_set_text( label, LVGL_Arduino.c_str() ); + lv_label_set_text( label, "Hello Ardino and LVGL!"); lv_obj_align( label, LV_ALIGN_CENTER, 0, 0 ); -#else - /* Try an example from the lv_examples Arduino library - make sure to include it as written above. - lv_example_btn_1(); - */ - - // uncomment one of these demos - lv_demo_widgets(); // OK - // lv_demo_benchmark(); // OK - // lv_demo_keypad_encoder(); // works, but I haven't an encoder - // lv_demo_music(); // NOK + + /* Try an example. See all the examples + * online: https://docs.lvgl.io/master/examples.html + * source codes: https://github.com/lvgl/lvgl/tree/e7f88efa5853128bf871dde335c0ca8da9eb7731/examples */ + //lv_example_btn_1(); + + /*Or try out a demo. Don't forget to enable the demos in lv_conf.h. E.g. LV_USE_DEMOS_WIDGETS*/ + //lv_demo_widgets(); + // lv_demo_benchmark(); + // lv_demo_keypad_encoder(); + // lv_demo_music(); // lv_demo_printer(); - // lv_demo_stress(); // seems to be OK -#endif + // lv_demo_stress(); + Serial.println( "Setup done" ); } diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/assets/animimg001.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/assets/animimg001.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/assets/animimg001.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/assets/animimg001.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/assets/animimg001.png b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/assets/animimg001.png similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/assets/animimg001.png rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/assets/animimg001.png diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/assets/animimg002.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/assets/animimg002.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/assets/animimg002.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/assets/animimg002.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/assets/animimg002.png b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/assets/animimg002.png similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/assets/animimg002.png rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/assets/animimg002.png diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/assets/animimg003.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/assets/animimg003.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/assets/animimg003.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/assets/animimg003.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/assets/animimg003.png b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/assets/animimg003.png similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/assets/animimg003.png rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/assets/animimg003.png diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/assets/caret_down.png b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/assets/caret_down.png similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/assets/caret_down.png rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/assets/caret_down.png diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/assets/emoji/F600.png b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/assets/emoji/F600.png similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/assets/emoji/F600.png rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/assets/emoji/F600.png diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/assets/emoji/img_emoji_F617.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/assets/emoji/img_emoji_F617.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/assets/emoji/img_emoji_F617.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/assets/emoji/img_emoji_F617.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/assets/font/lv_font_simsun_16_cjk.fnt b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/assets/font/lv_font_simsun_16_cjk.fnt similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/assets/font/lv_font_simsun_16_cjk.fnt rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/assets/font/lv_font_simsun_16_cjk.fnt diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/assets/font/montserrat-16.fnt b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/assets/font/montserrat-16.fnt similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/assets/font/montserrat-16.fnt rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/assets/font/montserrat-16.fnt diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/assets/font/montserrat-22.fnt b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/assets/font/montserrat-22.fnt similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/assets/font/montserrat-22.fnt rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/assets/font/montserrat-22.fnt diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/assets/img_caret_down.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/assets/img_caret_down.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/assets/img_caret_down.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/assets/img_caret_down.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/assets/img_caret_down.png b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/assets/img_caret_down.png similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/assets/img_caret_down.png rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/assets/img_caret_down.png diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/assets/img_cogwheel_alpha16.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/assets/img_cogwheel_alpha16.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/assets/img_cogwheel_alpha16.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/assets/img_cogwheel_alpha16.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/assets/img_cogwheel_argb.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/assets/img_cogwheel_argb.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/assets/img_cogwheel_argb.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/assets/img_cogwheel_argb.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/assets/img_cogwheel_argb.png b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/assets/img_cogwheel_argb.png similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/assets/img_cogwheel_argb.png rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/assets/img_cogwheel_argb.png diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/assets/img_cogwheel_chroma_keyed.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/assets/img_cogwheel_chroma_keyed.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/assets/img_cogwheel_chroma_keyed.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/assets/img_cogwheel_chroma_keyed.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/assets/img_cogwheel_chroma_keyed.png b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/assets/img_cogwheel_chroma_keyed.png similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/assets/img_cogwheel_chroma_keyed.png rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/assets/img_cogwheel_chroma_keyed.png diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/assets/img_cogwheel_indexed16.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/assets/img_cogwheel_indexed16.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/assets/img_cogwheel_indexed16.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/assets/img_cogwheel_indexed16.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/assets/img_cogwheel_indexed16.png b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/assets/img_cogwheel_indexed16.png similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/assets/img_cogwheel_indexed16.png rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/assets/img_cogwheel_indexed16.png diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/assets/img_cogwheel_rgb.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/assets/img_cogwheel_rgb.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/assets/img_cogwheel_rgb.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/assets/img_cogwheel_rgb.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/assets/img_cogwheel_rgb.png b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/assets/img_cogwheel_rgb.png similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/assets/img_cogwheel_rgb.png rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/assets/img_cogwheel_rgb.png diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/assets/img_hand.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/assets/img_hand.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/assets/img_hand.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/assets/img_hand.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/assets/img_hand_hour.png b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/assets/img_hand_hour.png similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/assets/img_hand_hour.png rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/assets/img_hand_hour.png diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/assets/img_hand_min.png b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/assets/img_hand_min.png similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/assets/img_hand_min.png rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/assets/img_hand_min.png diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/assets/img_skew_strip.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/assets/img_skew_strip.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/assets/img_skew_strip.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/assets/img_skew_strip.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/assets/img_skew_strip.png b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/assets/img_skew_strip.png similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/assets/img_skew_strip.png rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/assets/img_skew_strip.png diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/assets/img_skew_strip_80x20_argb8888.fnt b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/assets/img_skew_strip_80x20_argb8888.fnt old mode 100644 new mode 100755 similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/assets/img_skew_strip_80x20_argb8888.fnt rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/assets/img_skew_strip_80x20_argb8888.fnt diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/assets/img_star.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/assets/img_star.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/assets/img_star.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/assets/img_star.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/assets/img_star.png b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/assets/img_star.png similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/assets/img_star.png rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/assets/img_star.png diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/assets/img_strip.png b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/assets/img_strip.png similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/assets/img_strip.png rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/assets/img_strip.png diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/assets/imgbtn_left.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/assets/imgbtn_left.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/assets/imgbtn_left.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/assets/imgbtn_left.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/assets/imgbtn_left.png b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/assets/imgbtn_left.png similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/assets/imgbtn_left.png rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/assets/imgbtn_left.png diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/assets/imgbtn_mid.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/assets/imgbtn_mid.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/assets/imgbtn_mid.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/assets/imgbtn_mid.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/assets/imgbtn_mid.png b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/assets/imgbtn_mid.png similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/assets/imgbtn_mid.png rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/assets/imgbtn_mid.png diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/assets/imgbtn_right.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/assets/imgbtn_right.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/assets/imgbtn_right.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/assets/imgbtn_right.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/assets/imgbtn_right.png b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/assets/imgbtn_right.png similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/assets/imgbtn_right.png rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/assets/imgbtn_right.png diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/event/index.rst b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/event/index.rst similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/event/index.rst rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/event/index.rst diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/event/lv_example_event.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/event/lv_example_event.h similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/event/lv_example_event.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/event/lv_example_event.h diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/event/lv_example_event_1.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/event/lv_example_event_1.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/event/lv_example_event_1.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/event/lv_example_event_1.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/event/lv_example_event_1.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/event/lv_example_event_1.py similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/event/lv_example_event_1.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/event/lv_example_event_1.py diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/event/lv_example_event_2.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/event/lv_example_event_2.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/event/lv_example_event_2.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/event/lv_example_event_2.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/event/lv_example_event_2.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/event/lv_example_event_2.py similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/event/lv_example_event_2.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/event/lv_example_event_2.py diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/event/lv_example_event_3.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/event/lv_example_event_3.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/event/lv_example_event_3.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/event/lv_example_event_3.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/event/lv_example_event_3.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/event/lv_example_event_3.py similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/event/lv_example_event_3.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/event/lv_example_event_3.py diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/event/lv_example_event_4.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/event/lv_example_event_4.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/event/lv_example_event_4.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/event/lv_example_event_4.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/get_started/index.rst b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/get_started/index.rst similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/get_started/index.rst rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/get_started/index.rst diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/get_started/lv_example_get_started.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/get_started/lv_example_get_started.h similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/get_started/lv_example_get_started.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/get_started/lv_example_get_started.h diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/get_started/lv_example_get_started_1.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/get_started/lv_example_get_started_1.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/get_started/lv_example_get_started_1.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/get_started/lv_example_get_started_1.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/get_started/lv_example_get_started_1.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/get_started/lv_example_get_started_1.py similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/get_started/lv_example_get_started_1.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/get_started/lv_example_get_started_1.py diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/get_started/lv_example_get_started_2.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/get_started/lv_example_get_started_2.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/get_started/lv_example_get_started_2.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/get_started/lv_example_get_started_2.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/get_started/lv_example_get_started_2.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/get_started/lv_example_get_started_2.py similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/get_started/lv_example_get_started_2.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/get_started/lv_example_get_started_2.py diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/get_started/lv_example_get_started_3.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/get_started/lv_example_get_started_3.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/get_started/lv_example_get_started_3.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/get_started/lv_example_get_started_3.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/get_started/lv_example_get_started_3.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/get_started/lv_example_get_started_3.py similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/get_started/lv_example_get_started_3.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/get_started/lv_example_get_started_3.py diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/header.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/header.py similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/header.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/header.py diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/layouts/flex/index.rst b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/layouts/flex/index.rst similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/layouts/flex/index.rst rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/layouts/flex/index.rst diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/layouts/flex/lv_example_flex.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/layouts/flex/lv_example_flex.h similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/layouts/flex/lv_example_flex.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/layouts/flex/lv_example_flex.h diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/layouts/flex/lv_example_flex_1.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/layouts/flex/lv_example_flex_1.c similarity index 95% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/layouts/flex/lv_example_flex_1.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/layouts/flex/lv_example_flex_1.c index 6363d37..94cfe25 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/layouts/flex/lv_example_flex_1.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/layouts/flex/lv_example_flex_1.c @@ -28,7 +28,7 @@ void lv_example_flex_1(void) lv_obj_set_size(obj, 100, LV_PCT(100)); label = lv_label_create(obj); - lv_label_set_text_fmt(label, "Item: %u", i); + lv_label_set_text_fmt(label, "Item: %"LV_PRIu32, i); lv_obj_center(label); /*Add items to the column*/ diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/layouts/flex/lv_example_flex_1.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/layouts/flex/lv_example_flex_1.py similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/layouts/flex/lv_example_flex_1.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/layouts/flex/lv_example_flex_1.py diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/layouts/flex/lv_example_flex_2.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/layouts/flex/lv_example_flex_2.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/layouts/flex/lv_example_flex_2.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/layouts/flex/lv_example_flex_2.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/layouts/flex/lv_example_flex_2.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/layouts/flex/lv_example_flex_2.py similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/layouts/flex/lv_example_flex_2.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/layouts/flex/lv_example_flex_2.py diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/layouts/flex/lv_example_flex_3.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/layouts/flex/lv_example_flex_3.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/layouts/flex/lv_example_flex_3.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/layouts/flex/lv_example_flex_3.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/layouts/flex/lv_example_flex_3.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/layouts/flex/lv_example_flex_3.py similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/layouts/flex/lv_example_flex_3.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/layouts/flex/lv_example_flex_3.py diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/layouts/flex/lv_example_flex_4.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/layouts/flex/lv_example_flex_4.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/layouts/flex/lv_example_flex_4.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/layouts/flex/lv_example_flex_4.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/layouts/flex/lv_example_flex_4.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/layouts/flex/lv_example_flex_4.py similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/layouts/flex/lv_example_flex_4.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/layouts/flex/lv_example_flex_4.py diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/layouts/flex/lv_example_flex_5.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/layouts/flex/lv_example_flex_5.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/layouts/flex/lv_example_flex_5.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/layouts/flex/lv_example_flex_5.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/layouts/flex/lv_example_flex_5.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/layouts/flex/lv_example_flex_5.py similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/layouts/flex/lv_example_flex_5.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/layouts/flex/lv_example_flex_5.py diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/layouts/flex/lv_example_flex_6.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/layouts/flex/lv_example_flex_6.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/layouts/flex/lv_example_flex_6.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/layouts/flex/lv_example_flex_6.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/layouts/flex/lv_example_flex_6.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/layouts/flex/lv_example_flex_6.py similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/layouts/flex/lv_example_flex_6.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/layouts/flex/lv_example_flex_6.py diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/layouts/grid/index.rst b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/layouts/grid/index.rst similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/layouts/grid/index.rst rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/layouts/grid/index.rst diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/layouts/grid/lv_example_grid.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/layouts/grid/lv_example_grid.h similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/layouts/grid/lv_example_grid.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/layouts/grid/lv_example_grid.h diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/layouts/grid/lv_example_grid_1.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/layouts/grid/lv_example_grid_1.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/layouts/grid/lv_example_grid_1.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/layouts/grid/lv_example_grid_1.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/layouts/grid/lv_example_grid_1.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/layouts/grid/lv_example_grid_1.py similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/layouts/grid/lv_example_grid_1.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/layouts/grid/lv_example_grid_1.py diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/layouts/grid/lv_example_grid_2.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/layouts/grid/lv_example_grid_2.c similarity index 99% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/layouts/grid/lv_example_grid_2.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/layouts/grid/lv_example_grid_2.c index f992c57..2969383 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/layouts/grid/lv_example_grid_2.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/layouts/grid/lv_example_grid_2.c @@ -1,7 +1,6 @@ #include "../../lv_examples.h" #if LV_USE_GRID && LV_BUILD_EXAMPLES - /** * Demonstrate cell placement and span */ diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/layouts/grid/lv_example_grid_2.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/layouts/grid/lv_example_grid_2.py similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/layouts/grid/lv_example_grid_2.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/layouts/grid/lv_example_grid_2.py diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/layouts/grid/lv_example_grid_3.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/layouts/grid/lv_example_grid_3.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/layouts/grid/lv_example_grid_3.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/layouts/grid/lv_example_grid_3.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/layouts/grid/lv_example_grid_3.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/layouts/grid/lv_example_grid_3.py similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/layouts/grid/lv_example_grid_3.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/layouts/grid/lv_example_grid_3.py diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/layouts/grid/lv_example_grid_4.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/layouts/grid/lv_example_grid_4.c similarity index 99% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/layouts/grid/lv_example_grid_4.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/layouts/grid/lv_example_grid_4.c index 5141477..1354577 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/layouts/grid/lv_example_grid_4.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/layouts/grid/lv_example_grid_4.c @@ -9,7 +9,6 @@ void lv_example_grid_4(void) static lv_coord_t col_dsc[] = {60, 60, 60, LV_GRID_TEMPLATE_LAST}; static lv_coord_t row_dsc[] = {45, 45, 45, LV_GRID_TEMPLATE_LAST}; - /*Add space between the columns and move the rows to the bottom (end)*/ /*Create a container with grid*/ diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/layouts/grid/lv_example_grid_4.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/layouts/grid/lv_example_grid_4.py similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/layouts/grid/lv_example_grid_4.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/layouts/grid/lv_example_grid_4.py diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/layouts/grid/lv_example_grid_5.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/layouts/grid/lv_example_grid_5.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/layouts/grid/lv_example_grid_5.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/layouts/grid/lv_example_grid_5.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/layouts/grid/lv_example_grid_5.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/layouts/grid/lv_example_grid_5.py similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/layouts/grid/lv_example_grid_5.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/layouts/grid/lv_example_grid_5.py diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/layouts/grid/lv_example_grid_6.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/layouts/grid/lv_example_grid_6.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/layouts/grid/lv_example_grid_6.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/layouts/grid/lv_example_grid_6.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/layouts/grid/lv_example_grid_6.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/layouts/grid/lv_example_grid_6.py similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/layouts/grid/lv_example_grid_6.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/layouts/grid/lv_example_grid_6.py diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/layouts/lv_example_layout.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/layouts/lv_example_layout.h similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/layouts/lv_example_layout.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/layouts/lv_example_layout.h diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/bmp/example_16bit.bmp b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/libs/bmp/example_16bit.bmp similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/bmp/example_16bit.bmp rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/libs/bmp/example_16bit.bmp diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/bmp/example_24bit.bmp b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/libs/bmp/example_24bit.bmp similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/bmp/example_24bit.bmp rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/libs/bmp/example_24bit.bmp diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/bmp/example_32bit.bmp b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/libs/bmp/example_32bit.bmp similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/bmp/example_32bit.bmp rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/libs/bmp/example_32bit.bmp diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/bmp/index.rst b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/libs/bmp/index.rst similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/bmp/index.rst rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/libs/bmp/index.rst diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/bmp/lv_example_bmp.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/libs/bmp/lv_example_bmp.h similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/bmp/lv_example_bmp.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/libs/bmp/lv_example_bmp.h diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/bmp/lv_example_bmp_1.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/libs/bmp/lv_example_bmp_1.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/bmp/lv_example_bmp_1.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/libs/bmp/lv_example_bmp_1.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/bmp/lv_example_bmp_1.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/libs/bmp/lv_example_bmp_1.py old mode 100644 new mode 100755 similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/bmp/lv_example_bmp_1.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/libs/bmp/lv_example_bmp_1.py diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/ffmpeg/birds.mp4 b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/libs/ffmpeg/birds.mp4 similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/ffmpeg/birds.mp4 rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/libs/ffmpeg/birds.mp4 diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/ffmpeg/ffmpeg.png b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/libs/ffmpeg/ffmpeg.png similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/ffmpeg/ffmpeg.png rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/libs/ffmpeg/ffmpeg.png diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/ffmpeg/index.rst b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/libs/ffmpeg/index.rst similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/ffmpeg/index.rst rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/libs/ffmpeg/index.rst diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/ffmpeg/lv_example_ffmpeg.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/libs/ffmpeg/lv_example_ffmpeg.h similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/ffmpeg/lv_example_ffmpeg.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/libs/ffmpeg/lv_example_ffmpeg.h diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/ffmpeg/lv_example_ffmpeg_1.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/libs/ffmpeg/lv_example_ffmpeg_1.c similarity index 99% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/ffmpeg/lv_example_ffmpeg_1.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/libs/ffmpeg/lv_example_ffmpeg_1.c index 5815985..a48c68b 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/ffmpeg/lv_example_ffmpeg_1.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/libs/ffmpeg/lv_example_ffmpeg_1.c @@ -2,7 +2,6 @@ #if LV_BUILD_EXAMPLES #if LV_USE_FFMPEG - /** * Open an image from a file */ diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/ffmpeg/lv_example_ffmpeg_2.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/libs/ffmpeg/lv_example_ffmpeg_2.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/ffmpeg/lv_example_ffmpeg_2.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/libs/ffmpeg/lv_example_ffmpeg_2.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/freetype/Lato-Regular.ttf b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/libs/freetype/Lato-Regular.ttf similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/freetype/Lato-Regular.ttf rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/libs/freetype/Lato-Regular.ttf diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/freetype/index.rst b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/libs/freetype/index.rst similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/freetype/index.rst rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/libs/freetype/index.rst diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/freetype/lv_example_freetype.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/libs/freetype/lv_example_freetype.h similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/freetype/lv_example_freetype.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/libs/freetype/lv_example_freetype.h diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/freetype/lv_example_freetype_1.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/libs/freetype/lv_example_freetype_1.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/freetype/lv_example_freetype_1.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/libs/freetype/lv_example_freetype_1.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/freetype/lv_example_freetype_1.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/libs/freetype/lv_example_freetype_1.py old mode 100644 new mode 100755 similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/freetype/lv_example_freetype_1.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/libs/freetype/lv_example_freetype_1.py diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/gif/bulb.gif b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/libs/gif/bulb.gif similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/gif/bulb.gif rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/libs/gif/bulb.gif diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/gif/img_bulb_gif.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/libs/gif/img_bulb_gif.c similarity index 99% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/gif/img_bulb_gif.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/libs/gif/img_bulb_gif.c index ec21413..9168275 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/gif/img_bulb_gif.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/libs/gif/img_bulb_gif.c @@ -1,6 +1,5 @@ #include "../../../lvgl.h" - #ifndef LV_ATTRIBUTE_MEM_ALIGN #define LV_ATTRIBUTE_MEM_ALIGN #endif diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/gif/img_bulb_gif.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/libs/gif/img_bulb_gif.py similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/gif/img_bulb_gif.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/libs/gif/img_bulb_gif.py diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/gif/index.rst b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/libs/gif/index.rst similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/gif/index.rst rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/libs/gif/index.rst diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/gif/lv_example_gif.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/libs/gif/lv_example_gif.h similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/gif/lv_example_gif.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/libs/gif/lv_example_gif.h diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/gif/lv_example_gif_1.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/libs/gif/lv_example_gif_1.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/gif/lv_example_gif_1.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/libs/gif/lv_example_gif_1.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/gif/lv_example_gif_1.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/libs/gif/lv_example_gif_1.py old mode 100644 new mode 100755 similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/gif/lv_example_gif_1.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/libs/gif/lv_example_gif_1.py diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/lv_example_libs.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/libs/lv_example_libs.h similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/lv_example_libs.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/libs/lv_example_libs.h diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/png/img_wink_png.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/libs/png/img_wink_png.c similarity index 99% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/png/img_wink_png.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/libs/png/img_wink_png.c index bec3ed6..b911b2b 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/png/img_wink_png.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/libs/png/img_wink_png.c @@ -1,7 +1,6 @@ #include "../../../lvgl.h" #if LV_USE_PNG && LV_BUILD_EXAMPLES - #ifndef LV_ATTRIBUTE_MEM_ALIGN #define LV_ATTRIBUTE_MEM_ALIGN #endif diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/png/img_wink_png.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/libs/png/img_wink_png.py similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/png/img_wink_png.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/libs/png/img_wink_png.py diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/png/index.rst b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/libs/png/index.rst similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/png/index.rst rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/libs/png/index.rst diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/png/lv_example_png.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/libs/png/lv_example_png.h similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/png/lv_example_png.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/libs/png/lv_example_png.h diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/png/lv_example_png_1.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/libs/png/lv_example_png_1.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/png/lv_example_png_1.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/libs/png/lv_example_png_1.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/png/lv_example_png_1.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/libs/png/lv_example_png_1.py old mode 100644 new mode 100755 similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/png/lv_example_png_1.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/libs/png/lv_example_png_1.py diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/png/wink.png b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/libs/png/wink.png similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/png/wink.png rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/libs/png/wink.png diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/qrcode/index.rst b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/libs/qrcode/index.rst similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/qrcode/index.rst rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/libs/qrcode/index.rst diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/qrcode/lv_example_qrcode.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/libs/qrcode/lv_example_qrcode.h similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/qrcode/lv_example_qrcode.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/libs/qrcode/lv_example_qrcode.h diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/qrcode/lv_example_qrcode_1.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/libs/qrcode/lv_example_qrcode_1.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/qrcode/lv_example_qrcode_1.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/libs/qrcode/lv_example_qrcode_1.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/qrcode/lv_example_qrcode_1.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/libs/qrcode/lv_example_qrcode_1.py old mode 100644 new mode 100755 similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/qrcode/lv_example_qrcode_1.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/libs/qrcode/lv_example_qrcode_1.py diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/rlottie/index.rst b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/libs/rlottie/index.rst similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/rlottie/index.rst rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/libs/rlottie/index.rst diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/rlottie/lv_example_rlottie.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/libs/rlottie/lv_example_rlottie.h similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/rlottie/lv_example_rlottie.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/libs/rlottie/lv_example_rlottie.h diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/rlottie/lv_example_rlottie_1.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/libs/rlottie/lv_example_rlottie_1.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/rlottie/lv_example_rlottie_1.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/libs/rlottie/lv_example_rlottie_1.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/rlottie/lv_example_rlottie_1.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/libs/rlottie/lv_example_rlottie_1.py old mode 100644 new mode 100755 similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/rlottie/lv_example_rlottie_1.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/libs/rlottie/lv_example_rlottie_1.py diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/rlottie/lv_example_rlottie_2.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/libs/rlottie/lv_example_rlottie_2.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/rlottie/lv_example_rlottie_2.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/libs/rlottie/lv_example_rlottie_2.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/rlottie/lv_example_rlottie_2.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/libs/rlottie/lv_example_rlottie_2.py old mode 100644 new mode 100755 similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/rlottie/lv_example_rlottie_2.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/libs/rlottie/lv_example_rlottie_2.py diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/rlottie/lv_example_rlottie_approve.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/libs/rlottie/lv_example_rlottie_approve.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/rlottie/lv_example_rlottie_approve.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/libs/rlottie/lv_example_rlottie_approve.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/rlottie/lv_example_rlottie_approve.json b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/libs/rlottie/lv_example_rlottie_approve.json similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/rlottie/lv_example_rlottie_approve.json rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/libs/rlottie/lv_example_rlottie_approve.json diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/rlottie/lv_example_rlottie_approve.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/libs/rlottie/lv_example_rlottie_approve.py similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/rlottie/lv_example_rlottie_approve.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/libs/rlottie/lv_example_rlottie_approve.py diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/sjpg/index.rst b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/libs/sjpg/index.rst similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/sjpg/index.rst rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/libs/sjpg/index.rst diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/sjpg/lv_example_sjpg.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/libs/sjpg/lv_example_sjpg.h similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/sjpg/lv_example_sjpg.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/libs/sjpg/lv_example_sjpg.h diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/sjpg/lv_example_sjpg_1.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/libs/sjpg/lv_example_sjpg_1.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/sjpg/lv_example_sjpg_1.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/libs/sjpg/lv_example_sjpg_1.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/sjpg/lv_example_sjpg_1.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/libs/sjpg/lv_example_sjpg_1.py old mode 100644 new mode 100755 similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/sjpg/lv_example_sjpg_1.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/libs/sjpg/lv_example_sjpg_1.py diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/sjpg/small_image.sjpg b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/libs/sjpg/small_image.sjpg similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/sjpg/small_image.sjpg rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/libs/sjpg/small_image.sjpg diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/lv_examples.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/lv_examples.h similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/lv_examples.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/lv_examples.h diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/lv_examples.mk b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/lv_examples.mk similarity index 84% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/lv_examples.mk rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/lv_examples.mk index b8fa7eb..2586e33 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/lv_examples.mk +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/lv_examples.mk @@ -1 +1 @@ -CSRCS += $(shell find -L $(LVGL_DIR)/$(LVGL_DIR_NAME)/examples -name \*.c) +CSRCS += $(shell find -L $(LVGL_DIR)/$(LVGL_DIR_NAME)/examples -name "*.c") diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/others/fragment/index.rst b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/others/fragment/index.rst similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/others/fragment/index.rst rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/others/fragment/index.rst diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/others/fragment/lv_example_fragment.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/others/fragment/lv_example_fragment.h similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/others/fragment/lv_example_fragment.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/others/fragment/lv_example_fragment.h diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/others/fragment/lv_example_fragment_1.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/others/fragment/lv_example_fragment_1.c similarity index 99% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/others/fragment/lv_example_fragment_1.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/others/fragment/lv_example_fragment_1.c index 9e59124..4f038af 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/others/fragment/lv_example_fragment_1.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/others/fragment/lv_example_fragment_1.c @@ -23,7 +23,7 @@ static const lv_fragment_class_t sample_cls = { .constructor_cb = sample_fragment_ctor, .create_obj_cb = sample_fragment_create_obj, .instance_size = sizeof(struct sample_fragment_t) -}; + }; void lv_example_fragment_1(void) { @@ -37,7 +37,6 @@ void lv_example_fragment_1(void) lv_fragment_manager_replace(manager, fragment, &root); } - static void sample_fragment_ctor(lv_fragment_t * self, void * args) { ((struct sample_fragment_t *) self)->name = args; diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/others/fragment/lv_example_fragment_2.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/others/fragment/lv_example_fragment_2.c similarity index 99% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/others/fragment/lv_example_fragment_2.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/others/fragment/lv_example_fragment_2.c index c6a3e44..02cc9be 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/others/fragment/lv_example_fragment_2.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/others/fragment/lv_example_fragment_2.c @@ -66,7 +66,6 @@ void lv_example_fragment_2(void) lv_obj_add_event_cb(pop_btn, sample_pop_click, LV_EVENT_CLICKED, manager); } - static void sample_fragment_ctor(lv_fragment_t * self, void * args) { LV_UNUSED(args); diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/others/gridnav/index.rst b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/others/gridnav/index.rst similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/others/gridnav/index.rst rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/others/gridnav/index.rst diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/others/gridnav/lv_example_gridnav.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/others/gridnav/lv_example_gridnav.h similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/others/gridnav/lv_example_gridnav.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/others/gridnav/lv_example_gridnav.h diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/others/gridnav/lv_example_gridnav_1.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/others/gridnav/lv_example_gridnav_1.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/others/gridnav/lv_example_gridnav_1.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/others/gridnav/lv_example_gridnav_1.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/others/gridnav/lv_example_gridnav_2.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/others/gridnav/lv_example_gridnav_2.c similarity index 99% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/others/gridnav/lv_example_gridnav_2.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/others/gridnav/lv_example_gridnav_2.c index b757187..ed53f9f 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/others/gridnav/lv_example_gridnav_2.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/others/gridnav/lv_example_gridnav_2.c @@ -16,7 +16,6 @@ void lv_example_gridnav_2(void) lv_obj_set_style_bg_color(list1, lv_palette_lighten(LV_PALETTE_BLUE, 5), LV_STATE_FOCUSED); lv_group_add_obj(lv_group_get_default(), list1); - char buf[32]; uint32_t i; for(i = 0; i < 15; i++) { diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/others/gridnav/lv_example_gridnav_3.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/others/gridnav/lv_example_gridnav_3.c similarity index 99% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/others/gridnav/lv_example_gridnav_3.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/others/gridnav/lv_example_gridnav_3.c index 071f28a..ade81cc 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/others/gridnav/lv_example_gridnav_3.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/others/gridnav/lv_example_gridnav_3.c @@ -46,7 +46,6 @@ void lv_example_gridnav_3(void) label = lv_label_create(btn); lv_label_set_text(label, "Button 2"); - /*Create an other container with long text to show how LV_GRIDNAV_CTRL_SCROLL_FIRST works*/ lv_obj_t * cont_sub1 = lv_obj_create(cont_main); lv_obj_set_size(cont_sub1, lv_pct(100), 100); @@ -93,9 +92,6 @@ void lv_example_gridnav_3(void) label = lv_label_create(btn); lv_label_set_text(label, "Button 4"); - - - } #endif diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/others/gridnav/lv_example_gridnav_4.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/others/gridnav/lv_example_gridnav_4.c similarity index 99% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/others/gridnav/lv_example_gridnav_4.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/others/gridnav/lv_example_gridnav_4.c index 42f1314..9cf261b 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/others/gridnav/lv_example_gridnav_4.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/others/gridnav/lv_example_gridnav_4.c @@ -1,7 +1,6 @@ #include "../../lv_examples.h" #if LV_USE_GRIDNAV && LV_USE_FLEX && LV_BUILD_EXAMPLES - static void event_handler(lv_event_t * e) { lv_obj_t * obj = lv_event_get_target(e); diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/others/ime/index.rst b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/others/ime/index.rst similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/others/ime/index.rst rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/others/ime/index.rst diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/others/ime/lv_example_ime_pinyin.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/others/ime/lv_example_ime_pinyin.h similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/others/ime/lv_example_ime_pinyin.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/others/ime/lv_example_ime_pinyin.h diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/others/ime/lv_example_ime_pinyin_1.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/others/ime/lv_example_ime_pinyin_1.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/others/ime/lv_example_ime_pinyin_1.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/others/ime/lv_example_ime_pinyin_1.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/others/ime/lv_example_ime_pinyin_2.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/others/ime/lv_example_ime_pinyin_2.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/others/ime/lv_example_ime_pinyin_2.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/others/ime/lv_example_ime_pinyin_2.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/others/imgfont/index.rst b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/others/imgfont/index.rst similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/others/imgfont/index.rst rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/others/imgfont/index.rst diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/others/imgfont/lv_example_imgfont.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/others/imgfont/lv_example_imgfont.h similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/others/imgfont/lv_example_imgfont.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/others/imgfont/lv_example_imgfont.h diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/others/imgfont/lv_example_imgfont_1.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/others/imgfont/lv_example_imgfont_1.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/others/imgfont/lv_example_imgfont_1.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/others/imgfont/lv_example_imgfont_1.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/others/lv_example_others.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/others/lv_example_others.h similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/others/lv_example_others.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/others/lv_example_others.h diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/others/monkey/index.rst b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/others/monkey/index.rst similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/others/monkey/index.rst rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/others/monkey/index.rst diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/others/monkey/lv_example_monkey.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/others/monkey/lv_example_monkey.h similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/others/monkey/lv_example_monkey.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/others/monkey/lv_example_monkey.h diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/others/monkey/lv_example_monkey_1.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/others/monkey/lv_example_monkey_1.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/others/monkey/lv_example_monkey_1.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/others/monkey/lv_example_monkey_1.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/others/monkey/lv_example_monkey_2.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/others/monkey/lv_example_monkey_2.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/others/monkey/lv_example_monkey_2.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/others/monkey/lv_example_monkey_2.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/others/monkey/lv_example_monkey_3.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/others/monkey/lv_example_monkey_3.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/others/monkey/lv_example_monkey_3.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/others/monkey/lv_example_monkey_3.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/others/msg/index.rst b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/others/msg/index.rst similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/others/msg/index.rst rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/others/msg/index.rst diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/others/msg/lv_example_msg.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/others/msg/lv_example_msg.h similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/others/msg/lv_example_msg.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/others/msg/lv_example_msg.h diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/others/msg/lv_example_msg_1.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/others/msg/lv_example_msg_1.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/others/msg/lv_example_msg_1.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/others/msg/lv_example_msg_1.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/others/msg/lv_example_msg_2.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/others/msg/lv_example_msg_2.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/others/msg/lv_example_msg_2.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/others/msg/lv_example_msg_2.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/others/msg/lv_example_msg_3.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/others/msg/lv_example_msg_3.c similarity index 99% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/others/msg/lv_example_msg_3.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/others/msg/lv_example_msg_3.c index dddb4a8..4fb32e1 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/others/msg/lv_example_msg_3.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/others/msg/lv_example_msg_3.c @@ -69,13 +69,11 @@ void lv_example_msg_3(void) lv_obj_add_event_cb(slider, slider_event_cb, LV_EVENT_ALL, NULL); lv_msg_subsribe_obj(MSG_UPDATE, slider, NULL); - /* As there are new UI elements that don't know the system's state * send an UPDATE REQUEST message which will trigger an UPDATE message with the current value*/ lv_msg_send(MSG_UPDATE_REQUEST, NULL); } - static void value_handler(void * s, lv_msg_t * m) { LV_UNUSED(s); @@ -106,7 +104,6 @@ static void value_handler(void * s, lv_msg_t * m) } } - static void btn_event_cb(lv_event_t * e) { lv_obj_t * btn = lv_event_get_target(e); diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/others/snapshot/index.rst b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/others/snapshot/index.rst similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/others/snapshot/index.rst rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/others/snapshot/index.rst diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/others/snapshot/lv_example_snapshot.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/others/snapshot/lv_example_snapshot.h similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/others/snapshot/lv_example_snapshot.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/others/snapshot/lv_example_snapshot.h diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/others/snapshot/lv_example_snapshot_1.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/others/snapshot/lv_example_snapshot_1.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/others/snapshot/lv_example_snapshot_1.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/others/snapshot/lv_example_snapshot_1.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/others/snapshot/lv_example_snapshot_1.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/others/snapshot/lv_example_snapshot_1.py similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/others/snapshot/lv_example_snapshot_1.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/others/snapshot/lv_example_snapshot_1.py diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/porting/lv_port_disp_template.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/porting/lv_port_disp_template.c similarity index 99% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/porting/lv_port_disp_template.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/porting/lv_port_disp_template.c index db943fa..2197c2c 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/porting/lv_port_disp_template.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/porting/lv_port_disp_template.c @@ -199,7 +199,6 @@ static void disp_flush(lv_disp_drv_t * disp_drv, const lv_area_t * area, lv_colo // } //} - #else /*Enable this file at the top*/ /*This dummy typedef exists purely to silence -Wpedantic.*/ diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/porting/lv_port_disp_template.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/porting/lv_port_disp_template.h similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/porting/lv_port_disp_template.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/porting/lv_port_disp_template.h diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/porting/lv_port_fs_template.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/porting/lv_port_fs_template.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/porting/lv_port_fs_template.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/porting/lv_port_fs_template.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/porting/lv_port_fs_template.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/porting/lv_port_fs_template.h similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/porting/lv_port_fs_template.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/porting/lv_port_fs_template.h diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/porting/lv_port_indev_template.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/porting/lv_port_indev_template.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/porting/lv_port_indev_template.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/porting/lv_port_indev_template.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/porting/lv_port_indev_template.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/porting/lv_port_indev_template.h similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/porting/lv_port_indev_template.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/porting/lv_port_indev_template.h diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/scroll/index.rst b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/scroll/index.rst similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/scroll/index.rst rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/scroll/index.rst diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/scroll/lv_example_scroll.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/scroll/lv_example_scroll.h similarity index 99% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/scroll/lv_example_scroll.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/scroll/lv_example_scroll.h index dc38bef..f6443b4 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/scroll/lv_example_scroll.h +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/scroll/lv_example_scroll.h @@ -32,7 +32,6 @@ void lv_example_scroll_4(void); void lv_example_scroll_5(void); void lv_example_scroll_6(void); - /********************** * MACROS **********************/ diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/scroll/lv_example_scroll_1.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/scroll/lv_example_scroll_1.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/scroll/lv_example_scroll_1.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/scroll/lv_example_scroll_1.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/scroll/lv_example_scroll_1.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/scroll/lv_example_scroll_1.py similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/scroll/lv_example_scroll_1.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/scroll/lv_example_scroll_1.py diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/scroll/lv_example_scroll_2.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/scroll/lv_example_scroll_2.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/scroll/lv_example_scroll_2.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/scroll/lv_example_scroll_2.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/scroll/lv_example_scroll_2.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/scroll/lv_example_scroll_2.py similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/scroll/lv_example_scroll_2.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/scroll/lv_example_scroll_2.py diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/scroll/lv_example_scroll_3.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/scroll/lv_example_scroll_3.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/scroll/lv_example_scroll_3.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/scroll/lv_example_scroll_3.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/scroll/lv_example_scroll_3.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/scroll/lv_example_scroll_3.py similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/scroll/lv_example_scroll_3.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/scroll/lv_example_scroll_3.py diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/scroll/lv_example_scroll_4.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/scroll/lv_example_scroll_4.c similarity index 99% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/scroll/lv_example_scroll_4.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/scroll/lv_example_scroll_4.c index 5bbff5c..e147f15 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/scroll/lv_example_scroll_4.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/scroll/lv_example_scroll_4.c @@ -1,7 +1,6 @@ #include "../lv_examples.h" #if LV_BUILD_EXAMPLES && LV_USE_LIST - /** * Styling the scrollbars */ @@ -28,7 +27,6 @@ void lv_example_scroll_4(void) "Fusce molestie rhoncus nisi sit amet tincidunt. \n" "Suspendisse a nunc ut magna ornare volutpat."); - /*Remove the style of scrollbar to have clean start*/ lv_obj_remove_style(obj, NULL, LV_PART_SCROLLBAR | LV_STATE_ANY); diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/scroll/lv_example_scroll_4.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/scroll/lv_example_scroll_4.py similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/scroll/lv_example_scroll_4.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/scroll/lv_example_scroll_4.py diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/scroll/lv_example_scroll_5.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/scroll/lv_example_scroll_5.c similarity index 99% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/scroll/lv_example_scroll_5.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/scroll/lv_example_scroll_5.c index 60e65ff..d970c57 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/scroll/lv_example_scroll_5.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/scroll/lv_example_scroll_5.c @@ -1,7 +1,6 @@ #include "../lv_examples.h" #if LV_BUILD_EXAMPLES && LV_FONT_DEJAVU_16_PERSIAN_HEBREW - /** * Scrolling with Right To Left base direction */ diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/scroll/lv_example_scroll_5.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/scroll/lv_example_scroll_5.py similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/scroll/lv_example_scroll_5.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/scroll/lv_example_scroll_5.py diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/scroll/lv_example_scroll_6.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/scroll/lv_example_scroll_6.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/scroll/lv_example_scroll_6.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/scroll/lv_example_scroll_6.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/scroll/lv_example_scroll_6.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/scroll/lv_example_scroll_6.py similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/scroll/lv_example_scroll_6.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/scroll/lv_example_scroll_6.py diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/styles/index.rst b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/styles/index.rst similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/styles/index.rst rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/styles/index.rst diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/styles/lv_example_style.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/styles/lv_example_style.h similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/styles/lv_example_style.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/styles/lv_example_style.h diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/styles/lv_example_style_1.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/styles/lv_example_style_1.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/styles/lv_example_style_1.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/styles/lv_example_style_1.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/styles/lv_example_style_1.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/styles/lv_example_style_1.py similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/styles/lv_example_style_1.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/styles/lv_example_style_1.py diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/styles/lv_example_style_10.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/styles/lv_example_style_10.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/styles/lv_example_style_10.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/styles/lv_example_style_10.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/styles/lv_example_style_10.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/styles/lv_example_style_10.py similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/styles/lv_example_style_10.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/styles/lv_example_style_10.py diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/styles/lv_example_style_11.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/styles/lv_example_style_11.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/styles/lv_example_style_11.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/styles/lv_example_style_11.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/styles/lv_example_style_11.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/styles/lv_example_style_11.py similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/styles/lv_example_style_11.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/styles/lv_example_style_11.py diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/styles/lv_example_style_12.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/styles/lv_example_style_12.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/styles/lv_example_style_12.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/styles/lv_example_style_12.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/styles/lv_example_style_12.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/styles/lv_example_style_12.py similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/styles/lv_example_style_12.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/styles/lv_example_style_12.py diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/styles/lv_example_style_13.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/styles/lv_example_style_13.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/styles/lv_example_style_13.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/styles/lv_example_style_13.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/styles/lv_example_style_13.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/styles/lv_example_style_13.py similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/styles/lv_example_style_13.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/styles/lv_example_style_13.py diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/styles/lv_example_style_14.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/styles/lv_example_style_14.c similarity index 99% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/styles/lv_example_style_14.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/styles/lv_example_style_14.c index cdb2086..5ef7ea9 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/styles/lv_example_style_14.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/styles/lv_example_style_14.c @@ -1,7 +1,6 @@ #include "../lv_examples.h" #if LV_BUILD_EXAMPLES && LV_USE_IMG - static lv_style_t style_btn; /*Will be called when the styles of the base theme are already added @@ -36,8 +35,6 @@ static void new_theme_init_and_set(void) lv_disp_set_theme(NULL, &th_new); } - - /** * Extending the current theme */ diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/styles/lv_example_style_14.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/styles/lv_example_style_14.py similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/styles/lv_example_style_14.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/styles/lv_example_style_14.py diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/styles/lv_example_style_15.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/styles/lv_example_style_15.c similarity index 99% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/styles/lv_example_style_15.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/styles/lv_example_style_15.c index cab321f..a895df3 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/styles/lv_example_style_15.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/styles/lv_example_style_15.c @@ -1,8 +1,6 @@ #include "../lv_examples.h" #if LV_BUILD_EXAMPLES && LV_USE_BTN && LV_USE_LABEL - - /** * Opacity and Transformations */ diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/styles/lv_example_style_2.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/styles/lv_example_style_2.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/styles/lv_example_style_2.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/styles/lv_example_style_2.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/styles/lv_example_style_2.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/styles/lv_example_style_2.py similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/styles/lv_example_style_2.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/styles/lv_example_style_2.py diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/styles/lv_example_style_3.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/styles/lv_example_style_3.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/styles/lv_example_style_3.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/styles/lv_example_style_3.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/styles/lv_example_style_3.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/styles/lv_example_style_3.py similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/styles/lv_example_style_3.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/styles/lv_example_style_3.py diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/styles/lv_example_style_4.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/styles/lv_example_style_4.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/styles/lv_example_style_4.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/styles/lv_example_style_4.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/styles/lv_example_style_4.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/styles/lv_example_style_4.py similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/styles/lv_example_style_4.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/styles/lv_example_style_4.py diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/styles/lv_example_style_5.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/styles/lv_example_style_5.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/styles/lv_example_style_5.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/styles/lv_example_style_5.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/styles/lv_example_style_5.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/styles/lv_example_style_5.py similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/styles/lv_example_style_5.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/styles/lv_example_style_5.py diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/styles/lv_example_style_6.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/styles/lv_example_style_6.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/styles/lv_example_style_6.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/styles/lv_example_style_6.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/styles/lv_example_style_6.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/styles/lv_example_style_6.py similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/styles/lv_example_style_6.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/styles/lv_example_style_6.py diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/styles/lv_example_style_7.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/styles/lv_example_style_7.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/styles/lv_example_style_7.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/styles/lv_example_style_7.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/styles/lv_example_style_7.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/styles/lv_example_style_7.py similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/styles/lv_example_style_7.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/styles/lv_example_style_7.py diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/styles/lv_example_style_8.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/styles/lv_example_style_8.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/styles/lv_example_style_8.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/styles/lv_example_style_8.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/styles/lv_example_style_8.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/styles/lv_example_style_8.py similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/styles/lv_example_style_8.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/styles/lv_example_style_8.py diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/styles/lv_example_style_9.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/styles/lv_example_style_9.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/styles/lv_example_style_9.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/styles/lv_example_style_9.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/styles/lv_example_style_9.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/styles/lv_example_style_9.py similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/styles/lv_example_style_9.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/styles/lv_example_style_9.py diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/test_ex.sh b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/test_ex.sh old mode 100644 new mode 100755 similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/test_ex.sh rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/test_ex.sh diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/animimg/index.rst b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/animimg/index.rst similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/animimg/index.rst rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/animimg/index.rst diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/animimg/lv_example_animimg_1.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/animimg/lv_example_animimg_1.c similarity index 88% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/animimg/lv_example_animimg_1.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/animimg/lv_example_animimg_1.c index 84ea965..4341b6f 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/animimg/lv_example_animimg_1.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/animimg/lv_example_animimg_1.c @@ -14,7 +14,7 @@ void lv_example_animimg_1(void) { lv_obj_t * animimg0 = lv_animimg_create(lv_scr_act()); lv_obj_center(animimg0); - lv_animimg_set_src(animimg0, (lv_img_dsc_t **) anim_imgs, 3); + lv_animimg_set_src(animimg0, (const void **) anim_imgs, 3); lv_animimg_set_duration(animimg0, 1000); lv_animimg_set_repeat_count(animimg0, LV_ANIM_REPEAT_INFINITE); lv_animimg_start(animimg0); diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/animimg/lv_example_animimg_1.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/animimg/lv_example_animimg_1.py similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/animimg/lv_example_animimg_1.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/animimg/lv_example_animimg_1.py diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/arc/index.rst b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/arc/index.rst similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/arc/index.rst rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/arc/index.rst diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/arc/lv_example_arc_1.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/arc/lv_example_arc_1.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/arc/lv_example_arc_1.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/arc/lv_example_arc_1.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/arc/lv_example_arc_1.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/arc/lv_example_arc_1.py similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/arc/lv_example_arc_1.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/arc/lv_example_arc_1.py diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/arc/lv_example_arc_2.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/arc/lv_example_arc_2.c similarity index 99% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/arc/lv_example_arc_2.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/arc/lv_example_arc_2.c index 3b94a75..38311b8 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/arc/lv_example_arc_2.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/arc/lv_example_arc_2.c @@ -30,8 +30,6 @@ void lv_example_arc_2(void) lv_anim_set_values(&a, 0, 100); lv_anim_start(&a); - - } #endif diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/arc/lv_example_arc_2.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/arc/lv_example_arc_2.py similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/arc/lv_example_arc_2.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/arc/lv_example_arc_2.py diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/bar/index.rst b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/bar/index.rst similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/bar/index.rst rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/bar/index.rst diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/bar/lv_example_bar_1.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/bar/lv_example_bar_1.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/bar/lv_example_bar_1.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/bar/lv_example_bar_1.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/bar/lv_example_bar_1.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/bar/lv_example_bar_1.py similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/bar/lv_example_bar_1.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/bar/lv_example_bar_1.py diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/bar/lv_example_bar_2.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/bar/lv_example_bar_2.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/bar/lv_example_bar_2.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/bar/lv_example_bar_2.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/bar/lv_example_bar_2.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/bar/lv_example_bar_2.py similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/bar/lv_example_bar_2.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/bar/lv_example_bar_2.py diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/bar/lv_example_bar_3.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/bar/lv_example_bar_3.c similarity index 99% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/bar/lv_example_bar_3.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/bar/lv_example_bar_3.c index eaa8487..5e0aeef 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/bar/lv_example_bar_3.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/bar/lv_example_bar_3.c @@ -36,5 +36,4 @@ void lv_example_bar_3(void) lv_anim_start(&a); } - #endif diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/bar/lv_example_bar_3.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/bar/lv_example_bar_3.py similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/bar/lv_example_bar_3.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/bar/lv_example_bar_3.py diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/bar/lv_example_bar_4.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/bar/lv_example_bar_4.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/bar/lv_example_bar_4.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/bar/lv_example_bar_4.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/bar/lv_example_bar_4.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/bar/lv_example_bar_4.py similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/bar/lv_example_bar_4.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/bar/lv_example_bar_4.py diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/bar/lv_example_bar_5.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/bar/lv_example_bar_5.c similarity index 99% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/bar/lv_example_bar_5.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/bar/lv_example_bar_5.c index c416380..5c2c5fa 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/bar/lv_example_bar_5.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/bar/lv_example_bar_5.c @@ -8,7 +8,6 @@ void lv_example_bar_5(void) { lv_obj_t * label; - lv_obj_t * bar_ltr = lv_bar_create(lv_scr_act()); lv_obj_set_size(bar_ltr, 200, 20); lv_bar_set_value(bar_ltr, 70, LV_ANIM_OFF); diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/bar/lv_example_bar_5.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/bar/lv_example_bar_5.py similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/bar/lv_example_bar_5.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/bar/lv_example_bar_5.py diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/bar/lv_example_bar_6.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/bar/lv_example_bar_6.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/bar/lv_example_bar_6.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/bar/lv_example_bar_6.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/bar/lv_example_bar_6.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/bar/lv_example_bar_6.py similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/bar/lv_example_bar_6.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/bar/lv_example_bar_6.py diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/bar/test.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/bar/test.py similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/bar/test.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/bar/test.py diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/btn/index.rst b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/btn/index.rst similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/btn/index.rst rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/btn/index.rst diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/btn/lv_example_btn_1.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/btn/lv_example_btn_1.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/btn/lv_example_btn_1.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/btn/lv_example_btn_1.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/btn/lv_example_btn_1.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/btn/lv_example_btn_1.py similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/btn/lv_example_btn_1.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/btn/lv_example_btn_1.py diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/btn/lv_example_btn_2.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/btn/lv_example_btn_2.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/btn/lv_example_btn_2.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/btn/lv_example_btn_2.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/btn/lv_example_btn_2.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/btn/lv_example_btn_2.py similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/btn/lv_example_btn_2.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/btn/lv_example_btn_2.py diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/btn/lv_example_btn_3.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/btn/lv_example_btn_3.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/btn/lv_example_btn_3.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/btn/lv_example_btn_3.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/btn/lv_example_btn_3.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/btn/lv_example_btn_3.py similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/btn/lv_example_btn_3.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/btn/lv_example_btn_3.py diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/btnmatrix/index.rst b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/btnmatrix/index.rst similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/btnmatrix/index.rst rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/btnmatrix/index.rst diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/btnmatrix/lv_example_btnmatrix_1.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/btnmatrix/lv_example_btnmatrix_1.c similarity index 99% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/btnmatrix/lv_example_btnmatrix_1.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/btnmatrix/lv_example_btnmatrix_1.c index 262165f..7db9832 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/btnmatrix/lv_example_btnmatrix_1.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/btnmatrix/lv_example_btnmatrix_1.c @@ -13,7 +13,6 @@ static void event_handler(lv_event_t * e) } } - static const char * btnm_map[] = {"1", "2", "3", "4", "5", "\n", "6", "7", "8", "9", "0", "\n", "Action1", "Action2", "" diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/btnmatrix/lv_example_btnmatrix_1.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/btnmatrix/lv_example_btnmatrix_1.py similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/btnmatrix/lv_example_btnmatrix_1.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/btnmatrix/lv_example_btnmatrix_1.py diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/btnmatrix/lv_example_btnmatrix_2.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/btnmatrix/lv_example_btnmatrix_2.c similarity index 99% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/btnmatrix/lv_example_btnmatrix_2.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/btnmatrix/lv_example_btnmatrix_2.c index 985a3d1..4432534 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/btnmatrix/lv_example_btnmatrix_2.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/btnmatrix/lv_example_btnmatrix_2.c @@ -1,7 +1,6 @@ #include "../../lv_examples.h" #if LV_USE_BTNMATRIX && LV_BUILD_EXAMPLES - static void event_cb(lv_event_t * e) { lv_event_code_t code = lv_event_get_code(e); diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/btnmatrix/lv_example_btnmatrix_2.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/btnmatrix/lv_example_btnmatrix_2.py similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/btnmatrix/lv_example_btnmatrix_2.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/btnmatrix/lv_example_btnmatrix_2.py diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/btnmatrix/lv_example_btnmatrix_3.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/btnmatrix/lv_example_btnmatrix_3.c similarity index 99% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/btnmatrix/lv_example_btnmatrix_3.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/btnmatrix/lv_example_btnmatrix_3.c index cbfcfbd..4c95b0a 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/btnmatrix/lv_example_btnmatrix_3.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/btnmatrix/lv_example_btnmatrix_3.c @@ -34,7 +34,6 @@ void lv_example_btnmatrix_3(void) lv_style_set_radius(&style_bg, LV_RADIUS_CIRCLE); lv_style_set_border_width(&style_bg, 0); - static lv_style_t style_btn; lv_style_init(&style_btn); lv_style_set_radius(&style_btn, 0); diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/btnmatrix/lv_example_btnmatrix_3.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/btnmatrix/lv_example_btnmatrix_3.py similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/btnmatrix/lv_example_btnmatrix_3.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/btnmatrix/lv_example_btnmatrix_3.py diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/calendar/index.rst b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/calendar/index.rst similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/calendar/index.rst rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/calendar/index.rst diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/calendar/lv_example_calendar_1.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/calendar/lv_example_calendar_1.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/calendar/lv_example_calendar_1.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/calendar/lv_example_calendar_1.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/calendar/lv_example_calendar_1.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/calendar/lv_example_calendar_1.py similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/calendar/lv_example_calendar_1.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/calendar/lv_example_calendar_1.py diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/canvas/index.rst b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/canvas/index.rst similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/canvas/index.rst rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/canvas/index.rst diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/canvas/lv_example_canvas_1.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/canvas/lv_example_canvas_1.c similarity index 99% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/canvas/lv_example_canvas_1.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/canvas/lv_example_canvas_1.c index 6dd9ab0..a0265f4 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/canvas/lv_example_canvas_1.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/canvas/lv_example_canvas_1.c @@ -1,7 +1,6 @@ #include "../../lv_examples.h" #if LV_USE_CANVAS && LV_BUILD_EXAMPLES - #define CANVAS_WIDTH 200 #define CANVAS_HEIGHT 150 diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/canvas/lv_example_canvas_1.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/canvas/lv_example_canvas_1.py similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/canvas/lv_example_canvas_1.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/canvas/lv_example_canvas_1.py diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/canvas/lv_example_canvas_2.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/canvas/lv_example_canvas_2.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/canvas/lv_example_canvas_2.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/canvas/lv_example_canvas_2.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/canvas/lv_example_canvas_2.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/canvas/lv_example_canvas_2.py similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/canvas/lv_example_canvas_2.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/canvas/lv_example_canvas_2.py diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/chart/index.rst b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/chart/index.rst similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/chart/index.rst rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/chart/index.rst diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/chart/lv_example_chart_1.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/chart/lv_example_chart_1.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/chart/lv_example_chart_1.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/chart/lv_example_chart_1.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/chart/lv_example_chart_1.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/chart/lv_example_chart_1.py similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/chart/lv_example_chart_1.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/chart/lv_example_chart_1.py diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/chart/lv_example_chart_2.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/chart/lv_example_chart_2.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/chart/lv_example_chart_2.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/chart/lv_example_chart_2.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/chart/lv_example_chart_2.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/chart/lv_example_chart_2.py similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/chart/lv_example_chart_2.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/chart/lv_example_chart_2.py diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/chart/lv_example_chart_3.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/chart/lv_example_chart_3.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/chart/lv_example_chart_3.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/chart/lv_example_chart_3.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/chart/lv_example_chart_3.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/chart/lv_example_chart_3.py similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/chart/lv_example_chart_3.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/chart/lv_example_chart_3.py diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/chart/lv_example_chart_4.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/chart/lv_example_chart_4.c similarity index 99% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/chart/lv_example_chart_4.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/chart/lv_example_chart_4.c index 8508ef1..db5eac4 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/chart/lv_example_chart_4.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/chart/lv_example_chart_4.c @@ -1,7 +1,6 @@ #include "../../lv_examples.h" #if LV_USE_CHART && LV_BUILD_EXAMPLES - static void event_cb(lv_event_t * e) { lv_event_code_t code = lv_event_get_code(e); diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/chart/lv_example_chart_4.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/chart/lv_example_chart_4.py similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/chart/lv_example_chart_4.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/chart/lv_example_chart_4.py diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/chart/lv_example_chart_5.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/chart/lv_example_chart_5.c new file mode 100644 index 0000000..f960695 --- /dev/null +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/chart/lv_example_chart_5.c @@ -0,0 +1,99 @@ +#include "../../lv_examples.h" +#if LV_USE_CHART && LV_USE_SLIDER && LV_BUILD_EXAMPLES + +static lv_obj_t * chart; +/* Source: https://github.com/ankur219/ECG-Arrhythmia-classification/blob/642230149583adfae1e4bd26c6f0e1fd8af2be0e/sample.csv*/ +static const lv_coord_t ecg_sample[] = { + -2, 2, 0, -15, -39, -63, -71, -68, -67, -69, -84, -95, -104, -107, -108, -107, -107, -107, -107, -114, -118, -117, + -112, -100, -89, -83, -71, -64, -58, -58, -62, -62, -58, -51, -46, -39, -27, -10, 4, 7, 1, -3, 0, 14, 24, 30, 25, 19, + 13, 7, 12, 15, 18, 21, 13, 6, 9, 8, 17, 19, 13, 11, 11, 11, 23, 30, 37, 34, 25, 14, 15, 19, 28, 31, 26, 23, 25, 31, + 39, 37, 37, 34, 30, 32, 22, 29, 31, 33, 37, 23, 13, 7, 2, 4, -2, 2, 11, 22, 33, 19, -1, -27, -55, -67, -72, -71, -63, + -49, -18, 35, 113, 230, 369, 525, 651, 722, 730, 667, 563, 454, 357, 305, 288, 274, 255, 212, 173, 143, 117, 82, 39, + -13, -53, -78, -91, -101, -113, -124, -131, -131, -131, -129, -128, -129, -125, -123, -123, -129, -139, -148, -153, + -159, -166, -183, -205, -227, -243, -248, -246, -254, -280, -327, -381, -429, -473, -517, -556, -592, -612, -620, + -620, -614, -604, -591, -574, -540, -497, -441, -389, -358, -336, -313, -284, -222, -167, -114, -70, -47, -28, -4, 12, + 38, 52, 58, 56, 56, 57, 68, 77, 86, 86, 80, 69, 67, 70, 82, 85, 89, 90, 89, 89, 88, 91, 96, 97, 91, 83, 78, 82, 88, 95, + 96, 105, 106, 110, 102, 100, 96, 98, 97, 101, 98, 99, 100, 107, 113, 119, 115, 110, 96, 85, 73, 64, 69, 76, 79, + 78, 75, 85, 100, 114, 113, 105, 96, 84, 74, 66, 60, 75, 85, 89, 83, 67, 61, 67, 73, 79, 74, 63, 57, 56, 58, 61, 55, + 48, 45, 46, 55, 62, 55, 49, 43, 50, 59, 63, 57, 40, 31, 23, 25, 27, 31, 35, 34, 30, 36, 34, 42, 38, 36, 40, 46, 50, + 47, 32, 30, 32, 52, 67, 73, 71, 63, 54, 53, 45, 41, 28, 13, 3, 1, 4, 4, -8, -23, -32, -31, -19, -5, 3, 9, 13, 19, + 24, 27, 29, 25, 22, 26, 32, 42, 51, 56, 60, 57, 55, 53, 53, 54, 59, 54, 49, 26, -3, -11, -20, -47, -100, -194, -236, + -212, -123, 8, 103, 142, 147, 120, 105, 98, 93, 81, 61, 40, 26, 28, 30, 30, 27, 19, 17, 21, 20, 19, 19, 22, 36, 40, + 35, 20, 7, 1, 10, 18, 27, 22, 6, -4, -2, 3, 6, -2, -13, -14, -10, -2, 3, 2, -1, -5, -10, -19, -32, -42, -55, -60, + -68, -77, -86, -101, -110, -117, -115, -104, -92, -84, -85, -84, -73, -65, -52, -50, -45, -35, -20, -3, 12, 20, 25, + 26, 28, 28, 30, 28, 25, 28, 33, 42, 42, 36, 23, 9, 0, 1, -4, 1, -4, -4, 1, 5, 9, 9, -3, -1, -18, -50, -108, -190, + -272, -340, -408, -446, -537, -643, -777, -894, -920, -853, -697, -461, -251, -60, 58, 103, 129, 139, 155, 170, 173, + 178, 185, 190, 193, 200, 208, 215, 225, 224, 232, 234, 240, 240, 236, 229, 226, 224, 232, 233, 232, 224, 219, 219, + 223, 231, 226, 223, 219, 218, 223, 223, 223, 233, 245, 268, 286, 296, 295, 283, 271, 263, 252, 243, 226, 210, 197, + 186, 171, 152, 133, 117, 114, 110, 107, 96, 80, 63, 48, 40, 38, 34, 28, 15, 2, -7, -11, -14, -18, -29, -37, -44, -50, + -58, -63, -61, -52, -50, -48, -61, -59, -58, -54, -47, -52, -62, -61, -64, -54, -52, -59, -69, -76, -76, -69, -67, + -74, -78, -81, -80, -73, -65, -57, -53, -51, -47, -35, -27, -22, -22, -24, -21, -17, -13, -10, -11, -13, -20, -20, + -12, -2, 7, -1, -12, -16, -13, -2, 2, -4, -5, -2, 9, 19, 19, 14, 11, 13, 19, 21, 20, 18, 19, 19, 19, 16, 15, 13, 14, + 9, 3, -5, -9, -5, -3, -2, -3, -3, 2, 8, 9, 9, 5, 6, 8, 8, 7, 4, 3, 4, 5, 3, 5, 5, 13, 13, 12, 10, 10, 15, 22, 17, + 14, 7, 10, 15, 16, 11, 12, 10, 13, 9, -2, -4, -2, 7, 16, 16, 17, 16, 7, -1, -16, -18, -16, -9, -4, -5, -10, -9, -8, + -3, -4, -10, -19, -20, -16, -9, -9, -23, -40, -48, -43, -33, -19, -21, -26, -31, -33, -19, 0, 17, 24, 9, -17, -47, + -63, -67, -59, -52, -51, -50, -49, -42, -26, -21, -15, -20, -23, -22, -19, -12, -8, 5, 18, 27, 32, 26, 25, 26, 22, + 23, 17, 14, 17, 21, 25, 2, -45, -121, -196, -226, -200, -118, -9, 73, 126, 131, 114, 87, 60, 42, 29, 26, 34, 35, 34, + 25, 12, 9, 7, 3, 2, -8, -11, 2, 23, 38, 41, 23, 9, 10, 13, 16, 8, -8, -17, -23, -26, -25, -21, -15, -10, -13, -13, + -19, -22, -29, -40, -48, -48, -54, -55, -66, -82, -85, -90, -92, -98, -114, -119, -124, -129, -132, -146, -146, -138, + -124, -99, -85, -72, -65, -65, -65, -66, -63, -64, -64, -58, -46, -26, -9, 2, 2, 4, 0, 1, 4, 3, 10, 11, 10, 2, -4, + 0, 10, 18, 20, 6, 2, -9, -7, -3, -3, -2, -7, -12, -5, 5, 24, 36, 31, 25, 6, 3, 7, 12, 17, 11, 0, -6, -9, -8, -7, -5, + -6, -2, -2, -6, -2, 2, 14, 24, 22, 15, 8, 4, 6, 7, 12, 16, 25, 20, 7, -16, -41, -60, -67, -65, -54, -35, -11, 30, + 84, 175, 302, 455, 603, 707, 743, 714, 625, 519, 414, 337, 300, 281, 263, 239, 197, 163, 136, 109, 77, 34, -18, -50, + -66, -74, -79, -92, -107, -117, -127, -129, -135, -139, -141, -155, -159, -167, -171, -169, -174, -175, -178, -191, + -202, -223, -235, -243, -237, -240, -256, -298, -345, -393, -432, -475, -518, -565, -596, -619, -623, -623, -614, + -599, -583, -559, -524, -477, -425, -383, -357, -331, -301, -252, -198, -143, -96, -57, -29, -8, 10, 31, 45, 60, 65, + 70, 74, 76, 79, 82, 79, 75, 62, +}; + +static void slider_x_event_cb(lv_event_t * e) +{ + lv_obj_t * obj = lv_event_get_target(e); + int32_t v = lv_slider_get_value(obj); + lv_chart_set_zoom_x(chart, v); +} + +static void slider_y_event_cb(lv_event_t * e) +{ + lv_obj_t * obj = lv_event_get_target(e); + int32_t v = lv_slider_get_value(obj); + lv_chart_set_zoom_y(chart, v); +} + +/** + * Display 1000 data points with zooming and scrolling. + * See how the chart changes drawing mode (draw only vertical lines) when + * the points get too crowded. + */ +void lv_example_chart_5(void) +{ + /*Create a chart*/ + chart = lv_chart_create(lv_scr_act()); + lv_obj_set_size(chart, 200, 150); + lv_obj_align(chart, LV_ALIGN_CENTER, -30, -30); + lv_chart_set_range(chart, LV_CHART_AXIS_PRIMARY_Y, -1000, 1000); + + /*Do not display points on the data*/ + lv_obj_set_style_size(chart, 0, LV_PART_INDICATOR); + + lv_chart_series_t * ser = lv_chart_add_series(chart, lv_palette_main(LV_PALETTE_RED), LV_CHART_AXIS_PRIMARY_Y); + + uint32_t pcnt = sizeof(ecg_sample) / sizeof(ecg_sample[0]); + lv_chart_set_point_count(chart, pcnt); + lv_chart_set_ext_y_array(chart, ser, (lv_coord_t *)ecg_sample); + + lv_obj_t * slider; + slider = lv_slider_create(lv_scr_act()); + lv_slider_set_range(slider, LV_IMG_ZOOM_NONE, LV_IMG_ZOOM_NONE * 10); + lv_obj_add_event_cb(slider, slider_x_event_cb, LV_EVENT_VALUE_CHANGED, NULL); + lv_obj_set_size(slider, 200, 10); + lv_obj_align_to(slider, chart, LV_ALIGN_OUT_BOTTOM_MID, 0, 20); + + slider = lv_slider_create(lv_scr_act()); + lv_slider_set_range(slider, LV_IMG_ZOOM_NONE, LV_IMG_ZOOM_NONE * 10); + lv_obj_add_event_cb(slider, slider_y_event_cb, LV_EVENT_VALUE_CHANGED, NULL); + lv_obj_set_size(slider, 10, 150); + lv_obj_align_to(slider, chart, LV_ALIGN_OUT_RIGHT_MID, 20, 0); +} + +#endif diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/chart/lv_example_chart_5.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/chart/lv_example_chart_5.py similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/chart/lv_example_chart_5.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/chart/lv_example_chart_5.py diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/chart/lv_example_chart_6.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/chart/lv_example_chart_6.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/chart/lv_example_chart_6.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/chart/lv_example_chart_6.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/chart/lv_example_chart_6.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/chart/lv_example_chart_6.py similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/chart/lv_example_chart_6.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/chart/lv_example_chart_6.py diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/chart/lv_example_chart_7.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/chart/lv_example_chart_7.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/chart/lv_example_chart_7.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/chart/lv_example_chart_7.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/chart/lv_example_chart_7.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/chart/lv_example_chart_7.py similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/chart/lv_example_chart_7.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/chart/lv_example_chart_7.py diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/chart/lv_example_chart_8.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/chart/lv_example_chart_8.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/chart/lv_example_chart_8.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/chart/lv_example_chart_8.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/chart/lv_example_chart_8.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/chart/lv_example_chart_8.py similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/chart/lv_example_chart_8.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/chart/lv_example_chart_8.py diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/chart/lv_example_chart_9.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/chart/lv_example_chart_9.c similarity index 99% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/chart/lv_example_chart_9.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/chart/lv_example_chart_9.c index c94b564..c492a2f 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/chart/lv_example_chart_9.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/chart/lv_example_chart_9.c @@ -1,7 +1,6 @@ #include "../../lv_examples.h" #if LV_USE_CHART && LV_DRAW_COMPLEX && LV_BUILD_EXAMPLES - static void add_data(lv_timer_t * t) { lv_obj_t * chart = t->user_data; diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/chart/lv_example_chart_9.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/chart/lv_example_chart_9.py similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/chart/lv_example_chart_9.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/chart/lv_example_chart_9.py diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/checkbox/index.rst b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/checkbox/index.rst similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/checkbox/index.rst rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/checkbox/index.rst diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/checkbox/lv_example_checkbox_1.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/checkbox/lv_example_checkbox_1.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/checkbox/lv_example_checkbox_1.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/checkbox/lv_example_checkbox_1.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/checkbox/lv_example_checkbox_1.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/checkbox/lv_example_checkbox_1.py similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/checkbox/lv_example_checkbox_1.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/checkbox/lv_example_checkbox_1.py diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/checkbox/lv_example_checkbox_2.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/checkbox/lv_example_checkbox_2.c similarity index 99% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/checkbox/lv_example_checkbox_2.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/checkbox/lv_example_checkbox_2.c index 02a5728..6d12465 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/checkbox/lv_example_checkbox_2.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/checkbox/lv_example_checkbox_2.c @@ -24,7 +24,6 @@ static void radio_event_handler(lv_event_t * e) LV_LOG_USER("Selected radio buttons: %d, %d", (int)active_index_1, (int)active_index_2); } - static void radiobutton_create(lv_obj_t * parent, const char * txt) { lv_obj_t * obj = lv_checkbox_create(parent); @@ -44,7 +43,6 @@ void lv_example_checkbox_2(void) * A variable is passed as event user data where the index of the active * radiobutton is saved */ - lv_style_init(&style_radio); lv_style_set_radius(&style_radio, LV_RADIUS_CIRCLE); @@ -82,5 +80,4 @@ void lv_example_checkbox_2(void) lv_obj_add_state(lv_obj_get_child(cont2, 0), LV_STATE_CHECKED); } - #endif diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/colorwheel/index.rst b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/colorwheel/index.rst similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/colorwheel/index.rst rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/colorwheel/index.rst diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/colorwheel/lv_example_colorwheel_1.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/colorwheel/lv_example_colorwheel_1.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/colorwheel/lv_example_colorwheel_1.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/colorwheel/lv_example_colorwheel_1.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/colorwheel/lv_example_colorwheel_1.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/colorwheel/lv_example_colorwheel_1.py similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/colorwheel/lv_example_colorwheel_1.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/colorwheel/lv_example_colorwheel_1.py diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/dropdown/index.rst b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/dropdown/index.rst similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/dropdown/index.rst rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/dropdown/index.rst diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/dropdown/lv_example_dropdown_1.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/dropdown/lv_example_dropdown_1.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/dropdown/lv_example_dropdown_1.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/dropdown/lv_example_dropdown_1.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/dropdown/lv_example_dropdown_1.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/dropdown/lv_example_dropdown_1.py similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/dropdown/lv_example_dropdown_1.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/dropdown/lv_example_dropdown_1.py diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/dropdown/lv_example_dropdown_2.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/dropdown/lv_example_dropdown_2.c similarity index 99% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/dropdown/lv_example_dropdown_2.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/dropdown/lv_example_dropdown_2.c index 77f1579..fea5b8d 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/dropdown/lv_example_dropdown_2.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/dropdown/lv_example_dropdown_2.c @@ -1,7 +1,6 @@ #include "../../lv_examples.h" #if LV_USE_DROPDOWN && LV_BUILD_EXAMPLES - /** * Create a drop down, up, left and right menus */ diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/dropdown/lv_example_dropdown_2.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/dropdown/lv_example_dropdown_2.py similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/dropdown/lv_example_dropdown_2.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/dropdown/lv_example_dropdown_2.py diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/dropdown/lv_example_dropdown_3.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/dropdown/lv_example_dropdown_3.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/dropdown/lv_example_dropdown_3.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/dropdown/lv_example_dropdown_3.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/dropdown/lv_example_dropdown_3.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/dropdown/lv_example_dropdown_3.py similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/dropdown/lv_example_dropdown_3.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/dropdown/lv_example_dropdown_3.py diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/img/index.rst b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/img/index.rst similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/img/index.rst rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/img/index.rst diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/img/lv_example_img_1.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/img/lv_example_img_1.c similarity index 99% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/img/lv_example_img_1.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/img/lv_example_img_1.c index 76ef1f4..76fe1c3 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/img/lv_example_img_1.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/img/lv_example_img_1.c @@ -1,7 +1,6 @@ #include "../../lv_examples.h" #if LV_USE_IMG && LV_BUILD_EXAMPLES - void lv_example_img_1(void) { LV_IMG_DECLARE(img_cogwheel_argb); diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/img/lv_example_img_1.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/img/lv_example_img_1.py similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/img/lv_example_img_1.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/img/lv_example_img_1.py diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/img/lv_example_img_2.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/img/lv_example_img_2.c similarity index 99% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/img/lv_example_img_2.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/img/lv_example_img_2.c index 698ab90..2548552 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/img/lv_example_img_2.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/img/lv_example_img_2.c @@ -7,7 +7,6 @@ static void slider_event_cb(lv_event_t * e); static lv_obj_t * red_slider, * green_slider, * blue_slider, * intense_slider; static lv_obj_t * img1; - /** * Demonstrate runtime image re-coloring */ diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/img/lv_example_img_2.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/img/lv_example_img_2.py similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/img/lv_example_img_2.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/img/lv_example_img_2.py diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/img/lv_example_img_3.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/img/lv_example_img_3.c similarity index 99% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/img/lv_example_img_3.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/img/lv_example_img_3.c index aa5b5f3..d1ece70 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/img/lv_example_img_3.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/img/lv_example_img_3.c @@ -11,7 +11,6 @@ static void set_zoom(void * img, int32_t v) lv_img_set_zoom(img, v); } - /** * Show transformations (zoom and rotation) using a pivot point. */ diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/img/lv_example_img_3.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/img/lv_example_img_3.py similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/img/lv_example_img_3.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/img/lv_example_img_3.py diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/img/lv_example_img_4.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/img/lv_example_img_4.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/img/lv_example_img_4.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/img/lv_example_img_4.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/img/lv_example_img_4.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/img/lv_example_img_4.py similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/img/lv_example_img_4.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/img/lv_example_img_4.py diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/imgbtn/index.rst b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/imgbtn/index.rst similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/imgbtn/index.rst rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/imgbtn/index.rst diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/imgbtn/lv_example_imgbtn_1.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/imgbtn/lv_example_imgbtn_1.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/imgbtn/lv_example_imgbtn_1.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/imgbtn/lv_example_imgbtn_1.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/imgbtn/lv_example_imgbtn_1.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/imgbtn/lv_example_imgbtn_1.py similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/imgbtn/lv_example_imgbtn_1.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/imgbtn/lv_example_imgbtn_1.py diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/keyboard/index.rst b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/keyboard/index.rst similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/keyboard/index.rst rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/keyboard/index.rst diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/keyboard/lv_example_keyboard_1.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/keyboard/lv_example_keyboard_1.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/keyboard/lv_example_keyboard_1.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/keyboard/lv_example_keyboard_1.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/keyboard/lv_example_keyboard_1.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/keyboard/lv_example_keyboard_1.py similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/keyboard/lv_example_keyboard_1.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/keyboard/lv_example_keyboard_1.py diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/label/index.rst b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/label/index.rst similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/label/index.rst rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/label/index.rst diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/label/lv_example_label_1.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/label/lv_example_label_1.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/label/lv_example_label_1.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/label/lv_example_label_1.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/label/lv_example_label_1.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/label/lv_example_label_1.py similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/label/lv_example_label_1.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/label/lv_example_label_1.py diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/label/lv_example_label_2.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/label/lv_example_label_2.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/label/lv_example_label_2.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/label/lv_example_label_2.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/label/lv_example_label_2.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/label/lv_example_label_2.py similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/label/lv_example_label_2.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/label/lv_example_label_2.py diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/label/lv_example_label_3.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/label/lv_example_label_3.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/label/lv_example_label_3.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/label/lv_example_label_3.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/label/lv_example_label_3.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/label/lv_example_label_3.py similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/label/lv_example_label_3.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/label/lv_example_label_3.py diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/label/lv_example_label_4.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/label/lv_example_label_4.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/label/lv_example_label_4.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/label/lv_example_label_4.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/label/lv_example_label_5.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/label/lv_example_label_5.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/label/lv_example_label_5.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/label/lv_example_label_5.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/label/lv_example_label_5.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/label/lv_example_label_5.py similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/label/lv_example_label_5.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/label/lv_example_label_5.py diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/led/index.rst b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/led/index.rst similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/led/index.rst rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/led/index.rst diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/led/lv_example_led_1.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/led/lv_example_led_1.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/led/lv_example_led_1.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/led/lv_example_led_1.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/led/lv_example_led_1.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/led/lv_example_led_1.py similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/led/lv_example_led_1.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/led/lv_example_led_1.py diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/line/index.rst b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/line/index.rst similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/line/index.rst rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/line/index.rst diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/line/lv_example_line_1.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/line/lv_example_line_1.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/line/lv_example_line_1.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/line/lv_example_line_1.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/line/lv_example_line_1.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/line/lv_example_line_1.py similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/line/lv_example_line_1.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/line/lv_example_line_1.py diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/list/index.rst b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/list/index.rst similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/list/index.rst rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/list/index.rst diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/list/lv_example_list_1.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/list/lv_example_list_1.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/list/lv_example_list_1.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/list/lv_example_list_1.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/list/lv_example_list_1.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/list/lv_example_list_1.py similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/list/lv_example_list_1.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/list/lv_example_list_1.py diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/list/lv_example_list_2.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/list/lv_example_list_2.c similarity index 99% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/list/lv_example_list_2.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/list/lv_example_list_2.c index 0def918..8ffa359 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/list/lv_example_list_2.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/list/lv_example_list_2.c @@ -1,6 +1,5 @@ #include - #include "../../lv_examples.h" #if LV_USE_LIST && LV_BUILD_EXAMPLES diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/list/lv_example_list_2.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/list/lv_example_list_2.py similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/list/lv_example_list_2.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/list/lv_example_list_2.py diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/list/test.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/list/test.py old mode 100644 new mode 100755 similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/list/test.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/list/test.py diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/lv_example_widgets.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/lv_example_widgets.h similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/lv_example_widgets.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/lv_example_widgets.h diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/menu/index.rst b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/menu/index.rst similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/menu/index.rst rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/menu/index.rst diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/menu/lv_example_menu_1.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/menu/lv_example_menu_1.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/menu/lv_example_menu_1.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/menu/lv_example_menu_1.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/menu/lv_example_menu_1.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/menu/lv_example_menu_1.py similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/menu/lv_example_menu_1.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/menu/lv_example_menu_1.py diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/menu/lv_example_menu_2.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/menu/lv_example_menu_2.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/menu/lv_example_menu_2.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/menu/lv_example_menu_2.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/menu/lv_example_menu_2.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/menu/lv_example_menu_2.py similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/menu/lv_example_menu_2.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/menu/lv_example_menu_2.py diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/menu/lv_example_menu_3.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/menu/lv_example_menu_3.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/menu/lv_example_menu_3.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/menu/lv_example_menu_3.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/menu/lv_example_menu_3.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/menu/lv_example_menu_3.py similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/menu/lv_example_menu_3.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/menu/lv_example_menu_3.py diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/menu/lv_example_menu_4.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/menu/lv_example_menu_4.c similarity index 93% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/menu/lv_example_menu_4.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/menu/lv_example_menu_4.c index 5807e5d..7c96db5 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/menu/lv_example_menu_4.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/menu/lv_example_menu_4.c @@ -18,11 +18,11 @@ static void float_btn_event_cb(lv_event_t * e) cont = lv_menu_cont_create(sub_page); label = lv_label_create(cont); - lv_label_set_text_fmt(label, "Hello, I am hiding inside %i", btn_cnt); + lv_label_set_text_fmt(label, "Hello, I am hiding inside %"LV_PRIu32, btn_cnt); cont = lv_menu_cont_create(main_page); label = lv_label_create(cont); - lv_label_set_text_fmt(label, "Item %i", btn_cnt); + lv_label_set_text_fmt(label, "Item %"LV_PRIu32, btn_cnt); lv_menu_set_load_page_event(menu, cont, sub_page); lv_obj_scroll_to_view_recursive(cont, LV_ANIM_ON); diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/menu/lv_example_menu_4.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/menu/lv_example_menu_4.py similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/menu/lv_example_menu_4.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/menu/lv_example_menu_4.py diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/menu/lv_example_menu_5.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/menu/lv_example_menu_5.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/menu/lv_example_menu_5.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/menu/lv_example_menu_5.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/meter/index.rst b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/meter/index.rst similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/meter/index.rst rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/meter/index.rst diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/meter/lv_example_meter_1.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/meter/lv_example_meter_1.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/meter/lv_example_meter_1.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/meter/lv_example_meter_1.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/meter/lv_example_meter_1.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/meter/lv_example_meter_1.py similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/meter/lv_example_meter_1.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/meter/lv_example_meter_1.py diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/meter/lv_example_meter_2.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/meter/lv_example_meter_2.c similarity index 99% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/meter/lv_example_meter_2.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/meter/lv_example_meter_2.c index 811e056..05fe4bf 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/meter/lv_example_meter_2.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/meter/lv_example_meter_2.c @@ -8,7 +8,6 @@ static void set_value(void * indic, int32_t v) lv_meter_set_indicator_end_value(meter, indic, v); } - /** * A meter with multiple arcs */ diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/meter/lv_example_meter_2.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/meter/lv_example_meter_2.py similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/meter/lv_example_meter_2.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/meter/lv_example_meter_2.py diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/meter/lv_example_meter_3.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/meter/lv_example_meter_3.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/meter/lv_example_meter_3.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/meter/lv_example_meter_3.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/meter/lv_example_meter_3.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/meter/lv_example_meter_3.py similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/meter/lv_example_meter_3.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/meter/lv_example_meter_3.py diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/meter/lv_example_meter_4.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/meter/lv_example_meter_4.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/meter/lv_example_meter_4.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/meter/lv_example_meter_4.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/meter/lv_example_meter_4.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/meter/lv_example_meter_4.py similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/meter/lv_example_meter_4.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/meter/lv_example_meter_4.py diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/msgbox/index.rst b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/msgbox/index.rst similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/msgbox/index.rst rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/msgbox/index.rst diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/msgbox/lv_example_msgbox_1.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/msgbox/lv_example_msgbox_1.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/msgbox/lv_example_msgbox_1.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/msgbox/lv_example_msgbox_1.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/msgbox/lv_example_msgbox_1.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/msgbox/lv_example_msgbox_1.py similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/msgbox/lv_example_msgbox_1.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/msgbox/lv_example_msgbox_1.py diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/obj/index.rst b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/obj/index.rst similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/obj/index.rst rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/obj/index.rst diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/obj/lv_example_obj_1.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/obj/lv_example_obj_1.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/obj/lv_example_obj_1.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/obj/lv_example_obj_1.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/obj/lv_example_obj_1.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/obj/lv_example_obj_1.py similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/obj/lv_example_obj_1.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/obj/lv_example_obj_1.py diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/obj/lv_example_obj_2.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/obj/lv_example_obj_2.c similarity index 99% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/obj/lv_example_obj_2.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/obj/lv_example_obj_2.c index 627d509..6c30899 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/obj/lv_example_obj_2.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/obj/lv_example_obj_2.c @@ -16,7 +16,6 @@ static void drag_event_handler(lv_event_t * e) lv_obj_set_pos(obj, x, y); } - /** * Make an object dragable. */ diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/obj/lv_example_obj_2.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/obj/lv_example_obj_2.py similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/obj/lv_example_obj_2.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/obj/lv_example_obj_2.py diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/roller/index.rst b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/roller/index.rst similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/roller/index.rst rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/roller/index.rst diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/roller/lv_example_roller_1.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/roller/lv_example_roller_1.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/roller/lv_example_roller_1.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/roller/lv_example_roller_1.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/roller/lv_example_roller_1.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/roller/lv_example_roller_1.py similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/roller/lv_example_roller_1.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/roller/lv_example_roller_1.py diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/roller/lv_example_roller_2.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/roller/lv_example_roller_2.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/roller/lv_example_roller_2.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/roller/lv_example_roller_2.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/roller/lv_example_roller_2.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/roller/lv_example_roller_2.py similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/roller/lv_example_roller_2.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/roller/lv_example_roller_2.py diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/roller/lv_example_roller_3.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/roller/lv_example_roller_3.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/roller/lv_example_roller_3.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/roller/lv_example_roller_3.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/roller/lv_example_roller_3.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/roller/lv_example_roller_3.py similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/roller/lv_example_roller_3.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/roller/lv_example_roller_3.py diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/slider/index.rst b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/slider/index.rst similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/slider/index.rst rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/slider/index.rst diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/slider/lv_example_slider_1.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/slider/lv_example_slider_1.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/slider/lv_example_slider_1.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/slider/lv_example_slider_1.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/slider/lv_example_slider_1.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/slider/lv_example_slider_1.py similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/slider/lv_example_slider_1.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/slider/lv_example_slider_1.py diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/slider/lv_example_slider_2.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/slider/lv_example_slider_2.c similarity index 99% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/slider/lv_example_slider_2.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/slider/lv_example_slider_2.c index 883d61f..15de39d 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/slider/lv_example_slider_2.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/slider/lv_example_slider_2.c @@ -1,8 +1,6 @@ #include "../../lv_examples.h" #if LV_USE_SLIDER && LV_BUILD_EXAMPLES - - /** * Show how to style a slider. */ diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/slider/lv_example_slider_2.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/slider/lv_example_slider_2.py similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/slider/lv_example_slider_2.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/slider/lv_example_slider_2.py diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/slider/lv_example_slider_3.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/slider/lv_example_slider_3.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/slider/lv_example_slider_3.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/slider/lv_example_slider_3.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/slider/lv_example_slider_3.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/slider/lv_example_slider_3.py similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/slider/lv_example_slider_3.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/slider/lv_example_slider_3.py diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/span/index.rst b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/span/index.rst similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/span/index.rst rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/span/index.rst diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/span/lv_example_span_1.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/span/lv_example_span_1.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/span/lv_example_span_1.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/span/lv_example_span_1.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/span/lv_example_span_1.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/span/lv_example_span_1.py similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/span/lv_example_span_1.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/span/lv_example_span_1.py diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/spinbox/index.rst b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/spinbox/index.rst similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/spinbox/index.rst rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/spinbox/index.rst diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/spinbox/lv_example_spinbox_1.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/spinbox/lv_example_spinbox_1.c similarity index 99% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/spinbox/lv_example_spinbox_1.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/spinbox/lv_example_spinbox_1.c index 2395aa4..b19e29b 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/spinbox/lv_example_spinbox_1.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/spinbox/lv_example_spinbox_1.c @@ -3,7 +3,6 @@ static lv_obj_t * spinbox; - static void lv_spinbox_increment_event_cb(lv_event_t * e) { lv_event_code_t code = lv_event_get_code(e); @@ -20,7 +19,6 @@ static void lv_spinbox_decrement_event_cb(lv_event_t * e) } } - void lv_example_spinbox_1(void) { spinbox = lv_spinbox_create(lv_scr_act()); diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/spinbox/lv_example_spinbox_1.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/spinbox/lv_example_spinbox_1.py similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/spinbox/lv_example_spinbox_1.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/spinbox/lv_example_spinbox_1.py diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/spinner/index.rst b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/spinner/index.rst similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/spinner/index.rst rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/spinner/index.rst diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/spinner/lv_example_spinner_1.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/spinner/lv_example_spinner_1.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/spinner/lv_example_spinner_1.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/spinner/lv_example_spinner_1.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/spinner/lv_example_spinner_1.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/spinner/lv_example_spinner_1.py similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/spinner/lv_example_spinner_1.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/spinner/lv_example_spinner_1.py diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/switch/index.rst b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/switch/index.rst similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/switch/index.rst rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/switch/index.rst diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/switch/lv_example_switch_1.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/switch/lv_example_switch_1.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/switch/lv_example_switch_1.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/switch/lv_example_switch_1.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/switch/lv_example_switch_1.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/switch/lv_example_switch_1.py similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/switch/lv_example_switch_1.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/switch/lv_example_switch_1.py diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/table/index.rst b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/table/index.rst similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/table/index.rst rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/table/index.rst diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/table/lv_example_table_1.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/table/lv_example_table_1.c similarity index 99% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/table/lv_example_table_1.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/table/lv_example_table_1.c index dc77637..c766568 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/table/lv_example_table_1.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/table/lv_example_table_1.c @@ -29,7 +29,6 @@ static void draw_part_event_cb(lv_event_t * e) } } - void lv_example_table_1(void) { lv_obj_t * table = lv_table_create(lv_scr_act()); diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/table/lv_example_table_1.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/table/lv_example_table_1.py similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/table/lv_example_table_1.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/table/lv_example_table_1.py diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/table/lv_example_table_2.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/table/lv_example_table_2.c similarity index 99% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/table/lv_example_table_2.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/table/lv_example_table_2.c index bd1e933..8eb5ec1 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/table/lv_example_table_2.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/table/lv_example_table_2.c @@ -49,7 +49,6 @@ static void change_event_cb(lv_event_t * e) else lv_table_add_cell_ctrl(obj, row, 0, LV_TABLE_CELL_CTRL_CUSTOM_1); } - /** * A very light-weighted list created from table */ diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/table/lv_example_table_2.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/table/lv_example_table_2.py similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/table/lv_example_table_2.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/table/lv_example_table_2.py diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/tabview/index.rst b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/tabview/index.rst similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/tabview/index.rst rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/tabview/index.rst diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/tabview/lv_example_tabview_1.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/tabview/lv_example_tabview_1.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/tabview/lv_example_tabview_1.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/tabview/lv_example_tabview_1.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/tabview/lv_example_tabview_1.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/tabview/lv_example_tabview_1.py similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/tabview/lv_example_tabview_1.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/tabview/lv_example_tabview_1.py diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/tabview/lv_example_tabview_2.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/tabview/lv_example_tabview_2.c similarity index 81% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/tabview/lv_example_tabview_2.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/tabview/lv_example_tabview_2.c index 0266042..5cb4736 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/tabview/lv_example_tabview_2.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/tabview/lv_example_tabview_2.c @@ -1,21 +1,11 @@ #include "../../lv_examples.h" #if LV_USE_TABVIEW && LV_BUILD_EXAMPLES -static void scroll_begin_event(lv_event_t * e) -{ - /*Disable the scroll animations. Triggered when a tab button is clicked */ - if(lv_event_get_code(e) == LV_EVENT_SCROLL_BEGIN) { - lv_anim_t * a = lv_event_get_param(e); - if(a) a->time = 0; - } -} - void lv_example_tabview_2(void) { /*Create a Tab view object*/ lv_obj_t * tabview; tabview = lv_tabview_create(lv_scr_act(), LV_DIR_LEFT, 80); - lv_obj_add_event_cb(lv_tabview_get_content(tabview), scroll_begin_event, LV_EVENT_SCROLL_BEGIN, NULL); lv_obj_set_style_bg_color(tabview, lv_palette_lighten(LV_PALETTE_RED, 2), 0); @@ -24,7 +14,6 @@ void lv_example_tabview_2(void) lv_obj_set_style_text_color(tab_btns, lv_palette_lighten(LV_PALETTE_GREY, 5), 0); lv_obj_set_style_border_side(tab_btns, LV_BORDER_SIDE_RIGHT, LV_PART_ITEMS | LV_STATE_CHECKED); - /*Add 3 tabs (the tabs are page (lv_page) and can be scrolled*/ lv_obj_t * tab1 = lv_tabview_add_tab(tabview, "Tab 1"); lv_obj_t * tab2 = lv_tabview_add_tab(tabview, "Tab 2"); diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/tabview/lv_example_tabview_2.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/tabview/lv_example_tabview_2.py similarity index 77% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/tabview/lv_example_tabview_2.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/tabview/lv_example_tabview_2.py index f1604be..ee0360e 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/tabview/lv_example_tabview_2.py +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/tabview/lv_example_tabview_2.py @@ -1,15 +1,6 @@ -def scroll_begin_event(e): - - #Disable the scroll animations. Triggered when a tab button is clicked */ - if e.get_code() == lv.EVENT.SCROLL_BEGIN: - a = lv.anim_t.__cast__(e.get_param()) - if a: - a.time = 0 # Create a Tab view object tabview = lv.tabview(lv.scr_act(), lv.DIR.LEFT, 80) -tabview.get_content().add_event_cb(scroll_begin_event, lv.EVENT.SCROLL_BEGIN, None) - tabview.set_style_bg_color(lv.palette_lighten(lv.PALETTE.RED, 2), 0) tab_btns = tabview.get_tab_btns() diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/textarea/index.rst b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/textarea/index.rst similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/textarea/index.rst rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/textarea/index.rst diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/textarea/lv_example_textarea_1.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/textarea/lv_example_textarea_1.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/textarea/lv_example_textarea_1.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/textarea/lv_example_textarea_1.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/textarea/lv_example_textarea_1.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/textarea/lv_example_textarea_1.py similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/textarea/lv_example_textarea_1.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/textarea/lv_example_textarea_1.py diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/textarea/lv_example_textarea_2.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/textarea/lv_example_textarea_2.c similarity index 99% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/textarea/lv_example_textarea_2.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/textarea/lv_example_textarea_2.c index 0a915ca..551b921 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/textarea/lv_example_textarea_2.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/textarea/lv_example_textarea_2.c @@ -29,7 +29,6 @@ void lv_example_textarea_2(void) lv_obj_add_event_cb(text_ta, ta_event_cb, LV_EVENT_ALL, NULL); lv_obj_align(text_ta, LV_ALIGN_TOP_RIGHT, -5, 20); - /*Create a label and position it above the text box*/ lv_obj_t * oneline_label = lv_label_create(lv_scr_act()); lv_label_set_text(oneline_label, "Text:"); diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/textarea/lv_example_textarea_2.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/textarea/lv_example_textarea_2.py similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/textarea/lv_example_textarea_2.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/textarea/lv_example_textarea_2.py diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/textarea/lv_example_textarea_3.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/textarea/lv_example_textarea_3.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/textarea/lv_example_textarea_3.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/textarea/lv_example_textarea_3.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/textarea/lv_example_textarea_3.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/textarea/lv_example_textarea_3.py similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/textarea/lv_example_textarea_3.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/textarea/lv_example_textarea_3.py diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/tileview/index.rst b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/tileview/index.rst similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/tileview/index.rst rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/tileview/index.rst diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/tileview/lv_example_tileview_1.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/tileview/lv_example_tileview_1.c similarity index 99% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/tileview/lv_example_tileview_1.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/tileview/lv_example_tileview_1.c index 8f91d27..79ce6ae 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/tileview/lv_example_tileview_1.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/tileview/lv_example_tileview_1.c @@ -16,7 +16,6 @@ void lv_example_tileview_1(void) lv_label_set_text(label, "Scroll down"); lv_obj_center(label); - /*Tile2: a button*/ lv_obj_t * tile2 = lv_tileview_add_tile(tv, 0, 1, LV_DIR_TOP | LV_DIR_RIGHT); diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/tileview/lv_example_tileview_1.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/tileview/lv_example_tileview_1.py similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/tileview/lv_example_tileview_1.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/tileview/lv_example_tileview_1.py diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/win/index.rst b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/win/index.rst similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/win/index.rst rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/win/index.rst diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/win/lv_example_win_1.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/win/lv_example_win_1.c similarity index 99% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/win/lv_example_win_1.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/win/lv_example_win_1.c index 4df0bff..0a8a373 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/win/lv_example_win_1.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/win/lv_example_win_1.c @@ -1,7 +1,6 @@ #include "../../lv_examples.h" #if LV_USE_WIN && LV_BUILD_EXAMPLES - static void event_handler(lv_event_t * e) { lv_obj_t * obj = lv_event_get_target(e); @@ -39,7 +38,6 @@ void lv_example_win_1(void) "sure it\n" "overflows. :)"); - } #endif diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/win/lv_example_win_1.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/win/lv_example_win_1.py similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/win/lv_example_win_1.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/examples/widgets/win/lv_example_win_1.py diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/idf_component.yml b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/idf_component.yml new file mode 100644 index 0000000..9b1a2e2 --- /dev/null +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/idf_component.yml @@ -0,0 +1,5 @@ +description: LVGL - Light and Versatile Graphics Library +url: https://lvgl.io/ +repository: https://github.com/lvgl/lvgl.git +documentation: https://docs.lvgl.io/ +issues: https://github.com/lvgl/lvgl/issues diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/library.json b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/library.json similarity index 96% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/library.json rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/library.json index b5366b6..db41d53 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/library.json +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/library.json @@ -1,6 +1,6 @@ { "name": "lvgl", - "version": "8.3.3", + "version": "8.4.0", "keywords": "graphics, gui, embedded, tft, lvgl", "description": "Graphics library to create embedded GUI with easy-to-use graphical elements, beautiful visual effects and low memory footprint. It offers anti-aliasing, opacity, and animations using only one frame buffer.", "repository": { diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/library.properties b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/library.properties similarity index 96% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/library.properties rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/library.properties index 816446a..61f3eea 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/library.properties +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/library.properties @@ -1,5 +1,5 @@ name=lvgl -version=8.3.3 +version=8.4.0 author=kisvegabor maintainer=kisvegabor,embeddedt,pete-pjb sentence=Full-featured Graphics Library for Embedded Systems diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/lv_conf_template.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/lv_conf_template.h similarity index 96% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/lv_conf_template.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/lv_conf_template.h index 3d087f0..0c34c6f 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/lv_conf_template.h +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/lv_conf_template.h @@ -1,6 +1,6 @@ /** * @file lv_conf.h - * Configuration file for v8.3.3 + * Configuration file for v8.4.0 */ /* @@ -89,6 +89,9 @@ #if LV_TICK_CUSTOM #define LV_TICK_CUSTOM_INCLUDE "Arduino.h" /*Header for the system time function*/ #define LV_TICK_CUSTOM_SYS_TIME_EXPR (millis()) /*Expression evaluating to current system time in ms*/ + /*If using lvgl as ESP32 component*/ + // #define LV_TICK_CUSTOM_INCLUDE "esp_timer.h" + // #define LV_TICK_CUSTOM_SYS_TIME_EXPR ((esp_timer_get_time() / 1000LL)) #endif /*LV_TICK_CUSTOM*/ /*Default Dot Per Inch. Used to initialize default sizes such as widgets sized, style paddings. @@ -173,6 +176,9 @@ * GPU *-----------*/ +/*Use TSi's (aka Think Silicon) acceleration library NemaGFX */ +#define LV_USE_NEMA_GFX 0 + /*Use Arm's 2D acceleration library Arm-2D */ #define LV_USE_GPU_ARM2D 0 @@ -180,10 +186,18 @@ #define LV_USE_GPU_STM32_DMA2D 0 #if LV_USE_GPU_STM32_DMA2D /*Must be defined to include path of CMSIS header of target processor - e.g. "stm32f769xx.h" or "stm32f429xx.h"*/ + e.g. "stm32f7xx.h" or "stm32f4xx.h"*/ #define LV_GPU_DMA2D_CMSIS_INCLUDE #endif +/*Enable RA6M3 G2D GPU*/ +#define LV_USE_GPU_RA6M3_G2D 0 +#if LV_USE_GPU_RA6M3_G2D + /*include path of target processor + e.g. "hal_data.h"*/ + #define LV_GPU_RA6M3_G2D_INCLUDE "hal_data.h" +#endif + /*Use SWM341's DMA2D GPU*/ #define LV_USE_GPU_SWM341_DMA2D 0 #if LV_USE_GPU_SWM341_DMA2D @@ -628,6 +642,13 @@ #define LV_FS_FATFS_CACHE_SIZE 0 /*>0 to cache this number of bytes in lv_fs_read()*/ #endif +/*API for LittleFS (library needs to be added separately). Uses lfs_file_open, lfs_file_read, etc*/ +#define LV_USE_FS_LITTLEFS 0 +#if LV_USE_FS_LITTLEFS + #define LV_FS_LITTLEFS_LETTER '\0' /*Set an upper cased letter on which the drive will accessible (e.g. 'A')*/ + #define LV_FS_LITTLEFS_CACHE_SIZE 0 /*>0 to cache this number of bytes in lv_fs_read()*/ +#endif + /*PNG decoder library*/ #define LV_USE_PNG 0 @@ -661,6 +682,13 @@ #endif #endif +/*Tiny TTF library*/ +#define LV_USE_TINY_TTF 0 +#if LV_USE_TINY_TTF + /*Load TTF data from files*/ + #define LV_TINY_TTF_FILE_SUPPORT 0 +#endif + /*Rlottie library*/ #define LV_USE_RLOTTIE 0 diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/lvgl.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/lvgl.h similarity index 97% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/lvgl.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/lvgl.h index a045b7a..1305d99 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/lvgl.h +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/lvgl.h @@ -14,8 +14,8 @@ extern "C" { * CURRENT VERSION OF LVGL ***************************/ #define LVGL_VERSION_MAJOR 8 -#define LVGL_VERSION_MINOR 3 -#define LVGL_VERSION_PATCH 4 +#define LVGL_VERSION_MINOR 4 +#define LVGL_VERSION_PATCH 1 #define LVGL_VERSION_INFO "dev" /********************* diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/lvgl.mk b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/lvgl.mk similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/lvgl.mk rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/lvgl.mk diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/lvgl.pc.in b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/lvgl.pc.in new file mode 100644 index 0000000..eeec2b6 --- /dev/null +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/lvgl.pc.in @@ -0,0 +1,10 @@ +prefix="@CMAKE_INSTALL_PREFIX@" +includedir="${prefix}/@INC_INSTALL_DIR@" +libdir=${prefix}/lib + +Name: lvgl +Description: Light and Versatile Graphics Library +URL: https://lvgl.io/ +Version: 8.4.0 +Cflags: -I${includedir} +Libs: -L${libdir} -llvgl diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/scripts/.gitignore b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/scripts/.gitignore similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/scripts/.gitignore rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/scripts/.gitignore diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/scripts/Doxyfile b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/scripts/Doxyfile similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/scripts/Doxyfile rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/scripts/Doxyfile diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/scripts/build_html_examples.sh b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/scripts/build_html_examples.sh old mode 100644 new mode 100755 similarity index 92% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/scripts/build_html_examples.sh rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/scripts/build_html_examples.sh index 4c66ed7..ae8b631 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/scripts/build_html_examples.sh +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/scripts/build_html_examples.sh @@ -6,6 +6,7 @@ rm -rf emscripten_builder git clone https://github.com/lvgl/lv_sim_emscripten.git emscripten_builder scripts/genexamplelist.sh > emscripten_builder/examplelist.c cd emscripten_builder +git checkout 45e0bc5c8d3e55cfbcaf8214361d2335b8b9a7b4 git submodule update --init -- lvgl cd lvgl git checkout $CURRENT_REF diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/scripts/built_in_font/DejaVuSans.ttf b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/scripts/built_in_font/DejaVuSans.ttf similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/scripts/built_in_font/DejaVuSans.ttf rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/scripts/built_in_font/DejaVuSans.ttf diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/scripts/built_in_font/FontAwesome5-Solid+Brands+Regular.woff b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/scripts/built_in_font/FontAwesome5-Solid+Brands+Regular.woff similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/scripts/built_in_font/FontAwesome5-Solid+Brands+Regular.woff rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/scripts/built_in_font/FontAwesome5-Solid+Brands+Regular.woff diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/scripts/built_in_font/Montserrat-Medium.ttf b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/scripts/built_in_font/Montserrat-Medium.ttf similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/scripts/built_in_font/Montserrat-Medium.ttf rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/scripts/built_in_font/Montserrat-Medium.ttf diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/scripts/built_in_font/SimSun.woff b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/scripts/built_in_font/SimSun.woff similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/scripts/built_in_font/SimSun.woff rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/scripts/built_in_font/SimSun.woff diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/scripts/built_in_font/built_in_font_gen.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/scripts/built_in_font/built_in_font_gen.py old mode 100644 new mode 100755 similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/scripts/built_in_font/built_in_font_gen.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/scripts/built_in_font/built_in_font_gen.py diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/scripts/built_in_font/generate_all.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/scripts/built_in_font/generate_all.py old mode 100644 new mode 100755 similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/scripts/built_in_font/generate_all.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/scripts/built_in_font/generate_all.py diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/scripts/built_in_font/unscii-8.ttf b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/scripts/built_in_font/unscii-8.ttf similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/scripts/built_in_font/unscii-8.ttf rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/scripts/built_in_font/unscii-8.ttf diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/scripts/changelog-template.hbs b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/scripts/changelog-template.hbs similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/scripts/changelog-template.hbs rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/scripts/changelog-template.hbs diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/scripts/changelog_gen.sh b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/scripts/changelog_gen.sh old mode 100644 new mode 100755 similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/scripts/changelog_gen.sh rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/scripts/changelog_gen.sh diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/scripts/code-format.cfg b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/scripts/code-format.cfg similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/scripts/code-format.cfg rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/scripts/code-format.cfg diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/scripts/code-format.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/scripts/code-format.py old mode 100644 new mode 100755 similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/scripts/code-format.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/scripts/code-format.py diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/scripts/cppcheck_run.sh b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/scripts/cppcheck_run.sh old mode 100644 new mode 100755 similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/scripts/cppcheck_run.sh rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/scripts/cppcheck_run.sh diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/scripts/filetohex.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/scripts/filetohex.py old mode 100644 new mode 100755 similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/scripts/filetohex.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/scripts/filetohex.py diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/scripts/find_version.sh b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/scripts/find_version.sh old mode 100644 new mode 100755 similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/scripts/find_version.sh rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/scripts/find_version.sh diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/scripts/genexamplelist.sh b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/scripts/genexamplelist.sh old mode 100644 new mode 100755 similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/scripts/genexamplelist.sh rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/scripts/genexamplelist.sh diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/scripts/infer_run.sh b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/scripts/infer_run.sh old mode 100644 new mode 100755 similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/scripts/infer_run.sh rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/scripts/infer_run.sh diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/scripts/install-prerequisites.sh b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/scripts/install-prerequisites.sh old mode 100644 new mode 100755 similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/scripts/install-prerequisites.sh rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/scripts/install-prerequisites.sh diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/scripts/install_astyle.sh b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/scripts/install_astyle.sh new file mode 100755 index 0000000..5afd705 --- /dev/null +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/scripts/install_astyle.sh @@ -0,0 +1,9 @@ +#!/bin/sh + +rm -rf astyle +git clone https://github.com/lvgl/astyle.git +cd astyle/build/gcc +make -j +make install +cd ../../.. +rm -rf astyle diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/scripts/jpg_to_sjpg.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/scripts/jpg_to_sjpg.py old mode 100644 new mode 100755 similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/scripts/jpg_to_sjpg.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/scripts/jpg_to_sjpg.py diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/scripts/lv_conf_internal_gen.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/scripts/lv_conf_internal_gen.py old mode 100644 new mode 100755 similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/scripts/lv_conf_internal_gen.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/scripts/lv_conf_internal_gen.py diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/scripts/release/com.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/scripts/release/com.py old mode 100644 new mode 100755 similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/scripts/release/com.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/scripts/release/com.py diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/scripts/release/commits.txt b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/scripts/release/commits.txt similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/scripts/release/commits.txt rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/scripts/release/commits.txt diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/scripts/release/patch.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/scripts/release/patch.py old mode 100644 new mode 100755 similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/scripts/release/patch.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/scripts/release/patch.py diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/scripts/release/release.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/scripts/release/release.py similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/scripts/release/release.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/scripts/release/release.py diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/scripts/style_api_gen.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/scripts/style_api_gen.py old mode 100644 new mode 100755 similarity index 98% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/scripts/style_api_gen.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/scripts/style_api_gen.py index 5bcdded..2765cce --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/scripts/style_api_gen.py +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/scripts/style_api_gen.py @@ -163,7 +163,7 @@ props = [ {'name': 'BORDER_WIDTH', 'style_type': 'num', 'var_type': 'lv_coord_t' , 'default':0, 'inherited': 0, 'layout': 1, 'ext_draw': 0, - 'dsc': "Set hte width of the border. Only pixel values can be used."}, + 'dsc': "Set the width of the border. Only pixel values can be used."}, {'name': 'BORDER_SIDE', 'style_type': 'num', 'var_type': 'lv_border_side_t', 'default':'`LV_BORDER_SIDE_NONE`', 'inherited': 0, 'layout': 0, 'ext_draw': 0, @@ -316,6 +316,10 @@ props = [ 'style_type': 'num', 'var_type': 'lv_opa_t', 'default':'`LV_OPA_COVER`', 'inherited': 1, 'layout': 0, 'ext_draw': 0, 'dsc': "Scale down all opacity values of the object by this factor. Value 0, `LV_OPA_0` or `LV_OPA_TRANSP` means fully transparent, 255, `LV_OPA_100` or `LV_OPA_COVER` means fully covering, other values or LV_OPA_10, LV_OPA_20, etc means semi transparency." }, +{'name': 'OPA_LAYERED', + 'style_type': 'num', 'var_type': 'lv_opa_t', 'default':'`LV_OPA_COVER`', 'inherited': 1, 'layout': 0, 'ext_draw': 0, + 'dsc': "First draw the object on the layer, then scale down layer opacity factor. Value 0, `LV_OPA_0` or `LV_OPA_TRANSP` means fully transparent, 255, `LV_OPA_100` or `LV_OPA_COVER` means fully covering, other values or LV_OPA_10, LV_OPA_20, etc means semi transparency." }, + {'name': 'COLOR_FILTER_DSC', 'style_type': 'ptr', 'var_type': 'const lv_color_filter_dsc_t *', 'default':'`NULL`', 'inherited': 0, 'layout': 0, 'ext_draw': 0, 'dsc': "Mix a color to all colors of the object." }, @@ -346,7 +350,7 @@ props = [ {'name': 'LAYOUT', 'style_type': 'num', 'var_type': 'uint16_t', 'default':0, 'inherited': 0, 'layout': 1, 'ext_draw': 0, - 'dsc': "Set the layout if the object. The children will be repositioned and resized according to the policies set for the layout. For the possible values see the documentation of the layouts."}, + 'dsc': "Set the layout of the object. The children will be repositioned and resized according to the policies set for the layout. For the possible values see the documentation of the layouts."}, {'name': 'BASE_DIR', 'style_type': 'num', 'var_type': 'lv_base_dir_t', 'default':'`LV_BASE_DIR_AUTO`', 'inherited': 1, 'layout': 1, 'ext_draw': 0, diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/Makefile b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/Makefile similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/Makefile rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/Makefile diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/core/Makefile b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/core/Makefile similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/core/Makefile rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/core/Makefile diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/core/lv_core.mk b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/core/lv_core.mk similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/core/lv_core.mk rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/core/lv_core.mk diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/core/lv_disp.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/core/lv_disp.c similarity index 98% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/core/lv_disp.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/core/lv_disp.c index a1022b5..3b5e693 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/core/lv_disp.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/core/lv_disp.c @@ -224,18 +224,21 @@ void lv_scr_load_anim(lv_obj_t * new_scr, lv_scr_load_anim_t anim_type, uint32_t lv_disp_t * d = lv_obj_get_disp(new_scr); lv_obj_t * act_scr = lv_scr_act(); + if(act_scr == new_scr || d->scr_to_load == new_scr) { + return; + } + /*If an other screen load animation is in progress *make target screen loaded immediately. */ if(d->scr_to_load && act_scr != d->scr_to_load) { - scr_load_internal(d->scr_to_load); lv_anim_del(d->scr_to_load, NULL); lv_obj_set_pos(d->scr_to_load, 0, 0); lv_obj_remove_local_style_prop(d->scr_to_load, LV_STYLE_OPA, 0); - if(d->del_prev) { - lv_obj_del(act_scr); - } + d->prev_scr = d->act_scr; act_scr = d->scr_to_load; + + scr_load_internal(d->scr_to_load); } d->scr_to_load = new_scr; @@ -258,10 +261,10 @@ void lv_scr_load_anim(lv_obj_t * new_scr, lv_scr_load_anim_t anim_type, uint32_t lv_obj_remove_local_style_prop(new_scr, LV_STYLE_OPA, 0); lv_obj_remove_local_style_prop(lv_scr_act(), LV_STYLE_OPA, 0); - /*Shortcut for immediate load*/ if(time == 0 && delay == 0) { scr_load_internal(new_scr); + if(auto_del) lv_obj_del(act_scr); return; } @@ -477,6 +480,7 @@ static void scr_load_internal(lv_obj_t * scr) if(d->act_scr) lv_event_send(scr, LV_EVENT_SCREEN_LOAD_START, NULL); d->act_scr = scr; + d->scr_to_load = NULL; if(d->act_scr) lv_event_send(scr, LV_EVENT_SCREEN_LOADED, NULL); if(d->act_scr) lv_event_send(old_scr, LV_EVENT_SCREEN_UNLOADED, NULL); diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/core/lv_disp.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/core/lv_disp.h similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/core/lv_disp.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/core/lv_disp.h diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/core/lv_event.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/core/lv_event.c similarity index 99% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/core/lv_event.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/core/lv_event.c index f53ceac..3e20151 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/core/lv_event.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/core/lv_event.c @@ -20,7 +20,7 @@ typedef struct _lv_event_dsc_t { lv_event_cb_t cb; void * user_data; - lv_event_code_t filter : 8; + uint8_t filter; } lv_event_dsc_t; /********************** @@ -30,7 +30,6 @@ static lv_event_dsc_t * lv_obj_get_event_dsc(const lv_obj_t * obj, uint32_t id); static lv_res_t event_send_core(lv_event_t * e); static bool event_is_bubbled(lv_event_t * e); - /********************** * STATIC VARIABLES **********************/ @@ -80,7 +79,6 @@ lv_res_t lv_event_send(lv_obj_t * obj, lv_event_code_t event_code, void * param) return res; } - lv_res_t lv_obj_event_base(const lv_obj_class_t * class_p, lv_event_t * e) { const lv_obj_class_t * base; @@ -104,7 +102,6 @@ lv_res_t lv_obj_event_base(const lv_obj_class_t * class_p, lv_event_t * e) return res; } - lv_obj_t * lv_event_get_target(lv_event_t * e) { return e->target; @@ -140,7 +137,6 @@ void lv_event_stop_processing(lv_event_t * e) e->stop_processing = 1; } - uint32_t lv_event_register_id(void) { static uint32_t last_id = _LV_EVENT_LAST; @@ -158,7 +154,6 @@ void _lv_event_mark_deleted(lv_obj_t * obj) } } - struct _lv_event_dsc_t * lv_obj_add_event_cb(lv_obj_t * obj, lv_event_cb_t event_cb, lv_event_code_t filter, void * user_data) { @@ -226,7 +221,6 @@ bool lv_obj_remove_event_cb_with_user_data(lv_obj_t * obj, lv_event_cb_t event_c return false; } - bool lv_obj_remove_event_dsc(lv_obj_t * obj, struct _lv_event_dsc_t * event_dsc) { LV_ASSERT_OBJ(obj, MY_CLASS); diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/core/lv_event.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/core/lv_event.h similarity index 99% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/core/lv_event.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/core/lv_event.h index d5a9eb6..d89d438 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/core/lv_event.h +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/core/lv_event.h @@ -86,7 +86,6 @@ typedef enum { _LV_EVENT_LAST, /** Number of default events*/ - LV_EVENT_PREPROCESS = 0x80, /** This is a flag that can be set with an event so it's processed before the class default event processing */ } lv_event_code_t; @@ -223,7 +222,6 @@ uint32_t lv_event_register_id(void); */ void _lv_event_mark_deleted(struct _lv_obj_t * obj); - /** * Add an event handler function for an object. * Used by the user to react on event which happens with the object. diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/core/lv_group.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/core/lv_group.c similarity index 96% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/core/lv_group.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/core/lv_group.c index 2c4fa93..e6865de 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/core/lv_group.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/core/lv_group.c @@ -71,6 +71,8 @@ lv_group_t * lv_group_create(void) void lv_group_del(lv_group_t * group) { + LV_ASSERT_NULL(group); + /*Defocus the currently focused object*/ if(group->obj_focus != NULL) { lv_event_send(*group->obj_focus, LV_EVENT_DEFOCUSED, get_indev(group)); @@ -92,6 +94,7 @@ void lv_group_del(lv_group_t * group) indev = lv_indev_get_next(indev); } + if(default_group == group) default_group = NULL; _lv_ll_clear(&(group->obj_ll)); _lv_ll_remove(&LV_GC_ROOT(_lv_group_ll), group); lv_mem_free(group); @@ -166,8 +169,9 @@ void lv_group_swap_obj(lv_obj_t * obj1, lv_obj_t * obj2) else if((*obj_i) == obj2)(*obj_i) = obj1; } - if(*g1->obj_focus == obj1) lv_group_focus_obj(obj2); - else if(*g1->obj_focus == obj2) lv_group_focus_obj(obj1); + lv_obj_t * focused = lv_group_get_focused(g1); + if(focused == obj1) lv_group_focus_obj(obj2); + else if(focused == obj2) lv_group_focus_obj(obj1); } @@ -214,6 +218,8 @@ void lv_group_remove_obj(lv_obj_t * obj) void lv_group_remove_all_objs(lv_group_t * group) { + LV_ASSERT_NULL(group); + /*Defocus the currently focused object*/ if(group->obj_focus != NULL) { lv_event_send(*group->obj_focus, LV_EVENT_DEFOCUSED, get_indev(group)); @@ -265,6 +271,8 @@ void lv_group_focus_obj(lv_obj_t * obj) void lv_group_focus_next(lv_group_t * group) { + LV_ASSERT_NULL(group); + bool focus_changed = focus_next_core(group, _lv_ll_get_head, _lv_ll_get_next); if(group->edge_cb) { if(!focus_changed) @@ -274,6 +282,8 @@ void lv_group_focus_next(lv_group_t * group) void lv_group_focus_prev(lv_group_t * group) { + LV_ASSERT_NULL(group); + bool focus_changed = focus_next_core(group, _lv_ll_get_tail, _lv_ll_get_prev); if(group->edge_cb) { if(!focus_changed) @@ -283,6 +293,8 @@ void lv_group_focus_prev(lv_group_t * group) void lv_group_focus_freeze(lv_group_t * group, bool en) { + LV_ASSERT_NULL(group); + if(en == false) group->frozen = 0; else group->frozen = 1; } @@ -299,11 +311,15 @@ lv_res_t lv_group_send_data(lv_group_t * group, uint32_t c) void lv_group_set_focus_cb(lv_group_t * group, lv_group_focus_cb_t focus_cb) { + LV_ASSERT_NULL(group); + group->focus_cb = focus_cb; } void lv_group_set_edge_cb(lv_group_t * group, lv_group_edge_cb_t edge_cb) { + LV_ASSERT_NULL(group); + group->edge_cb = edge_cb; } @@ -327,11 +343,15 @@ void lv_group_set_editing(lv_group_t * group, bool edit) void lv_group_set_refocus_policy(lv_group_t * group, lv_group_refocus_policy_t policy) { + LV_ASSERT_NULL(group); + group->refocus_policy = policy & 0x01; } void lv_group_set_wrap(lv_group_t * group, bool en) { + LV_ASSERT_NULL(group); + group->wrap = en ? 1 : 0; } @@ -369,6 +389,8 @@ bool lv_group_get_wrap(lv_group_t * group) uint32_t lv_group_get_obj_count(lv_group_t * group) { + LV_ASSERT_NULL(group); + return _lv_ll_get_len(&group->obj_ll); } /********************** @@ -377,6 +399,8 @@ uint32_t lv_group_get_obj_count(lv_group_t * group) static void lv_group_refocus(lv_group_t * g) { + LV_ASSERT_NULL(g); + /*Refocus must temporarily allow wrapping to work correctly*/ uint8_t temp_wrap = g->wrap; g->wrap = 1; @@ -392,6 +416,8 @@ static void lv_group_refocus(lv_group_t * g) static bool focus_next_core(lv_group_t * group, void * (*begin)(const lv_ll_t *), void * (*move)(const lv_ll_t *, const void *)) { + LV_ASSERT_NULL(group); + bool focus_changed = false; if(group->frozen) return focus_changed; diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/core/lv_group.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/core/lv_group.h similarity index 99% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/core/lv_group.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/core/lv_group.h index 0910597..3b8231a 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/core/lv_group.h +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/core/lv_group.h @@ -77,7 +77,6 @@ typedef struct _lv_group_t { of list.*/ } lv_group_t; - typedef enum { LV_GROUP_REFOCUS_POLICY_NEXT = 0, LV_GROUP_REFOCUS_POLICY_PREV = 1 @@ -190,7 +189,6 @@ void lv_group_set_focus_cb(lv_group_t * group, lv_group_focus_cb_t focus_cb); */ void lv_group_set_edge_cb(lv_group_t * group, lv_group_edge_cb_t edge_cb); - /** * Set whether the next or previous item in a group is focused if the currently focused obj is * deleted. diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/core/lv_indev.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/core/lv_indev.c similarity index 97% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/core/lv_indev.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/core/lv_indev.c index ab1265e..d753e44 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/core/lv_indev.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/core/lv_indev.c @@ -296,7 +296,6 @@ lv_timer_t * lv_indev_get_read_timer(lv_disp_t * indev) return indev->refr_timer; } - lv_obj_t * lv_indev_search_obj(lv_obj_t * obj, lv_point_t * point) { lv_obj_t * found_p = NULL; @@ -356,16 +355,16 @@ static void indev_pointer_proc(lv_indev_t * i, lv_indev_data_t * data) /*Simple sanity check*/ if(data->point.x < 0) { - LV_LOG_WARN("X is %d which is smaller than zero", data->point.x); + LV_LOG_WARN("X is %d which is smaller than zero", (int)data->point.x); } if(data->point.x >= lv_disp_get_hor_res(i->driver->disp)) { - LV_LOG_WARN("X is %d which is greater than hor. res", data->point.x); + LV_LOG_WARN("X is %d which is greater than hor. res", (int)data->point.x); } if(data->point.y < 0) { - LV_LOG_WARN("Y is %d which is smaller than zero", data->point.y); + LV_LOG_WARN("Y is %d which is smaller than zero", (int)data->point.y); } if(data->point.y >= lv_disp_get_ver_res(i->driver->disp)) { - LV_LOG_WARN("Y is %d which is greater than ver. res", data->point.y); + LV_LOG_WARN("Y is %d which is greater than ver. res", (int)data->point.y); } /*Move the cursor if set and moved*/ @@ -852,8 +851,6 @@ static void indev_proc_press(_lv_indev_proc_t * proc) if(indev_reset_check(proc)) return; } - lv_obj_transform_point(indev_obj_act, &proc->types.pointer.act_point, true, true); - /*If a new object was found reset some variables and send a pressed event handler*/ if(indev_obj_act != proc->types.pointer.act_obj) { proc->types.pointer.last_point.x = proc->types.pointer.act_point.x; @@ -987,6 +984,26 @@ static void indev_proc_release(_lv_indev_proc_t * proc) proc->pr_timestamp = 0; proc->longpr_rep_timestamp = 0; + /*Get the transformed vector with this object*/ + if(scroll_obj) { + int16_t angle = 0; + int16_t zoom = 256; + lv_point_t pivot = { 0, 0 }; + lv_obj_t * parent = scroll_obj; + while(parent) { + angle += lv_obj_get_style_transform_angle(parent, 0); + zoom *= (lv_obj_get_style_transform_zoom(parent, 0) / 256); + parent = lv_obj_get_parent(parent); + } + + if(angle != 0 || zoom != LV_IMG_ZOOM_NONE) { + angle = -angle; + zoom = (256 * 256) / zoom; + lv_point_transform(&proc->types.pointer.scroll_throw_vect, angle, zoom, &pivot); + lv_point_transform(&proc->types.pointer.scroll_throw_vect_ori, angle, zoom, &pivot); + } + } + } /*The reset can be set in the Call the ancestor's event handler function. diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/core/lv_indev.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/core/lv_indev.h similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/core/lv_indev.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/core/lv_indev.h diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/core/lv_indev_scroll.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/core/lv_indev_scroll.c similarity index 88% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/core/lv_indev_scroll.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/core/lv_indev_scroll.c index c05e345..9216075 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/core/lv_indev_scroll.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/core/lv_indev_scroll.c @@ -45,12 +45,13 @@ static lv_coord_t elastic_diff(lv_obj_t * scroll_obj, lv_coord_t diff, lv_coord_ void _lv_indev_scroll_handler(_lv_indev_proc_t * proc) { + if(proc->types.pointer.vect.x == 0 && proc->types.pointer.vect.y == 0) { + return; + } + lv_obj_t * scroll_obj = proc->types.pointer.scroll_obj; /*If there is no scroll object yet try to find one*/ if(scroll_obj == NULL) { - proc->types.pointer.scroll_sum.x += proc->types.pointer.vect.x; - proc->types.pointer.scroll_sum.y += proc->types.pointer.vect.y; - scroll_obj = find_scroll_obj(proc); if(scroll_obj == NULL) return; @@ -61,37 +62,49 @@ void _lv_indev_scroll_handler(_lv_indev_proc_t * proc) } /*Set new position or scroll if the vector is not zero*/ - if(proc->types.pointer.vect.x != 0 || proc->types.pointer.vect.y != 0) { - lv_coord_t diff_x = 0; - lv_coord_t diff_y = 0; - - if(proc->types.pointer.scroll_dir == LV_DIR_HOR) { - lv_coord_t sr = lv_obj_get_scroll_right(scroll_obj); - lv_coord_t sl = lv_obj_get_scroll_left(scroll_obj); - diff_x = elastic_diff(scroll_obj, proc->types.pointer.vect.x, sl, sr, LV_DIR_HOR); - } - else { - lv_coord_t st = lv_obj_get_scroll_top(scroll_obj); - lv_coord_t sb = lv_obj_get_scroll_bottom(scroll_obj); - diff_y = elastic_diff(scroll_obj, proc->types.pointer.vect.y, st, sb, LV_DIR_VER); - } - - lv_dir_t scroll_dir = lv_obj_get_scroll_dir(scroll_obj); - if((scroll_dir & LV_DIR_LEFT) == 0 && diff_x > 0) diff_x = 0; - if((scroll_dir & LV_DIR_RIGHT) == 0 && diff_x < 0) diff_x = 0; - if((scroll_dir & LV_DIR_TOP) == 0 && diff_y > 0) diff_y = 0; - if((scroll_dir & LV_DIR_BOTTOM) == 0 && diff_y < 0) diff_y = 0; - - /*Respect the scroll limit area*/ - scroll_limit_diff(proc, &diff_x, &diff_y); - - _lv_obj_scroll_by_raw(scroll_obj, diff_x, diff_y); - if(proc->reset_query) return; - proc->types.pointer.scroll_sum.x += diff_x; - proc->types.pointer.scroll_sum.y += diff_y; + int16_t angle = 0; + int16_t zoom = 256; + lv_obj_t * parent = scroll_obj; + while(parent) { + angle += lv_obj_get_style_transform_angle(parent, 0); + zoom *= (lv_obj_get_style_transform_zoom(parent, 0) / 256); + parent = lv_obj_get_parent(parent); } -} + if(angle != 0 || zoom != LV_IMG_ZOOM_NONE) { + angle = -angle; + zoom = (256 * 256) / zoom; + lv_point_t pivot = { 0, 0 }; + lv_point_transform(&proc->types.pointer.vect, angle, zoom, &pivot); + } + + lv_coord_t diff_x = 0; + lv_coord_t diff_y = 0; + if(proc->types.pointer.scroll_dir == LV_DIR_HOR) { + lv_coord_t sr = lv_obj_get_scroll_right(scroll_obj); + lv_coord_t sl = lv_obj_get_scroll_left(scroll_obj); + diff_x = elastic_diff(scroll_obj, proc->types.pointer.vect.x, sl, sr, LV_DIR_HOR); + } + else { + lv_coord_t st = lv_obj_get_scroll_top(scroll_obj); + lv_coord_t sb = lv_obj_get_scroll_bottom(scroll_obj); + diff_y = elastic_diff(scroll_obj, proc->types.pointer.vect.y, st, sb, LV_DIR_VER); + } + + lv_dir_t scroll_dir = lv_obj_get_scroll_dir(scroll_obj); + if((scroll_dir & LV_DIR_LEFT) == 0 && diff_x > 0) diff_x = 0; + if((scroll_dir & LV_DIR_RIGHT) == 0 && diff_x < 0) diff_x = 0; + if((scroll_dir & LV_DIR_TOP) == 0 && diff_y > 0) diff_y = 0; + if((scroll_dir & LV_DIR_BOTTOM) == 0 && diff_y < 0) diff_y = 0; + + /*Respect the scroll limit area*/ + scroll_limit_diff(proc, &diff_x, &diff_y); + + _lv_obj_scroll_by_raw(scroll_obj, diff_x, diff_y); + if(proc->reset_query) return; + proc->types.pointer.scroll_sum.x += diff_x; + proc->types.pointer.scroll_sum.y += diff_y; +} void _lv_indev_scroll_throw_handler(_lv_indev_proc_t * proc) { @@ -99,7 +112,6 @@ void _lv_indev_scroll_throw_handler(_lv_indev_proc_t * proc) if(scroll_obj == NULL) return; if(proc->types.pointer.scroll_dir == LV_DIR_NONE) return; - lv_indev_t * indev_act = lv_indev_get_act(); lv_coord_t scroll_throw = indev_act->driver->scroll_throw; @@ -259,14 +271,37 @@ static lv_obj_t * find_scroll_obj(_lv_indev_proc_t * proc) /*Decide if it's a horizontal or vertical scroll*/ bool hor_en = false; bool ver_en = false; - if(LV_ABS(proc->types.pointer.scroll_sum.x) > LV_ABS(proc->types.pointer.scroll_sum.y)) { - hor_en = true; - } - else { - ver_en = true; - } + + proc->types.pointer.scroll_sum.x += proc->types.pointer.vect.x; + proc->types.pointer.scroll_sum.y += proc->types.pointer.vect.y; while(obj_act) { + /*Get the transformed scroll_sum with this object*/ + int16_t angle = 0; + int32_t zoom = 256; + lv_point_t pivot = { 0, 0 }; + lv_obj_t * parent = obj_act; + while(parent) { + angle += lv_obj_get_style_transform_angle(parent, 0); + int32_t zoom_act = lv_obj_get_style_transform_zoom(parent, 0); + zoom = (zoom * zoom_act) >> 8; + parent = lv_obj_get_parent(parent); + } + + lv_point_t obj_scroll_sum = proc->types.pointer.scroll_sum; + if(angle != 0 || zoom != LV_IMG_ZOOM_NONE) { + angle = -angle; + zoom = (256 * 256) / zoom; + lv_point_transform(&obj_scroll_sum, angle, zoom, &pivot); + } + + if(LV_ABS(obj_scroll_sum.x) > LV_ABS(obj_scroll_sum.y)) { + hor_en = true; + } + else { + ver_en = true; + } + if(lv_obj_has_flag(obj_act, LV_OBJ_FLAG_SCROLLABLE) == false) { /*If this object don't want to chain the scroll to the parent stop searching*/ if(lv_obj_has_flag(obj_act, LV_OBJ_FLAG_SCROLL_CHAIN_HOR) == false && hor_en) break; @@ -300,15 +335,15 @@ static lv_obj_t * find_scroll_obj(_lv_indev_proc_t * proc) *is propagated to this object it can show at least elastic scroll effect. *But if not hor/ver scrollable do not scroll it at all (so it's not a good candidate)*/ if((st > 0 || sb > 0) && - ((up_en && proc->types.pointer.scroll_sum.y >= scroll_limit) || - (down_en && proc->types.pointer.scroll_sum.y <= - scroll_limit))) { + ((up_en && obj_scroll_sum.y >= scroll_limit) || + (down_en && obj_scroll_sum.y <= - scroll_limit))) { obj_candidate = obj_act; dir_candidate = LV_DIR_VER; } if((sl > 0 || sr > 0) && - ((left_en && proc->types.pointer.scroll_sum.x >= scroll_limit) || - (right_en && proc->types.pointer.scroll_sum.x <= - scroll_limit))) { + ((left_en && obj_scroll_sum.x >= scroll_limit) || + (right_en && obj_scroll_sum.x <= - scroll_limit))) { obj_candidate = obj_act; dir_candidate = LV_DIR_HOR; } @@ -318,11 +353,11 @@ static lv_obj_t * find_scroll_obj(_lv_indev_proc_t * proc) if(sl <= 0) left_en = false; if(sr <= 0) right_en = false; - /*If the object really can be scrolled into the current direction the use it.*/ - if((left_en && proc->types.pointer.scroll_sum.x >= scroll_limit) || - (right_en && proc->types.pointer.scroll_sum.x <= - scroll_limit) || - (up_en && proc->types.pointer.scroll_sum.y >= scroll_limit) || - (down_en && proc->types.pointer.scroll_sum.y <= - scroll_limit)) { + /*If the object really can be scrolled into the current direction then use it.*/ + if((left_en && obj_scroll_sum.x >= scroll_limit) || + (right_en && obj_scroll_sum.x <= - scroll_limit) || + (up_en && obj_scroll_sum.y >= scroll_limit) || + (down_en && obj_scroll_sum.y <= - scroll_limit)) { proc->types.pointer.scroll_dir = hor_en ? LV_DIR_HOR : LV_DIR_VER; break; } @@ -538,8 +573,6 @@ static void scroll_limit_diff(_lv_indev_proc_t * proc, lv_coord_t * diff_x, lv_c } } - - static lv_coord_t scroll_throw_predict_y(_lv_indev_proc_t * proc) { lv_coord_t y = proc->types.pointer.scroll_throw_vect.y; @@ -555,7 +588,6 @@ static lv_coord_t scroll_throw_predict_y(_lv_indev_proc_t * proc) return move; } - static lv_coord_t scroll_throw_predict_x(_lv_indev_proc_t * proc) { lv_coord_t x = proc->types.pointer.scroll_throw_vect.x; @@ -648,5 +680,3 @@ static lv_coord_t elastic_diff(lv_obj_t * scroll_obj, lv_coord_t diff, lv_coord_ return diff; } - - diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/core/lv_indev_scroll.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/core/lv_indev_scroll.h similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/core/lv_indev_scroll.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/core/lv_indev_scroll.h diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/core/lv_obj.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/core/lv_obj.c similarity index 95% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/core/lv_obj.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/core/lv_obj.c index 8890fcb..f8921f0 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/core/lv_obj.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/core/lv_obj.c @@ -30,6 +30,10 @@ #include "../draw/stm32_dma2d/lv_gpu_stm32_dma2d.h" #endif +#if LV_USE_GPU_RA6M3_G2D + #include "../draw/renesas/lv_gpu_d2_ra6m3.h" +#endif + #if LV_USE_GPU_SWM341_DMA2D #include "../draw/swm341_dma2d/lv_gpu_swm341_dma2d.h" #endif @@ -38,6 +42,10 @@ #include "../draw/nxp/pxp/lv_gpu_nxp_pxp.h" #endif +#if LV_USE_NEMA_GFX + #include "../draw/nema_gfx/lv_draw_nema_gfx.h" +#endif + /********************* * DEFINES *********************/ @@ -119,6 +127,11 @@ void lv_init(void) lv_draw_stm32_dma2d_init(); #endif +#if LV_USE_GPU_RA6M3_G2D + /*Initialize G2D GPU*/ + lv_draw_ra6m3_g2d_init(); +#endif + #if LV_USE_GPU_SWM341_DMA2D /*Initialize DMA2D GPU*/ lv_draw_swm341_dma2d_init(); @@ -128,6 +141,11 @@ void lv_init(void) PXP_COND_STOP(!lv_gpu_nxp_pxp_init(), "PXP init failed."); #endif +#if LV_USE_NEMA_GFX + /*Initialize NEMA GPU*/ + lv_draw_nema_gfx_init(); +#endif + _lv_obj_style_init(); _lv_ll_init(&LV_GC_ROOT(_lv_disp_ll), sizeof(lv_disp_t)); _lv_ll_init(&LV_GC_ROOT(_lv_indev_ll), sizeof(lv_indev_t)); @@ -140,9 +158,9 @@ void lv_init(void) lv_img_cache_set_size(LV_IMG_CACHE_DEF_SIZE); #endif /*Test if the IDE has UTF-8 encoding*/ - char * txt = "Á"; + const char * txt = "Á"; - uint8_t * txt_u8 = (uint8_t *)txt; + const uint8_t * txt_u8 = (uint8_t *)txt; if(txt_u8[0] != 0xc3 || txt_u8[1] != 0x81 || txt_u8[2] != 0x00) { LV_LOG_WARN("The strings have no UTF-8 encoding. Non-ASCII characters won't be displayed."); } @@ -223,12 +241,22 @@ void lv_obj_add_flag(lv_obj_t * obj, lv_obj_flag_t f) bool was_on_layout = lv_obj_is_layout_positioned(obj); + /* We must invalidate the area occupied by the object before we hide it as calls to invalidate hidden objects are ignored */ if(f & LV_OBJ_FLAG_HIDDEN) lv_obj_invalidate(obj); obj->flags |= f; if(f & LV_OBJ_FLAG_HIDDEN) { - lv_obj_invalidate(obj); + if(lv_obj_has_state(obj, LV_STATE_FOCUSED)) { + lv_group_t * group = lv_obj_get_group(obj); + if(group != NULL) { + lv_group_focus_next(group); + lv_obj_t * next_obj = lv_group_get_focused(group); + if(next_obj != NULL) { + lv_obj_invalidate(next_obj); + } + } + } } if((was_on_layout != lv_obj_is_layout_positioned(obj)) || (f & (LV_OBJ_FLAG_LAYOUT_1 | LV_OBJ_FLAG_LAYOUT_2))) { @@ -494,6 +522,11 @@ static void lv_obj_draw(lv_event_t * e) return; } + if(lv_obj_get_style_opa(obj, LV_PART_MAIN) < LV_OPA_MAX) { + info->res = LV_COVER_RES_NOT_COVER; + return; + } + info->res = LV_COVER_RES_COVER; } @@ -536,7 +569,6 @@ static void lv_obj_draw(lv_event_t * e) lv_draw_rect(draw_ctx, &draw_dsc, &coords); - #if LV_DRAW_COMPLEX if(clip_corner) { lv_draw_mask_radius_param_t * mp = lv_mem_buf_get(sizeof(lv_draw_mask_radius_param_t)); @@ -678,7 +710,7 @@ static lv_res_t scrollbar_init_draw_dsc(lv_obj_t * obj, lv_draw_rect_dsc_t * dsc } } - lv_opa_t opa = lv_obj_get_style_opa(obj, LV_PART_SCROLLBAR); + lv_opa_t opa = lv_obj_get_style_opa_recursive(obj, LV_PART_SCROLLBAR); if(opa < LV_OPA_MAX) { dsc->bg_opa = (dsc->bg_opa * opa) >> 8; dsc->border_opa = (dsc->bg_opa * opa) >> 8; @@ -709,9 +741,9 @@ static void lv_obj_event(const lv_obj_class_t * class_p, lv_event_t * e) } else if(code == LV_EVENT_RELEASED) { lv_obj_clear_state(obj, LV_STATE_PRESSED); - void * param = lv_event_get_param(e); + lv_indev_t * indev = lv_event_get_indev(e); /*Go the checked state if enabled*/ - if(lv_indev_get_scroll_obj(param) == NULL && lv_obj_has_flag(obj, LV_OBJ_FLAG_CHECKABLE)) { + if(lv_indev_get_scroll_obj(indev) == NULL && lv_obj_has_flag(obj, LV_OBJ_FLAG_CHECKABLE)) { if(!(lv_obj_get_state(obj) & LV_STATE_CHECKED)) lv_obj_add_state(obj, LV_STATE_CHECKED); else lv_obj_clear_state(obj, LV_STATE_CHECKED); @@ -838,6 +870,10 @@ static void lv_obj_event(const lv_obj_class_t * class_p, lv_event_t * e) lv_obj_mark_layout_as_dirty(obj); } } + else if(code == LV_EVENT_CHILD_DELETED) { + obj->readjust_scroll_after_layout = 1; + lv_obj_mark_layout_as_dirty(obj); + } else if(code == LV_EVENT_REFR_EXT_DRAW_SIZE) { lv_coord_t d = lv_obj_calculate_ext_draw_size(obj, LV_PART_MAIN); lv_event_set_ext_draw_size(e, d); diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/core/lv_obj.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/core/lv_obj.h similarity index 99% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/core/lv_obj.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/core/lv_obj.h index c89e460..1f4ed71 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/core/lv_obj.h +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/core/lv_obj.h @@ -121,7 +121,6 @@ enum { }; - typedef uint32_t lv_obj_flag_t; /** @@ -183,14 +182,15 @@ typedef struct _lv_obj_t { lv_obj_flag_t flags; lv_state_t state; uint16_t layout_inv : 1; + uint16_t readjust_scroll_after_layout : 1; uint16_t scr_layout_inv : 1; uint16_t skip_trans : 1; uint16_t style_cnt : 6; uint16_t h_layout : 1; uint16_t w_layout : 1; + uint16_t being_deleted : 1; } lv_obj_t; - /********************** * GLOBAL PROTOTYPES **********************/ @@ -223,7 +223,6 @@ bool lv_is_initialized(void); */ lv_obj_t * lv_obj_create(lv_obj_t * parent); - /*===================== * Setter functions *====================*/ @@ -242,7 +241,6 @@ void lv_obj_add_flag(lv_obj_t * obj, lv_obj_flag_t f); */ void lv_obj_clear_flag(lv_obj_t * obj, lv_obj_flag_t f); - /** * Add one or more states to the object. The other state bits will remain unchanged. * If specified in the styles, transition animation will be started from the previous state to the current. @@ -401,7 +399,6 @@ static inline lv_coord_t lv_obj_dpx(const lv_obj_t * obj, lv_coord_t n) # define LV_TRACE_OBJ_CREATE(...) #endif - #ifdef __cplusplus } /*extern "C"*/ #endif diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/core/lv_obj_class.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/core/lv_obj_class.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/core/lv_obj_class.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/core/lv_obj_class.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/core/lv_obj_class.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/core/lv_obj_class.h similarity index 99% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/core/lv_obj_class.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/core/lv_obj_class.h index 01a7248..94f6529 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/core/lv_obj_class.h +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/core/lv_obj_class.h @@ -20,7 +20,6 @@ extern "C" { * DEFINES *********************/ - /********************** * TYPEDEFS **********************/ @@ -86,7 +85,6 @@ bool lv_obj_is_group_def(struct _lv_obj_t * obj); * MACROS **********************/ - #ifdef __cplusplus } /*extern "C"*/ #endif diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/core/lv_obj_draw.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/core/lv_obj_draw.c similarity index 88% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/core/lv_obj_draw.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/core/lv_obj_draw.c index f2428cd..d906126 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/core/lv_obj_draw.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/core/lv_obj_draw.c @@ -38,9 +38,8 @@ void lv_obj_init_draw_rect_dsc(lv_obj_t * obj, uint32_t part, lv_draw_rect_dsc_t * draw_dsc) { - lv_opa_t opa = LV_OPA_COVER; + lv_opa_t opa = lv_obj_get_style_opa_recursive(obj, part); if(part != LV_PART_MAIN) { - opa = lv_obj_get_style_opa(obj, part); if(opa <= LV_OPA_MIN) { draw_dsc->bg_opa = LV_OPA_TRANSP; draw_dsc->bg_img_opa = LV_OPA_TRANSP; @@ -180,15 +179,12 @@ void lv_obj_init_draw_rect_dsc(lv_obj_t * obj, uint32_t part, lv_draw_rect_dsc_t } } #endif - - if(part != LV_PART_MAIN) { - if(opa < LV_OPA_MAX) { - draw_dsc->bg_opa = (opa * draw_dsc->shadow_opa) >> 8; - draw_dsc->bg_img_opa = (opa * draw_dsc->shadow_opa) >> 8; - draw_dsc->border_opa = (opa * draw_dsc->shadow_opa) >> 8; - draw_dsc->outline_opa = (opa * draw_dsc->shadow_opa) >> 8; - draw_dsc->shadow_opa = (opa * draw_dsc->shadow_opa) >> 8; - } + if(opa < LV_OPA_MAX) { + draw_dsc->bg_opa = (opa * draw_dsc->bg_opa) >> 8; + draw_dsc->bg_img_opa = (opa * draw_dsc->bg_img_opa) >> 8; + draw_dsc->border_opa = (opa * draw_dsc->border_opa) >> 8; + draw_dsc->outline_opa = (opa * draw_dsc->outline_opa) >> 8; + draw_dsc->shadow_opa = (opa * draw_dsc->shadow_opa) >> 8; } } @@ -197,16 +193,15 @@ void lv_obj_init_draw_label_dsc(lv_obj_t * obj, uint32_t part, lv_draw_label_dsc draw_dsc->opa = lv_obj_get_style_text_opa(obj, part); if(draw_dsc->opa <= LV_OPA_MIN) return; - if(part != LV_PART_MAIN) { - lv_opa_t opa = lv_obj_get_style_opa(obj, part); - if(opa <= LV_OPA_MIN) { - draw_dsc->opa = LV_OPA_TRANSP; - return; - } - if(opa < LV_OPA_MAX) { - draw_dsc->opa = (opa * draw_dsc->opa) >> 8; - } + lv_opa_t opa = lv_obj_get_style_opa_recursive(obj, part); + if(opa <= LV_OPA_MIN) { + draw_dsc->opa = LV_OPA_TRANSP; + return; } + if(opa < LV_OPA_MAX) { + draw_dsc->opa = (opa * draw_dsc->opa) >> 8; + } + if(draw_dsc->opa <= LV_OPA_MIN) return; draw_dsc->color = lv_obj_get_style_text_color_filtered(obj, part); draw_dsc->letter_space = lv_obj_get_style_text_letter_space(obj, part); @@ -230,16 +225,15 @@ void lv_obj_init_draw_img_dsc(lv_obj_t * obj, uint32_t part, lv_draw_img_dsc_t * draw_dsc->opa = lv_obj_get_style_img_opa(obj, part); if(draw_dsc->opa <= LV_OPA_MIN) return; - if(part != LV_PART_MAIN) { - lv_opa_t opa = lv_obj_get_style_opa(obj, part); - if(opa <= LV_OPA_MIN) { - draw_dsc->opa = LV_OPA_TRANSP; - return; - } - if(opa < LV_OPA_MAX) { - draw_dsc->opa = (opa * draw_dsc->opa) >> 8; - } + lv_opa_t opa = lv_obj_get_style_opa_recursive(obj, part); + if(opa <= LV_OPA_MIN) { + draw_dsc->opa = LV_OPA_TRANSP; + return; } + if(opa < LV_OPA_MAX) { + draw_dsc->opa = (opa * draw_dsc->opa) >> 8; + } + if(draw_dsc->opa <= LV_OPA_MIN) return; draw_dsc->angle = 0; draw_dsc->zoom = LV_IMG_ZOOM_NONE; @@ -260,16 +254,15 @@ void lv_obj_init_draw_line_dsc(lv_obj_t * obj, uint32_t part, lv_draw_line_dsc_t draw_dsc->opa = lv_obj_get_style_line_opa(obj, part); if(draw_dsc->opa <= LV_OPA_MIN) return; - if(part != LV_PART_MAIN) { - lv_opa_t opa = lv_obj_get_style_opa(obj, part); - if(opa <= LV_OPA_MIN) { - draw_dsc->opa = LV_OPA_TRANSP; - return; - } - if(opa < LV_OPA_MAX) { - draw_dsc->opa = (opa * draw_dsc->opa) >> 8; - } + lv_opa_t opa = lv_obj_get_style_opa_recursive(obj, part); + if(opa <= LV_OPA_MIN) { + draw_dsc->opa = LV_OPA_TRANSP; + return; } + if(opa < LV_OPA_MAX) { + draw_dsc->opa = (opa * draw_dsc->opa) >> 8; + } + if(draw_dsc->opa <= LV_OPA_MIN) return; draw_dsc->width = lv_obj_get_style_line_width(obj, part); if(draw_dsc->width == 0) return; @@ -297,16 +290,15 @@ void lv_obj_init_draw_arc_dsc(lv_obj_t * obj, uint32_t part, lv_draw_arc_dsc_t * draw_dsc->opa = lv_obj_get_style_arc_opa(obj, part); if(draw_dsc->opa <= LV_OPA_MIN) return; - if(part != LV_PART_MAIN) { - lv_opa_t opa = lv_obj_get_style_opa(obj, part); - if(opa <= LV_OPA_MIN) { - draw_dsc->opa = LV_OPA_TRANSP; - return; - } - if(opa < LV_OPA_MAX) { - draw_dsc->opa = (opa * draw_dsc->opa) >> 8; - } + lv_opa_t opa = lv_obj_get_style_opa_recursive(obj, part); + if(opa <= LV_OPA_MIN) { + draw_dsc->opa = LV_OPA_TRANSP; + return; } + if(opa < LV_OPA_MAX) { + draw_dsc->opa = (opa * draw_dsc->opa) >> 8; + } + if(draw_dsc->opa <= LV_OPA_MIN) return; draw_dsc->color = lv_obj_get_style_arc_color_filtered(obj, part); draw_dsc->img_src = lv_obj_get_style_arc_img_src(obj, part); diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/core/lv_obj_draw.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/core/lv_obj_draw.h similarity index 99% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/core/lv_obj_draw.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/core/lv_obj_draw.h index 3f9d0f3..94fc057 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/core/lv_obj_draw.h +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/core/lv_obj_draw.h @@ -101,7 +101,6 @@ void lv_obj_init_draw_label_dsc(struct _lv_obj_t * obj, uint32_t part, lv_draw_l */ void lv_obj_init_draw_img_dsc(struct _lv_obj_t * obj, uint32_t part, lv_draw_img_dsc_t * draw_dsc); - /** * Initialize a line draw descriptor from an object's styles in its current state * @param obj pointer to an object @@ -158,7 +157,6 @@ void lv_obj_refresh_ext_draw_size(struct _lv_obj_t * obj); */ lv_coord_t _lv_obj_get_ext_draw_size(const struct _lv_obj_t * obj); - lv_layer_type_t _lv_obj_get_layer_type(const struct _lv_obj_t * obj); /********************** diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/core/lv_obj_pos.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/core/lv_obj_pos.c similarity index 97% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/core/lv_obj_pos.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/core/lv_obj_pos.c index a31c11d..595c50d 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/core/lv_obj_pos.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/core/lv_obj_pos.c @@ -200,7 +200,7 @@ bool lv_obj_refr_size(lv_obj_t * obj) /*Invalidate the new area*/ lv_obj_invalidate(obj); - lv_obj_readjust_scroll(obj, LV_ANIM_OFF); + obj->readjust_scroll_after_layout = 1; /*If the object was out of the parent invalidate the new scrollbar area too. *If it wasn't out of the parent but out now, also invalidate the scrollbars*/ @@ -551,7 +551,6 @@ lv_coord_t lv_obj_get_y_aligned(const lv_obj_t * obj) return lv_obj_get_style_y(obj, LV_PART_MAIN); } - lv_coord_t lv_obj_get_width(const lv_obj_t * obj) { LV_ASSERT_OBJ(obj, MY_CLASS); @@ -630,7 +629,6 @@ void lv_obj_refr_pos(lv_obj_t * obj) { if(lv_obj_is_layout_positioned(obj)) return; - lv_obj_t * parent = lv_obj_get_parent(obj); lv_coord_t x = lv_obj_get_style_x(obj, LV_PART_MAIN); lv_coord_t y = lv_obj_get_style_y(obj, LV_PART_MAIN); @@ -833,7 +831,6 @@ void lv_obj_get_transformed_area(const lv_obj_t * obj, lv_area_t * area, bool re lv_area_increase(area, 5, 5); } - void lv_obj_invalidate_area(const lv_obj_t * obj, const lv_area_t * area) { LV_ASSERT_OBJ(obj, MY_CLASS); @@ -895,7 +892,6 @@ bool lv_obj_area_is_visible(const lv_obj_t * obj, lv_area_t * area) lv_obj_get_transformed_area(obj, area, true, false); - /*Truncate recursively to the parents*/ lv_obj_t * par = lv_obj_get_parent(obj); while(par != NULL) { @@ -985,8 +981,6 @@ lv_coord_t lv_clamp_height(lv_coord_t height, lv_coord_t min_height, lv_coord_t return LV_CLAMP(min_height, height, max_height); } - - /********************** * STATIC FUNCTIONS **********************/ @@ -1093,7 +1087,6 @@ static lv_coord_t calc_content_height(lv_obj_t * obj) lv_obj_t * child = obj->spec_attr->children[i]; if(lv_obj_has_flag_any(child, LV_OBJ_FLAG_HIDDEN | LV_OBJ_FLAG_FLOATING)) continue; - if(!lv_obj_is_layout_positioned(child)) { lv_align_t align = lv_obj_get_style_align(child, 0); switch(align) { @@ -1137,20 +1130,24 @@ static void layout_update_core(lv_obj_t * obj) layout_update_core(child); } - if(obj->layout_inv == 0) return; + if(obj->layout_inv) { + obj->layout_inv = 0; + lv_obj_refr_size(obj); + lv_obj_refr_pos(obj); - obj->layout_inv = 0; - - lv_obj_refr_size(obj); - lv_obj_refr_pos(obj); - - if(child_cnt > 0) { - uint32_t layout_id = lv_obj_get_style_layout(obj, LV_PART_MAIN); - if(layout_id > 0 && layout_id <= layout_cnt) { - void * user_data = LV_GC_ROOT(_lv_layout_list)[layout_id - 1].user_data; - LV_GC_ROOT(_lv_layout_list)[layout_id - 1].cb(obj, user_data); + if(child_cnt > 0) { + uint32_t layout_id = lv_obj_get_style_layout(obj, LV_PART_MAIN); + if(layout_id > 0 && layout_id <= layout_cnt) { + void * user_data = LV_GC_ROOT(_lv_layout_list)[layout_id - 1].user_data; + LV_GC_ROOT(_lv_layout_list)[layout_id - 1].cb(obj, user_data); + } } } + + if(obj->readjust_scroll_after_layout) { + obj->readjust_scroll_after_layout = 0; + lv_obj_readjust_scroll(obj, LV_ANIM_OFF); + } } static void transform_point(const lv_obj_t * obj, lv_point_t * p, bool inv) @@ -1160,9 +1157,21 @@ static void transform_point(const lv_obj_t * obj, lv_point_t * p, bool inv) if(angle == 0 && zoom == LV_IMG_ZOOM_NONE) return; - lv_point_t pivot; - pivot.x = obj->coords.x1 + lv_obj_get_style_transform_pivot_x(obj, 0); - pivot.y = obj->coords.y1 + lv_obj_get_style_transform_pivot_y(obj, 0); + lv_point_t pivot = { + .x = lv_obj_get_style_transform_pivot_x(obj, 0), + .y = lv_obj_get_style_transform_pivot_y(obj, 0) + }; + + if(LV_COORD_IS_PCT(pivot.x)) { + pivot.x = (LV_COORD_GET_PCT(pivot.x) * lv_area_get_width(&obj->coords)) / 100; + } + if(LV_COORD_IS_PCT(pivot.y)) { + pivot.y = (LV_COORD_GET_PCT(pivot.y) * lv_area_get_height(&obj->coords)) / 100; + } + + pivot.x = obj->coords.x1 + pivot.x; + pivot.y = obj->coords.y1 + pivot.y; + if(inv) { angle = -angle; zoom = (256 * 256) / zoom; diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/core/lv_obj_pos.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/core/lv_obj_pos.h similarity index 99% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/core/lv_obj_pos.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/core/lv_obj_pos.h index d20ee96..cf2ba98 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/core/lv_obj_pos.h +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/core/lv_obj_pos.h @@ -201,7 +201,6 @@ static inline void lv_obj_center(struct _lv_obj_t * obj) lv_obj_align(obj, LV_ALIGN_CENTER, 0, 0); } - /** * Copy the coordinates of an object to an area * @param obj pointer to an object @@ -345,7 +344,6 @@ void lv_obj_refr_pos(struct _lv_obj_t * obj); void lv_obj_move_to(struct _lv_obj_t * obj, lv_coord_t x, lv_coord_t y); - void lv_obj_move_children_by(struct _lv_obj_t * obj, lv_coord_t x_diff, lv_coord_t y_diff, bool ignore_floating); /** diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/core/lv_obj_scroll.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/core/lv_obj_scroll.c similarity index 99% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/core/lv_obj_scroll.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/core/lv_obj_scroll.c index 02b9826..1239dc7 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/core/lv_obj_scroll.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/core/lv_obj_scroll.c @@ -299,7 +299,6 @@ void lv_obj_scroll_by_bounded(lv_obj_t * obj, lv_coord_t dx, lv_coord_t dy, lv_a } } - void lv_obj_scroll_by(lv_obj_t * obj, lv_coord_t dx, lv_coord_t dy, lv_anim_enable_t anim_en) { if(dx == 0 && dy == 0) return; @@ -425,7 +424,6 @@ lv_res_t _lv_obj_scroll_by_raw(lv_obj_t * obj, lv_coord_t x, lv_coord_t y) return LV_RES_OK; } - bool lv_obj_is_scrolling(const lv_obj_t * obj) { lv_indev_t * indev = lv_indev_get_next(NULL); @@ -480,7 +478,6 @@ void lv_obj_get_scrollbar_area(lv_obj_t * obj, lv_area_t * hor_area, lv_area_t * ver_draw = true; } - bool hor_draw = false; if((dir & LV_DIR_HOR) && ((sm == LV_SCROLLBAR_MODE_ON) || @@ -668,7 +665,6 @@ void lv_obj_readjust_scroll(lv_obj_t * obj, lv_anim_enable_t anim_en) * STATIC FUNCTIONS **********************/ - static void scroll_x_anim(void * obj, int32_t v) { _lv_obj_scroll_by_raw(obj, v + lv_obj_get_scroll_x(obj), 0); diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/core/lv_obj_scroll.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/core/lv_obj_scroll.h similarity index 99% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/core/lv_obj_scroll.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/core/lv_obj_scroll.h index e1da245..aaa5634 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/core/lv_obj_scroll.h +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/core/lv_obj_scroll.h @@ -37,7 +37,6 @@ enum { }; typedef uint8_t lv_scrollbar_mode_t; - /** Scroll span align options. Tells where to align the snappable children when scroll stops.*/ enum { LV_SCROLL_SNAP_NONE, /**< Do not align, leave where it is*/ @@ -249,7 +248,6 @@ void lv_obj_scroll_to_view(struct _lv_obj_t * obj, lv_anim_enable_t anim_en); */ void lv_obj_scroll_to_view_recursive(struct _lv_obj_t * obj, lv_anim_enable_t anim_en); - /** * Low level function to scroll by given x and y coordinates. * `LV_EVENT_SCROLL` is sent. @@ -290,7 +288,7 @@ void lv_obj_get_scrollbar_area(struct _lv_obj_t * obj, lv_area_t * hor, lv_area_ void lv_obj_scrollbar_invalidate(struct _lv_obj_t * obj); /** - * Checked if the content is scrolled "in" and adjusts it to a normal position. + * Checks if the content is scrolled "in" and adjusts it to a normal position. * @param obj pointer to an object * @param anim_en LV_ANIM_ON/OFF */ diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/core/lv_obj_style.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/core/lv_obj_style.c similarity index 95% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/core/lv_obj_style.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/core/lv_obj_style.c index c6cdf82..294d580 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/core/lv_obj_style.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/core/lv_obj_style.c @@ -75,8 +75,13 @@ void _lv_obj_style_init(void) void lv_obj_add_style(lv_obj_t * obj, lv_style_t * style, lv_style_selector_t selector) { + LV_ASSERT(obj->style_cnt < 63); + trans_del(obj, selector, LV_STYLE_PROP_ANY, NULL); + /*Try removing the style first to be sure it won't be added twice*/ + lv_obj_remove_style(obj, style, selector); + uint32_t i; /*Go after the transition and local styles*/ for(i = 0; i < obj->style_cnt; i++) { @@ -89,7 +94,9 @@ void lv_obj_add_style(lv_obj_t * obj, lv_style_t * style, lv_style_selector_t se /*Allocate space for the new style and shift the rest of the style to the end*/ obj->style_cnt++; + LV_ASSERT(obj->style_cnt != 0); obj->styles = lv_mem_realloc(obj->styles, obj->style_cnt * sizeof(_lv_obj_style_t)); + LV_ASSERT_MALLOC(obj->styles); uint32_t j; for(j = obj->style_cnt - 1; j > i ; j--) { @@ -283,7 +290,6 @@ void lv_obj_set_local_style_prop_meta(lv_obj_t * obj, lv_style_prop_t prop, uint lv_obj_refresh_style(obj, selector, prop); } - lv_style_res_t lv_obj_get_local_style_prop(lv_obj_t * obj, lv_style_prop_t prop, lv_style_value_t * value, lv_style_selector_t selector) { @@ -378,7 +384,6 @@ void _lv_obj_style_create_transition(lv_obj_t * obj, lv_part_t part, lv_state_t lv_anim_start(&a); } - lv_style_value_t _lv_obj_style_apply_color_filter(const lv_obj_t * obj, uint32_t part, lv_style_value_t v) { if(obj == NULL) return v; @@ -487,7 +492,6 @@ lv_part_t lv_obj_style_get_selector_part(lv_style_selector_t selector) return selector & 0xFF0000; } - lv_text_align_t lv_obj_calculate_style_text_align(const struct _lv_obj_t * obj, lv_part_t part, const char * txt) { lv_text_align_t align = lv_obj_get_style_text_align(obj, part); @@ -496,6 +500,39 @@ lv_text_align_t lv_obj_calculate_style_text_align(const struct _lv_obj_t * obj, return align; } +lv_opa_t lv_obj_get_style_opa_recursive(const lv_obj_t * obj, lv_part_t part) +{ + + lv_opa_t opa_obj = lv_obj_get_style_opa(obj, part); + if(opa_obj <= LV_OPA_MIN) return LV_OPA_TRANSP; + + lv_opa_t opa_final = LV_OPA_COVER; + if(opa_obj < LV_OPA_MAX) { + opa_final = ((uint32_t)opa_final * opa_obj) >> 8; + } + + if(part != LV_PART_MAIN) { + part = LV_PART_MAIN; + } + else { + obj = lv_obj_get_parent(obj); + } + + while(obj) { + opa_obj = lv_obj_get_style_opa(obj, part); + if(opa_obj <= LV_OPA_MIN) return LV_OPA_TRANSP; + if(opa_obj < LV_OPA_MAX) { + opa_final = ((uint32_t)opa_final * opa_obj) >> 8; + } + + obj = lv_obj_get_parent(obj); + } + + if(opa_final <= LV_OPA_MIN) return LV_OPA_TRANSP; + if(opa_final >= LV_OPA_MAX) return LV_OPA_COVER; + return opa_final; +} + /********************** * STATIC FUNCTIONS **********************/ @@ -518,6 +555,7 @@ static lv_style_t * get_local_style(lv_obj_t * obj, lv_style_selector_t selector } obj->style_cnt++; + LV_ASSERT(obj->style_cnt != 0); obj->styles = lv_mem_realloc(obj->styles, obj->style_cnt * sizeof(_lv_obj_style_t)); LV_ASSERT_MALLOC(obj->styles); @@ -554,7 +592,9 @@ static _lv_obj_style_t * get_trans_style(lv_obj_t * obj, lv_style_selector_t se if(i != obj->style_cnt) return &obj->styles[i]; obj->style_cnt++; + LV_ASSERT(obj->style_cnt != 0); obj->styles = lv_mem_realloc(obj->styles, obj->style_cnt * sizeof(_lv_obj_style_t)); + LV_ASSERT_MALLOC(obj->styles); for(i = obj->style_cnt - 1; i > 0 ; i--) { obj->styles[i] = obj->styles[i - 1]; @@ -568,7 +608,6 @@ static _lv_obj_style_t * get_trans_style(lv_obj_t * obj, lv_style_selector_t se return &obj->styles[0]; } - static lv_style_res_t get_prop_core(const lv_obj_t * obj, lv_part_t part, lv_style_prop_t prop, lv_style_value_t * v) { uint8_t group = 1 << _lv_style_get_prop_group(prop); @@ -749,6 +788,7 @@ static void trans_anim_cb(void * _tr, int32_t v) else value_final.ptr = tr->end_value.ptr; break; case LV_STYLE_BG_COLOR: + case LV_STYLE_BG_GRAD_COLOR: case LV_STYLE_BORDER_COLOR: case LV_STYLE_TEXT_COLOR: case LV_STYLE_SHADOW_COLOR: @@ -845,8 +885,7 @@ static lv_layer_type_t calculate_layer_type(lv_obj_t * obj) { if(lv_obj_get_style_transform_angle(obj, 0) != 0) return LV_LAYER_TYPE_TRANSFORM; if(lv_obj_get_style_transform_zoom(obj, 0) != 256) return LV_LAYER_TYPE_TRANSFORM; - if(lv_obj_get_style_opa(obj, 0) != LV_OPA_COVER) return LV_LAYER_TYPE_SIMPLE; - + if(lv_obj_get_style_opa_layered(obj, 0) != LV_OPA_COVER) return LV_LAYER_TYPE_SIMPLE; #if LV_DRAW_COMPLEX if(lv_obj_get_style_blend_mode(obj, 0) != LV_BLEND_MODE_NORMAL) return LV_LAYER_TYPE_SIMPLE; #endif @@ -862,5 +901,3 @@ static void fade_in_anim_ready(lv_anim_t * a) { lv_obj_remove_local_style_prop(a->var, LV_STYLE_OPA, 0); } - - diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/core/lv_obj_style.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/core/lv_obj_style.h similarity index 92% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/core/lv_obj_style.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/core/lv_obj_style.h index 5d122ca..a0eb8ce 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/core/lv_obj_style.h +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/core/lv_obj_style.h @@ -91,7 +91,7 @@ void lv_obj_remove_style(struct _lv_obj_t * obj, lv_style_t * style, lv_style_se */ static inline void lv_obj_remove_style_all(struct _lv_obj_t * obj) { - lv_obj_remove_style(obj, NULL, LV_PART_ANY | LV_STATE_ANY); + lv_obj_remove_style(obj, NULL, (lv_style_selector_t)LV_PART_ANY | (lv_style_selector_t)LV_STATE_ANY); } /** @@ -236,6 +236,19 @@ static inline void lv_obj_set_style_size(struct _lv_obj_t * obj, lv_coord_t valu lv_text_align_t lv_obj_calculate_style_text_align(const struct _lv_obj_t * obj, lv_part_t part, const char * txt); +static inline lv_coord_t lv_obj_get_style_transform_zoom_safe(const struct _lv_obj_t * obj, uint32_t part) +{ + int16_t zoom = lv_obj_get_style_transform_zoom(obj, part); + return zoom != 0 ? zoom : 1; +} + +/** + * Get the `opa` style property from all parents and multiply and `>> 8` them. + * @param obj the object whose opacity should be get + * @param part the part whose opacity should be get. Non-MAIN parts will consider the `opa` of teh MAIN part too + * @return the final opacity considering the parents' opacity too + */ +lv_opa_t lv_obj_get_style_opa_recursive(const struct _lv_obj_t * obj, lv_part_t part); /********************** * MACROS diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/core/lv_obj_style_gen.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/core/lv_obj_style_gen.c similarity index 98% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/core/lv_obj_style_gen.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/core/lv_obj_style_gen.c index 64a0bb2..81358ab 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/core/lv_obj_style_gen.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/core/lv_obj_style_gen.c @@ -600,6 +600,14 @@ void lv_obj_set_style_opa(struct _lv_obj_t * obj, lv_opa_t value, lv_style_selec lv_obj_set_local_style_prop(obj, LV_STYLE_OPA, v, selector); } +void lv_obj_set_style_opa_layered(struct _lv_obj_t * obj, lv_opa_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_OPA_LAYERED, v, selector); +} + void lv_obj_set_style_color_filter_dsc(struct _lv_obj_t * obj, const lv_color_filter_dsc_t * value, lv_style_selector_t selector) { lv_style_value_t v = { diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/core/lv_obj_style_gen.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/core/lv_obj_style_gen.h similarity index 98% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/core/lv_obj_style_gen.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/core/lv_obj_style_gen.h index 576927d..4a135be 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/core/lv_obj_style_gen.h +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/core/lv_obj_style_gen.h @@ -508,6 +508,12 @@ static inline lv_opa_t lv_obj_get_style_opa(const struct _lv_obj_t * obj, uint32 return (lv_opa_t)v.num; } +static inline lv_opa_t lv_obj_get_style_opa_layered(const struct _lv_obj_t * obj, uint32_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_OPA_LAYERED); + return (lv_opa_t)v.num; +} + static inline const lv_color_filter_dsc_t * lv_obj_get_style_color_filter_dsc(const struct _lv_obj_t * obj, uint32_t part) { lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_COLOR_FILTER_DSC); @@ -637,6 +643,7 @@ void lv_obj_set_style_text_align(struct _lv_obj_t * obj, lv_text_align_t value, void lv_obj_set_style_radius(struct _lv_obj_t * obj, lv_coord_t value, lv_style_selector_t selector); void lv_obj_set_style_clip_corner(struct _lv_obj_t * obj, bool value, lv_style_selector_t selector); void lv_obj_set_style_opa(struct _lv_obj_t * obj, lv_opa_t value, lv_style_selector_t selector); +void lv_obj_set_style_opa_layered(struct _lv_obj_t * obj, lv_opa_t value, lv_style_selector_t selector); void lv_obj_set_style_color_filter_dsc(struct _lv_obj_t * obj, const lv_color_filter_dsc_t * value, lv_style_selector_t selector); void lv_obj_set_style_color_filter_opa(struct _lv_obj_t * obj, lv_opa_t value, lv_style_selector_t selector); void lv_obj_set_style_anim(struct _lv_obj_t * obj, const lv_anim_t * value, lv_style_selector_t selector); diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/core/lv_obj_tree.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/core/lv_obj_tree.c similarity index 98% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/core/lv_obj_tree.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/core/lv_obj_tree.c index d3ad16a..569d674 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/core/lv_obj_tree.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/core/lv_obj_tree.c @@ -49,9 +49,6 @@ void lv_obj_del(lv_obj_t * obj) lv_obj_invalidate(obj); lv_obj_t * par = lv_obj_get_parent(obj); - if(par) { - lv_obj_scrollbar_invalidate(par); - } lv_disp_t * disp = NULL; bool act_scr_del = false; @@ -65,8 +62,6 @@ void lv_obj_del(lv_obj_t * obj) /*Call the ancestor's event handler to the parent to notify it about the child delete*/ if(par) { - lv_obj_update_layout(par); - lv_obj_readjust_scroll(par, LV_ANIM_OFF); lv_obj_scrollbar_invalidate(par); lv_event_send(par, LV_EVENT_CHILD_CHANGED, NULL); lv_event_send(par, LV_EVENT_CHILD_DELETED, NULL); @@ -173,7 +168,6 @@ void lv_obj_set_parent(lv_obj_t * obj, lv_obj_t * parent) obj->parent = parent; /*Notify the original parent because one of its children is lost*/ - lv_obj_readjust_scroll(old_parent, LV_ANIM_OFF); lv_obj_scrollbar_invalidate(old_parent); lv_event_send(old_parent, LV_EVENT_CHILD_CHANGED, obj); lv_event_send(old_parent, LV_EVENT_CHILD_DELETED, NULL); @@ -360,6 +354,8 @@ static void obj_del_core(lv_obj_t * obj) lv_res_t res = lv_event_send(obj, LV_EVENT_DELETE, NULL); if(res == LV_RES_INV) return; + obj->being_deleted = 1; + /*Recursively delete the children*/ lv_obj_t * child = lv_obj_get_child(obj, 0); while(child) { @@ -420,7 +416,6 @@ static void obj_del_core(lv_obj_t * obj) lv_mem_free(obj); } - static lv_obj_tree_walk_res_t walk_core(lv_obj_t * obj, lv_obj_tree_walk_cb_t cb, void * user_data) { lv_obj_tree_walk_res_t res = LV_OBJ_TREE_WALK_NEXT; diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/core/lv_obj_tree.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/core/lv_obj_tree.h similarity index 99% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/core/lv_obj_tree.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/core/lv_obj_tree.h index bee9e16..629efeb 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/core/lv_obj_tree.h +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/core/lv_obj_tree.h @@ -20,7 +20,6 @@ extern "C" { * DEFINES *********************/ - /********************** * TYPEDEFS **********************/ @@ -164,7 +163,6 @@ void lv_obj_tree_walk(struct _lv_obj_t * start_obj, lv_obj_tree_walk_cb_t cb, vo * MACROS **********************/ - #ifdef __cplusplus } /*extern "C"*/ #endif diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/core/lv_refr.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/core/lv_refr.c similarity index 92% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/core/lv_refr.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/core/lv_refr.c index 1a56fed..55dd326 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/core/lv_refr.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/core/lv_refr.c @@ -53,6 +53,7 @@ typedef struct { **********************/ static void lv_refr_join_area(void); static void refr_invalid_areas(void); +static void refr_sync_areas(void); static void refr_area(const lv_area_t * area_p); static void refr_area_part(lv_draw_ctx_t * draw_ctx); static lv_obj_t * lv_refr_get_top_obj(const lv_area_t * area_p, lv_obj_t * obj); @@ -195,7 +196,6 @@ void lv_obj_redraw(lv_draw_ctx_t * draw_ctx, lv_obj_t * obj) draw_ctx->clip_area = clip_area_ori; } - /** * Invalidate an area on display to redraw it * @param area_p pointer to area which should be invalidated (NULL: delete the invalidated areas) @@ -320,12 +320,25 @@ void _lv_disp_refr_timer(lv_timer_t * tmr) } lv_refr_join_area(); - + refr_sync_areas(); refr_invalid_areas(); /*If refresh happened ...*/ if(disp_refr->inv_p != 0) { + /*Copy invalid areas for sync next refresh in double buffered direct mode*/ + if(disp_refr->driver->direct_mode && disp_refr->driver->draw_buf->buf2) { + + uint16_t i; + for(i = 0; i < disp_refr->inv_p; i++) { + if(disp_refr->inv_area_joined[i]) + continue; + + lv_area_t * sync_area = _lv_ll_ins_tail(&disp_refr->sync_areas); + *sync_area = disp_refr->inv_areas[i]; + } + } + /*Clean up*/ lv_memset_00(disp_refr->inv_areas, sizeof(disp_refr->inv_areas)); lv_memset_00(disp_refr->inv_area_joined, sizeof(disp_refr->inv_area_joined)); @@ -453,7 +466,6 @@ uint32_t lv_refr_get_fps_avg(void) } #endif - /********************** * STATIC FUNCTIONS **********************/ @@ -495,6 +507,78 @@ static void lv_refr_join_area(void) } } +/** + * Refresh the sync areas + */ +static void refr_sync_areas(void) +{ + /*Do not sync if not direct mode*/ + if(!disp_refr->driver->direct_mode) return; + + /*Do not sync if not double buffered*/ + if(disp_refr->driver->draw_buf->buf2 == NULL) return; + + /*Do not sync if no sync areas*/ + if(_lv_ll_is_empty(&disp_refr->sync_areas)) return; + + /*The buffers are already swapped. + *So the active buffer is the off screen buffer where LVGL will render*/ + void * buf_off_screen = disp_refr->driver->draw_buf->buf_act; + void * buf_on_screen = disp_refr->driver->draw_buf->buf_act == disp_refr->driver->draw_buf->buf1 + ? disp_refr->driver->draw_buf->buf2 + : disp_refr->driver->draw_buf->buf1; + + /*Get stride for buffer copy*/ + lv_coord_t stride = lv_disp_get_hor_res(disp_refr); + + /*Iterate through invalidated areas to see if sync area should be copied*/ + lv_area_t res[4] = {0}; + int8_t res_c, j; + uint32_t i; + lv_area_t * sync_area, * new_area, * next_area; + for(i = 0; i < disp_refr->inv_p; i++) { + /*Skip joined areas*/ + if(disp_refr->inv_area_joined[i]) continue; + + /*Iterate over sync areas*/ + sync_area = _lv_ll_get_head(&disp_refr->sync_areas); + while(sync_area != NULL) { + /*Get next sync area*/ + next_area = _lv_ll_get_next(&disp_refr->sync_areas, sync_area); + + /*Remove intersect of redraw area from sync area and get remaining areas*/ + res_c = _lv_area_diff(res, sync_area, &disp_refr->inv_areas[i]); + + /*New sub areas created after removing intersect*/ + if(res_c != -1) { + /*Replace old sync area with new areas*/ + for(j = 0; j < res_c; j++) { + new_area = _lv_ll_ins_prev(&disp_refr->sync_areas, sync_area); + *new_area = res[j]; + } + _lv_ll_remove(&disp_refr->sync_areas, sync_area); + lv_mem_free(sync_area); + } + + /*Move on to next sync area*/ + sync_area = next_area; + } + } + + /*Copy sync areas (if any remaining)*/ + for(sync_area = _lv_ll_get_head(&disp_refr->sync_areas); sync_area != NULL; + sync_area = _lv_ll_get_next(&disp_refr->sync_areas, sync_area)) { + disp_refr->driver->draw_ctx->buffer_copy( + disp_refr->driver->draw_ctx, + buf_off_screen, stride, sync_area, + buf_on_screen, stride, sync_area + ); + } + + /*Clear sync areas*/ + _lv_ll_clear(&disp_refr->sync_areas); +} + /** * Refresh the joined areas */ @@ -613,6 +697,9 @@ static void refr_area_part(lv_draw_ctx_t * draw_ctx) { lv_disp_draw_buf_t * draw_buf = lv_disp_get_draw_buf(disp_refr); + if(draw_ctx->init_buf) + draw_ctx->init_buf(draw_ctx); + /* Below the `area_p` area will be redrawn into the draw buffer. * In single buffered mode wait here until the buffer is freed. * In full double buffered mode wait here while the buffers are swapped and a buffer becomes available*/ @@ -801,7 +888,6 @@ static void refr_obj_and_children(lv_draw_ctx_t * draw_ctx, lv_obj_t * top_obj) } } - static lv_res_t layer_get_area(lv_draw_ctx_t * draw_ctx, lv_obj_t * obj, lv_layer_type_t layer_type, lv_area_t * layer_area_out) { @@ -875,7 +961,6 @@ static void layer_alpha_test(lv_obj_t * obj, lv_draw_ctx_t * draw_ctx, lv_draw_l lv_draw_layer_adjust(draw_ctx, layer_ctx, has_alpha ? LV_DRAW_LAYER_FLAG_HAS_ALPHA : LV_DRAW_LAYER_FLAG_NONE); } - void refr_obj(lv_draw_ctx_t * draw_ctx, lv_obj_t * obj) { /*Do not refresh hidden objects*/ @@ -885,7 +970,7 @@ void refr_obj(lv_draw_ctx_t * draw_ctx, lv_obj_t * obj) lv_obj_redraw(draw_ctx, obj); } else { - lv_opa_t opa = lv_obj_get_style_opa(obj, 0); + lv_opa_t opa = lv_obj_get_style_opa_layered(obj, 0); if(opa < LV_OPA_MIN) return; lv_area_t layer_area_full; @@ -914,6 +999,13 @@ void refr_obj(lv_draw_ctx_t * draw_ctx, lv_obj_t * obj) .y = lv_obj_get_style_transform_pivot_y(obj, 0) }; + if(LV_COORD_IS_PCT(pivot.x)) { + pivot.x = (LV_COORD_GET_PCT(pivot.x) * lv_area_get_width(&obj->coords)) / 100; + } + if(LV_COORD_IS_PCT(pivot.y)) { + pivot.y = (LV_COORD_GET_PCT(pivot.y) * lv_area_get_height(&obj->coords)) / 100; + } + lv_draw_img_dsc_t draw_dsc; lv_draw_img_dsc_init(&draw_dsc); draw_dsc.opa = opa; @@ -954,7 +1046,6 @@ void refr_obj(lv_draw_ctx_t * draw_ctx, lv_obj_t * obj) } } - static uint32_t get_max_row(lv_disp_t * disp, lv_coord_t area_w, lv_coord_t area_h) { int32_t max_row = (uint32_t)disp->driver->draw_buf->size / area_w; @@ -1017,7 +1108,7 @@ static void draw_buf_rotate_180(lv_disp_drv_t * drv, lv_area_t * area, lv_color_ area->x1 = drv->hor_res - tmp_coord - 1; } -static LV_ATTRIBUTE_FAST_MEM void draw_buf_rotate_90(bool invert_i, lv_coord_t area_w, lv_coord_t area_h, +static void LV_ATTRIBUTE_FAST_MEM draw_buf_rotate_90(bool invert_i, lv_coord_t area_w, lv_coord_t area_h, lv_color_t * orig_color_p, lv_color_t * rot_buf) { @@ -1252,4 +1343,3 @@ static void mem_monitor_init(mem_monitor_t * _mem_monitor) _mem_monitor->mem_label = NULL; } #endif - diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/core/lv_refr.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/core/lv_refr.h similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/core/lv_refr.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/core/lv_refr.h diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/core/lv_theme.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/core/lv_theme.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/core/lv_theme.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/core/lv_theme.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/core/lv_theme.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/core/lv_theme.h similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/core/lv_theme.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/core/lv_theme.h diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/Makefile b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/Makefile similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/Makefile rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/Makefile diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/arm2d/lv_draw_arm2d.mk b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/arm2d/lv_draw_arm2d.mk similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/arm2d/lv_draw_arm2d.mk rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/arm2d/lv_draw_arm2d.mk diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/arm2d/lv_gpu_arm2d.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/arm2d/lv_gpu_arm2d.c similarity index 63% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/arm2d/lv_gpu_arm2d.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/arm2d/lv_gpu_arm2d.c index 7777fe2..31d4390 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/arm2d/lv_gpu_arm2d.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/arm2d/lv_gpu_arm2d.c @@ -3,6 +3,24 @@ * */ +/* + * Copyright (C) 2010-2023 Arm Limited or its affiliates. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + /********************* * INCLUDES *********************/ @@ -34,15 +52,14 @@ #pragma clang diagnostic ignored "-Wint-conversion" #endif - #include "lv_gpu_arm2d.h" #include "../../core/lv_refr.h" #if LV_USE_GPU_ARM2D +#define __ARM_2D_IMPL__ #include "arm_2d.h" #include "__arm_2d_impl.h" - #if defined(__IS_COMPILER_ARM_COMPILER_5__) #pragma diag_suppress 174,177,188,68,513,144,1296 #elif defined(__IS_COMPILER_IAR__) @@ -72,6 +89,8 @@ #define arm_2d_tile_copy arm_2d_rgb16_tile_copy #define arm_2d_alpha_blending arm_2d_rgb565_alpha_blending #define arm_2d_tile_copy_with_src_mask arm_2d_rgb565_tile_copy_with_src_mask +#define __arm_2d_impl_tile_copy_with_src_mask_and_opacity \ + __arm_2d_impl_rgb565_tile_copy_with_src_mask_and_opacity #define arm_2d_color_t arm_2d_color_rgb565_t /* arm-2d direct mode apis */ @@ -89,10 +108,14 @@ #define __arm_2d_impl_cl_key_copy __arm_2d_impl_rgb16_cl_key_copy #define __arm_2d_impl_alpha_blending_colour_keying \ __arm_2d_impl_rgb565_alpha_blending_colour_keying -#define arm_2d_tile_transform_with_src_mask_and_opacity \ - arm_2d_rgb565_tile_transform_with_src_mask_and_opacity -#define arm_2d_tile_transform_with_opacity \ - arm_2d_rgb565_tile_transform_with_opacity +#define arm_2d_tile_transform_with_src_mask_and_opacity_prepare \ + arm_2dp_rgb565_tile_transform_with_src_mask_and_opacity_prepare +#define arm_2d_tile_transform_with_opacity_prepare \ + arm_2dp_rgb565_tile_transform_with_opacity_prepare +#define arm_2d_tile_transform_only_with_opacity_prepare \ + arm_2dp_rgb565_tile_transform_only_with_opacity_prepare +#define arm_2d_tile_transform_prepare \ + arm_2dp_rgb565_tile_transform_prepare #define __ARM_2D_PIXEL_BLENDING_OPA __ARM_2D_PIXEL_BLENDING_OPA_RGB565 @@ -107,6 +130,8 @@ #define arm_2d_tile_copy arm_2d_rgb32_tile_copy #define arm_2d_alpha_blending arm_2d_cccn888_alpha_blending #define arm_2d_tile_copy_with_src_mask arm_2d_cccn888_tile_copy_with_src_mask +#define __arm_2d_impl_tile_copy_with_src_mask_and_opacity \ + __arm_2d_impl_cccn888_tile_copy_with_src_mask_and_opacity #define arm_2d_color_t arm_2d_color_cccn888_t /* arm-2d direct mode apis */ @@ -124,10 +149,14 @@ #define __arm_2d_impl_cl_key_copy __arm_2d_impl_rgb32_cl_key_copy #define __arm_2d_impl_alpha_blending_colour_keying \ __arm_2d_impl_cccn888_alpha_blending_colour_keying -#define arm_2d_tile_transform_with_src_mask_and_opacity \ - arm_2d_cccn888_tile_transform_with_src_mask_and_opacity -#define arm_2d_tile_transform_with_opacity \ - arm_2d_cccn888_tile_transform_with_opacity +#define arm_2d_tile_transform_with_src_mask_and_opacity_prepare \ + arm_2dp_cccn888_tile_transform_with_src_mask_and_opacity_prepare +#define arm_2d_tile_transform_with_opacity_prepare \ + arm_2dp_cccn888_tile_transform_with_opacity_prepare +#define arm_2d_tile_transform_only_with_opacity_prepare \ + arm_2dp_cccn888_tile_transform_only_with_opacity_prepare +#define arm_2d_tile_transform_prepare \ + arm_2dp_cccn888_tile_transform_prepare #define __ARM_2D_PIXEL_BLENDING_OPA __ARM_2D_PIXEL_BLENDING_OPA_CCCN888 @@ -298,11 +327,88 @@ /* replace src_buf for the following operation */ \ src_buf = (const uint8_t *)rgb_tmp_buf; \ } \ - __VA_ARGS__ \ + do { \ + __VA_ARGS__ \ + } while(0); \ if (NULL != rgb_tmp_buf) { \ lv_mem_buf_release(rgb_tmp_buf); \ } \ - } while(0); + } while(0); \ + src_buf = src_buf_org; + +#define __RECOLOUR_BEGIN() \ + do { \ + lv_color_t *rgb_tmp_buf = NULL; \ + if(draw_dsc->recolor_opa > LV_OPA_MIN) { \ + rgb_tmp_buf \ + = lv_mem_buf_get(src_w * src_h * sizeof(lv_color_t)); \ + if (NULL == rgb_tmp_buf) { \ + LV_LOG_WARN( \ + "Failed to allocate memory for accelerating recolour, " \ + "use normal route instead."); \ + break; \ + } \ + lv_memcpy(rgb_tmp_buf, src_buf, src_w * src_h * sizeof(lv_color_t));\ + arm_2d_size_t copy_size = { \ + .iWidth = src_w, \ + .iHeight = src_h, \ + }; \ + /* apply re-colour */ \ + __arm_2d_impl_colour_filling_with_opacity( \ + (color_int *)rgb_tmp_buf, \ + src_w, \ + ©_size, \ + (color_int)draw_dsc->recolor.full, \ + draw_dsc->recolor_opa); \ + \ + /* replace src_buf for the following operation */ \ + src_buf = (const uint8_t *)rgb_tmp_buf; \ + } \ + do { + +#define __RECOLOUR_END() \ + } while(0); \ + if (NULL != rgb_tmp_buf) { \ + lv_mem_buf_release(rgb_tmp_buf); \ + } \ + } while(0); \ + src_buf = src_buf_org; + +#define __ARM_2D_PREPARE_TRANS_AND_TARGET_REGION(__TRANS_PREPARE, ...) \ + do { \ + __TRANS_PREPARE( \ + NULL, \ + __VA_ARGS__); \ + \ + target_region = (arm_2d_region_t) { \ + .tLocation = { \ + .iX = coords->x1 - draw_ctx->clip_area->x1, \ + .iY = coords->y1 - draw_ctx->clip_area->y1, \ + }, \ + .tSize = { \ + .iWidth = lv_area_get_width(coords), \ + .iHeight = lv_area_get_height(coords), \ + }, \ + }; \ + \ + arm_2d_size_t tTransSize \ + = ARM_2D_CTRL.DefaultOP \ + .tTransform.Source.ptTile->tRegion.tSize; \ + \ + if (target_region.tSize.iWidth < tTransSize.iWidth) { \ + int16_t iDelta = tTransSize.iWidth - target_region.tSize.iWidth;\ + target_region.tLocation.iX -= iDelta / 2; \ + target_region.tSize.iWidth = tTransSize.iWidth; \ + } \ + \ + if (target_region.tSize.iHeight < tTransSize.iHeight) { \ + int16_t iDelta \ + = tTransSize.iHeight - target_region.tSize.iHeight; \ + target_region.tLocation.iY -= iDelta / 2; \ + target_region.tSize.iHeight = tTransSize.iHeight; \ + } \ + } while(0) + /* *INDENT-ON* */ /********************** @@ -313,21 +419,6 @@ * STATIC PROTOTYPES **********************/ -#if __ARM_2D_HAS_HW_ACC__ -LV_ATTRIBUTE_FAST_MEM -static bool lv_draw_arm2d_fill_colour(const arm_2d_tile_t * target_tile, - const arm_2d_region_t * region, - lv_color_t color, - lv_opa_t opa, - const arm_2d_tile_t * mask_tile); - -LV_ATTRIBUTE_FAST_MEM -static bool lv_draw_arm2d_tile_copy(const arm_2d_tile_t * target_tile, - const arm_2d_region_t * region, - arm_2d_tile_t * source_tile, - lv_opa_t opa, - arm_2d_tile_t * mask_tile); -#else static void convert_cb(const lv_area_t * dest_area, const void * src_buf, @@ -339,36 +430,32 @@ static void convert_cb(const lv_area_t * dest_area, lv_color_t * cbuf, lv_opa_t * abuf); -LV_ATTRIBUTE_FAST_MEM -static bool arm_2d_fill_normal(lv_color_t * dest_buf, - const lv_area_t * dest_area, - lv_coord_t dest_stride, - lv_color_t color, - lv_opa_t opa, - const lv_opa_t * mask, - lv_coord_t mask_stride); +static bool /* LV_ATTRIBUTE_FAST_MEM */ arm_2d_fill_normal(lv_color_t * dest_buf, + const lv_area_t * dest_area, + lv_coord_t dest_stride, + lv_color_t color, + lv_opa_t opa, + const lv_opa_t * mask, + lv_coord_t mask_stride); -LV_ATTRIBUTE_FAST_MEM -static bool arm_2d_copy_normal(lv_color_t * dest_buf, - const lv_area_t * dest_area, - lv_coord_t dest_stride, - const lv_color_t * src_buf, - lv_coord_t src_stride, - lv_opa_t opa, - const lv_opa_t * mask, - lv_coord_t mask_stride); -#endif +static bool /* LV_ATTRIBUTE_FAST_MEM */ arm_2d_copy_normal(lv_color_t * dest_buf, + const lv_area_t * dest_area, + lv_coord_t dest_stride, + const lv_color_t * src_buf, + lv_coord_t src_stride, + lv_opa_t opa, + const lv_opa_t * mask, + lv_coord_t mask_stride); -LV_ATTRIBUTE_FAST_MEM -static void lv_draw_arm2d_blend(lv_draw_ctx_t * draw_ctx, const lv_draw_sw_blend_dsc_t * dsc); -LV_ATTRIBUTE_FAST_MEM -static void lv_gpu_arm2d_wait_cb(lv_draw_ctx_t * draw_ctx); -LV_ATTRIBUTE_FAST_MEM -static void lv_draw_arm2d_img_decoded(struct _lv_draw_ctx_t * draw_ctx, - const lv_draw_img_dsc_t * draw_dsc, - const lv_area_t * coords, - const uint8_t * src_buf, - lv_img_cf_t cf); + +static void /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_arm2d_blend(lv_draw_ctx_t * draw_ctx, + const lv_draw_sw_blend_dsc_t * dsc); +static void /* LV_ATTRIBUTE_FAST_MEM */ lv_gpu_arm2d_wait_cb(lv_draw_ctx_t * draw_ctx); +static void /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_arm2d_img_decoded(struct _lv_draw_ctx_t * draw_ctx, + const lv_draw_img_dsc_t * draw_dsc, + const lv_area_t * coords, + const uint8_t * src_buf, + lv_img_cf_t cf); /********************** * STATIC VARIABLES @@ -393,9 +480,7 @@ void lv_draw_arm2d_ctx_init(lv_disp_drv_t * drv, lv_draw_ctx_t * draw_ctx) arm2d_draw_ctx->blend = lv_draw_arm2d_blend; arm2d_draw_ctx->base_draw.wait_for_finish = lv_gpu_arm2d_wait_cb; -#if !__ARM_2D_HAS_HW_ACC__ arm2d_draw_ctx->base_draw.draw_img_decoded = lv_draw_arm2d_img_decoded; -#endif } @@ -407,188 +492,9 @@ void lv_draw_arm2d_ctx_deinit(lv_disp_drv_t * drv, lv_draw_ctx_t * draw_ctx) extern void test_flush(lv_color_t * color_p); -#if __ARM_2D_HAS_HW_ACC__ -LV_ATTRIBUTE_FAST_MEM -static void lv_draw_arm2d_blend(lv_draw_ctx_t * draw_ctx, const lv_draw_sw_blend_dsc_t * dsc) -{ - const lv_opa_t * mask; - if(dsc->mask_buf == NULL) mask = NULL; - if(dsc->mask_buf && dsc->mask_res == LV_DRAW_MASK_RES_TRANSP) return; - else if(dsc->mask_res == LV_DRAW_MASK_RES_FULL_COVER) mask = NULL; - else mask = dsc->mask_buf; - - lv_area_t blend_area; - if(!_lv_area_intersect(&blend_area, dsc->blend_area, draw_ctx->clip_area)) { - return; - } - - bool is_accelerated = false; - - if(dsc->blend_mode == LV_BLEND_MODE_NORMAL - && lv_area_get_size(&blend_area) > 100) { - - __PREPARE_TARGET_TILE__(blend_area); - __PREPARE_SOURCE_TILE__(dsc, blend_area); - __PREPARE_MASK_TILE__(dsc, blend_area, mask, false); - - if(src_buf) { - is_accelerated = lv_draw_arm2d_tile_copy( - &target_tile, - &target_region, - &source_tile, - dsc->opa, - (NULL == mask) ? NULL : &mask_tile); - } - else { - is_accelerated = lv_draw_arm2d_fill_colour( - &target_tile, - &target_region, - dsc->color, - dsc->opa, - (NULL == mask) ? NULL : &mask_tile); - } - } - - if(!is_accelerated) { - lv_draw_sw_blend_basic(draw_ctx, dsc); - } -} - - -LV_ATTRIBUTE_FAST_MEM -static bool lv_draw_arm2d_fill_colour(const arm_2d_tile_t * target_tile, - const arm_2d_region_t * region, - lv_color_t color, - lv_opa_t opa, - const arm_2d_tile_t * mask_tile) -{ - arm_fsm_rt_t result = (arm_fsm_rt_t)ARM_2D_ERR_NONE; - - if(NULL == mask_tile) { - if(opa >= LV_OPA_MAX) { - result = arm_2d_fill_colour(target_tile, region, color.full); - } - else { -#if LV_COLOR_SCREEN_TRANSP - return false; -#else - result = arm_2d_fill_colour_with_alpha( - target_tile, - region, - (arm_2d_color_t) { - color.full - }, - opa); -#endif - } - } - else { - - if(opa >= LV_OPA_MAX) { - result = arm_2d_fill_colour_with_mask( - target_tile, - region, - mask_tile, - (arm_2d_color_t) { - color.full - }); - } - else { -#if LV_COLOR_SCREEN_TRANSP - return false; -#else - result = arm_2d_fill_colour_with_mask_and_opacity( - target_tile, - region, - mask_tile, - (arm_2d_color_t) { - color.full - }, - opa); -#endif - } - } - - if(result < 0) { - /* error detected */ - return false; - } - - return true; - -} - -LV_ATTRIBUTE_FAST_MEM -static bool lv_draw_arm2d_tile_copy(const arm_2d_tile_t * target_tile, - const arm_2d_region_t * region, - arm_2d_tile_t * source_tile, - lv_opa_t opa, - arm_2d_tile_t * mask_tile) -{ - arm_fsm_rt_t result = (arm_fsm_rt_t)ARM_2D_ERR_NONE; - - if(NULL == mask_tile) { - if(opa >= LV_OPA_MAX) { - result = arm_2d_tile_copy(source_tile, - target_tile, - region, - ARM_2D_CP_MODE_COPY); - } -#if LV_COLOR_SCREEN_TRANSP - else { - return false; /* not supported */ - } -#else - else { - result = arm_2d_alpha_blending(source_tile, - target_tile, - region, - opa); - } -#endif - } - else { -#if LV_COLOR_SCREEN_TRANSP - return false; /* not support */ -#else - - if(opa >= LV_OPA_MAX) { - result = arm_2d_tile_copy_with_src_mask(source_tile, - mask_tile, - target_tile, - region, - ARM_2D_CP_MODE_COPY); - } - else { - return false; - } -#endif - } - - if(result < 0) { - /* error detected */ - return false; - } - - return true; -} - -static void lv_gpu_arm2d_wait_cb(lv_draw_ctx_t * draw_ctx) -{ - lv_disp_t * disp = _lv_refr_get_disp_refreshing(); - - arm_2d_op_wait_async(NULL); - if(disp->driver && disp->driver->wait_cb) { - disp->driver->wait_cb(disp->driver); - } - lv_draw_sw_wait_for_finish(draw_ctx); -} -#else - - -LV_ATTRIBUTE_FAST_MEM -static void lv_draw_arm2d_blend(lv_draw_ctx_t * draw_ctx, const lv_draw_sw_blend_dsc_t * dsc) +static void LV_ATTRIBUTE_FAST_MEM lv_draw_arm2d_blend(lv_draw_ctx_t * draw_ctx, + const lv_draw_sw_blend_dsc_t * dsc) { const lv_opa_t * mask; if(dsc->mask_buf == NULL) mask = NULL; @@ -601,18 +507,26 @@ static void lv_draw_arm2d_blend(lv_draw_ctx_t * draw_ctx, const lv_draw_sw_blend lv_area_t blend_area; if(!_lv_area_intersect(&blend_area, dsc->blend_area, draw_ctx->clip_area)) return; - lv_disp_t * disp = _lv_refr_get_disp_refreshing(); + //lv_disp_t * disp = _lv_refr_get_disp_refreshing(); bool is_accelerated = false; do { - if(NULL != disp->driver->set_px_cb) { - break; + + /* target buffer */ + lv_color_t * dest_buf = draw_ctx->buf; + lv_disp_t * disp = _lv_refr_get_disp_refreshing(); + if(disp->driver->screen_transp == 0) { + dest_buf += dest_stride * (blend_area.y1 - draw_ctx->buf_area->y1) + (blend_area.x1 - draw_ctx->buf_area->x1); + } + else { + /*With LV_COLOR_DEPTH 16 it means ARGB8565 (3 bytes format)*/ + uint8_t * dest_buf8 = (uint8_t *) dest_buf; + dest_buf8 += dest_stride * (blend_area.y1 - draw_ctx->buf_area->y1) * LV_IMG_PX_SIZE_ALPHA_BYTE; + dest_buf8 += (blend_area.x1 - draw_ctx->buf_area->x1) * LV_IMG_PX_SIZE_ALPHA_BYTE; + dest_buf = (lv_color_t *)dest_buf8; } - lv_color_t * dest_buf = draw_ctx->buf; - dest_buf += dest_stride * (blend_area.y1 - draw_ctx->buf_area->y1) - + (blend_area.x1 - draw_ctx->buf_area->x1); - + /* source buffer */ const lv_color_t * src_buf = dsc->src_buf; lv_coord_t src_stride; if(src_buf) { @@ -634,7 +548,9 @@ static void lv_draw_arm2d_blend(lv_draw_ctx_t * draw_ctx, const lv_draw_sw_blend lv_area_move(&blend_area, -draw_ctx->buf_area->x1, -draw_ctx->buf_area->y1); - + if(disp->driver->screen_transp) { + break; + } if(dsc->src_buf == NULL) { if(dsc->blend_mode == LV_BLEND_MODE_NORMAL) { is_accelerated = arm_2d_fill_normal(dest_buf, @@ -645,14 +561,8 @@ static void lv_draw_arm2d_blend(lv_draw_ctx_t * draw_ctx, const lv_draw_sw_blend mask, mask_stride); } -#if LV_DRAW_COMPLEX - else { - break; - } -#endif } else { - if(dsc->blend_mode == LV_BLEND_MODE_NORMAL) { is_accelerated = arm_2d_copy_normal(dest_buf, &blend_area, @@ -663,25 +573,19 @@ static void lv_draw_arm2d_blend(lv_draw_ctx_t * draw_ctx, const lv_draw_sw_blend mask, mask_stride); } -#if LV_DRAW_COMPLEX - else { - break; - } -#endif } } while(0); if(!is_accelerated) lv_draw_sw_blend_basic(draw_ctx, dsc); } -LV_ATTRIBUTE_FAST_MEM -static bool arm_2d_fill_normal(lv_color_t * dest_buf, - const lv_area_t * dest_area, - lv_coord_t dest_stride, - lv_color_t color, - lv_opa_t opa, - const lv_opa_t * mask, - lv_coord_t mask_stride) +static bool LV_ATTRIBUTE_FAST_MEM arm_2d_fill_normal(lv_color_t * dest_buf, + const lv_area_t * dest_area, + lv_coord_t dest_stride, + lv_color_t color, + lv_opa_t opa, + const lv_opa_t * mask, + lv_coord_t mask_stride) { arm_2d_size_t target_size = { .iWidth = lv_area_get_width(dest_area), @@ -698,15 +602,11 @@ static bool arm_2d_fill_normal(lv_color_t * dest_buf, } /*Has opacity*/ else { -#if LV_COLOR_SCREEN_TRANSP - return false; -#else __arm_2d_impl_colour_filling_with_opacity((color_int *)dest_buf, dest_stride, &target_size, color.full, opa); -#endif } } /*Masked*/ @@ -722,9 +622,6 @@ static bool arm_2d_fill_normal(lv_color_t * dest_buf, } /*With opacity*/ else { -#if LV_COLOR_SCREEN_TRANSP - return false; -#else __arm_2d_impl_colour_filling_mask_opacity((color_int *)dest_buf, dest_stride, (uint8_t *)mask, @@ -732,23 +629,20 @@ static bool arm_2d_fill_normal(lv_color_t * dest_buf, &target_size, color.full, opa); -#endif } } return true; } - -LV_ATTRIBUTE_FAST_MEM -static bool arm_2d_copy_normal(lv_color_t * dest_buf, - const lv_area_t * dest_area, - lv_coord_t dest_stride, - const lv_color_t * src_buf, - lv_coord_t src_stride, - lv_opa_t opa, - const lv_opa_t * mask, - lv_coord_t mask_stride) +static bool LV_ATTRIBUTE_FAST_MEM arm_2d_copy_normal(lv_color_t * dest_buf, + const lv_area_t * dest_area, + lv_coord_t dest_stride, + const lv_color_t * src_buf, + lv_coord_t src_stride, + lv_opa_t opa, + const lv_opa_t * mask, + lv_coord_t mask_stride) { int32_t w = lv_area_get_width(dest_area); @@ -759,10 +653,6 @@ static bool arm_2d_copy_normal(lv_color_t * dest_buf, .iHeight = lv_area_get_height(dest_area), }; -#if LV_COLOR_SCREEN_TRANSP - lv_disp_t * disp = _lv_refr_get_disp_refreshing(); -#endif - /*Simple fill (maybe with opacity), no masking*/ if(mask == NULL) { if(opa >= LV_OPA_MAX) { @@ -773,25 +663,18 @@ static bool arm_2d_copy_normal(lv_color_t * dest_buf, ©_size); } else { -#if LV_COLOR_SCREEN_TRANSP - return false; -#else __arm_2d_impl_alpha_blending((color_int *)src_buf, src_stride, (color_int *)dest_buf, dest_stride, ©_size, opa); -#endif } } /*Masked*/ else { /*Only the mask matters*/ if(opa > LV_OPA_MAX) { -#if LV_COLOR_SCREEN_TRANSP - return false; -#else __arm_2d_impl_src_msk_copy((color_int *)src_buf, src_stride, (uint8_t *)mask, @@ -800,45 +683,34 @@ static bool arm_2d_copy_normal(lv_color_t * dest_buf, (color_int *)dest_buf, dest_stride, ©_size); -#endif } /*Handle opa and mask values too*/ else { -#if LV_COLOR_SCREEN_TRANSP - return false; -#else - __arm_2d_impl_gray8_alpha_blending((uint8_t *)mask, - mask_stride, - (uint8_t *)mask, - mask_stride, - ©_size, - opa); - - __arm_2d_impl_src_msk_copy((color_int *)src_buf, - src_stride, - (uint8_t *)mask, - mask_stride, - ©_size, - (color_int *)dest_buf, - dest_stride, - ©_size); -#endif + __arm_2d_impl_tile_copy_with_src_mask_and_opacity((color_int *)src_buf, + src_stride, + (uint8_t *)mask, + mask_stride, + ©_size, + (color_int *)dest_buf, + dest_stride, + ©_size, + opa); } } return true; } -LV_ATTRIBUTE_FAST_MEM -static void lv_draw_arm2d_img_decoded(struct _lv_draw_ctx_t * draw_ctx, - const lv_draw_img_dsc_t * draw_dsc, - const lv_area_t * coords, - const uint8_t * src_buf, - lv_img_cf_t cf) +static void LV_ATTRIBUTE_FAST_MEM lv_draw_arm2d_img_decoded(struct _lv_draw_ctx_t * draw_ctx, + const lv_draw_img_dsc_t * draw_dsc, + const lv_area_t * coords, + const uint8_t * src_buf, + lv_img_cf_t cf) { /*Use the clip area as draw area*/ lv_area_t draw_area; lv_area_copy(&draw_area, draw_ctx->clip_area); + const uint8_t * src_buf_org = src_buf; bool mask_any = lv_draw_mask_is_any(&draw_area); bool transform = draw_dsc->angle != 0 || draw_dsc->zoom != LV_IMG_ZOOM_NONE ? true : false; @@ -851,6 +723,12 @@ static void lv_draw_arm2d_img_decoded(struct _lv_draw_ctx_t * draw_ctx, blend_dsc.blend_mode = draw_dsc->blend_mode; blend_dsc.blend_area = &blend_area; + if(lv_img_cf_is_chroma_keyed(cf)) cf = LV_IMG_CF_TRUE_COLOR_CHROMA_KEYED; + else if(cf == LV_IMG_CF_ALPHA_8BIT) {} + else if(cf == LV_IMG_CF_RGB565A8) {} + else if(lv_img_cf_has_alpha(cf)) cf = LV_IMG_CF_TRUE_COLOR_ALPHA; + else cf = LV_IMG_CF_TRUE_COLOR; + /*The simplest case just copy the pixels into the draw_buf*/ if(!mask_any && !transform && cf == LV_IMG_CF_TRUE_COLOR && draw_dsc->recolor_opa == LV_OPA_TRANSP) { blend_dsc.src_buf = (const lv_color_t *)src_buf; @@ -859,6 +737,9 @@ static void lv_draw_arm2d_img_decoded(struct _lv_draw_ctx_t * draw_ctx, lv_draw_sw_blend(draw_ctx, &blend_dsc); } else if(!mask_any && !transform && cf == LV_IMG_CF_ALPHA_8BIT) { + lv_area_t clipped_coords; + if(!_lv_area_intersect(&clipped_coords, coords, draw_ctx->clip_area)) return; + blend_dsc.mask_buf = (lv_opa_t *)src_buf; blend_dsc.mask_area = coords; blend_dsc.src_buf = NULL; @@ -869,7 +750,8 @@ static void lv_draw_arm2d_img_decoded(struct _lv_draw_ctx_t * draw_ctx, lv_draw_sw_blend(draw_ctx, &blend_dsc); } #if LV_COLOR_DEPTH == 16 - else if(!mask_any && !transform && cf == LV_IMG_CF_RGB565A8 && draw_dsc->recolor_opa == LV_OPA_TRANSP) { + else if(!mask_any && !transform && cf == LV_IMG_CF_RGB565A8 && draw_dsc->recolor_opa == LV_OPA_TRANSP && + blend_dsc.opa >= LV_OPA_MAX) { lv_coord_t src_w = lv_area_get_width(coords); lv_coord_t src_h = lv_area_get_height(coords); blend_dsc.src_buf = (const lv_color_t *)src_buf; @@ -922,136 +804,164 @@ static void lv_draw_arm2d_img_decoded(struct _lv_draw_ctx_t * draw_ctx, LV_DRAW_MASK_RES_CHANGED : LV_DRAW_MASK_RES_FULL_COVER; blend_dsc.mask_res = mask_res_def; + if(cf == LV_IMG_CF_ALPHA_8BIT) { + /* original code: + lv_color_fill(rgb_buf, draw_dsc->recolor, buf_size); + */ + arm_2d_size_t copy_size = { + .iWidth = buf_w, + .iHeight = buf_h, + }; + + /* apply re-colour */ + __arm_2d_impl_colour_filling( + (color_int *)rgb_buf, + buf_w, + ©_size, + (color_int)draw_dsc->recolor.full); + } + bool is_accelerated = false; if(!transform) { if(LV_IMG_CF_TRUE_COLOR_CHROMA_KEYED == cf) { /* copy with colour keying */ - /* *INDENT-OFF* */ - __RECOLOUR_WRAPPER( + /* *INDENT-OFF* */ + __RECOLOUR_WRAPPER( - lv_color_t chrome_key = LV_COLOR_CHROMA_KEY; - /* calculate new chrome-key colour */ - if(draw_dsc->recolor_opa > LV_OPA_MIN) { - __ARM_2D_PIXEL_BLENDING_OPA( - (color_int *) & (draw_dsc->recolor.full), - (color_int *) & (chrome_key.full), - draw_dsc->recolor_opa - ); - } + lv_color_t chrome_key = LV_COLOR_CHROMA_KEY; + /* calculate new chrome-key colour */ + if(draw_dsc->recolor_opa > LV_OPA_MIN) { + __ARM_2D_PIXEL_BLENDING_OPA( + (color_int *) & (draw_dsc->recolor.full), + (color_int *) & (chrome_key.full), + draw_dsc->recolor_opa + ); + } - __PREPARE_LL_ACCELERATION__(); + __PREPARE_LL_ACCELERATION__(); - if(blend_dsc.opa >= LV_OPA_MAX) { - __arm_2d_impl_cl_key_copy( + if(blend_dsc.opa >= LV_OPA_MAX) { + __arm_2d_impl_cl_key_copy( + (color_int *)src_buf_tmp, + src_stride, + (color_int *)dest_buf, + dest_stride, + ©_size, + (color_int)chrome_key.full); + } + else { + __arm_2d_impl_alpha_blending_colour_keying( (color_int *)src_buf_tmp, src_stride, (color_int *)dest_buf, dest_stride, ©_size, + blend_dsc.opa, (color_int)chrome_key.full); - } - else { - __arm_2d_impl_alpha_blending_colour_keying( - (color_int *)src_buf_tmp, - src_stride, - (color_int *)dest_buf, - dest_stride, - ©_size, - blend_dsc.opa, - (color_int)chrome_key.full); - } - is_accelerated = true; - ) - /* *INDENT-ON* */ + } + is_accelerated = true; + ) + /* *INDENT-ON* */ } else if((LV_COLOR_DEPTH == 32) && !mask_any - && (cf == LV_IMG_CF_TRUE_COLOR_ALPHA)) { + && (LV_IMG_CF_TRUE_COLOR_ALPHA == cf)) { /* accelerate copy-with-source-masks-and-opacity */ - /* *INDENT-OFF* */ - __RECOLOUR_WRAPPER( - __PREPARE_LL_ACCELERATION__(); + /* *INDENT-OFF* */ + __RECOLOUR_WRAPPER( + __PREPARE_LL_ACCELERATION__(); - uint8_t * mask_temp_buf = NULL; - if(blend_dsc.opa < LV_OPA_MAX) { - mask_temp_buf = lv_mem_buf_get(copy_size.iHeight * copy_size.iWidth); - if(NULL == mask_temp_buf) { - LV_LOG_WARN( - "Failed to allocate memory for alpha mask," - " use normal route instead."); - break; - } - lv_memset_00(mask_temp_buf, copy_size.iHeight * copy_size.iWidth); + uint8_t * mask_temp_buf = NULL; + if(blend_dsc.opa < LV_OPA_MAX) { + __arm_2d_impl_ccca8888_tile_copy_to_cccn888_with_opacity( + (uint32_t *)src_buf_tmp, + src_stride, + (uint32_t *)dest_buf, + dest_stride, + ©_size, + blend_dsc.opa); + } + else { + __arm_2d_impl_ccca8888_to_cccn888( + (uint32_t *)src_buf_tmp, + src_stride, + (uint32_t *)dest_buf, + dest_stride, + ©_size); + } - __arm_2d_impl_gray8_colour_filling_channel_mask_opacity( - mask_temp_buf, - src_stride, - (uint32_t *) - ((uintptr_t)src_buf_tmp + LV_IMG_PX_SIZE_ALPHA_BYTE - 1), - src_stride, - ©_size, - 0xFF, - blend_dsc.opa); + is_accelerated = true; + ) + /* *INDENT-ON* */ + } + else if(!mask_any + && (LV_IMG_CF_RGB565A8 == cf)) { + /* accelerate copy-with-source-masks-and-opacity */ - __arm_2d_impl_src_msk_copy( - (color_int *)src_buf_tmp, - src_stride, - mask_temp_buf, - src_stride, - ©_size, - (color_int *)dest_buf, - dest_stride, - ©_size); + uint8_t * mask_after_rgb = src_buf + sizeof(lv_color_t) * src_w * src_h; + /* *INDENT-OFF* */ + __RECOLOUR_WRAPPER( + __PREPARE_LL_ACCELERATION__(); - lv_mem_buf_release(mask_temp_buf); - } - else { - __arm_2d_impl_src_chn_msk_copy( - (color_int *)src_buf_tmp, - src_stride, - (uint32_t *) - ((uintptr_t)src_buf_tmp + LV_IMG_PX_SIZE_ALPHA_BYTE - 1), - src_stride, - ©_size, - (color_int *)dest_buf, - dest_stride, - ©_size); - } + uint8_t * mask_temp_buf = NULL; + if(blend_dsc.opa < LV_OPA_MAX) { + __arm_2d_impl_rgb565_tile_copy_with_src_mask_and_opacity( + (uint16_t *)src_buf_tmp, + src_stride, + (uint8_t *)mask_after_rgb, + src_stride, + ©_size, + (uint16_t *)dest_buf, + dest_stride, + ©_size, + blend_dsc.opa); + } + else { + __arm_2d_impl_src_msk_copy( + (color_int *)src_buf_tmp, + src_stride, + mask_after_rgb, + src_stride, + ©_size, + (color_int *)dest_buf, + dest_stride, + ©_size); + } - is_accelerated = true; - ) - /* *INDENT-ON* */ + is_accelerated = true; + ) + /* *INDENT-ON* */ } else if(!mask_any && (cf == LV_IMG_CF_TRUE_COLOR)) { /* accelerate copy-with-source-masks-and-opacity */ - /* *INDENT-OFF* */ - __RECOLOUR_WRAPPER( - __PREPARE_LL_ACCELERATION__(); + /* *INDENT-OFF* */ + __RECOLOUR_WRAPPER( + __PREPARE_LL_ACCELERATION__(); - if(blend_dsc.opa >= LV_OPA_MAX) { - __arm_2d_impl_copy( + if(blend_dsc.opa >= LV_OPA_MAX) { + __arm_2d_impl_copy( + (color_int *)src_buf_tmp, + src_stride, + (color_int *)dest_buf, + dest_stride, + ©_size); + } + else { + __arm_2d_impl_alpha_blending( (color_int *)src_buf_tmp, src_stride, (color_int *)dest_buf, dest_stride, - ©_size); - } - else { - __arm_2d_impl_alpha_blending( - (color_int *)src_buf_tmp, - src_stride, - (color_int *)dest_buf, - dest_stride, - ©_size, - blend_dsc.opa); - } - is_accelerated = true; - ) - /* *INDENT-ON* */ + ©_size, + blend_dsc.opa); + } + is_accelerated = true; + ) + /* *INDENT-ON* */ } } else if(!mask_any @@ -1063,6 +973,7 @@ static void lv_draw_arm2d_img_decoded(struct _lv_draw_ctx_t * draw_ctx, && (draw_dsc->recolor_opa == LV_OPA_TRANSP) && (((LV_IMG_CF_TRUE_COLOR_CHROMA_KEYED == cf) || (LV_IMG_CF_TRUE_COLOR == cf)) + || (LV_IMG_CF_RGB565A8 == cf) #if defined(__ARM_2D_CFG_SUPPORT_COLOUR_CHANNEL_ACCESS__) && __ARM_2D_CFG_SUPPORT_COLOUR_CHANNEL_ACCESS__ || ((LV_IMG_CF_TRUE_COLOR_ALPHA == cf) && (LV_COLOR_DEPTH == 32)) @@ -1070,68 +981,126 @@ static void lv_draw_arm2d_img_decoded(struct _lv_draw_ctx_t * draw_ctx, ) ) { - /* *INDENT-OFF* */ - __RECOLOUR_WRAPPER( - /* accelerate transform without re-color */ + uint8_t * mask_after_rgb = src_buf + sizeof(lv_color_t) * src_w * src_h; + /* *INDENT-OFF* */ + __RECOLOUR_WRAPPER( + /* accelerate transform without re-color */ - static arm_2d_tile_t target_tile_origin; - static arm_2d_tile_t target_tile; - arm_2d_region_t clip_region; - static arm_2d_region_t target_region; + static arm_2d_tile_t target_tile_origin; + static arm_2d_tile_t target_tile; + arm_2d_region_t clip_region; + static arm_2d_region_t target_region; - lv_color_t * dest_buf = draw_ctx->buf; + lv_color_t * dest_buf = draw_ctx->buf; - target_tile_origin = (arm_2d_tile_t) { - .tRegion = { - .tSize = { - .iWidth = lv_area_get_width(draw_ctx->buf_area), - .iHeight = lv_area_get_height(draw_ctx->buf_area), - }, - }, - .tInfo.bIsRoot = true, - .phwBuffer = (uint16_t *)draw_ctx->buf, - }; - - clip_region = (arm_2d_region_t) { - .tLocation = { - .iX = draw_ctx->clip_area->x1 - draw_ctx->buf_area->x1, - .iY = draw_ctx->clip_area->y1 - draw_ctx->buf_area->y1, - }, + target_tile_origin = (arm_2d_tile_t) { + .tRegion = { .tSize = { - .iWidth = lv_area_get_width(draw_ctx->clip_area), - .iHeight = lv_area_get_height(draw_ctx->clip_area), + .iWidth = lv_area_get_width(draw_ctx->buf_area), + .iHeight = lv_area_get_height(draw_ctx->buf_area), }, - }; + }, + .tInfo.bIsRoot = true, + .phwBuffer = (uint16_t *)draw_ctx->buf, + }; - arm_2d_tile_generate_child(&target_tile_origin, - &clip_region, - &target_tile, - false); + clip_region = (arm_2d_region_t) { + .tLocation = { + .iX = draw_ctx->clip_area->x1 - draw_ctx->buf_area->x1, + .iY = draw_ctx->clip_area->y1 - draw_ctx->buf_area->y1, + }, + .tSize = { + .iWidth = lv_area_get_width(draw_ctx->clip_area), + .iHeight = lv_area_get_height(draw_ctx->clip_area), + }, + }; - target_region = (arm_2d_region_t) { - .tLocation = { - .iX = coords->x1 - draw_ctx->clip_area->x1, - .iY = coords->y1 - draw_ctx->clip_area->y1, - }, + arm_2d_tile_generate_child(&target_tile_origin, + &clip_region, + &target_tile, + false); + + static arm_2d_tile_t source_tile; + + source_tile = (arm_2d_tile_t) { + .tRegion = { .tSize = { - .iWidth = lv_area_get_width(coords), - .iHeight = lv_area_get_height(coords), + .iWidth = src_w, + .iHeight = src_h, }, - }; + }, + .tInfo.bIsRoot = true, + .pchBuffer = (uint8_t *)src_buf, + }; - static arm_2d_tile_t source_tile; + static arm_2d_location_t source_center, target_center; + source_center.iX = draw_dsc->pivot.x; + source_center.iY = draw_dsc->pivot.y; - source_tile = (arm_2d_tile_t) { - .tRegion = { - .tSize = { - .iWidth = src_w, - .iHeight = src_h, - }, - }, - .tInfo.bIsRoot = true, - .pchBuffer = (uint8_t *)src_buf, - }; + if(LV_IMG_CF_TRUE_COLOR_CHROMA_KEYED == cf) { + __ARM_2D_PREPARE_TRANS_AND_TARGET_REGION( + arm_2d_tile_transform_with_opacity_prepare, + &source_tile, + source_center, + ARM_2D_ANGLE((draw_dsc->angle / 10.0f)), + draw_dsc->zoom / 256.0f, + (color_int)LV_COLOR_CHROMA_KEY.full, + blend_dsc.opa); + + arm_2d_tile_transform( + &target_tile, + &target_region, + NULL + ); + is_accelerated = true; + } + else if (LV_IMG_CF_TRUE_COLOR == cf) { + __ARM_2D_PREPARE_TRANS_AND_TARGET_REGION( + arm_2d_tile_transform_only_with_opacity_prepare, + &source_tile, + source_center, + ARM_2D_ANGLE((draw_dsc->angle / 10.0f)), + draw_dsc->zoom / 256.0f, + blend_dsc.opa); + + arm_2d_tile_transform( + &target_tile, + &target_region, + NULL + ); + is_accelerated = true; + } + else if (LV_IMG_CF_RGB565A8 == cf) { + static arm_2d_tile_t mask_tile; + mask_tile = source_tile; + + mask_tile.tInfo.bHasEnforcedColour = true; + mask_tile.tInfo.tColourInfo.chScheme = ARM_2D_COLOUR_GRAY8; + mask_tile.pchBuffer = mask_after_rgb; + + __ARM_2D_PREPARE_TRANS_AND_TARGET_REGION( + arm_2d_tile_transform_with_src_mask_and_opacity_prepare, + &source_tile, + &mask_tile, + source_center, + ARM_2D_ANGLE((draw_dsc->angle / 10.0f)), + draw_dsc->zoom / 256.0f, + blend_dsc.opa + ); + + arm_2d_tile_transform( + &target_tile, + &target_region, + NULL + ); + + is_accelerated = true; + } +#if defined(__ARM_2D_CFG_SUPPORT_COLOUR_CHANNEL_ACCESS__) \ + && __ARM_2D_CFG_SUPPORT_COLOUR_CHANNEL_ACCESS__ + else if((LV_IMG_CF_TRUE_COLOR_ALPHA == cf) && + (LV_COLOR_DEPTH == 32)) { static arm_2d_tile_t mask_tile; mask_tile = source_tile; @@ -1139,44 +1108,27 @@ static void lv_draw_arm2d_img_decoded(struct _lv_draw_ctx_t * draw_ctx, mask_tile.tInfo.tColourInfo.chScheme = ARM_2D_CHANNEL_8in32; mask_tile.pchBuffer += 3; - static arm_2d_location_t source_center, target_center; - source_center.iX = draw_dsc->pivot.x; - source_center.iY = draw_dsc->pivot.y; + __ARM_2D_PREPARE_TRANS_AND_TARGET_REGION( + arm_2d_tile_transform_with_src_mask_and_opacity_prepare, + &source_tile, + &mask_tile, + source_center, + ARM_2D_ANGLE((draw_dsc->angle / 10.0f)), + draw_dsc->zoom / 256.0f, + blend_dsc.opa + ); + arm_2d_tile_transform( + &target_tile, + &target_region, + NULL + ); - if((LV_IMG_CF_TRUE_COLOR_CHROMA_KEYED == cf) || - (LV_IMG_CF_TRUE_COLOR == cf)) { - arm_2d_tile_transform_with_opacity( - &source_tile, - &target_tile, - &target_region, - source_center, - ARM_2D_ANGLE((draw_dsc->angle / 10.0f)), - draw_dsc->zoom / 256.0f, - (color_int)LV_COLOR_CHROMA_KEY.full, - blend_dsc.opa); - - is_accelerated = true; - } - #if defined(__ARM_2D_CFG_SUPPORT_COLOUR_CHANNEL_ACCESS__) \ - && __ARM_2D_CFG_SUPPORT_COLOUR_CHANNEL_ACCESS__ - else if((LV_IMG_CF_TRUE_COLOR_ALPHA == cf) && - (LV_COLOR_DEPTH == 32)) { - arm_2d_tile_transform_with_src_mask_and_opacity( - &source_tile, - &mask_tile, - &target_tile, - &target_region, - source_center, - ARM_2D_ANGLE((draw_dsc->angle / 10.0f)), - draw_dsc->zoom / 256.0f, - blend_dsc.opa); - - is_accelerated = true; - } - #endif - ) - /* *INDENT-ON* */ + is_accelerated = true; + } +#endif + ) + /* *INDENT-ON* */ } /* *INDENT-OFF* */ @@ -1208,7 +1160,7 @@ static void lv_draw_arm2d_img_decoded(struct _lv_draw_ctx_t * draw_ctx, (color_int)draw_dsc->recolor.full, draw_dsc->recolor_opa); } -#if LV_DRAW_COMPLEX +#if LV_USE_DRAW_MASKS /*Apply the masks if any*/ if(mask_any) { lv_coord_t y; @@ -1255,9 +1207,6 @@ static void lv_gpu_arm2d_wait_cb(lv_draw_ctx_t * draw_ctx) } -#endif - - /********************** * STATIC FUNCTIONS **********************/ @@ -1275,7 +1224,7 @@ static void convert_cb(const lv_area_t * dest_area, const void * src_buf, lv_coo if(cf == LV_IMG_CF_TRUE_COLOR || cf == LV_IMG_CF_TRUE_COLOR_CHROMA_KEYED) { uint32_t px_cnt = lv_area_get_size(dest_area); - lv_memset_ff(abuf, px_cnt); + lv_memset(abuf, 0xff, px_cnt); src_tmp8 += (src_stride * dest_area->y1 * sizeof(lv_color_t)) + dest_area->x1 * sizeof(lv_color_t); uint32_t dest_w = lv_area_get_width(dest_area); diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/arm2d/lv_gpu_arm2d.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/arm2d/lv_gpu_arm2d.h similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/arm2d/lv_gpu_arm2d.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/arm2d/lv_gpu_arm2d.h diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/lv_draw.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/lv_draw.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/lv_draw.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/lv_draw.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/lv_draw.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/lv_draw.h similarity index 99% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/lv_draw.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/lv_draw.h index 80b62e9..a3f0687 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/lv_draw.h +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/lv_draw.h @@ -72,6 +72,7 @@ typedef struct _lv_draw_ctx_t { */ const lv_area_t * clip_area; + void (*init_buf)(struct _lv_draw_ctx_t * draw_ctx); void (*draw_rect)(struct _lv_draw_ctx_t * draw_ctx, const lv_draw_rect_dsc_t * dsc, const lv_area_t * coords); @@ -87,15 +88,12 @@ typedef struct _lv_draw_ctx_t { void (*draw_letter)(struct _lv_draw_ctx_t * draw_ctx, const lv_draw_label_dsc_t * dsc, const lv_point_t * pos_p, uint32_t letter); - void (*draw_line)(struct _lv_draw_ctx_t * draw_ctx, const lv_draw_line_dsc_t * dsc, const lv_point_t * point1, const lv_point_t * point2); - void (*draw_polygon)(struct _lv_draw_ctx_t * draw_ctx, const lv_draw_rect_dsc_t * draw_dsc, const lv_point_t * points, uint16_t point_cnt); - /** * Get an area of a transformed image (zoomed and/or rotated) * @param draw_ctx pointer to a draw context @@ -196,7 +194,6 @@ typedef struct _lv_draw_ctx_t { void lv_draw_init(void); - void lv_draw_wait_for_finish(lv_draw_ctx_t * draw_ctx); /********************** diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/lv_draw.mk b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/lv_draw.mk similarity index 92% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/lv_draw.mk rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/lv_draw.mk index f48f48f..c7d5463 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/lv_draw.mk +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/lv_draw.mk @@ -23,3 +23,4 @@ include $(LVGL_DIR)/$(LVGL_DIR_NAME)/src/draw/sdl/lv_draw_sdl.mk include $(LVGL_DIR)/$(LVGL_DIR_NAME)/src/draw/stm32_dma2d/lv_draw_stm32_dma2d.mk include $(LVGL_DIR)/$(LVGL_DIR_NAME)/src/draw/sw/lv_draw_sw.mk include $(LVGL_DIR)/$(LVGL_DIR_NAME)/src/draw/swm341_dma2d/lv_draw_swm341_dma2d.mk +include $(LVGL_DIR)/$(LVGL_DIR_NAME)/src/draw/nema_gfx/lv_draw_nema_gfx.mk \ No newline at end of file diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/lv_draw_arc.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/lv_draw_arc.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/lv_draw_arc.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/lv_draw_arc.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/lv_draw_arc.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/lv_draw_arc.h similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/lv_draw_arc.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/lv_draw_arc.h diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/lv_draw_img.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/lv_draw_img.c similarity index 93% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/lv_draw_img.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/lv_draw_img.c index 41dc0f0..931c1f8 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/lv_draw_img.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/lv_draw_img.c @@ -25,8 +25,9 @@ /********************** * STATIC PROTOTYPES **********************/ -LV_ATTRIBUTE_FAST_MEM static lv_res_t decode_and_draw(lv_draw_ctx_t * draw_ctx, const lv_draw_img_dsc_t * draw_dsc, - const lv_area_t * coords, const void * src); +static lv_res_t /* LV_ATTRIBUTE_FAST_MEM */ decode_and_draw(lv_draw_ctx_t * draw_ctx, + const lv_draw_img_dsc_t * draw_dsc, + const lv_area_t * coords, const void * src); static void show_error(lv_draw_ctx_t * draw_ctx, const lv_area_t * coords, const char * msg); static void draw_cleanup(_lv_img_cache_entry_t * cache); @@ -69,18 +70,19 @@ void lv_draw_img(lv_draw_ctx_t * draw_ctx, const lv_draw_img_dsc_t * dsc, const if(dsc->opa <= LV_OPA_MIN) return; - lv_res_t res; + lv_res_t res = LV_RES_INV; + if(draw_ctx->draw_img) { res = draw_ctx->draw_img(draw_ctx, dsc, coords, src); } - else { + + if(res != LV_RES_OK) { res = decode_and_draw(draw_ctx, dsc, coords, src); } - if(res == LV_RES_INV) { + if(res != LV_RES_OK) { LV_LOG_WARN("Image draw error"); show_error(draw_ctx, coords, "No\ndata"); - return; } } @@ -197,11 +199,19 @@ lv_img_src_t lv_img_src_get_type(const void * src) if(src == NULL) return img_src_type; const uint8_t * u8_p = src; - /*The first byte shows the type of the image source*/ + /*The first or fourth byte depending on platform endianess shows the type of the image source*/ +#if LV_BIG_ENDIAN_SYSTEM + if(u8_p[3] >= 0x20 && u8_p[3] <= 0x7F) { +#else if(u8_p[0] >= 0x20 && u8_p[0] <= 0x7F) { +#endif img_src_type = LV_IMG_SRC_FILE; /*If it's an ASCII character then it's file name*/ } +#if LV_BIG_ENDIAN_SYSTEM + else if(u8_p[3] >= 0x80) { +#else else if(u8_p[0] >= 0x80) { +#endif img_src_type = LV_IMG_SRC_SYMBOL; /*Symbols begins after 0x7F*/ } else { @@ -227,7 +237,8 @@ void lv_draw_img_decoded(lv_draw_ctx_t * draw_ctx, const lv_draw_img_dsc_t * dsc * STATIC FUNCTIONS **********************/ -LV_ATTRIBUTE_FAST_MEM static lv_res_t decode_and_draw(lv_draw_ctx_t * draw_ctx, const lv_draw_img_dsc_t * draw_dsc, +static lv_res_t LV_ATTRIBUTE_FAST_MEM decode_and_draw(lv_draw_ctx_t * draw_ctx, + const lv_draw_img_dsc_t * draw_dsc, const lv_area_t * coords, const void * src) { if(draw_dsc->opa <= LV_OPA_MIN) return LV_RES_OK; @@ -340,7 +351,6 @@ LV_ATTRIBUTE_FAST_MEM static lv_res_t decode_and_draw(lv_draw_ctx_t * draw_ctx, return LV_RES_OK; } - static void show_error(lv_draw_ctx_t * draw_ctx, const lv_area_t * coords, const char * msg) { lv_draw_rect_dsc_t rect_dsc; diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/lv_draw_img.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/lv_draw_img.h similarity index 99% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/lv_draw_img.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/lv_draw_img.h index a88a33c..da696ac 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/lv_draw_img.h +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/lv_draw_img.h @@ -62,7 +62,6 @@ void lv_draw_img_dsc_init(lv_draw_img_dsc_t * dsc); void lv_draw_img(struct _lv_draw_ctx_t * draw_ctx, const lv_draw_img_dsc_t * dsc, const lv_area_t * coords, const void * src); - void lv_draw_img_decoded(struct _lv_draw_ctx_t * draw_ctx, const lv_draw_img_dsc_t * dsc, const lv_area_t * coords, const uint8_t * map_p, lv_img_cf_t color_format); diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/lv_draw_label.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/lv_draw_label.c similarity index 98% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/lv_draw_label.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/lv_draw_label.c index 7f80df4..db3c09f 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/lv_draw_label.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/lv_draw_label.c @@ -52,7 +52,7 @@ static uint8_t hex_char_to_num(char hex); * GLOBAL FUNCTIONS **********************/ -void lv_draw_label_dsc_init(lv_draw_label_dsc_t * dsc) +void LV_ATTRIBUTE_FAST_MEM lv_draw_label_dsc_init(lv_draw_label_dsc_t * dsc) { lv_memset_00(dsc, sizeof(lv_draw_label_dsc_t)); dsc->opa = LV_OPA_COVER; @@ -74,7 +74,7 @@ void lv_draw_label_dsc_init(lv_draw_label_dsc_t * dsc) * @param hint pointer to a `lv_draw_label_hint_t` variable. * It is managed by the draw to speed up the drawing of very long texts (thousands of lines). */ -LV_ATTRIBUTE_FAST_MEM void lv_draw_label(lv_draw_ctx_t * draw_ctx, const lv_draw_label_dsc_t * dsc, +void LV_ATTRIBUTE_FAST_MEM lv_draw_label(lv_draw_ctx_t * draw_ctx, const lv_draw_label_dsc_t * dsc, const lv_area_t * coords, const char * txt, lv_draw_label_hint_t * hint) { if(dsc->opa <= LV_OPA_MIN) return; @@ -367,7 +367,6 @@ void lv_draw_letter(lv_draw_ctx_t * draw_ctx, const lv_draw_label_dsc_t * dsc, draw_ctx->draw_letter(draw_ctx, dsc, pos_p, letter); } - /********************** * STATIC FUNCTIONS **********************/ @@ -414,4 +413,3 @@ static uint8_t hex_char_to_num(char hex) return result; } - diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/lv_draw_label.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/lv_draw_label.h similarity index 88% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/lv_draw_label.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/lv_draw_label.h index de72edd..b28436a 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/lv_draw_label.h +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/lv_draw_label.h @@ -68,7 +68,7 @@ struct _lv_draw_ctx_t; * GLOBAL PROTOTYPES **********************/ -LV_ATTRIBUTE_FAST_MEM void lv_draw_label_dsc_init(lv_draw_label_dsc_t * dsc); +void /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_label_dsc_init(lv_draw_label_dsc_t * dsc); /** * Write a text @@ -79,8 +79,8 @@ LV_ATTRIBUTE_FAST_MEM void lv_draw_label_dsc_init(lv_draw_label_dsc_t * dsc); * @param hint pointer to a `lv_draw_label_hint_t` variable. * It is managed by the draw to speed up the drawing of very long texts (thousands of lines). */ -LV_ATTRIBUTE_FAST_MEM void lv_draw_label(struct _lv_draw_ctx_t * draw_ctx, const lv_draw_label_dsc_t * dsc, - const lv_area_t * coords, const char * txt, lv_draw_label_hint_t * hint); +void /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_label(struct _lv_draw_ctx_t * draw_ctx, const lv_draw_label_dsc_t * dsc, + const lv_area_t * coords, const char * txt, lv_draw_label_hint_t * hint); void lv_draw_letter(struct _lv_draw_ctx_t * draw_ctx, const lv_draw_label_dsc_t * dsc, const lv_point_t * pos_p, uint32_t letter); diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/lv_draw_layer.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/lv_draw_layer.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/lv_draw_layer.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/lv_draw_layer.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/lv_draw_layer.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/lv_draw_layer.h similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/lv_draw_layer.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/lv_draw_layer.h diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/lv_draw_line.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/lv_draw_line.c similarity index 89% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/lv_draw_line.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/lv_draw_line.c index b4844db..d0c4327 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/lv_draw_line.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/lv_draw_line.c @@ -34,7 +34,7 @@ * GLOBAL FUNCTIONS **********************/ -LV_ATTRIBUTE_FAST_MEM void lv_draw_line_dsc_init(lv_draw_line_dsc_t * dsc) +void LV_ATTRIBUTE_FAST_MEM lv_draw_line_dsc_init(lv_draw_line_dsc_t * dsc) { lv_memset_00(dsc, sizeof(lv_draw_line_dsc_t)); dsc->width = 1; @@ -42,7 +42,7 @@ LV_ATTRIBUTE_FAST_MEM void lv_draw_line_dsc_init(lv_draw_line_dsc_t * dsc) dsc->color = lv_color_black(); } -LV_ATTRIBUTE_FAST_MEM void lv_draw_line(struct _lv_draw_ctx_t * draw_ctx, const lv_draw_line_dsc_t * dsc, +void LV_ATTRIBUTE_FAST_MEM lv_draw_line(struct _lv_draw_ctx_t * draw_ctx, const lv_draw_line_dsc_t * dsc, const lv_point_t * point1, const lv_point_t * point2) { if(dsc->width == 0) return; diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/lv_draw_line.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/lv_draw_line.h similarity index 81% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/lv_draw_line.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/lv_draw_line.h index d82ea51..edd96ba 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/lv_draw_line.h +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/lv_draw_line.h @@ -43,7 +43,7 @@ struct _lv_draw_ctx_t; * GLOBAL PROTOTYPES **********************/ -LV_ATTRIBUTE_FAST_MEM void lv_draw_line_dsc_init(lv_draw_line_dsc_t * dsc); +void /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_line_dsc_init(lv_draw_line_dsc_t * dsc); /** * Draw a line @@ -52,9 +52,8 @@ LV_ATTRIBUTE_FAST_MEM void lv_draw_line_dsc_init(lv_draw_line_dsc_t * dsc); * @param clip the line will be drawn only in this area * @param dsc pointer to an initialized `lv_draw_line_dsc_t` variable */ -void lv_draw_line(struct _lv_draw_ctx_t * draw_ctx, const lv_draw_line_dsc_t * dsc, const lv_point_t * point1, - const lv_point_t * point2); - +void /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_line(struct _lv_draw_ctx_t * draw_ctx, const lv_draw_line_dsc_t * dsc, + const lv_point_t * point1, const lv_point_t * point2); /********************** * MACROS diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/lv_draw_mask.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/lv_draw_mask.c similarity index 95% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/lv_draw_mask.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/lv_draw_mask.c index 2170da9..675fede 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/lv_draw_mask.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/lv_draw_mask.c @@ -26,31 +26,31 @@ /********************** * STATIC PROTOTYPES **********************/ -LV_ATTRIBUTE_FAST_MEM static lv_draw_mask_res_t lv_draw_mask_line(lv_opa_t * mask_buf, lv_coord_t abs_x, - lv_coord_t abs_y, lv_coord_t len, - lv_draw_mask_line_param_t * param); -LV_ATTRIBUTE_FAST_MEM static lv_draw_mask_res_t lv_draw_mask_radius(lv_opa_t * mask_buf, lv_coord_t abs_x, - lv_coord_t abs_y, lv_coord_t len, - lv_draw_mask_radius_param_t * param); -LV_ATTRIBUTE_FAST_MEM static lv_draw_mask_res_t lv_draw_mask_angle(lv_opa_t * mask_buf, lv_coord_t abs_x, - lv_coord_t abs_y, lv_coord_t len, - lv_draw_mask_angle_param_t * param); -LV_ATTRIBUTE_FAST_MEM static lv_draw_mask_res_t lv_draw_mask_fade(lv_opa_t * mask_buf, lv_coord_t abs_x, - lv_coord_t abs_y, lv_coord_t len, - lv_draw_mask_fade_param_t * param); -LV_ATTRIBUTE_FAST_MEM static lv_draw_mask_res_t lv_draw_mask_map(lv_opa_t * mask_buf, lv_coord_t abs_x, - lv_coord_t abs_y, lv_coord_t len, - lv_draw_mask_map_param_t * param); -LV_ATTRIBUTE_FAST_MEM static lv_draw_mask_res_t lv_draw_mask_polygon(lv_opa_t * mask_buf, lv_coord_t abs_x, - lv_coord_t abs_y, lv_coord_t len, - lv_draw_mask_polygon_param_t * param); +static lv_draw_mask_res_t /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_mask_line(lv_opa_t * mask_buf, lv_coord_t abs_x, + lv_coord_t abs_y, lv_coord_t len, + lv_draw_mask_line_param_t * param); +static lv_draw_mask_res_t /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_mask_radius(lv_opa_t * mask_buf, lv_coord_t abs_x, + lv_coord_t abs_y, lv_coord_t len, + lv_draw_mask_radius_param_t * param); +static lv_draw_mask_res_t /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_mask_angle(lv_opa_t * mask_buf, lv_coord_t abs_x, + lv_coord_t abs_y, lv_coord_t len, + lv_draw_mask_angle_param_t * param); +static lv_draw_mask_res_t /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_mask_fade(lv_opa_t * mask_buf, lv_coord_t abs_x, + lv_coord_t abs_y, lv_coord_t len, + lv_draw_mask_fade_param_t * param); +static lv_draw_mask_res_t /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_mask_map(lv_opa_t * mask_buf, lv_coord_t abs_x, + lv_coord_t abs_y, lv_coord_t len, + lv_draw_mask_map_param_t * param); +static lv_draw_mask_res_t /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_mask_polygon(lv_opa_t * mask_buf, lv_coord_t abs_x, + lv_coord_t abs_y, lv_coord_t len, + lv_draw_mask_polygon_param_t * param); -LV_ATTRIBUTE_FAST_MEM static lv_draw_mask_res_t line_mask_flat(lv_opa_t * mask_buf, lv_coord_t abs_x, lv_coord_t abs_y, - lv_coord_t len, - lv_draw_mask_line_param_t * p); -LV_ATTRIBUTE_FAST_MEM static lv_draw_mask_res_t line_mask_steep(lv_opa_t * mask_buf, lv_coord_t abs_x, lv_coord_t abs_y, - lv_coord_t len, - lv_draw_mask_line_param_t * p); +static lv_draw_mask_res_t /* LV_ATTRIBUTE_FAST_MEM */ line_mask_flat(lv_opa_t * mask_buf, lv_coord_t abs_x, + lv_coord_t abs_y, lv_coord_t len, + lv_draw_mask_line_param_t * p); +static lv_draw_mask_res_t /* LV_ATTRIBUTE_FAST_MEM */ line_mask_steep(lv_opa_t * mask_buf, lv_coord_t abs_x, + lv_coord_t abs_y, lv_coord_t len, + lv_draw_mask_line_param_t * p); static void circ_init(lv_point_t * c, lv_coord_t * tmp, lv_coord_t radius); static bool circ_cont(lv_point_t * c); @@ -58,7 +58,7 @@ static void circ_next(lv_point_t * c, lv_coord_t * tmp); static void circ_calc_aa4(_lv_draw_mask_radius_circle_dsc_t * c, lv_coord_t radius); static lv_opa_t * get_next_line(_lv_draw_mask_radius_circle_dsc_t * c, lv_coord_t y, lv_coord_t * len, lv_coord_t * x_start); -LV_ATTRIBUTE_FAST_MEM static inline lv_opa_t mask_mix(lv_opa_t mask_act, lv_opa_t mask_new); +static inline lv_opa_t /* LV_ATTRIBUTE_FAST_MEM */ mask_mix(lv_opa_t mask_act, lv_opa_t mask_new); /********************** * STATIC VARIABLES @@ -108,8 +108,8 @@ int16_t lv_draw_mask_add(void * param, void * custom_id) * - `LV_DRAW_MASK_RES_FULL_COVER`: the whole line is fully visible. `mask_buf` is unchanged * - `LV_DRAW_MASK_RES_CHANGED`: `mask_buf` has changed, it shows the desired opacity of each pixel in the given line */ -LV_ATTRIBUTE_FAST_MEM lv_draw_mask_res_t lv_draw_mask_apply(lv_opa_t * mask_buf, lv_coord_t abs_x, lv_coord_t abs_y, - lv_coord_t len) +lv_draw_mask_res_t LV_ATTRIBUTE_FAST_MEM lv_draw_mask_apply(lv_opa_t * mask_buf, lv_coord_t abs_x, + lv_coord_t abs_y, lv_coord_t len) { bool changed = false; _lv_draw_mask_common_dsc_t * dsc; @@ -142,8 +142,9 @@ LV_ATTRIBUTE_FAST_MEM lv_draw_mask_res_t lv_draw_mask_apply(lv_opa_t * mask_buf, * - `LV_DRAW_MASK_RES_FULL_COVER`: the whole line is fully visible. `mask_buf` is unchanged * - `LV_DRAW_MASK_RES_CHANGED`: `mask_buf` has changed, it shows the desired opacity of each pixel in the given line */ -LV_ATTRIBUTE_FAST_MEM lv_draw_mask_res_t lv_draw_mask_apply_ids(lv_opa_t * mask_buf, lv_coord_t abs_x, lv_coord_t abs_y, - lv_coord_t len, const int16_t * ids, int16_t ids_count) +lv_draw_mask_res_t LV_ATTRIBUTE_FAST_MEM lv_draw_mask_apply_ids(lv_opa_t * mask_buf, lv_coord_t abs_x, + lv_coord_t abs_y, lv_coord_t len, + const int16_t * ids, int16_t ids_count) { bool changed = false; _lv_draw_mask_common_dsc_t * dsc; @@ -243,7 +244,7 @@ void _lv_draw_mask_cleanup(void) * Count the currently added masks * @return number of active masks */ -LV_ATTRIBUTE_FAST_MEM uint8_t lv_draw_mask_get_cnt(void) +uint8_t LV_ATTRIBUTE_FAST_MEM lv_draw_mask_get_cnt(void) { uint8_t cnt = 0; uint8_t i; @@ -593,7 +594,7 @@ void lv_draw_mask_polygon_init(lv_draw_mask_polygon_param_t * param, const lv_po * STATIC FUNCTIONS **********************/ -LV_ATTRIBUTE_FAST_MEM static lv_draw_mask_res_t lv_draw_mask_line(lv_opa_t * mask_buf, lv_coord_t abs_x, +static lv_draw_mask_res_t LV_ATTRIBUTE_FAST_MEM lv_draw_mask_line(lv_opa_t * mask_buf, lv_coord_t abs_x, lv_coord_t abs_y, lv_coord_t len, lv_draw_mask_line_param_t * p) { @@ -653,7 +654,7 @@ LV_ATTRIBUTE_FAST_MEM static lv_draw_mask_res_t lv_draw_mask_line(lv_opa_t * mas return res; } -LV_ATTRIBUTE_FAST_MEM static lv_draw_mask_res_t line_mask_flat(lv_opa_t * mask_buf, lv_coord_t abs_x, lv_coord_t abs_y, +static lv_draw_mask_res_t LV_ATTRIBUTE_FAST_MEM line_mask_flat(lv_opa_t * mask_buf, lv_coord_t abs_x, lv_coord_t abs_y, lv_coord_t len, lv_draw_mask_line_param_t * p) { @@ -769,7 +770,7 @@ LV_ATTRIBUTE_FAST_MEM static lv_draw_mask_res_t line_mask_flat(lv_opa_t * mask_b return LV_DRAW_MASK_RES_CHANGED; } -LV_ATTRIBUTE_FAST_MEM static lv_draw_mask_res_t line_mask_steep(lv_opa_t * mask_buf, lv_coord_t abs_x, lv_coord_t abs_y, +static lv_draw_mask_res_t LV_ATTRIBUTE_FAST_MEM line_mask_steep(lv_opa_t * mask_buf, lv_coord_t abs_x, lv_coord_t abs_y, lv_coord_t len, lv_draw_mask_line_param_t * p) { @@ -911,7 +912,7 @@ LV_ATTRIBUTE_FAST_MEM static lv_draw_mask_res_t line_mask_steep(lv_opa_t * mask_ return LV_DRAW_MASK_RES_CHANGED; } -LV_ATTRIBUTE_FAST_MEM static lv_draw_mask_res_t lv_draw_mask_angle(lv_opa_t * mask_buf, lv_coord_t abs_x, +static lv_draw_mask_res_t LV_ATTRIBUTE_FAST_MEM lv_draw_mask_angle(lv_opa_t * mask_buf, lv_coord_t abs_x, lv_coord_t abs_y, lv_coord_t len, lv_draw_mask_angle_param_t * p) { @@ -1048,9 +1049,7 @@ LV_ATTRIBUTE_FAST_MEM static lv_draw_mask_res_t lv_draw_mask_angle(lv_opa_t * ma } } - - -LV_ATTRIBUTE_FAST_MEM static lv_draw_mask_res_t lv_draw_mask_radius(lv_opa_t * mask_buf, lv_coord_t abs_x, +static lv_draw_mask_res_t LV_ATTRIBUTE_FAST_MEM lv_draw_mask_radius(lv_opa_t * mask_buf, lv_coord_t abs_x, lv_coord_t abs_y, lv_coord_t len, lv_draw_mask_radius_param_t * p) { @@ -1103,7 +1102,6 @@ LV_ATTRIBUTE_FAST_MEM static lv_draw_mask_res_t lv_draw_mask_radius(lv_opa_t * m } // printf("exec: x:%d.. %d, y:%d: r:%d, %s\n", abs_x, abs_x + len - 1, abs_y, p->cfg.radius, p->cfg.outer ? "inv" : "norm"); - // if( abs_x == 276 && abs_x + len - 1 == 479 && abs_y == 63 && p->cfg.radius == 5 && p->cfg.outer == 1) { // char x = 0; // } @@ -1167,7 +1165,7 @@ LV_ATTRIBUTE_FAST_MEM static lv_draw_mask_res_t lv_draw_mask_radius(lv_opa_t * m return LV_DRAW_MASK_RES_CHANGED; } -LV_ATTRIBUTE_FAST_MEM static lv_draw_mask_res_t lv_draw_mask_fade(lv_opa_t * mask_buf, lv_coord_t abs_x, +static lv_draw_mask_res_t LV_ATTRIBUTE_FAST_MEM lv_draw_mask_fade(lv_opa_t * mask_buf, lv_coord_t abs_x, lv_coord_t abs_y, lv_coord_t len, lv_draw_mask_fade_param_t * p) { @@ -1213,7 +1211,7 @@ LV_ATTRIBUTE_FAST_MEM static lv_draw_mask_res_t lv_draw_mask_fade(lv_opa_t * mas } } -LV_ATTRIBUTE_FAST_MEM static lv_draw_mask_res_t lv_draw_mask_map(lv_opa_t * mask_buf, lv_coord_t abs_x, +static lv_draw_mask_res_t LV_ATTRIBUTE_FAST_MEM lv_draw_mask_map(lv_opa_t * mask_buf, lv_coord_t abs_x, lv_coord_t abs_y, lv_coord_t len, lv_draw_mask_map_param_t * p) { @@ -1247,7 +1245,7 @@ LV_ATTRIBUTE_FAST_MEM static lv_draw_mask_res_t lv_draw_mask_map(lv_opa_t * mask return LV_DRAW_MASK_RES_CHANGED; } -LV_ATTRIBUTE_FAST_MEM static lv_draw_mask_res_t lv_draw_mask_polygon(lv_opa_t * mask_buf, lv_coord_t abs_x, +static lv_draw_mask_res_t LV_ATTRIBUTE_FAST_MEM lv_draw_mask_polygon(lv_opa_t * mask_buf, lv_coord_t abs_x, lv_coord_t abs_y, lv_coord_t len, lv_draw_mask_polygon_param_t * param) { @@ -1517,8 +1515,7 @@ static lv_opa_t * get_next_line(_lv_draw_mask_radius_circle_dsc_t * c, lv_coord_ return &c->cir_opa[c->opa_start_on_y[y]]; } - -LV_ATTRIBUTE_FAST_MEM static inline lv_opa_t mask_mix(lv_opa_t mask_act, lv_opa_t mask_new) +static inline lv_opa_t LV_ATTRIBUTE_FAST_MEM mask_mix(lv_opa_t mask_act, lv_opa_t mask_new) { if(mask_new >= LV_OPA_MAX) return mask_act; if(mask_new <= LV_OPA_MIN) return 0; @@ -1526,5 +1523,4 @@ LV_ATTRIBUTE_FAST_MEM static inline lv_opa_t mask_mix(lv_opa_t mask_act, lv_opa_ return LV_UDIV255(mask_act * mask_new);// >> 8); } - #endif /*LV_DRAW_COMPLEX*/ diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/lv_draw_mask.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/lv_draw_mask.h similarity index 95% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/lv_draw_mask.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/lv_draw_mask.h index b7e4e1c..df6c2e6 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/lv_draw_mask.h +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/lv_draw_mask.h @@ -10,7 +10,6 @@ extern "C" { #endif - /********************* * INCLUDES *********************/ @@ -49,8 +48,6 @@ typedef struct { typedef _lv_draw_mask_saved_t _lv_draw_mask_saved_arr_t[_LV_MASK_MAX_NUM]; - - #if LV_DRAW_COMPLEX == 0 static inline uint8_t lv_draw_mask_get_cnt(void) { @@ -179,7 +176,6 @@ typedef struct { _lv_draw_mask_radius_circle_dsc_t * circle; } lv_draw_mask_radius_param_t; - typedef struct { /*The first element must be the common descriptor*/ _lv_draw_mask_common_dsc_t dsc; @@ -194,7 +190,6 @@ typedef struct { } lv_draw_mask_fade_param_t; - typedef struct _lv_draw_mask_map_param_t { /*The first element must be the common descriptor*/ _lv_draw_mask_common_dsc_t dsc; @@ -215,7 +210,6 @@ typedef struct { } cfg; } lv_draw_mask_polygon_param_t; - /********************** * GLOBAL PROTOTYPES **********************/ @@ -241,8 +235,8 @@ int16_t lv_draw_mask_add(void * param, void * custom_id); * - `LV_DRAW_MASK_RES_FULL_COVER`: the whole line is fully visible. `mask_buf` is unchanged * - `LV_DRAW_MASK_RES_CHANGED`: `mask_buf` has changed, it shows the desired opacity of each pixel in the given line */ -LV_ATTRIBUTE_FAST_MEM lv_draw_mask_res_t lv_draw_mask_apply(lv_opa_t * mask_buf, lv_coord_t abs_x, lv_coord_t abs_y, - lv_coord_t len); +lv_draw_mask_res_t /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_mask_apply(lv_opa_t * mask_buf, lv_coord_t abs_x, + lv_coord_t abs_y, lv_coord_t len); /** * Apply the specified buffers on a line. Used internally by the library's drawing routines. @@ -257,8 +251,9 @@ LV_ATTRIBUTE_FAST_MEM lv_draw_mask_res_t lv_draw_mask_apply(lv_opa_t * mask_buf, * - `LV_DRAW_MASK_RES_FULL_COVER`: the whole line is fully visible. `mask_buf` is unchanged * - `LV_DRAW_MASK_RES_CHANGED`: `mask_buf` has changed, it shows the desired opacity of each pixel in the given line */ -LV_ATTRIBUTE_FAST_MEM lv_draw_mask_res_t lv_draw_mask_apply_ids(lv_opa_t * mask_buf, lv_coord_t abs_x, lv_coord_t abs_y, - lv_coord_t len, const int16_t * ids, int16_t ids_count); +lv_draw_mask_res_t /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_mask_apply_ids(lv_opa_t * mask_buf, lv_coord_t abs_x, + lv_coord_t abs_y, lv_coord_t len, + const int16_t * ids, int16_t ids_count); //! @endcond @@ -299,8 +294,7 @@ void _lv_draw_mask_cleanup(void); * Count the currently added masks * @return number of active masks */ -LV_ATTRIBUTE_FAST_MEM uint8_t lv_draw_mask_get_cnt(void); - +uint8_t /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_mask_get_cnt(void); /** * Check if there is any added draw mask diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/lv_draw_rect.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/lv_draw_rect.c similarity index 96% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/lv_draw_rect.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/lv_draw_rect.c index f34854d..ae81f38 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/lv_draw_rect.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/lv_draw_rect.c @@ -34,7 +34,7 @@ * GLOBAL FUNCTIONS **********************/ -LV_ATTRIBUTE_FAST_MEM void lv_draw_rect_dsc_init(lv_draw_rect_dsc_t * dsc) +void LV_ATTRIBUTE_FAST_MEM lv_draw_rect_dsc_init(lv_draw_rect_dsc_t * dsc) { lv_memset_00(dsc, sizeof(lv_draw_rect_dsc_t)); dsc->bg_color = lv_color_white(); diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/lv_draw_rect.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/lv_draw_rect.h similarity index 96% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/lv_draw_rect.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/lv_draw_rect.h index 1583e3e..dbe6610 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/lv_draw_rect.h +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/lv_draw_rect.h @@ -74,8 +74,7 @@ struct _lv_draw_ctx_t; * GLOBAL PROTOTYPES **********************/ -LV_ATTRIBUTE_FAST_MEM void lv_draw_rect_dsc_init(lv_draw_rect_dsc_t * dsc); - +void /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_rect_dsc_init(lv_draw_rect_dsc_t * dsc); /** * Draw a rectangle diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/lv_draw_transform.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/lv_draw_transform.c similarity index 99% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/lv_draw_transform.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/lv_draw_transform.c index 580351d..aa39687 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/lv_draw_transform.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/lv_draw_transform.c @@ -48,7 +48,6 @@ void lv_draw_transform(lv_draw_ctx_t * draw_ctx, const lv_area_t * dest_area, co } - /********************** * STATIC FUNCTIONS **********************/ diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/lv_draw_transform.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/lv_draw_transform.h similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/lv_draw_transform.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/lv_draw_transform.h diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/lv_draw_triangle.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/lv_draw_triangle.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/lv_draw_triangle.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/lv_draw_triangle.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/lv_draw_triangle.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/lv_draw_triangle.h similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/lv_draw_triangle.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/lv_draw_triangle.h diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/lv_img_buf.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/lv_img_buf.c similarity index 82% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/lv_img_buf.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/lv_img_buf.c index 4c939dd..5ac1ead 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/lv_img_buf.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/lv_img_buf.c @@ -38,17 +38,7 @@ * GLOBAL FUNCTIONS **********************/ -/** - * Get the color of an image's pixel - * @param dsc an image descriptor - * @param x x coordinate of the point to get - * @param y x coordinate of the point to get - * @param color the color of the image. In case of `LV_IMG_CF_ALPHA_1/2/4/8` this color is used. - * Not used in other cases. - * @param safe true: check out of bounds - * @return color of the point - */ -lv_color_t lv_img_buf_get_px_color(lv_img_dsc_t * dsc, lv_coord_t x, lv_coord_t y, lv_color_t color) +lv_color_t lv_img_buf_get_px_color(const lv_img_dsc_t * dsc, lv_coord_t x, lv_coord_t y, lv_color_t color) { lv_color_t p_color = lv_color_black(); uint8_t * buf_u8 = (uint8_t *)dsc->data; @@ -107,15 +97,7 @@ lv_color_t lv_img_buf_get_px_color(lv_img_dsc_t * dsc, lv_coord_t x, lv_coord_t return p_color; } -/** - * Get the alpha value of an image's pixel - * @param dsc pointer to an image descriptor - * @param x x coordinate of the point to set - * @param y x coordinate of the point to set - * @param safe true: check out of bounds - * @return alpha value of the point - */ -lv_opa_t lv_img_buf_get_px_alpha(lv_img_dsc_t * dsc, lv_coord_t x, lv_coord_t y) +lv_opa_t lv_img_buf_get_px_alpha(const lv_img_dsc_t * dsc, lv_coord_t x, lv_coord_t y) { uint8_t * buf_u8 = (uint8_t *)dsc->data; @@ -170,15 +152,7 @@ lv_opa_t lv_img_buf_get_px_alpha(lv_img_dsc_t * dsc, lv_coord_t x, lv_coord_t y) return LV_OPA_COVER; } -/** - * Set the alpha value of a pixel of an image. The color won't be affected - * @param dsc pointer to an image descriptor - * @param x x coordinate of the point to set - * @param y x coordinate of the point to set - * @param opa the desired opacity - * @param safe true: check out of bounds - */ -void lv_img_buf_set_px_alpha(lv_img_dsc_t * dsc, lv_coord_t x, lv_coord_t y, lv_opa_t opa) +void lv_img_buf_set_px_alpha(const lv_img_dsc_t * dsc, lv_coord_t x, lv_coord_t y, lv_opa_t opa) { uint8_t * buf_u8 = (uint8_t *)dsc->data; @@ -229,15 +203,7 @@ void lv_img_buf_set_px_alpha(lv_img_dsc_t * dsc, lv_coord_t x, lv_coord_t y, lv_ } } -/** - * Set the color of a pixel of an image. The alpha channel won't be affected. - * @param dsc pointer to an image descriptor - * @param x x coordinate of the point to set - * @param y x coordinate of the point to set - * @param c color of the point - * @param safe true: check out of bounds - */ -void lv_img_buf_set_px_color(lv_img_dsc_t * dsc, lv_coord_t x, lv_coord_t y, lv_color_t c) +void lv_img_buf_set_px_color(const lv_img_dsc_t * dsc, lv_coord_t x, lv_coord_t y, lv_color_t c) { uint8_t * buf_u8 = (uint8_t *)dsc->data; @@ -296,17 +262,7 @@ void lv_img_buf_set_px_color(lv_img_dsc_t * dsc, lv_coord_t x, lv_coord_t y, lv_ } } -/** - * Set the palette color of an indexed image. Valid only for `LV_IMG_CF_INDEXED1/2/4/8` - * @param dsc pointer to an image descriptor - * @param id the palette color to set: - * - for `LV_IMG_CF_INDEXED1`: 0..1 - * - for `LV_IMG_CF_INDEXED2`: 0..3 - * - for `LV_IMG_CF_INDEXED4`: 0..15 - * - for `LV_IMG_CF_INDEXED8`: 0..255 - * @param c the color to set - */ -void lv_img_buf_set_palette(lv_img_dsc_t * dsc, uint8_t id, lv_color_t c) +void lv_img_buf_set_palette(const lv_img_dsc_t * dsc, uint8_t id, lv_color_t c) { if((dsc->header.cf == LV_IMG_CF_ALPHA_1BIT && id > 1) || (dsc->header.cf == LV_IMG_CF_ALPHA_2BIT && id > 3) || (dsc->header.cf == LV_IMG_CF_ALPHA_4BIT && id > 15) || (dsc->header.cf == LV_IMG_CF_ALPHA_8BIT)) { @@ -320,13 +276,6 @@ void lv_img_buf_set_palette(lv_img_dsc_t * dsc, uint8_t id, lv_color_t c) lv_memcpy_small(&buf[id * sizeof(c32)], &c32, sizeof(c32)); } -/** - * Allocate an image buffer in RAM - * @param w width of image - * @param h height of image - * @param cf a color format (`LV_IMG_CF_...`) - * @return an allocated image, or NULL on failure - */ lv_img_dsc_t * lv_img_buf_alloc(lv_coord_t w, lv_coord_t h, lv_img_cf_t cf) { /*Allocate image descriptor*/ @@ -359,10 +308,6 @@ lv_img_dsc_t * lv_img_buf_alloc(lv_coord_t w, lv_coord_t h, lv_img_cf_t cf) return dsc; } -/** - * Free an allocated image buffer - * @param dsc image buffer to free - */ void lv_img_buf_free(lv_img_dsc_t * dsc) { if(dsc != NULL) { @@ -373,13 +318,6 @@ void lv_img_buf_free(lv_img_dsc_t * dsc) } } -/** - * Get the memory consumption of a raw bitmap, given color format and dimensions. - * @param w width - * @param h height - * @param cf color format - * @return size in bytes - */ uint32_t lv_img_buf_get_img_size(lv_coord_t w, lv_coord_t h, lv_img_cf_t cf) { switch(cf) { @@ -411,15 +349,6 @@ uint32_t lv_img_buf_get_img_size(lv_coord_t w, lv_coord_t h, lv_img_cf_t cf) } } -/** - * Get the area of a rectangle if its rotated and scaled - * @param res store the coordinates here - * @param w width of the rectangle to transform - * @param h height of the rectangle to transform - * @param angle angle of rotation - * @param zoom zoom, (256 no zoom) - * @param pivot x,y pivot coordinates of rotation - */ void _lv_img_buf_get_transformed_area(lv_area_t * res, lv_coord_t w, lv_coord_t h, int16_t angle, uint16_t zoom, const lv_point_t * pivot) { diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/lv_img_buf.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/lv_img_buf.h similarity index 95% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/lv_img_buf.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/lv_img_buf.h index 1be7bb6..a315a85 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/lv_img_buf.h +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/lv_img_buf.h @@ -104,7 +104,6 @@ enum { }; typedef uint8_t lv_img_cf_t; - /** * The first 8 bit is very important to distinguish the different source types. * For more info see `lv_img_get_src_type()` in lv_img.c @@ -167,7 +166,7 @@ lv_img_dsc_t * lv_img_buf_alloc(lv_coord_t w, lv_coord_t h, lv_img_cf_t cf); * @param safe true: check out of bounds * @return color of the point */ -lv_color_t lv_img_buf_get_px_color(lv_img_dsc_t * dsc, lv_coord_t x, lv_coord_t y, lv_color_t color); +lv_color_t lv_img_buf_get_px_color(const lv_img_dsc_t * dsc, lv_coord_t x, lv_coord_t y, lv_color_t color); /** * Get the alpha value of an image's pixel @@ -177,7 +176,7 @@ lv_color_t lv_img_buf_get_px_color(lv_img_dsc_t * dsc, lv_coord_t x, lv_coord_t * @param safe true: check out of bounds * @return alpha value of the point */ -lv_opa_t lv_img_buf_get_px_alpha(lv_img_dsc_t * dsc, lv_coord_t x, lv_coord_t y); +lv_opa_t lv_img_buf_get_px_alpha(const lv_img_dsc_t * dsc, lv_coord_t x, lv_coord_t y); /** * Set the color of a pixel of an image. The alpha channel won't be affected. @@ -187,7 +186,7 @@ lv_opa_t lv_img_buf_get_px_alpha(lv_img_dsc_t * dsc, lv_coord_t x, lv_coord_t y) * @param c color of the point * @param safe true: check out of bounds */ -void lv_img_buf_set_px_color(lv_img_dsc_t * dsc, lv_coord_t x, lv_coord_t y, lv_color_t c); +void lv_img_buf_set_px_color(const lv_img_dsc_t * dsc, lv_coord_t x, lv_coord_t y, lv_color_t c); /** * Set the alpha value of a pixel of an image. The color won't be affected @@ -197,7 +196,7 @@ void lv_img_buf_set_px_color(lv_img_dsc_t * dsc, lv_coord_t x, lv_coord_t y, lv_ * @param opa the desired opacity * @param safe true: check out of bounds */ -void lv_img_buf_set_px_alpha(lv_img_dsc_t * dsc, lv_coord_t x, lv_coord_t y, lv_opa_t opa); +void lv_img_buf_set_px_alpha(const lv_img_dsc_t * dsc, lv_coord_t x, lv_coord_t y, lv_opa_t opa); /** * Set the palette color of an indexed image. Valid only for `LV_IMG_CF_INDEXED1/2/4/8` @@ -209,7 +208,7 @@ void lv_img_buf_set_px_alpha(lv_img_dsc_t * dsc, lv_coord_t x, lv_coord_t y, lv_ * - for `LV_IMG_CF_INDEXED8`: 0..255 * @param c the color to set */ -void lv_img_buf_set_palette(lv_img_dsc_t * dsc, uint8_t id, lv_color_t c); +void lv_img_buf_set_palette(const lv_img_dsc_t * dsc, uint8_t id, lv_color_t c); /** * Free an allocated image buffer diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/lv_img_cache.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/lv_img_cache.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/lv_img_cache.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/lv_img_cache.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/lv_img_cache.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/lv_img_cache.h similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/lv_img_cache.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/lv_img_cache.h diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/lv_img_decoder.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/lv_img_decoder.c similarity index 95% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/lv_img_decoder.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/lv_img_decoder.c index 13050b8..76aff5e 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/lv_img_decoder.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/lv_img_decoder.c @@ -360,10 +360,35 @@ lv_res_t lv_img_decoder_built_in_open(lv_img_decoder_t * decoder, lv_img_decoder } lv_img_cf_t cf = dsc->header.cf; + /*Process A8, RGB565A8, need load file to ram after https://github.com/lvgl/lvgl/pull/3337*/ + if(cf == LV_IMG_CF_ALPHA_8BIT || cf == LV_IMG_CF_RGB565A8) { + if(dsc->src_type == LV_IMG_SRC_VARIABLE) { + /*In case of uncompressed formats the image stored in the ROM/RAM. + *So simply give its pointer*/ + dsc->img_data = ((lv_img_dsc_t *)dsc->src)->data; + return LV_RES_OK; + } + else { + /*If it's a file, read all to memory*/ + uint32_t len = dsc->header.w * dsc->header.h; + len *= cf == LV_IMG_CF_RGB565A8 ? 3 : 1; + uint8_t * fs_buf = lv_mem_alloc(len); + if(fs_buf == NULL) return LV_RES_INV; + + lv_img_decoder_built_in_data_t * user_data = dsc->user_data; + lv_fs_seek(&user_data->f, 4, LV_FS_SEEK_SET); /*+4 to skip the header*/ + lv_fs_res_t res = lv_fs_read(&user_data->f, fs_buf, len, NULL); + if(res != LV_FS_RES_OK) { + lv_mem_free(fs_buf); + return LV_RES_INV; + } + dsc->img_data = fs_buf; + return LV_RES_OK; + } + } /*Process true color formats*/ - if(cf == LV_IMG_CF_TRUE_COLOR || cf == LV_IMG_CF_TRUE_COLOR_ALPHA || - cf == LV_IMG_CF_TRUE_COLOR_CHROMA_KEYED || cf == LV_IMG_CF_RGB565A8 || - cf == LV_IMG_CF_ALPHA_8BIT) { + else if(cf == LV_IMG_CF_TRUE_COLOR || cf == LV_IMG_CF_TRUE_COLOR_ALPHA || + cf == LV_IMG_CF_TRUE_COLOR_CHROMA_KEYED) { if(dsc->src_type == LV_IMG_SRC_VARIABLE) { /*In case of uncompressed formats the image stored in the ROM/RAM. *So simply give its pointer*/ diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/lv_img_decoder.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/lv_img_decoder.h similarity index 99% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/lv_img_decoder.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/lv_img_decoder.h index 9dc84dd..29ed9f0 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/lv_img_decoder.h +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/lv_img_decoder.h @@ -82,7 +82,6 @@ typedef lv_res_t (*lv_img_decoder_read_line_f_t)(struct _lv_img_decoder_t * deco */ typedef void (*lv_img_decoder_close_f_t)(struct _lv_img_decoder_t * decoder, struct _lv_img_decoder_dsc_t * dsc); - typedef struct _lv_img_decoder_t { lv_img_decoder_info_f_t info_cb; lv_img_decoder_open_f_t open_cb; @@ -94,7 +93,6 @@ typedef struct _lv_img_decoder_t { #endif } lv_img_decoder_t; - /**Describe an image decoding session. Stores data about the decoding*/ typedef struct _lv_img_decoder_dsc_t { /**The decoder which was able to open the image source*/ diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/nema_gfx/lv_draw_nema_gfx.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/nema_gfx/lv_draw_nema_gfx.c new file mode 100644 index 0000000..bf71027 --- /dev/null +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/nema_gfx/lv_draw_nema_gfx.c @@ -0,0 +1,554 @@ +/** + * @file lv_draw_nema_gfx.c + * + */ + +/** + * MIT License + * + * ----------------------------------------------------------------------------- + * Copyright (c) 2008-24 Think Silicon Single Member PC + * ----------------------------------------------------------------------------- + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next paragraph) + * shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A + * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF + * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE + * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + */ + +/********************* + * INCLUDES + *********************/ +#include "../../core/lv_refr.h" + +#if LV_USE_NEMA_GFX + +#include "lv_draw_nema_gfx.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +static lv_res_t draw_nema_gfx_bg(lv_draw_ctx_t * draw_ctx, const lv_draw_rect_dsc_t * dsc, const lv_area_t * coords); +static inline bool Isargb8565(lv_img_cf_t cf); +static uint32_t lv_cf_to_nema(lv_img_cf_t cf); +static uint32_t skip_pallete(lv_img_cf_t cf); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_draw_nema_gfx_init(void) +{ + nema_init(); + return; +} + +static inline bool Isargb8565(lv_img_cf_t cf) +{ +#if LV_COLOR_DEPTH != 32 + if(cf == LV_IMG_CF_TRUE_COLOR_ALPHA) + return true; +#endif + return false; +} + +static uint32_t lv_cf_to_nema(lv_img_cf_t cf) +{ + switch(cf) { + case LV_IMG_CF_ALPHA_1BIT: + return NEMA_A1; + case LV_IMG_CF_ALPHA_2BIT: + return NEMA_A2; + case LV_IMG_CF_ALPHA_4BIT: + return NEMA_A4; + case LV_IMG_CF_ALPHA_8BIT: + return NEMA_A8; + case LV_IMG_CF_INDEXED_1BIT: + return NEMA_L1; + case LV_IMG_CF_INDEXED_2BIT: + return NEMA_L2; + case LV_IMG_CF_INDEXED_4BIT: + return NEMA_L4; + case LV_IMG_CF_INDEXED_8BIT: + return NEMA_L8; + default: + return LV_NEMA_GFX_COLOR_FORMAT; + } +} + +static uint32_t skip_pallete(lv_img_cf_t cf) +{ + switch(cf) { + case LV_IMG_CF_INDEXED_1BIT: + return 2; + case LV_IMG_CF_INDEXED_2BIT: + return 4; + case LV_IMG_CF_INDEXED_4BIT: + return 16; + default: + return 256; + } +} + +void lv_draw_nema_gfx_img_decoded(lv_draw_ctx_t * draw_ctx, const lv_draw_img_dsc_t * dsc, const lv_area_t * coords, + const uint8_t * map_p, lv_img_cf_t cf) +{ + + /*Use the clip area as draw area*/ + lv_area_t draw_area; + lv_area_copy(&draw_area, draw_ctx->clip_area); + bool mask_any = lv_draw_mask_is_any(&draw_area); + bool recolor = (dsc->recolor_opa != LV_OPA_TRANSP); + bool transform = dsc->angle != 0 || dsc->zoom != LV_IMG_ZOOM_NONE ? true : false; + + lv_draw_nema_gfx_ctx_t * nema_gfx_draw_ctx = (lv_draw_nema_gfx_ctx_t *)draw_ctx; + + lv_area_t blend_area; + /*Let's get the blend area which is the intersection of the area to fill and the clip area.*/ + if(!_lv_area_intersect(&blend_area, coords, draw_ctx->clip_area)) + return; /*Fully clipped, nothing to do*/ + + /*Make the blend area relative to the buffer*/ + lv_area_move(&blend_area, -draw_ctx->buf_area->x1, -draw_ctx->buf_area->y1); + + lv_coord_t tex_w = lv_area_get_width(coords); + lv_coord_t tex_h = lv_area_get_height(coords); + + lv_area_t clip_area; + lv_area_copy(&clip_area, draw_ctx->clip_area); + lv_area_move(&clip_area, -draw_ctx->buf_area->x1, -draw_ctx->buf_area->y1); + + const lv_color_t * src_buf = (const lv_color_t *)map_p; + + if(!src_buf || Isargb8565(cf)) { + lv_draw_sw_img_decoded(draw_ctx, dsc, coords, map_p, cf); + return; + } + + lv_color_t * dest_buf = draw_ctx->buf; + lv_coord_t dest_stride = lv_area_get_width(draw_ctx->buf_area); + uint32_t blending_mode = NEMA_BL_SIMPLE; + + uint32_t color_format = lv_cf_to_nema(cf); + + nema_buffer_t Shuffle_pallete_bo; + if(color_format == NEMA_L8) { + Shuffle_pallete_bo = nema_buffer_create(256 * 4); + uint32_t * Shuffle_pallete = Shuffle_pallete_bo.base_virt; + for(int i = 0; i < 256; i++) { + int idx = ((i >> 4) | ((i & 0xfU) << 4)); + lv_color32_t col32 = {.full = lv_color_to32(*(lv_color_t *)((uint32_t *)src_buf + idx))}; + Shuffle_pallete[i] = col32.full; + } + } + + if(!mask_any) { + nema_bind_dst_tex((uintptr_t)NEMA_VIRT2PHYS(draw_ctx->buf), lv_area_get_width(draw_ctx->buf_area), + lv_area_get_height(draw_ctx->buf_area), LV_NEMA_GFX_COLOR_FORMAT, + lv_area_get_width(draw_ctx->buf_area)*LV_NEMA_GFX_FORMAT_MULTIPLIER); + nema_set_clip(clip_area.x1, clip_area.y1, lv_area_get_width(&clip_area), lv_area_get_height(&clip_area)); + if(color_format == NEMA_L1 || color_format == NEMA_L2 || color_format == NEMA_L4) { + blending_mode |= NEMA_BLOP_LUT; + nema_bind_lut_tex((uintptr_t)((uint32_t *)src_buf + (skip_pallete(cf))), tex_w, tex_h, color_format, -1, 0, + (uintptr_t)(src_buf), NEMA_BGRA8888); + } + else if(color_format == NEMA_L8) { + blending_mode |= NEMA_BLOP_LUT; + nema_bind_lut_tex((uintptr_t)((uint32_t *)src_buf + (skip_pallete(cf))), tex_w, tex_h, color_format, -1, 0, + Shuffle_pallete_bo.base_phys, NEMA_BGRA8888); + } + else + nema_bind_src_tex((uintptr_t)(src_buf), tex_w, tex_h, color_format, -1, + (dsc->antialias == true) ? NEMA_FILTER_BL : NEMA_FILTER_PS); + + if(recolor) { + lv_color32_t col32 = {.full = lv_color_to32(dsc->recolor)}; + uint32_t color = nema_rgba(col32.ch.red, col32.ch.green, col32.ch.blue, dsc->recolor_opa); + nema_set_recolor_color(color); + blending_mode |= NEMA_BLOP_RECOLOR; + } + + if(lv_img_cf_is_chroma_keyed(cf)) { + blending_mode |= NEMA_BLOP_SRC_CKEY; + lv_color_t ckey = LV_COLOR_CHROMA_KEY; + lv_color32_t col32 = {.full = lv_color_to32(ckey)}; + uint32_t src_color_key = nema_rgba(col32.ch.red, col32.ch.green, col32.ch.blue, 0U); + nema_set_src_color_key(src_color_key); + } + + if(dsc->opa < 255) { + uint32_t rgba = ((uint32_t)dsc->opa << 24U) | ((uint32_t)dsc->opa << 16U) | ((uint32_t)dsc->opa << 8U) | (( + uint32_t)dsc->opa); + nema_set_const_color(rgba); + blending_mode |= NEMA_BLOP_MODULATE_A; + } + + nema_set_blend_blit(blending_mode); + + if(!transform) { + nema_blit_rect((coords->x1 - draw_ctx->buf_area->x1), + (coords->y1 - draw_ctx->buf_area->y1), tex_w, tex_h); + } + else { + + /*Calculate the transformed points*/ + float x0 = (coords->x1 - draw_ctx->buf_area->x1); + float y0 = (coords->y1 - draw_ctx->buf_area->y1); + float x1 = x0 + tex_w ; + float y1 = y0; + float x2 = x0 + tex_w ; + float y2 = y0 + tex_h; + float x3 = x0 ; + float y3 = y0 + tex_h; + + nema_matrix3x3_t m; + nema_mat3x3_load_identity(m); + nema_mat3x3_translate(m, -x0, -y0); + nema_mat3x3_translate(m, -(float)dsc->pivot.x, -(float)dsc->pivot.y); + nema_mat3x3_rotate(m, (dsc->angle / 10.0f)); /* angle is 1/10 degree */ + float scale = 1.f * dsc->zoom / LV_IMG_ZOOM_NONE; + nema_mat3x3_scale(m, (float)scale, (float)scale); + nema_mat3x3_translate(m, (float)dsc->pivot.x, (float)dsc->pivot.y); + nema_mat3x3_translate(m, x0, y0); + + /*Apply Transformation Matrix to Vertices*/ + nema_mat3x3_mul_vec(m, &x0, &y0); + nema_mat3x3_mul_vec(m, &x1, &y1); + nema_mat3x3_mul_vec(m, &x2, &y2); + nema_mat3x3_mul_vec(m, &x3, &y3); + + nema_blit_quad_fit(x0, y0, + x1, y1, + x2, y2, + x3, y3); + } + nema_cl_submit(&(nema_gfx_draw_ctx->cl)); + if(color_format == NEMA_L8) { + nema_cl_wait(&(nema_gfx_draw_ctx->cl)); + nema_buffer_destroy(&Shuffle_pallete_bo); + } + return; + } + /*Wait for GPU to finish previous jobs in case of failure and call SW rendering*/ + nema_cl_wait(&(nema_gfx_draw_ctx->cl)); + lv_draw_sw_img_decoded(draw_ctx, dsc, coords, map_p, cf); + return; +} + + +void lv_draw_nema_gfx_ctx_init(lv_disp_drv_t * drv, lv_draw_ctx_t * draw_ctx) +{ + + lv_draw_sw_init_ctx(drv, draw_ctx); + + lv_draw_nema_gfx_ctx_t * nema_gfx_draw_ctx = (lv_draw_nema_gfx_ctx_t *)draw_ctx; + + nema_gfx_draw_ctx->base_sw_ctx.blend = lv_draw_nema_gfx_blend; + nema_gfx_draw_ctx->base_sw_ctx.base_draw.draw_rect = lv_draw_nema_gfx_rect; + nema_gfx_draw_ctx->base_sw_ctx.base_draw.draw_bg = lv_draw_nema_gfx_bg; + nema_gfx_draw_ctx->base_sw_ctx.base_draw.draw_img_decoded = lv_draw_nema_gfx_img_decoded; + nema_gfx_draw_ctx->base_sw_ctx.base_draw.draw_img = lv_draw_nema_gfx_img; + nema_gfx_draw_ctx->base_sw_ctx.base_draw.draw_letter = lv_draw_nema_gfx_letter; + + //Overide this functions to wait for GPU + nema_gfx_draw_ctx->base_sw_ctx.base_draw.draw_arc = lv_draw_nema_gfx_arc; + nema_gfx_draw_ctx->base_sw_ctx.base_draw.draw_line = lv_draw_nema_gfx_line; + nema_gfx_draw_ctx->base_sw_ctx.base_draw.draw_polygon = lv_draw_nema_gfx_polygon; + + /*Create GPU Command List*/ + nema_gfx_draw_ctx->cl = nema_cl_create(); + /*Bind Command List*/ + nema_cl_bind_circular(&(nema_gfx_draw_ctx->cl)); + +} + +void lv_draw_nema_gfx_ctx_deinit(lv_disp_drv_t * drv, lv_draw_ctx_t * draw_ctx) +{ + LV_UNUSED(drv); + lv_draw_nema_gfx_ctx_t * nema_gfx_draw_ctx = (lv_draw_nema_gfx_ctx_t *) draw_ctx; + nema_cl_destroy(&(nema_gfx_draw_ctx->cl)); +} + + +void lv_draw_nema_gfx_blend(lv_draw_ctx_t * draw_ctx, const lv_draw_sw_blend_dsc_t * dsc) +{ + const lv_opa_t * mask; + if(dsc->mask_buf == NULL) mask = NULL; + if(dsc->mask_buf && dsc->mask_res == LV_DRAW_MASK_RES_TRANSP) return; + else if(dsc->mask_res == LV_DRAW_MASK_RES_FULL_COVER) mask = NULL; + else mask = dsc->mask_buf; + + lv_draw_nema_gfx_ctx_t * nema_gfx_draw_ctx = (lv_draw_nema_gfx_ctx_t *)draw_ctx; + + lv_area_t blend_area; + + bool render_on_gpu = false; + + /*Let's get the blend area which is the intersection of the area to fill and the clip area.*/ + if(!_lv_area_intersect(&blend_area, dsc->blend_area, draw_ctx->clip_area)) + return; /*Fully clipped, nothing to do*/ + + /*Make the blend area relative to the buffer*/ + lv_area_move(&blend_area, -draw_ctx->buf_area->x1, -draw_ctx->buf_area->y1); + + if(mask == NULL && dsc->blend_mode == LV_BLEND_MODE_NORMAL) { + + const lv_color_t * src_buf = dsc->src_buf; + + nema_bind_dst_tex((uintptr_t)NEMA_VIRT2PHYS(draw_ctx->buf), lv_area_get_width(draw_ctx->buf_area), + lv_area_get_height(draw_ctx->buf_area), LV_NEMA_GFX_COLOR_FORMAT, + lv_area_get_width(draw_ctx->buf_area)*LV_NEMA_GFX_FORMAT_MULTIPLIER); + + //Set Clipping Area + lv_area_t clip_area; + lv_area_copy(&clip_area, draw_ctx->clip_area); + lv_area_move(&clip_area, -draw_ctx->buf_area->x1, -draw_ctx->buf_area->y1); + + nema_set_clip(clip_area.x1, clip_area.y1, lv_area_get_width(&clip_area), lv_area_get_height(&clip_area)); + + lv_coord_t coords_bg_w = lv_area_get_width(&blend_area); + lv_coord_t coords_bg_h = lv_area_get_height(&blend_area); + + if(src_buf == NULL) { + //Simple Fill + uint8_t opacity; + lv_color32_t col32 = {.full = lv_color_to32(dsc->color)}; + if(dsc->opa < LV_OPA_MAX && dsc->opa > LV_OPA_MIN) { + opacity = (uint8_t)(((uint16_t)col32.ch.alpha * dsc->opa) >> 8); + } + else if(dsc->opa >= LV_OPA_MAX) { + opacity = col32.ch.alpha; + } + + uint32_t color = nema_rgba(col32.ch.red, col32.ch.green, col32.ch.blue, opacity); + + if(opacity < 255U) + nema_set_blend_fill(NEMA_BL_SRC_OVER | NEMA_BLOP_SRC_PREMULT); + else + nema_set_blend_fill(NEMA_BL_SRC_OVER); + + nema_fill_rect(blend_area.x1, blend_area.y1, coords_bg_w, coords_bg_h, color); + render_on_gpu = true; + } + else { //Full Opaque mask + nema_bind_src_tex((uintptr_t)(src_buf), coords_bg_w, coords_bg_h, LV_NEMA_GFX_COLOR_FORMAT, + coords_bg_w * LV_NEMA_GFX_FORMAT_MULTIPLIER, NEMA_FILTER_PS); + if(dsc->opa < 255) { + uint32_t rgba = ((uint32_t)dsc->opa << 24U) | ((uint32_t)dsc->opa << 16U) | ((uint32_t)dsc->opa << 8U) | (( + uint32_t)dsc->opa); + nema_set_const_color(rgba); + nema_set_blend_blit(NEMA_BL_SIMPLE | NEMA_BLOP_MODULATE_A); + } + else + nema_set_blend_blit(NEMA_BL_SIMPLE); + + nema_blit_rect(blend_area.x1, blend_area.y1, coords_bg_w, coords_bg_h); + render_on_gpu = true; + } + } + + if(render_on_gpu) { + nema_cl_submit(&(nema_gfx_draw_ctx->cl)); + } + else { + nema_cl_wait(&(nema_gfx_draw_ctx->cl)); + lv_draw_sw_blend_basic(draw_ctx, dsc); + } + + return; +} + +void lv_draw_nema_gfx_rect(lv_draw_ctx_t * draw_ctx, const lv_draw_rect_dsc_t * dsc, const lv_area_t * coords) +{ + bool done = false; + lv_draw_rect_dsc_t nema_dsc; + + lv_memcpy(&nema_dsc, dsc, sizeof(nema_dsc)); +#if LV_DRAW_COMPLEX + /* Draw only the shadow */ + nema_dsc.bg_opa = 0; + nema_dsc.bg_img_opa = 0; + nema_dsc.border_opa = 0; + nema_dsc.outline_opa = 0; + lv_draw_nema_gfx_ctx_t * nema_gfx_draw_ctx = (lv_draw_nema_gfx_ctx_t *)draw_ctx; + nema_cl_wait(&(nema_gfx_draw_ctx->cl)); + + lv_draw_sw_rect(draw_ctx, &nema_dsc, coords); + + /* Draw the background */ + nema_dsc.shadow_opa = 0; + nema_dsc.bg_opa = dsc->bg_opa; + if(draw_nema_gfx_bg(draw_ctx, &nema_dsc, coords) == LV_RES_OK) { + nema_dsc.bg_opa = 0; + } +#endif /*LV_DRAW_COMPLEX*/ + + /* Draw the remaining parts */ + nema_dsc.bg_img_opa = dsc->bg_img_opa; + nema_dsc.border_opa = dsc->border_opa; + nema_dsc.outline_opa = dsc->outline_opa; + + lv_draw_sw_rect(draw_ctx, &nema_dsc, coords); + +} + +void lv_draw_nema_gfx_bg(lv_draw_ctx_t * draw_ctx, const lv_draw_rect_dsc_t * dsc, const lv_area_t * coords) +{ + + bool rendered_by_gpu = false; + lv_draw_rect_dsc_t nema_dsc; + lv_memcpy(&nema_dsc, dsc, sizeof(nema_dsc)); + + // try to render with GPU + rendered_by_gpu = (draw_nema_gfx_bg(draw_ctx, &nema_dsc, coords) == LV_RES_OK); + + if(rendered_by_gpu) { + // rendered with gpu + // continuew with the rest + nema_dsc.bg_opa = 0; + lv_draw_sw_bg(draw_ctx, &nema_dsc, coords); + } + else { + // couldn't draw with gpu + lv_draw_sw_bg(draw_ctx, dsc, coords); + } +} + +lv_res_t draw_nema_gfx_bg(lv_draw_ctx_t * draw_ctx, const lv_draw_rect_dsc_t * dsc, const lv_area_t * coords) +{ + +#if LV_COLOR_SCREEN_TRANSP && LV_COLOR_DEPTH == 32 + lv_memset_00(draw_ctx->buf, lv_area_get_size(draw_ctx->buf_area) * sizeof(lv_color_t)); +#endif + + if(dsc->bg_opa <= LV_OPA_MIN) return LV_RES_INV; + + lv_area_t bg_coords; + lv_area_copy(&bg_coords, coords); + + /*If the border fully covers make the bg area 1px smaller to avoid artifacts on the corners*/ + if(dsc->border_width > 1 && dsc->border_opa >= (lv_opa_t)LV_OPA_MAX && dsc->radius != 0) { + bg_coords.x1 += (dsc->border_side & LV_BORDER_SIDE_LEFT) ? 1 : 0; + bg_coords.y1 += (dsc->border_side & LV_BORDER_SIDE_TOP) ? 1 : 0; + bg_coords.x2 -= (dsc->border_side & LV_BORDER_SIDE_RIGHT) ? 1 : 0; + bg_coords.y2 -= (dsc->border_side & LV_BORDER_SIDE_BOTTOM) ? 1 : 0; + } + + lv_area_t clipped_coords; + if(!_lv_area_intersect(&clipped_coords, &bg_coords, draw_ctx->clip_area)) + return LV_RES_INV; + + /*Make the blend area relative to the buffer*/ + lv_area_move(&bg_coords, -draw_ctx->buf_area->x1, -draw_ctx->buf_area->y1); + + lv_draw_nema_gfx_ctx_t * nema_gfx_draw_ctx = (lv_draw_nema_gfx_ctx_t *)draw_ctx; + + nema_bind_dst_tex((uintptr_t)NEMA_VIRT2PHYS(draw_ctx->buf), lv_area_get_width(draw_ctx->buf_area), + lv_area_get_height(draw_ctx->buf_area), LV_NEMA_GFX_COLOR_FORMAT, + lv_area_get_width(draw_ctx->buf_area)*LV_NEMA_GFX_FORMAT_MULTIPLIER); + //Set Clipping Area + + lv_area_t clip_area; + lv_area_copy(&clip_area, draw_ctx->clip_area); + lv_area_move(&clip_area, -draw_ctx->buf_area->x1, -draw_ctx->buf_area->y1); + + nema_set_clip(clip_area.x1, clip_area.y1, lv_area_get_width(&clip_area), lv_area_get_height(&clip_area)); + + lv_coord_t coords_bg_w = lv_area_get_width(&bg_coords); + lv_coord_t coords_bg_h = lv_area_get_height(&bg_coords); + int32_t short_side = LV_MIN(coords_bg_w, coords_bg_h); + int32_t radius = LV_MIN(dsc->radius, short_side >> 1); + + bool mask_any = lv_draw_mask_is_any(&bg_coords); + + if(!mask_any && (dsc->bg_grad.dir == LV_GRAD_DIR_NONE)) { + + uint8_t opacity; + lv_color32_t bg_col32 = {.full = lv_color_to32(dsc->bg_color)}; + if(dsc->bg_opa < LV_OPA_MAX && dsc->bg_opa > LV_OPA_MIN) { + opacity = (uint8_t)(((uint16_t)bg_col32.ch.alpha * dsc->bg_opa) >> 8); + } + else if(dsc->bg_opa >= LV_OPA_MAX) { + opacity = bg_col32.ch.alpha; + } + + if(opacity < 255U) { + nema_set_blend_fill(NEMA_BL_SIMPLE); + } + else { + nema_set_blend_fill(NEMA_BL_SRC); + } + + uint32_t bg_color = nema_rgba(bg_col32.ch.red, bg_col32.ch.green, bg_col32.ch.blue, opacity); + + if(dsc->radius != 0) + nema_fill_rounded_rect_aa(bg_coords.x1, bg_coords.y1, coords_bg_w, coords_bg_h, radius, bg_color); + else + nema_fill_rect(bg_coords.x1, bg_coords.y1, coords_bg_w, coords_bg_h, bg_color); + + nema_cl_submit(&(nema_gfx_draw_ctx->cl)); + nema_cl_wait(&(nema_gfx_draw_ctx->cl)); + + return LV_RES_OK; + } + return LV_RES_INV; +} + +LV_ATTRIBUTE_FAST_MEM void lv_draw_nema_gfx_line(struct _lv_draw_ctx_t * draw_ctx, const lv_draw_line_dsc_t * dsc, + const lv_point_t * point1, const lv_point_t * point2) +{ + lv_draw_nema_gfx_ctx_t * nema_gfx_draw_ctx = (lv_draw_nema_gfx_ctx_t *)draw_ctx; + //Ensure that GPU has no unfinished workload + nema_cl_wait(&(nema_gfx_draw_ctx->cl)); + lv_draw_sw_line(draw_ctx, dsc, point1, point2); +} + +void lv_draw_nema_gfx_polygon(struct _lv_draw_ctx_t * draw_ctx, const lv_draw_rect_dsc_t * draw_dsc, + const lv_point_t * points, uint16_t point_cnt) +{ + lv_draw_nema_gfx_ctx_t * nema_gfx_draw_ctx = (lv_draw_nema_gfx_ctx_t *)draw_ctx; + //Ensure that GPU has no unfinished workload + nema_cl_wait(&(nema_gfx_draw_ctx->cl)); + lv_draw_sw_polygon(draw_ctx, draw_dsc, points, point_cnt); +} + +void lv_draw_nema_gfx_arc(lv_draw_ctx_t * draw_ctx, const lv_draw_arc_dsc_t * dsc, const lv_point_t * center, + uint16_t radius, uint16_t start_angle, uint16_t end_angle) +{ + lv_draw_nema_gfx_ctx_t * nema_gfx_draw_ctx = (lv_draw_nema_gfx_ctx_t *)draw_ctx; + //Ensure that GPU has no unfinished workload + nema_cl_wait(&(nema_gfx_draw_ctx->cl)); + lv_draw_sw_arc(draw_ctx, dsc, center, radius, start_angle, end_angle); +} + +#endif diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/nema_gfx/lv_draw_nema_gfx.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/nema_gfx/lv_draw_nema_gfx.h new file mode 100644 index 0000000..b5f3a38 --- /dev/null +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/nema_gfx/lv_draw_nema_gfx.h @@ -0,0 +1,134 @@ +/** + * @file lv_draw_nema_gfx.h + * + */ + +/** + * MIT License + * + * ----------------------------------------------------------------------------- + * Copyright (c) 2008-24 Think Silicon Single Member PC + * ----------------------------------------------------------------------------- + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next paragraph) + * shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A + * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF + * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE + * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + */ + +#ifndef LV_DRAW_NEMA_GFX_H +#define LV_DRAW_NEMA_GFX_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../misc/lv_color.h" +#include "../../hal/lv_hal_disp.h" +#include "../sw/lv_draw_sw.h" + +#if LV_USE_NEMA_GFX + +#include "nema_core.h" +#include "nema_utils.h" +#include "nema_error.h" +#include "nema_provisional.h" + + +/********************* + * DEFINES + *********************/ + +#ifndef NEMA_VIRT2PHYS +#define NEMA_VIRT2PHYS +#endif + +/*Color depth: 1 (1 byte per pixel), 8 (RGB332), 16 (RGB565), 32 (ARGB8888)*/ +#if LV_COLOR_DEPTH == 8 +#define LV_NEMA_GFX_COLOR_FORMAT NEMA_RGB332 +#define LV_NEMA_GFX_FORMAT_MULTIPLIER 1 +#elif LV_COLOR_DEPTH == 16 +#define LV_NEMA_GFX_COLOR_FORMAT NEMA_RGB565 +#define LV_NEMA_GFX_FORMAT_MULTIPLIER 2 +#elif LV_COLOR_DEPTH == 32 +#define LV_NEMA_GFX_COLOR_FORMAT NEMA_BGRA8888 +#define LV_NEMA_GFX_FORMAT_MULTIPLIER 4 +#else +/*Can't use GPU with other formats*/ +#endif + +/********************** + * TYPEDEFS + **********************/ + +typedef struct { + lv_draw_sw_ctx_t base_sw_ctx; + /*Add other needed fields here*/ + nema_cmdlist_t cl; +} lv_draw_nema_gfx_ctx_t; + +struct _lv_disp_drv_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +void lv_draw_nema_gfx_init(void); + +void lv_draw_nema_gfx_ctx_init(struct _lv_disp_drv_t * drv, lv_draw_ctx_t * draw_ctx); + +void lv_draw_nema_gfx_ctx_deinit(struct _lv_disp_drv_t * drv, lv_draw_ctx_t * draw_ctx); + +void lv_draw_nema_gfx_blend(lv_draw_ctx_t * draw_ctx, const lv_draw_sw_blend_dsc_t * dsc); + +void lv_draw_nema_gfx_bg(lv_draw_ctx_t * draw_ctx, const lv_draw_rect_dsc_t * dsc, const lv_area_t * coords); + +void lv_draw_nema_gfx_rect(lv_draw_ctx_t * draw_ctx, const lv_draw_rect_dsc_t * dsc, const lv_area_t * coords); + +void lv_draw_nema_gfx_img_decoded(lv_draw_ctx_t * draw_ctx, const lv_draw_img_dsc_t * dsc, + const lv_area_t * coords, const uint8_t * map_p, lv_img_cf_t cf); + +void lv_draw_nema_gfx_letter(lv_draw_ctx_t * draw_ctx, const lv_draw_label_dsc_t * dsc, const lv_point_t * pos_p, + uint32_t letter); + +void lv_draw_nema_gfx_arc(lv_draw_ctx_t * draw_ctx, const lv_draw_arc_dsc_t * dsc, const lv_point_t * center, + uint16_t radius, + uint16_t start_angle, uint16_t end_angle); + +void lv_draw_nema_gfx_line(struct _lv_draw_ctx_t * draw_ctx, const lv_draw_line_dsc_t * dsc, + const lv_point_t * point1, const lv_point_t * point2); + +void lv_draw_nema_gfx_polygon(struct _lv_draw_ctx_t * draw_ctx, const lv_draw_rect_dsc_t * draw_dsc, + const lv_point_t * points, uint16_t point_cnt); + +lv_res_t lv_draw_nema_gfx_img(struct _lv_draw_ctx_t * draw_ctx, const lv_draw_img_dsc_t * dsc, + const lv_area_t * coords, + const void * src); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_NEMA_GFX*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_DRAW_NEMA_GFX_H*/ diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/nema_gfx/lv_draw_nema_gfx.mk b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/nema_gfx/lv_draw_nema_gfx.mk new file mode 100644 index 0000000..d4d59a9 --- /dev/null +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/nema_gfx/lv_draw_nema_gfx.mk @@ -0,0 +1,8 @@ +CSRCS += lv_draw_nema_gfx.c +CSRCS += lv_draw_nema_gfx_letter.c +CSRCS += lv_draw_nema_gfx_img.c + +DEPPATH += --dep-path $(LVGL_DIR)/$(LVGL_DIR_NAME)/src/draw/nema_gfx +VPATH += :$(LVGL_DIR)/$(LVGL_DIR_NAME)/src/draw/nema_gfx + +CFLAGS += "-I$(LVGL_DIR)/$(LVGL_DIR_NAME)/src/draw/nema_gfx" diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/nema_gfx/lv_draw_nema_gfx_img.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/nema_gfx/lv_draw_nema_gfx_img.c new file mode 100644 index 0000000..c6e4deb --- /dev/null +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/nema_gfx/lv_draw_nema_gfx_img.c @@ -0,0 +1,243 @@ +/** + * @file lv_draw_nema_gfx_img.c + * + */ + +/** + * MIT License + * + * ----------------------------------------------------------------------------- + * Copyright (c) 2008-24 Think Silicon Single Member PC + * ----------------------------------------------------------------------------- + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next paragraph) + * shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A + * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF + * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE + * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + */ + +/********************* + * INCLUDES + *********************/ +#include "../../core/lv_refr.h" + +#if LV_USE_NEMA_GFX + +#include "lv_draw_nema_gfx.h" +#include "lv_img_cache.h" +#include "../hal/lv_hal_disp.h" +#include "../misc/lv_log.h" +#include "../core/lv_refr.h" +#include "../misc/lv_mem.h" +#include "../misc/lv_math.h" +#include "lv_img_buf.h" +#include "../misc/lv_style.h" + +/********************** + * STATIC PROTOTYPES + **********************/ + +static void show_error(lv_draw_ctx_t * draw_ctx, const lv_area_t * coords, const char * msg); +static void draw_cleanup(_lv_img_cache_entry_t * cache); + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +bool lv_img_cf_alpha_only_format(lv_img_cf_t cf) +{ + bool is_alpha_format = false; + + switch(cf) { + case LV_IMG_CF_ALPHA_1BIT: + case LV_IMG_CF_ALPHA_2BIT: + case LV_IMG_CF_ALPHA_4BIT: + case LV_IMG_CF_ALPHA_8BIT: + is_alpha_format = true; + break; + default: + is_alpha_format = false; + break; + } + + return is_alpha_format; +} + + +bool lv_img_cf_lut_format(lv_img_cf_t cf) +{ + bool is_lut_format = false; + + switch(cf) { + case LV_IMG_CF_INDEXED_1BIT: + case LV_IMG_CF_INDEXED_2BIT: + case LV_IMG_CF_INDEXED_4BIT: + case LV_IMG_CF_INDEXED_8BIT: + is_lut_format = true; + break; + default: + is_lut_format = false; + break; + } + + return is_lut_format; +} + +lv_res_t lv_draw_nema_gfx_img(struct _lv_draw_ctx_t * draw_ctx, const lv_draw_img_dsc_t * draw_dsc, + const lv_area_t * coords, const void * src) +{ + if(draw_dsc->opa <= LV_OPA_MIN) return LV_RES_OK; + + _lv_img_cache_entry_t * cdsc = _lv_img_cache_open(src, draw_dsc->recolor, draw_dsc->frame_id); + + if(cdsc == NULL) return LV_RES_INV; + + lv_img_cf_t cf; + if(lv_img_cf_is_chroma_keyed(cdsc->dec_dsc.header.cf)) cf = LV_IMG_CF_TRUE_COLOR_CHROMA_KEYED; + else if(LV_IMG_CF_ALPHA_8BIT == cdsc->dec_dsc.header.cf) cf = LV_IMG_CF_ALPHA_8BIT; + else if(LV_IMG_CF_RGB565A8 == cdsc->dec_dsc.header.cf) cf = LV_IMG_CF_RGB565A8; + else if(lv_img_cf_has_alpha(cdsc->dec_dsc.header.cf)) cf = LV_IMG_CF_TRUE_COLOR_ALPHA; + else cf = LV_IMG_CF_TRUE_COLOR; + + if(cf == LV_IMG_CF_ALPHA_8BIT) { + if(draw_dsc->angle || draw_dsc->zoom != LV_IMG_ZOOM_NONE) { + /* resume normal method */ + cf = LV_IMG_CF_TRUE_COLOR_ALPHA; + cdsc->dec_dsc.img_data = NULL; + } + } + + if(cdsc->dec_dsc.error_msg != NULL) { + LV_LOG_WARN("Image draw error"); + + show_error(draw_ctx, coords, cdsc->dec_dsc.error_msg); + } + /*The decoder could open the image and gave the entire uncompressed image. + *Just draw it!*/ + else if(cdsc->dec_dsc.img_data || (lv_img_cf_alpha_only_format(cdsc->dec_dsc.header.cf)) || + lv_img_cf_lut_format(cdsc->dec_dsc.header.cf)) { + lv_area_t map_area_rot; + lv_area_copy(&map_area_rot, coords); + if(draw_dsc->angle || draw_dsc->zoom != LV_IMG_ZOOM_NONE) { + int32_t w = lv_area_get_width(coords); + int32_t h = lv_area_get_height(coords); + + _lv_img_buf_get_transformed_area(&map_area_rot, w, h, draw_dsc->angle, draw_dsc->zoom, &draw_dsc->pivot); + + map_area_rot.x1 += coords->x1; + map_area_rot.y1 += coords->y1; + map_area_rot.x2 += coords->x1; + map_area_rot.y2 += coords->y1; + } + + lv_area_t clip_com; /*Common area of mask and coords*/ + bool union_ok; + union_ok = _lv_area_intersect(&clip_com, draw_ctx->clip_area, &map_area_rot); + /*Out of mask. There is nothing to draw so the image is drawn successfully.*/ + if(union_ok == false) { + draw_cleanup(cdsc); + return LV_RES_OK; + } + + if(lv_img_cf_alpha_only_format(cdsc->dec_dsc.header.cf)) { + lv_color32_t tex_col32 = {.full = lv_color_to32(cdsc->dec_dsc.color)}; + uint32_t tex_color = nema_rgba(tex_col32.ch.red, tex_col32.ch.green, tex_col32.ch.blue, 0); + nema_set_tex_color(tex_color); + cf = cdsc->dec_dsc.header.cf; + } + + if(lv_img_cf_lut_format(cdsc->dec_dsc.header.cf)) { + cf = cdsc->dec_dsc.header.cf; + } + + const lv_area_t * clip_area_ori = draw_ctx->clip_area; + draw_ctx->clip_area = &clip_com; + uint8_t * img_data = (uint8_t *)(cdsc->dec_dsc.img_data) ? (uint8_t *)(cdsc->dec_dsc.img_data) : (uint8_t *)((( + lv_img_dsc_t *)src)->data); + lv_draw_img_decoded(draw_ctx, draw_dsc, coords, img_data, cf); + draw_ctx->clip_area = clip_area_ori; + } + /*The whole uncompressed image is not available. Try to read it line-by-line*/ + else { + lv_area_t mask_com; /*Common area of mask and coords*/ + bool union_ok; + union_ok = _lv_area_intersect(&mask_com, draw_ctx->clip_area, coords); + /*Out of mask. There is nothing to draw so the image is drawn successfully.*/ + if(union_ok == false) { + return LV_RES_OK; + } + int32_t width = lv_area_get_width(&mask_com); + uint8_t * buf = lv_mem_buf_get(lv_area_get_width(&mask_com) * + LV_IMG_PX_SIZE_ALPHA_BYTE); /*+1 because of the possible alpha byte*/ + const lv_area_t * clip_area_ori = draw_ctx->clip_area; + lv_area_t line; + lv_area_copy(&line, &mask_com); + lv_area_set_height(&line, 1); + int32_t x = mask_com.x1 - coords->x1; + int32_t y = mask_com.y1 - coords->y1; + int32_t row; + lv_res_t read_res; + for(row = mask_com.y1; row <= mask_com.y2; row++) { + lv_area_t mask_line; + union_ok = _lv_area_intersect(&mask_line, clip_area_ori, &line); + if(union_ok == false) continue; + + read_res = lv_img_decoder_read_line(&cdsc->dec_dsc, x, y, width, buf); + if(read_res != LV_RES_OK) { + lv_img_decoder_close(&cdsc->dec_dsc); + LV_LOG_WARN("Image draw can't read the line"); + lv_mem_buf_release(buf); + draw_cleanup(cdsc); + draw_ctx->clip_area = clip_area_ori; + return LV_RES_INV; + } + draw_ctx->clip_area = &mask_line; + lv_draw_img_decoded(draw_ctx, draw_dsc, &line, buf, cf); + line.y1++; + line.y2++; + y++; + } + draw_ctx->clip_area = clip_area_ori; + lv_mem_buf_release(buf); + } + + draw_cleanup(cdsc); + return LV_RES_OK; +} + +static void show_error(lv_draw_ctx_t * draw_ctx, const lv_area_t * coords, const char * msg) +{ + lv_draw_rect_dsc_t rect_dsc; + lv_draw_rect_dsc_init(&rect_dsc); + rect_dsc.bg_color = lv_color_white(); + lv_draw_rect(draw_ctx, &rect_dsc, coords); + + lv_draw_label_dsc_t label_dsc; + lv_draw_label_dsc_init(&label_dsc); + lv_draw_label(draw_ctx, &label_dsc, coords, msg, NULL); +} + +static void draw_cleanup(_lv_img_cache_entry_t * cache) +{ + /*Automatically close images with no caching*/ +#if LV_IMG_CACHE_DEF_SIZE == 0 + lv_img_decoder_close(&cache->dec_dsc); +#else + LV_UNUSED(cache); +#endif +} + +#endif \ No newline at end of file diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/nema_gfx/lv_draw_nema_gfx_letter.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/nema_gfx/lv_draw_nema_gfx_letter.c new file mode 100644 index 0000000..78e52a6 --- /dev/null +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/nema_gfx/lv_draw_nema_gfx_letter.c @@ -0,0 +1,330 @@ +/** + * @file lv_draw_nema_gfx_letter.c + * + */ + +/** + * MIT License + * + * ----------------------------------------------------------------------------- + * Copyright (c) 2008-24 Think Silicon Single Member PC + * ----------------------------------------------------------------------------- + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next paragraph) + * shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A + * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF + * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE + * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + */ + +/********************* + * INCLUDES + *********************/ +#include "../../hal/lv_hal_disp.h" +#include "../../misc/lv_math.h" +#include "../../misc/lv_assert.h" +#include "../../misc/lv_area.h" +#include "../../misc/lv_style.h" +#include "../../font/lv_font.h" +#include "../../core/lv_refr.h" +#include "lv_draw_nema_gfx.h" + +#if LV_USE_NEMA_GFX +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * FORWARD DECLARATION + **********************/ + +void nema_raster_rect(int x, int y, int w, int h); + +void nema_set_matrix(nema_matrix3x3_t m); + +/********************** + * STATIC PROTOTYPES + **********************/ + +LV_ATTRIBUTE_FAST_MEM static lv_res_t draw_nema_gfx_letter_normal(lv_draw_ctx_t * draw_ctx, + const lv_draw_label_dsc_t * dsc, + const lv_point_t * pos, lv_font_glyph_dsc_t * g, const uint8_t * map_p); + +LV_ATTRIBUTE_FAST_MEM static lv_res_t draw_nema_gfx_letter_blend(lv_draw_ctx_t * draw_ctx, + const lv_draw_sw_blend_dsc_t * dsc, lv_font_glyph_dsc_t * g); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * GLOBAL VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +/** + * Draw a letter in the Virtual Display Buffer + * @param pos_p left-top coordinate of the latter + * @param mask_p the letter will be drawn only on this area (truncated to draw_buf area) + * @param font_p pointer to font + * @param letter a letter to draw + * @param color color of letter + * @param opa opacity of letter (0..255) + */ +void lv_draw_nema_gfx_letter(lv_draw_ctx_t * draw_ctx, const lv_draw_label_dsc_t * dsc, const lv_point_t * pos_p, + uint32_t letter) +{ + lv_font_glyph_dsc_t g; + bool g_ret = lv_font_get_glyph_dsc(dsc->font, &g, letter, '\0'); + if(g_ret == false) { + /*Add warning if the dsc is not found + *but do not print warning for non printable ASCII chars (e.g. '\n')*/ + if(letter >= 0x20 && + letter != 0xf8ff && /*LV_SYMBOL_DUMMY*/ + letter != 0x200c) { /*ZERO WIDTH NON-JOINER*/ + LV_LOG_WARN("lv_draw_letter: glyph dsc. not found for U+%" PRIX32, letter); + +#if LV_USE_FONT_PLACEHOLDER + /* draw placeholder */ + lv_area_t glyph_coords; + lv_draw_rect_dsc_t glyph_dsc; + lv_coord_t begin_x = pos_p->x + g.ofs_x; + lv_coord_t begin_y = pos_p->y + g.ofs_y; + lv_area_set(&glyph_coords, begin_x, begin_y, begin_x + g.box_w, begin_y + g.box_h); + lv_draw_rect_dsc_init(&glyph_dsc); + glyph_dsc.bg_opa = LV_OPA_MIN; + glyph_dsc.outline_opa = LV_OPA_MIN; + glyph_dsc.shadow_opa = LV_OPA_MIN; + glyph_dsc.bg_img_opa = LV_OPA_MIN; + glyph_dsc.border_color = dsc->color; + glyph_dsc.border_width = 1; + draw_ctx->draw_rect(draw_ctx, &glyph_dsc, &glyph_coords); +#endif + } + return; + } + + /*Don't draw anything if the character is empty. E.g. space*/ + if((g.box_h == 0) || (g.box_w == 0)) return; + + lv_point_t gpos; + gpos.x = pos_p->x + g.ofs_x; + gpos.y = pos_p->y + (dsc->font->line_height - dsc->font->base_line) - g.box_h - g.ofs_y; + + /*If the letter is completely out of mask don't draw it*/ + if(gpos.x + g.box_w < draw_ctx->clip_area->x1 || + gpos.x > draw_ctx->clip_area->x2 || + gpos.y + g.box_h < draw_ctx->clip_area->y1 || + gpos.y > draw_ctx->clip_area->y2) { + return; + } + + if(g.resolved_font->subpx) { +#if LV_DRAW_COMPLEX && LV_USE_FONT_SUBPX + return lv_draw_sw_letter(draw_ctx, dsc, pos_p, letter); +#else + LV_LOG_WARN("Can't draw sub-pixel rendered letter because LV_USE_FONT_SUBPX == 0 in lv_conf.h"); + return ; +#endif + } + + const uint8_t * map_p = lv_font_get_glyph_bitmap(g.resolved_font, letter); + if(map_p == NULL) { + LV_LOG_WARN("lv_draw_letter: character's bitmap not found"); + return; + } + + if(draw_nema_gfx_letter_normal(draw_ctx, dsc, &gpos, &g, map_p) != LV_RES_OK) + return lv_draw_sw_letter(draw_ctx, dsc, pos_p, letter); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +LV_ATTRIBUTE_FAST_MEM static lv_res_t draw_nema_gfx_letter_normal(lv_draw_ctx_t * draw_ctx, + const lv_draw_label_dsc_t * dsc, + const lv_point_t * pos, lv_font_glyph_dsc_t * g, const uint8_t * map_p) +{ + + uint32_t bpp = g->bpp; + lv_opa_t opa = dsc->opa; + if(bpp == 3) bpp = 4; + +#if LV_USE_IMGFONT + if(bpp == LV_IMGFONT_BPP) { //is imgfont + lv_area_t fill_area; + fill_area.x1 = pos->x; + fill_area.y1 = pos->y; + fill_area.x2 = pos->x + g->box_w - 1; + fill_area.y2 = pos->y + g->box_h - 1; + lv_draw_img_dsc_t img_dsc; + lv_draw_img_dsc_init(&img_dsc); + img_dsc.angle = 0; + img_dsc.zoom = LV_IMG_ZOOM_NONE; + img_dsc.opa = dsc->opa; + img_dsc.blend_mode = dsc->blend_mode; + lv_draw_img(draw_ctx, &img_dsc, &fill_area, map_p); + return; + } +#endif + + int32_t box_w = g->box_w; + int32_t box_h = g->box_h; + + /*Calculate the col/row start/end on the map*/ + int32_t col_start = pos->x >= draw_ctx->clip_area->x1 ? 0 : draw_ctx->clip_area->x1 - pos->x; + int32_t col_end = pos->x + box_w <= draw_ctx->clip_area->x2 ? box_w : draw_ctx->clip_area->x2 - pos->x + 1; + int32_t row_start = pos->y >= draw_ctx->clip_area->y1 ? 0 : draw_ctx->clip_area->y1 - pos->y; + int32_t row_end = pos->y + box_h <= draw_ctx->clip_area->y2 ? box_h : draw_ctx->clip_area->y2 - pos->y + 1; + + lv_draw_sw_blend_dsc_t blend_dsc; + lv_memset_00(&blend_dsc, sizeof(blend_dsc)); + blend_dsc.color = dsc->color; + blend_dsc.opa = dsc->opa; + blend_dsc.blend_mode = dsc->blend_mode; + + lv_coord_t hor_res = lv_disp_get_hor_res(_lv_refr_get_disp_refreshing()); + uint32_t mask_buf_size = box_w * box_h > hor_res ? hor_res : box_w * box_h; + blend_dsc.mask_buf = (uint8_t *)map_p; + + /*Initially leave fill area as is, to check for mask_area*/ + lv_area_t fill_area; + fill_area.x1 = col_start + pos->x; + fill_area.x2 = col_end + pos->x - 1; + fill_area.y1 = row_start + pos->y; + fill_area.y2 = row_end + pos->y - 1; + +#if LV_DRAW_COMPLEX + lv_coord_t fill_w = lv_area_get_width(&fill_area); + lv_area_t mask_area; + lv_area_copy(&mask_area, &fill_area); + mask_area.y2 = mask_area.y1 + row_end; + bool mask_any = lv_draw_mask_is_any(&mask_area); +#endif + /*After the mask checking change fill area to what NemaGFX wants*/ + fill_area.x1 = pos->x; + fill_area.y1 = pos->y; + + blend_dsc.blend_area = &fill_area; + blend_dsc.mask_area = &fill_area; + +#if LV_DRAW_COMPLEX + /*Apply masks if any*/ + if(mask_any) { + return LV_RES_INV; + } +#endif + lv_res_t result = draw_nema_gfx_letter_blend(draw_ctx, &blend_dsc, g); + return result; +} + +static inline uint8_t _bpp_nema_gfx_format(lv_font_glyph_dsc_t * g) +{ + + uint32_t bpp = g->bpp ; + if(bpp == 3) bpp = 4; + + switch(bpp) { + case 1: + return NEMA_A1; + case 2: + return NEMA_A2; + case 4: + return NEMA_A4; + default: + return NEMA_A8; + } +} + +LV_ATTRIBUTE_FAST_MEM static lv_res_t draw_nema_gfx_letter_blend(lv_draw_ctx_t * draw_ctx, + const lv_draw_sw_blend_dsc_t * dsc, lv_font_glyph_dsc_t * g) +{ + lv_draw_nema_gfx_ctx_t * nema_gfx_draw_ctx = (lv_draw_nema_gfx_ctx_t *)draw_ctx; + + lv_area_t blend_area; + + /*Let's get the blend area which is the intersection of the area to fill and the clip area.*/ + if(!_lv_area_intersect(&blend_area, dsc->blend_area, draw_ctx->clip_area)) + return LV_RES_OK; /*Fully clipped, nothing to do*/ + + /*Make the blend area relative to the buffer*/ + lv_area_move(&blend_area, -draw_ctx->buf_area->x1, -draw_ctx->buf_area->y1); + + nema_bind_dst_tex((uintptr_t)NEMA_VIRT2PHYS(draw_ctx->buf), lv_area_get_width(draw_ctx->buf_area), + lv_area_get_height(draw_ctx->buf_area), LV_NEMA_GFX_COLOR_FORMAT, + lv_area_get_width(draw_ctx->buf_area)*LV_NEMA_GFX_FORMAT_MULTIPLIER); + + //Set Clipping Area + lv_area_t clip_area; + lv_area_copy(&clip_area, draw_ctx->clip_area); + lv_area_move(&clip_area, -draw_ctx->buf_area->x1, -draw_ctx->buf_area->y1); + + nema_set_clip(clip_area.x1, clip_area.y1, lv_area_get_width(&clip_area), lv_area_get_height(&clip_area)); + + uint8_t opacity; + lv_color32_t col32 = {.full = lv_color_to32(dsc->color)}; + if(dsc->opa < LV_OPA_MAX && dsc->opa > LV_OPA_MIN) { + opacity = (uint8_t)(((uint16_t)col32.ch.alpha * dsc->opa) >> 8); + } + else if(dsc->opa >= LV_OPA_MAX) { + opacity = col32.ch.alpha; + } + + uint32_t color = nema_rgba(col32.ch.red, col32.ch.green, col32.ch.blue, opacity); + + nema_set_tex_color(color); + + lv_coord_t x = dsc->blend_area->x1; + lv_coord_t y = dsc->blend_area->y1; + lv_coord_t w = g->box_w; + lv_coord_t h = g->box_h; + + nema_bind_src_tex((uintptr_t)(dsc->mask_buf), w * h, 1, _bpp_nema_gfx_format(g), -1, 1); + + if(opacity < 255U) { + nema_set_blend_blit(NEMA_BL_SIMPLE | NEMA_BLOP_MODULATE_A); + nema_set_const_color(color); + } + else { + nema_set_blend_blit(NEMA_BL_SIMPLE); + } + + nema_matrix3x3_t m = { + 1, w, -x - (y * w) - (0.5 * w), + 0, 1, 0, + 0, 0, 1 + }; + + nema_set_matrix(m); + nema_raster_rect(x, y, w, h); + + nema_cl_submit(&(nema_gfx_draw_ctx->cl)); + + return LV_RES_OK; + +} +#endif diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/nxp/lv_draw_nxp.mk b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/nxp/lv_draw_nxp.mk similarity index 93% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/nxp/lv_draw_nxp.mk rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/nxp/lv_draw_nxp.mk index 17371ac..18a751e 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/nxp/lv_draw_nxp.mk +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/nxp/lv_draw_nxp.mk @@ -1,5 +1,3 @@ -CSRCS += lv_gpu_nxp.c - DEPPATH += --dep-path $(LVGL_DIR)/$(LVGL_DIR_NAME)/src/draw/nxp VPATH += :$(LVGL_DIR)/$(LVGL_DIR_NAME)/src/draw/nxp diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/nxp/pxp/lv_draw_nxp_pxp.mk b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/nxp/pxp/lv_draw_nxp_pxp.mk similarity index 92% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/nxp/pxp/lv_draw_nxp_pxp.mk rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/nxp/pxp/lv_draw_nxp_pxp.mk index ff475a1..5c684bc 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/nxp/pxp/lv_draw_nxp_pxp.mk +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/nxp/pxp/lv_draw_nxp_pxp.mk @@ -1,3 +1,4 @@ +CSRCS += lv_draw_pxp.c CSRCS += lv_draw_pxp_blend.c CSRCS += lv_gpu_nxp_pxp_osa.c CSRCS += lv_gpu_nxp_pxp.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/nxp/pxp/lv_draw_pxp.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/nxp/pxp/lv_draw_pxp.c new file mode 100644 index 0000000..cd70f48 --- /dev/null +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/nxp/pxp/lv_draw_pxp.c @@ -0,0 +1,275 @@ +/** + * @file lv_draw_pxp.c + * + */ + +/** + * MIT License + * + * Copyright 2022, 2023 NXP + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next paragraph) + * shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A + * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF + * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE + * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_draw_pxp.h" + +#if LV_USE_GPU_NXP_PXP +#include "lv_draw_pxp_blend.h" + +#if LV_COLOR_DEPTH != 32 + #include "../../../core/lv_refr.h" +#endif + +/********************* + * DEFINES + *********************/ + +/* Minimum area (in pixels) for PXP blit/fill processing. */ +#ifndef LV_GPU_NXP_PXP_SIZE_LIMIT + #define LV_GPU_NXP_PXP_SIZE_LIMIT 5000 +#endif + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +static void lv_draw_pxp_wait_for_finish(lv_draw_ctx_t * draw_ctx); + +static void lv_draw_pxp_blend(lv_draw_ctx_t * draw_ctx, const lv_draw_sw_blend_dsc_t * dsc); + +static void lv_draw_pxp_img_decoded(lv_draw_ctx_t * draw_ctx, const lv_draw_img_dsc_t * dsc, + const lv_area_t * coords, const uint8_t * map_p, lv_img_cf_t cf); + +static void lv_draw_pxp_buffer_copy(lv_draw_ctx_t * draw_ctx, + void * dest_buf, lv_coord_t dest_stride, const lv_area_t * dest_area, + void * src_buf, lv_coord_t src_stride, const lv_area_t * src_area); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_draw_pxp_ctx_init(lv_disp_drv_t * drv, lv_draw_ctx_t * draw_ctx) +{ + lv_draw_sw_init_ctx(drv, draw_ctx); + + lv_draw_pxp_ctx_t * pxp_draw_ctx = (lv_draw_sw_ctx_t *)draw_ctx; + pxp_draw_ctx->base_draw.draw_img_decoded = lv_draw_pxp_img_decoded; + pxp_draw_ctx->blend = lv_draw_pxp_blend; + pxp_draw_ctx->base_draw.wait_for_finish = lv_draw_pxp_wait_for_finish; + pxp_draw_ctx->base_draw.buffer_copy = lv_draw_pxp_buffer_copy; +} + +void lv_draw_pxp_ctx_deinit(lv_disp_drv_t * drv, lv_draw_ctx_t * draw_ctx) +{ + lv_draw_sw_deinit_ctx(drv, draw_ctx); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +/** + * During rendering, LVGL might initializes new draw_ctxs and start drawing into + * a separate buffer (called layer). If the content to be rendered has "holes", + * e.g. rounded corner, LVGL temporarily sets the disp_drv.screen_transp flag. + * It means the renderers should draw into an ARGB buffer. + * With 32 bit color depth it's not a big problem but with 16 bit color depth + * the target pixel format is ARGB8565 which is not supported by the GPU. + * In this case, the PXP callbacks should fallback to SW rendering. + */ +static inline bool need_argb8565_support() +{ +#if LV_COLOR_DEPTH != 32 + lv_disp_t * disp = _lv_refr_get_disp_refreshing(); + + if(disp->driver->screen_transp == 1) + return true; +#endif + + return false; +} + +static void lv_draw_pxp_wait_for_finish(lv_draw_ctx_t * draw_ctx) +{ + lv_gpu_nxp_pxp_wait(); + + lv_draw_sw_wait_for_finish(draw_ctx); +} + +static void lv_draw_pxp_blend(lv_draw_ctx_t * draw_ctx, const lv_draw_sw_blend_dsc_t * dsc) +{ + if(dsc->opa <= (lv_opa_t)LV_OPA_MIN) + return; + + if(need_argb8565_support()) { + lv_draw_sw_blend_basic(draw_ctx, dsc); + return; + } + + lv_area_t blend_area; + /*Let's get the blend area which is the intersection of the area to draw and the clip area*/ + if(!_lv_area_intersect(&blend_area, dsc->blend_area, draw_ctx->clip_area)) + return; /*Fully clipped, nothing to do*/ + + /*Make the blend area relative to the buffer*/ + lv_area_move(&blend_area, -draw_ctx->buf_area->x1, -draw_ctx->buf_area->y1); + if(dsc->mask_buf != NULL || dsc->blend_mode != LV_BLEND_MODE_NORMAL || + lv_area_get_size(&blend_area) < LV_GPU_NXP_PXP_SIZE_LIMIT) { + lv_draw_sw_blend_basic(draw_ctx, dsc); + return; + } + + /*Fill/Blend only non masked, normal blended*/ + lv_color_t * dest_buf = draw_ctx->buf; + lv_coord_t dest_stride = lv_area_get_width(draw_ctx->buf_area); + const lv_color_t * src_buf = dsc->src_buf; + + if(src_buf == NULL) { + lv_gpu_nxp_pxp_fill(dest_buf, &blend_area, dest_stride, dsc->color, dsc->opa); + } + else { + lv_area_t src_area; + src_area.x1 = blend_area.x1 - (dsc->blend_area->x1 - draw_ctx->buf_area->x1); + src_area.y1 = blend_area.y1 - (dsc->blend_area->y1 - draw_ctx->buf_area->y1); + src_area.x2 = src_area.x1 + lv_area_get_width(dsc->blend_area) - 1; + src_area.y2 = src_area.y1 + lv_area_get_height(dsc->blend_area) - 1; + lv_coord_t src_stride = lv_area_get_width(dsc->blend_area); + + lv_gpu_nxp_pxp_blit(dest_buf, &blend_area, dest_stride, src_buf, &src_area, src_stride, + dsc->opa, LV_DISP_ROT_NONE); + } +} + +static void lv_draw_pxp_img_decoded(lv_draw_ctx_t * draw_ctx, const lv_draw_img_dsc_t * dsc, + const lv_area_t * coords, const uint8_t * map_p, lv_img_cf_t cf) +{ + if(dsc->opa <= (lv_opa_t)LV_OPA_MIN) + return; + + if(need_argb8565_support()) { + lv_draw_sw_img_decoded(draw_ctx, dsc, coords, map_p, cf); + return; + } + + const lv_color_t * src_buf = (const lv_color_t *)map_p; + if(!src_buf) { + lv_draw_sw_img_decoded(draw_ctx, dsc, coords, map_p, cf); + return; + } + + lv_area_t rel_coords; + lv_area_copy(&rel_coords, coords); + lv_area_move(&rel_coords, -draw_ctx->buf_area->x1, -draw_ctx->buf_area->y1); + + lv_area_t rel_clip_area; + lv_area_copy(&rel_clip_area, draw_ctx->clip_area); + lv_area_move(&rel_clip_area, -draw_ctx->buf_area->x1, -draw_ctx->buf_area->y1); + + bool has_scale = (dsc->zoom != LV_IMG_ZOOM_NONE); + bool has_rotation = (dsc->angle != 0); + bool unsup_rotation = false; + + lv_area_t blend_area; + if(has_rotation) + lv_area_copy(&blend_area, &rel_coords); + else if(!_lv_area_intersect(&blend_area, &rel_coords, &rel_clip_area)) + return; /*Fully clipped, nothing to do*/ + + bool has_mask = lv_draw_mask_is_any(&blend_area); + lv_coord_t src_width = lv_area_get_width(coords); + lv_coord_t src_height = lv_area_get_height(coords); + + if(has_rotation) { + /* + * PXP can only rotate at 90x angles. + */ + if(dsc->angle % 900) { + PXP_LOG_TRACE("Rotation angle %d is not supported. PXP can rotate only 90x angle.", dsc->angle); + unsup_rotation = true; + } + + /* + * PXP is set to process 16x16 blocks to optimize the system for memory + * bandwidth and image processing time. + * The output engine essentially truncates any output pixels after the + * desired number of pixels has been written. + * When rotating a source image and the output is not divisible by the block + * size, the incorrect pixels could be truncated and the final output image + * can look shifted. + */ + if(src_width % 16 || src_height % 16) { + PXP_LOG_TRACE("Rotation is not supported for image w/o alignment to block size 16x16."); + unsup_rotation = true; + } + } + + if(has_mask || has_scale || unsup_rotation || lv_area_get_size(&blend_area) < LV_GPU_NXP_PXP_SIZE_LIMIT +#if LV_COLOR_DEPTH != 32 + || lv_img_cf_has_alpha(cf) +#endif + ) { + lv_draw_sw_img_decoded(draw_ctx, dsc, coords, map_p, cf); + return; + } + + lv_color_t * dest_buf = draw_ctx->buf; + lv_coord_t dest_stride = lv_area_get_width(draw_ctx->buf_area); + + lv_area_t src_area; + src_area.x1 = blend_area.x1 - (coords->x1 - draw_ctx->buf_area->x1); + src_area.y1 = blend_area.y1 - (coords->y1 - draw_ctx->buf_area->y1); + src_area.x2 = src_area.x1 + src_width - 1; + src_area.y2 = src_area.y1 + src_height - 1; + lv_coord_t src_stride = lv_area_get_width(coords); + + lv_gpu_nxp_pxp_blit_transform(dest_buf, &blend_area, dest_stride, src_buf, &src_area, src_stride, + dsc, cf); +} + +static void lv_draw_pxp_buffer_copy(lv_draw_ctx_t * draw_ctx, + void * dest_buf, lv_coord_t dest_stride, const lv_area_t * dest_area, + void * src_buf, lv_coord_t src_stride, const lv_area_t * src_area) +{ + LV_UNUSED(draw_ctx); + + if(lv_area_get_size(dest_area) < LV_GPU_NXP_PXP_SIZE_LIMIT) { + lv_draw_sw_buffer_copy(draw_ctx, dest_buf, dest_stride, dest_area, src_buf, src_stride, src_area); + return; + } + + lv_gpu_nxp_pxp_buffer_copy(dest_buf, dest_area, dest_stride, src_buf, src_area, src_stride); +} + +#endif /*LV_USE_GPU_NXP_PXP*/ diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/nxp/lv_gpu_nxp.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/nxp/pxp/lv_draw_pxp.h similarity index 77% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/nxp/lv_gpu_nxp.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/nxp/pxp/lv_draw_pxp.h index 899aff2..1ace3bc 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/nxp/lv_gpu_nxp.h +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/nxp/pxp/lv_draw_pxp.h @@ -1,12 +1,12 @@ /** - * @file lv_gpu_nxp.h + * @file lv_draw_pxp.h * */ /** * MIT License * - * Copyright 2022 NXP + * Copyright 2022, 2023 NXP * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -27,8 +27,8 @@ * */ -#ifndef LV_GPU_NXP_H -#define LV_GPU_NXP_H +#ifndef LV_DRAW_PXP_H +#define LV_DRAW_PXP_H #ifdef __cplusplus extern "C" { @@ -38,9 +38,10 @@ extern "C" { * INCLUDES *********************/ -#include "../../lv_conf_internal.h" -#if LV_USE_GPU_NXP_PXP || LV_USE_GPU_NXP_VG_LITE -#include "../sw/lv_draw_sw.h" +#include "../../../lv_conf_internal.h" + +#if LV_USE_GPU_NXP_PXP +#include "../../sw/lv_draw_sw.h" /********************* * DEFINES @@ -49,23 +50,23 @@ extern "C" { /********************** * TYPEDEFS **********************/ -typedef lv_draw_sw_ctx_t lv_draw_nxp_ctx_t; +typedef lv_draw_sw_ctx_t lv_draw_pxp_ctx_t; /********************** * GLOBAL PROTOTYPES **********************/ -void lv_draw_nxp_ctx_init(struct _lv_disp_drv_t * drv, lv_draw_ctx_t * draw_ctx); +void lv_draw_pxp_ctx_init(struct _lv_disp_drv_t * drv, lv_draw_ctx_t * draw_ctx); -void lv_draw_nxp_ctx_deinit(struct _lv_disp_drv_t * drv, lv_draw_ctx_t * draw_ctx); +void lv_draw_pxp_ctx_deinit(struct _lv_disp_drv_t * drv, lv_draw_ctx_t * draw_ctx); /********************** * MACROS **********************/ -#endif /*LV_USE_GPU_NXP_PXP || LV_USE_GPU_NXP_VG_LITE*/ +#endif /*LV_USE_GPU_NXP_PXP*/ #ifdef __cplusplus } /*extern "C"*/ #endif -#endif /*LV_GPU_NXP_H*/ +#endif /*LV_DRAW_PXP_H*/ diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/nxp/pxp/lv_draw_pxp_blend.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/nxp/pxp/lv_draw_pxp_blend.c similarity index 55% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/nxp/pxp/lv_draw_pxp_blend.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/nxp/pxp/lv_draw_pxp_blend.c index c0a6eca..8292576 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/nxp/pxp/lv_draw_pxp_blend.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/nxp/pxp/lv_draw_pxp_blend.c @@ -6,7 +6,7 @@ /** * MIT License * - * Copyright 2020-2022 NXP + * Copyright 2020-2023 NXP * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -34,6 +34,7 @@ #include "lv_draw_pxp_blend.h" #if LV_USE_GPU_NXP_PXP +#include "lvgl_support.h" /********************* * DEFINES @@ -43,25 +44,25 @@ #error Color swap not implemented. Disable LV_COLOR_16_SWAP feature. #endif -#if LV_COLOR_DEPTH==16 +#if LV_COLOR_DEPTH == 16 #define PXP_OUT_PIXEL_FORMAT kPXP_OutputPixelFormatRGB565 #define PXP_AS_PIXEL_FORMAT kPXP_AsPixelFormatRGB565 #define PXP_PS_PIXEL_FORMAT kPXP_PsPixelFormatRGB565 -#elif LV_COLOR_DEPTH==32 + #define PXP_TEMP_BUF_SIZE LCD_WIDTH * LCD_HEIGHT * 2U +#elif LV_COLOR_DEPTH == 32 #define PXP_OUT_PIXEL_FORMAT kPXP_OutputPixelFormatARGB8888 #define PXP_AS_PIXEL_FORMAT kPXP_AsPixelFormatARGB8888 - #define PXP_PS_PIXEL_FORMAT kPXP_PsPixelFormatRGB888 + #if (!(defined(FSL_FEATURE_PXP_HAS_NO_EXTEND_PIXEL_FORMAT) && FSL_FEATURE_PXP_HAS_NO_EXTEND_PIXEL_FORMAT)) && \ + (!(defined(FSL_FEATURE_PXP_V3) && FSL_FEATURE_PXP_V3)) + #define PXP_PS_PIXEL_FORMAT kPXP_PsPixelFormatARGB8888 + #else + #define PXP_PS_PIXEL_FORMAT kPXP_PsPixelFormatRGB888 + #endif + #define PXP_TEMP_BUF_SIZE LCD_WIDTH * LCD_HEIGHT * 4U #elif #error Only 16bit and 32bit color depth are supported. Set LV_COLOR_DEPTH to 16 or 32. #endif -#if defined (__alpha__) || defined (__ia64__) || defined (__x86_64__) \ - || defined (_WIN64) || defined (__LP64__) || defined (__LLP64__) - #define ALIGN_SIZE 8 -#else - #define ALIGN_SIZE 4 -#endif - /********************** * TYPEDEFS **********************/ @@ -70,63 +71,60 @@ * STATIC PROTOTYPES **********************/ +static LV_ATTRIBUTE_MEM_ALIGN uint8_t temp_buf[PXP_TEMP_BUF_SIZE]; + /** * BLock Image Transfer - copy rectangular image from src buffer to dst buffer * with combination of transformation (rotation, scale, recolor) and opacity, alpha channel * or color keying. This requires two steps. First step is used for transformation into * a temporary buffer and the second one will handle the color format or opacity. * - * @param[in/out] dest_buf destination buffer - * @param[in] dest_area area to be copied from src_buf to dst_buf - * @param[in] dest_stride width (stride) of destination buffer in pixels - * @param[in] src_buf source buffer - * @param[in] src_area source area with absolute coordinates to draw on destination buffer - * @param[in] dsc image descriptor - * @param[in] cf color format - * @retval LV_RES_OK Fill completed - * @retval LV_RES_INV Error occurred (\see LV_GPU_NXP_PXP_LOG_ERRORS) + * @param[in/out] dest_buf Destination buffer + * @param[in] dest_area Area with relative coordinates of destination buffer + * @param[in] dest_stride Stride of destination buffer in pixels + * @param[in] src_buf Source buffer + * @param[in] src_area Area with relative coordinates of source buffer + * @param[in] src_stride Stride of source buffer in pixels + * @param[in] dsc Image descriptor + * @param[in] cf Color format */ -static lv_res_t lv_gpu_nxp_pxp_blit_opa(lv_color_t * dest_buf, const lv_area_t * dest_area, lv_coord_t dest_stride, - const lv_color_t * src_buf, const lv_area_t * src_area, - const lv_draw_img_dsc_t * dsc, lv_img_cf_t cf); +static void lv_pxp_blit_opa(lv_color_t * dest_buf, const lv_area_t * dest_area, lv_coord_t dest_stride, + const lv_color_t * src_buf, const lv_area_t * src_area, lv_coord_t src_stride, + const lv_draw_img_dsc_t * dsc, lv_img_cf_t cf); /** * BLock Image Transfer - copy rectangular image from src buffer to dst buffer * with transformation and full opacity. * - * @param[in/out] dest_buf destination buffer - * @param[in] dest_area area to be copied from src_buf to dst_buf - * @param[in] dest_stride width (stride) of destination buffer in pixels - * @param[in] src_buf source buffer - * @param[in] src_area source area with absolute coordinates to draw on destination buffer - * @param[in] dsc image descriptor - * @param[in] cf color format - * @retval LV_RES_OK Fill completed - * @retval LV_RES_INV Error occurred (\see LV_GPU_NXP_PXP_LOG_ERRORS) + * @param[in/out] dest_buf Destination buffer + * @param[in] dest_area Area with relative coordinates of destination buffer + * @param[in] dest_stride Stride of destination buffer in pixels + * @param[in] src_buf Source buffer + * @param[in] src_area Area with relative coordinates of source buffer + * @param[in] src_stride Stride of source buffer in pixels + * @param[in] dsc Image descriptor + * @param[in] cf Color format */ -static lv_res_t lv_gpu_nxp_pxp_blit_cover(lv_color_t * dest_buf, const lv_area_t * dest_area, - lv_coord_t dest_stride, - const lv_color_t * src_buf, const lv_area_t * src_area, - const lv_draw_img_dsc_t * dsc, lv_img_cf_t cf); +static void lv_pxp_blit_cover(lv_color_t * dest_buf, lv_area_t * dest_area, lv_coord_t dest_stride, + const lv_color_t * src_buf, const lv_area_t * src_area, lv_coord_t src_stride, + const lv_draw_img_dsc_t * dsc, lv_img_cf_t cf); /** * BLock Image Transfer - copy rectangular image from src buffer to dst buffer * without transformation but handling color format or opacity. * - * @param[in/out] dest_buf destination buffer - * @param[in] dest_area area to be copied from src_buf to dst_buf - * @param[in] dest_stride width (stride) of destination buffer in pixels - * @param[in] src_buf source buffer - * @param[in] src_area source area with absolute coordinates to draw on destination buffer - * @param[in] dsc image descriptor - * @param[in] cf color format - * @retval LV_RES_OK Fill completed - * @retval LV_RES_INV Error occurred (\see LV_GPU_NXP_PXP_LOG_ERRORS) + * @param[in/out] dest_buf Destination buffer + * @param[in] dest_area Area with relative coordinates of destination buffer + * @param[in] dest_stride Stride of destination buffer in pixels + * @param[in] src_buf Source buffer + * @param[in] src_area Area with relative coordinates of source buffer + * @param[in] src_stride Stride of source buffer in pixels + * @param[in] dsc Image descriptor + * @param[in] cf Color format */ -static lv_res_t lv_gpu_nxp_pxp_blit_cf(lv_color_t * dest_buf, const lv_area_t * dest_area, - lv_coord_t dest_stride, - const lv_color_t * src_buf, const lv_area_t * src_area, - const lv_draw_img_dsc_t * dsc, lv_img_cf_t cf); +static void lv_pxp_blit_cf(lv_color_t * dest_buf, const lv_area_t * dest_area, lv_coord_t dest_stride, + const lv_color_t * src_buf, const lv_area_t * src_area, lv_coord_t src_stride, + const lv_draw_img_dsc_t * dsc, lv_img_cf_t cf); /********************** * STATIC VARIABLES @@ -136,45 +134,27 @@ static lv_res_t lv_gpu_nxp_pxp_blit_cf(lv_color_t * dest_buf, const lv_area_t * * MACROS **********************/ -#define ROUND_UP(x, align) ((x + (align - 1)) & ~(align - 1)) - /********************** * GLOBAL FUNCTIONS **********************/ -lv_res_t lv_gpu_nxp_pxp_fill(lv_color_t * dest_buf, lv_coord_t dest_stride, const lv_area_t * fill_area, - lv_color_t color, lv_opa_t opa) +void lv_gpu_nxp_pxp_fill(lv_color_t * dest_buf, const lv_area_t * dest_area, lv_coord_t dest_stride, + lv_color_t color, lv_opa_t opa) { - uint32_t area_size = lv_area_get_size(fill_area); - lv_coord_t area_w = lv_area_get_width(fill_area); - lv_coord_t area_h = lv_area_get_height(fill_area); + lv_coord_t dest_w = lv_area_get_width(dest_area); + lv_coord_t dest_h = lv_area_get_height(dest_area); - if(opa >= (lv_opa_t)LV_OPA_MAX) { - if(area_size < LV_GPU_NXP_PXP_FILL_SIZE_LIMIT) { - PXP_LOG_TRACE("Area size %d smaller than limit %d.", area_size, LV_GPU_NXP_PXP_FILL_SIZE_LIMIT); - return LV_RES_INV; - } - } - else { - if(area_size < LV_GPU_NXP_PXP_FILL_OPA_SIZE_LIMIT) { - PXP_LOG_TRACE("Area size %d smaller than limit %d.", area_size, LV_GPU_NXP_PXP_FILL_OPA_SIZE_LIMIT); - return LV_RES_INV; - } - } - - PXP_Init(LV_GPU_NXP_PXP_ID); - PXP_EnableCsc1(LV_GPU_NXP_PXP_ID, false); /*Disable CSC1, it is enabled by default.*/ - PXP_SetProcessBlockSize(LV_GPU_NXP_PXP_ID, kPXP_BlockSize16); /*Block size 16x16 for higher performance*/ + lv_gpu_nxp_pxp_reset(); /*OUT buffer configure*/ pxp_output_buffer_config_t outputConfig = { .pixelFormat = PXP_OUT_PIXEL_FORMAT, .interlacedMode = kPXP_OutputProgressive, - .buffer0Addr = (uint32_t)(dest_buf + dest_stride * fill_area->y1 + fill_area->x1), + .buffer0Addr = (uint32_t)(dest_buf + dest_stride * dest_area->y1 + dest_area->x1), .buffer1Addr = (uint32_t)NULL, .pitchBytes = dest_stride * sizeof(lv_color_t), - .width = area_w, - .height = area_h + .width = dest_w, + .height = dest_h }; PXP_SetOutputBufferConfig(LV_GPU_NXP_PXP_ID, &outputConfig); @@ -193,7 +173,7 @@ lv_res_t lv_gpu_nxp_pxp_fill(lv_color_t * dest_buf, lv_coord_t dest_stride, cons }; PXP_SetAlphaSurfaceBufferConfig(LV_GPU_NXP_PXP_ID, &asBufferConfig); - PXP_SetAlphaSurfacePosition(LV_GPU_NXP_PXP_ID, 0U, 0U, area_w, area_h); + PXP_SetAlphaSurfacePosition(LV_GPU_NXP_PXP_ID, 0U, 0U, dest_w - 1U, dest_h - 1U); } /*Disable PS, use as color generator*/ @@ -223,34 +203,19 @@ lv_res_t lv_gpu_nxp_pxp_fill(lv_color_t * dest_buf, lv_coord_t dest_stride, cons PXP_SetPorterDuffConfig(LV_GPU_NXP_PXP_ID, &pdConfig); - lv_gpu_nxp_pxp_run(); /*Start PXP task*/ - - return LV_RES_OK; + lv_gpu_nxp_pxp_run(); } -lv_res_t lv_gpu_nxp_pxp_blit(lv_color_t * dest_buf, const lv_area_t * dest_area, lv_coord_t dest_stride, - const lv_color_t * src_buf, const lv_area_t * src_area, lv_opa_t opa, lv_disp_rot_t angle) +void lv_gpu_nxp_pxp_blit(lv_color_t * dest_buf, const lv_area_t * dest_area, lv_coord_t dest_stride, + const lv_color_t * src_buf, const lv_area_t * src_area, lv_coord_t src_stride, + lv_opa_t opa, lv_disp_rot_t angle) { - uint32_t dest_size = lv_area_get_size(dest_area); lv_coord_t dest_w = lv_area_get_width(dest_area); lv_coord_t dest_h = lv_area_get_height(dest_area); + lv_coord_t src_w = lv_area_get_width(src_area); + lv_coord_t src_h = lv_area_get_height(src_area); - if(opa >= (lv_opa_t)LV_OPA_MAX) { - if(dest_size < LV_GPU_NXP_PXP_BLIT_SIZE_LIMIT) { - PXP_LOG_TRACE("Area size %d smaller than limit %d.", dest_size, LV_GPU_NXP_PXP_BLIT_SIZE_LIMIT); - return LV_RES_INV; - } - } - else { - if(dest_size < LV_GPU_NXP_PXP_BLIT_OPA_SIZE_LIMIT) { - PXP_LOG_TRACE("Area size %d smaller than limit %d.", dest_size, LV_GPU_NXP_PXP_BLIT_OPA_SIZE_LIMIT); - return LV_RES_INV; - } - } - - PXP_Init(LV_GPU_NXP_PXP_ID); - PXP_EnableCsc1(LV_GPU_NXP_PXP_ID, false); /*Disable CSC1, it is enabled by default.*/ - PXP_SetProcessBlockSize(LV_GPU_NXP_PXP_ID, kPXP_BlockSize16); /*block size 16x16 for higher performance*/ + lv_gpu_nxp_pxp_reset(); /* convert rotation angle */ pxp_rotate_degree_t pxp_rot; @@ -297,19 +262,17 @@ lv_res_t lv_gpu_nxp_pxp_blit(lv_color_t * dest_buf, const lv_area_t * dest_area, asBlendConfig.alphaMode = kPXP_AlphaOverride; PXP_SetProcessSurfaceBufferConfig(LV_GPU_NXP_PXP_ID, &psBufferConfig); - PXP_SetProcessSurfacePosition(LV_GPU_NXP_PXP_ID, 0U, 0U, dest_w - 1, dest_h - 1); + PXP_SetProcessSurfacePosition(LV_GPU_NXP_PXP_ID, 0U, 0U, dest_w - 1U, dest_h - 1U); } - lv_coord_t src_stride = lv_area_get_width(src_area); - /*AS buffer - source image*/ pxp_as_buffer_config_t asBufferConfig = { .pixelFormat = PXP_AS_PIXEL_FORMAT, - .bufferAddr = (uint32_t)src_buf, + .bufferAddr = (uint32_t)(src_buf + src_stride * src_area->y1 + src_area->x1), .pitchBytes = src_stride * sizeof(lv_color_t) }; PXP_SetAlphaSurfaceBufferConfig(LV_GPU_NXP_PXP_ID, &asBufferConfig); - PXP_SetAlphaSurfacePosition(LV_GPU_NXP_PXP_ID, 0U, 0U, dest_w - 1U, dest_h - 1U); + PXP_SetAlphaSurfacePosition(LV_GPU_NXP_PXP_ID, 0U, 0U, src_w - 1U, src_h - 1U); PXP_SetAlphaSurfaceBlendConfig(LV_GPU_NXP_PXP_ID, &asBlendConfig); PXP_EnableAlphaSurfaceOverlayColorKey(LV_GPU_NXP_PXP_ID, false); @@ -325,162 +288,147 @@ lv_res_t lv_gpu_nxp_pxp_blit(lv_color_t * dest_buf, const lv_area_t * dest_area, }; PXP_SetOutputBufferConfig(LV_GPU_NXP_PXP_ID, &outputBufferConfig); - lv_gpu_nxp_pxp_run(); /* Start PXP task */ - - return LV_RES_OK; + lv_gpu_nxp_pxp_run(); } -lv_res_t lv_gpu_nxp_pxp_blit_transform(lv_color_t * dest_buf, const lv_area_t * dest_area, lv_coord_t dest_stride, - const lv_color_t * src_buf, const lv_area_t * src_area, - const lv_draw_img_dsc_t * dsc, lv_img_cf_t cf) +void lv_gpu_nxp_pxp_blit_transform(lv_color_t * dest_buf, lv_area_t * dest_area, lv_coord_t dest_stride, + const lv_color_t * src_buf, const lv_area_t * src_area, lv_coord_t src_stride, + const lv_draw_img_dsc_t * dsc, lv_img_cf_t cf) { - uint32_t dest_size = lv_area_get_size(dest_area); + bool has_recolor = (dsc->recolor_opa != LV_OPA_TRANSP); + bool has_rotation = (dsc->angle != 0); - if(dsc->opa >= (lv_opa_t)LV_OPA_MAX) { - if(dest_size < LV_GPU_NXP_PXP_BLIT_SIZE_LIMIT) { - PXP_LOG_TRACE("Area size %d smaller than limit %d.", dest_size, LV_GPU_NXP_PXP_BLIT_SIZE_LIMIT); - return LV_RES_INV; + if(has_recolor || has_rotation) { + if(dsc->opa >= (lv_opa_t)LV_OPA_MAX && !lv_img_cf_has_alpha(cf) && !lv_img_cf_is_chroma_keyed(cf)) { + lv_pxp_blit_cover(dest_buf, dest_area, dest_stride, src_buf, src_area, src_stride, dsc, cf); + return; } - } - else { - if(dest_size < LV_GPU_NXP_PXP_BLIT_OPA_SIZE_LIMIT) { - PXP_LOG_TRACE("Area size %d smaller than limit %d.", dest_size, LV_GPU_NXP_PXP_BLIT_OPA_SIZE_LIMIT); - return LV_RES_INV; - } - } - - bool recolor = (dsc->recolor_opa != LV_OPA_TRANSP); - bool rotation = (dsc->angle != 0); - - if(rotation) { - if(dsc->angle != 0 && dsc->angle != 900 && dsc->angle != 1800 && dsc->angle != 2700) { - PXP_LOG_TRACE("Rotation angle %d is not supported. PXP can rotate only 90x angle.", dsc->angle); - return LV_RES_INV; - } - } - - if(recolor || rotation) { - if(dsc->opa >= (lv_opa_t)LV_OPA_MAX && !lv_img_cf_has_alpha(cf) && !lv_img_cf_is_chroma_keyed(cf)) - return lv_gpu_nxp_pxp_blit_cover(dest_buf, dest_area, dest_stride, src_buf, src_area, dsc, cf); - else + else { /*Recolor and/or rotation with alpha or opacity is done in two steps.*/ - return lv_gpu_nxp_pxp_blit_opa(dest_buf, dest_area, dest_stride, src_buf, src_area, dsc, cf); + lv_pxp_blit_opa(dest_buf, dest_area, dest_stride, src_buf, src_area, src_stride, dsc, cf); + return; + } } - return lv_gpu_nxp_pxp_blit_cf(dest_buf, dest_area, dest_stride, src_buf, src_area, dsc, cf); + lv_pxp_blit_cf(dest_buf, dest_area, dest_stride, src_buf, src_area, src_stride, dsc, cf); +} + +void lv_gpu_nxp_pxp_buffer_copy(lv_color_t * dest_buf, const lv_area_t * dest_area, lv_coord_t dest_stride, + const lv_color_t * src_buf, const lv_area_t * src_area, lv_coord_t src_stride) +{ + lv_coord_t src_width = lv_area_get_width(src_area); + lv_coord_t src_height = lv_area_get_height(src_area); + + lv_gpu_nxp_pxp_reset(); + + const pxp_pic_copy_config_t picCopyConfig = { + .srcPicBaseAddr = (uint32_t)src_buf, + .srcPitchBytes = src_stride * sizeof(lv_color_t), + .srcOffsetX = src_area->x1, + .srcOffsetY = src_area->y1, + .destPicBaseAddr = (uint32_t)dest_buf, + .destPitchBytes = dest_stride * sizeof(lv_color_t), + .destOffsetX = dest_area->x1, + .destOffsetY = dest_area->y1, + .width = src_width, + .height = src_height, + .pixelFormat = PXP_AS_PIXEL_FORMAT + }; + + PXP_StartPictureCopy(LV_GPU_NXP_PXP_ID, &picCopyConfig); + + lv_gpu_nxp_pxp_wait(); } /********************** * STATIC FUNCTIONS **********************/ -static lv_res_t lv_gpu_nxp_pxp_blit_opa(lv_color_t * dest_buf, const lv_area_t * dest_area, lv_coord_t dest_stride, - const lv_color_t * src_buf, const lv_area_t * src_area, - const lv_draw_img_dsc_t * dsc, lv_img_cf_t cf) +static void lv_pxp_blit_opa(lv_color_t * dest_buf, const lv_area_t * dest_area, lv_coord_t dest_stride, + const lv_color_t * src_buf, const lv_area_t * src_area, lv_coord_t src_stride, + const lv_draw_img_dsc_t * dsc, lv_img_cf_t cf) { - lv_coord_t dest_w = lv_area_get_width(dest_area); - lv_coord_t dest_h = lv_area_get_height(dest_area); - lv_res_t res; - uint32_t size = dest_w * dest_h * sizeof(lv_color_t); - - if(ROUND_UP(size, ALIGN_SIZE) >= LV_MEM_SIZE) - PXP_RETURN_INV("Insufficient memory for temporary buffer. Please increase LV_MEM_SIZE."); - - lv_color_t * tmp_buf = (lv_color_t *)lv_mem_buf_get(size); - if(!tmp_buf) - PXP_RETURN_INV("Allocating temporary buffer failed."); - - const lv_area_t tmp_area = { - .x1 = 0, - .y1 = 0, - .x2 = dest_w - 1, - .y2 = dest_h - 1 - }; + lv_area_t temp_area; + lv_area_copy(&temp_area, dest_area); + lv_coord_t temp_stride = dest_stride; + lv_coord_t temp_w = lv_area_get_width(&temp_area); + lv_coord_t temp_h = lv_area_get_height(&temp_area); /*Step 1: Transform with full opacity to temporary buffer*/ - res = lv_gpu_nxp_pxp_blit_cover(tmp_buf, &tmp_area, dest_w, src_buf, src_area, dsc, cf); - if(res != LV_RES_OK) { - PXP_LOG_TRACE("Blit cover with full opacity failed."); - lv_mem_buf_release(tmp_buf); + lv_pxp_blit_cover((lv_color_t *)temp_buf, &temp_area, temp_stride, src_buf, src_area, src_stride, dsc, cf); - return res; + /*Switch width and height if angle requires it*/ + if(dsc->angle == 900 || dsc->angle == 2700) { + temp_area.x2 = temp_area.x1 + temp_h - 1; + temp_area.y2 = temp_area.y1 + temp_w - 1; } - /*Step 2: Blit temporary results with required opacity to output*/ - res = lv_gpu_nxp_pxp_blit_cf(dest_buf, dest_area, dest_stride, tmp_buf, &tmp_area, dsc, cf); - - /*Clean-up memory*/ - lv_mem_buf_release(tmp_buf); - - return res; + /*Step 2: Blit temporary result with required opacity to output*/ + lv_pxp_blit_cf(dest_buf, &temp_area, dest_stride, (lv_color_t *)temp_buf, &temp_area, temp_stride, dsc, cf); } - -static lv_res_t lv_gpu_nxp_pxp_blit_cover(lv_color_t * dest_buf, const lv_area_t * dest_area, - lv_coord_t dest_stride, - const lv_color_t * src_buf, const lv_area_t * src_area, - const lv_draw_img_dsc_t * dsc, lv_img_cf_t cf) +static void lv_pxp_blit_cover(lv_color_t * dest_buf, lv_area_t * dest_area, lv_coord_t dest_stride, + const lv_color_t * src_buf, const lv_area_t * src_area, lv_coord_t src_stride, + const lv_draw_img_dsc_t * dsc, lv_img_cf_t cf) { lv_coord_t dest_w = lv_area_get_width(dest_area); lv_coord_t dest_h = lv_area_get_height(dest_area); + lv_coord_t src_w = lv_area_get_width(src_area); + lv_coord_t src_h = lv_area_get_height(src_area); - bool recolor = (dsc->recolor_opa != LV_OPA_TRANSP); - bool rotation = (dsc->angle != 0); + bool has_recolor = (dsc->recolor_opa != LV_OPA_TRANSP); + bool has_rotation = (dsc->angle != 0); - PXP_Init(LV_GPU_NXP_PXP_ID); - PXP_EnableCsc1(LV_GPU_NXP_PXP_ID, false); /*Disable CSC1, it is enabled by default.*/ - PXP_SetProcessBlockSize(LV_GPU_NXP_PXP_ID, kPXP_BlockSize16); /*block size 16x16 for higher performance*/ + lv_point_t pivot = dsc->pivot; + lv_coord_t piv_offset_x; + lv_coord_t piv_offset_y; - if(rotation) { - /* - * PXP is set to process 16x16 blocks to optimize the system for memory - * bandwidth and image processing time. - * The output engine essentially truncates any output pixels after the - * desired number of pixels has been written. - * When rotating a source image and the output is not divisible by the block - * size, the incorrect pixels could be truncated and the final output image - * can look shifted. - */ - if(lv_area_get_width(src_area) % 16 || lv_area_get_height(src_area) % 16) { - PXP_LOG_TRACE("Rotation is not supported for image w/o alignment to block size 16x16."); - return LV_RES_INV; - } + lv_gpu_nxp_pxp_reset(); - /*Convert rotation angle*/ - pxp_rotate_degree_t pxp_rot; + if(has_rotation) { + /*Convert rotation angle and calculate offsets caused by pivot*/ + pxp_rotate_degree_t pxp_angle; switch(dsc->angle) { case 0: - pxp_rot = kPXP_Rotate0; + pxp_angle = kPXP_Rotate0; + piv_offset_x = 0; + piv_offset_y = 0; break; case 900: - pxp_rot = kPXP_Rotate90; + piv_offset_x = pivot.x + pivot.y - dest_h; + piv_offset_y = pivot.y - pivot.x; + pxp_angle = kPXP_Rotate90; break; case 1800: - pxp_rot = kPXP_Rotate180; + piv_offset_x = 2 * pivot.x - dest_w; + piv_offset_y = 2 * pivot.y - dest_h; + pxp_angle = kPXP_Rotate180; break; case 2700: - pxp_rot = kPXP_Rotate270; + piv_offset_x = pivot.x - pivot.y; + piv_offset_y = pivot.x + pivot.y - dest_w; + pxp_angle = kPXP_Rotate270; break; default: - PXP_LOG_TRACE("Rotation angle %d is not supported. PXP can rotate only 90x angle.", dsc->angle); - return LV_RES_INV; + piv_offset_x = 0; + piv_offset_y = 0; + pxp_angle = kPXP_Rotate0; } - PXP_SetRotateConfig(LV_GPU_NXP_PXP_ID, kPXP_RotateOutputBuffer, pxp_rot, kPXP_FlipDisable); + PXP_SetRotateConfig(LV_GPU_NXP_PXP_ID, kPXP_RotateOutputBuffer, pxp_angle, kPXP_FlipDisable); + lv_area_move(dest_area, piv_offset_x, piv_offset_y); } - lv_coord_t src_stride = lv_area_get_width(src_area); - /*AS buffer - source image*/ pxp_as_buffer_config_t asBufferConfig = { .pixelFormat = PXP_AS_PIXEL_FORMAT, - .bufferAddr = (uint32_t)src_buf, + .bufferAddr = (uint32_t)(src_buf + src_stride * src_area->y1 + src_area->x1), .pitchBytes = src_stride * sizeof(lv_color_t) }; PXP_SetAlphaSurfaceBufferConfig(LV_GPU_NXP_PXP_ID, &asBufferConfig); - PXP_SetAlphaSurfacePosition(LV_GPU_NXP_PXP_ID, 0U, 0U, dest_w - 1U, dest_h - 1U); + PXP_SetAlphaSurfacePosition(LV_GPU_NXP_PXP_ID, 0U, 0U, src_w - 1U, src_h - 1U); /*Disable PS buffer*/ PXP_SetProcessSurfacePosition(LV_GPU_NXP_PXP_ID, 0xFFFFU, 0xFFFFU, 0U, 0U); - if(recolor) + if(has_recolor) /*Use as color generator*/ PXP_SetProcessSurfaceBackGroundColor(LV_GPU_NXP_PXP_ID, lv_color_to32(dsc->recolor)); @@ -496,7 +444,7 @@ static lv_res_t lv_gpu_nxp_pxp_blit_cover(lv_color_t * dest_buf, const lv_area_t }; PXP_SetOutputBufferConfig(LV_GPU_NXP_PXP_ID, &outputBufferConfig); - if(recolor || lv_img_cf_has_alpha(cf)) { + if(has_recolor || lv_img_cf_has_alpha(cf)) { /** * Configure Porter-Duff blending. * @@ -512,7 +460,7 @@ static lv_res_t lv_gpu_nxp_pxp_blit_cover(lv_color_t * dest_buf, const lv_area_t .srcGlobalAlphaMode = lv_img_cf_has_alpha(cf) ? kPXP_PorterDuffLocalAlpha : kPXP_PorterDuffGlobalAlpha, .dstFactorMode = kPXP_PorterDuffFactorStraight, .srcFactorMode = kPXP_PorterDuffFactorInversed, - .dstGlobalAlpha = recolor ? dsc->recolor_opa : 0x00, + .dstGlobalAlpha = has_recolor ? dsc->recolor_opa : 0x00, .srcGlobalAlpha = 0xff, .dstAlphaMode = kPXP_PorterDuffAlphaStraight, /*don't care*/ .srcAlphaMode = kPXP_PorterDuffAlphaStraight @@ -520,22 +468,19 @@ static lv_res_t lv_gpu_nxp_pxp_blit_cover(lv_color_t * dest_buf, const lv_area_t PXP_SetPorterDuffConfig(LV_GPU_NXP_PXP_ID, &pdConfig); } - lv_gpu_nxp_pxp_run(); /*Start PXP task*/ - - return LV_RES_OK; + lv_gpu_nxp_pxp_run(); } -static lv_res_t lv_gpu_nxp_pxp_blit_cf(lv_color_t * dest_buf, const lv_area_t * dest_area, - lv_coord_t dest_stride, - const lv_color_t * src_buf, const lv_area_t * src_area, - const lv_draw_img_dsc_t * dsc, lv_img_cf_t cf) +static void lv_pxp_blit_cf(lv_color_t * dest_buf, const lv_area_t * dest_area, lv_coord_t dest_stride, + const lv_color_t * src_buf, const lv_area_t * src_area, lv_coord_t src_stride, + const lv_draw_img_dsc_t * dsc, lv_img_cf_t cf) { lv_coord_t dest_w = lv_area_get_width(dest_area); lv_coord_t dest_h = lv_area_get_height(dest_area); + lv_coord_t src_w = lv_area_get_width(src_area); + lv_coord_t src_h = lv_area_get_height(src_area); - PXP_Init(LV_GPU_NXP_PXP_ID); - PXP_EnableCsc1(LV_GPU_NXP_PXP_ID, false); /*Disable CSC1, it is enabled by default.*/ - PXP_SetProcessBlockSize(LV_GPU_NXP_PXP_ID, kPXP_BlockSize16); /*block size 16x16 for higher performance*/ + lv_gpu_nxp_pxp_reset(); pxp_as_blend_config_t asBlendConfig = { .alpha = dsc->opa, @@ -566,28 +511,26 @@ static lv_res_t lv_gpu_nxp_pxp_blit_cf(lv_color_t * dest_buf, const lv_area_t * asBlendConfig.alphaMode = lv_img_cf_has_alpha(cf) ? kPXP_AlphaMultiply : kPXP_AlphaOverride; } PXP_SetProcessSurfaceBufferConfig(LV_GPU_NXP_PXP_ID, &psBufferConfig); - PXP_SetProcessSurfacePosition(LV_GPU_NXP_PXP_ID, 0U, 0U, dest_w - 1, dest_h - 1); + PXP_SetProcessSurfacePosition(LV_GPU_NXP_PXP_ID, 0U, 0U, dest_w - 1U, dest_h - 1U); } - lv_coord_t src_stride = lv_area_get_width(src_area); - /*AS buffer - source image*/ pxp_as_buffer_config_t asBufferConfig = { .pixelFormat = PXP_AS_PIXEL_FORMAT, - .bufferAddr = (uint32_t)src_buf, + .bufferAddr = (uint32_t)(src_buf + src_stride * src_area->y1 + src_area->x1), .pitchBytes = src_stride * sizeof(lv_color_t) }; PXP_SetAlphaSurfaceBufferConfig(LV_GPU_NXP_PXP_ID, &asBufferConfig); - PXP_SetAlphaSurfacePosition(LV_GPU_NXP_PXP_ID, 0U, 0U, dest_w - 1U, dest_h - 1U); + PXP_SetAlphaSurfacePosition(LV_GPU_NXP_PXP_ID, 0U, 0U, src_w - 1U, src_h - 1U); PXP_SetAlphaSurfaceBlendConfig(LV_GPU_NXP_PXP_ID, &asBlendConfig); if(lv_img_cf_is_chroma_keyed(cf)) { lv_color_t colorKeyLow = LV_COLOR_CHROMA_KEY; lv_color_t colorKeyHigh = LV_COLOR_CHROMA_KEY; - bool recolor = (dsc->recolor_opa != LV_OPA_TRANSP); + bool has_recolor = (dsc->recolor_opa != LV_OPA_TRANSP); - if(recolor) { + if(has_recolor) { /* New color key after recoloring */ lv_color_t colorKey = lv_color_mix(dsc->recolor, LV_COLOR_CHROMA_KEY, dsc->recolor_opa); @@ -595,11 +538,11 @@ static lv_res_t lv_gpu_nxp_pxp_blit_cf(lv_color_t * dest_buf, const lv_area_t * LV_COLOR_SET_G(colorKeyLow, colorKey.ch.green != 0 ? colorKey.ch.green - 1 : 0); LV_COLOR_SET_B(colorKeyLow, colorKey.ch.blue != 0 ? colorKey.ch.blue - 1 : 0); -#if LV_COLOR_DEPTH==16 +#if LV_COLOR_DEPTH == 16 LV_COLOR_SET_R(colorKeyHigh, colorKey.ch.red != 0x1f ? colorKey.ch.red + 1 : 0x1f); LV_COLOR_SET_G(colorKeyHigh, colorKey.ch.green != 0x3f ? colorKey.ch.green + 1 : 0x3f); LV_COLOR_SET_B(colorKeyHigh, colorKey.ch.blue != 0x1f ? colorKey.ch.blue + 1 : 0x1f); -#else /*LV_COLOR_DEPTH==32*/ +#else /*LV_COLOR_DEPTH == 32*/ LV_COLOR_SET_R(colorKeyHigh, colorKey.ch.red != 0xff ? colorKey.ch.red + 1 : 0xff); LV_COLOR_SET_G(colorKeyHigh, colorKey.ch.green != 0xff ? colorKey.ch.green + 1 : 0xff); LV_COLOR_SET_B(colorKeyHigh, colorKey.ch.blue != 0xff ? colorKey.ch.blue + 1 : 0xff); @@ -624,9 +567,7 @@ static lv_res_t lv_gpu_nxp_pxp_blit_cf(lv_color_t * dest_buf, const lv_area_t * }; PXP_SetOutputBufferConfig(LV_GPU_NXP_PXP_ID, &outputBufferConfig); - lv_gpu_nxp_pxp_run(); /* Start PXP task */ - - return LV_RES_OK; + lv_gpu_nxp_pxp_run(); } #endif /*LV_USE_GPU_NXP_PXP*/ diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/nxp/pxp/lv_draw_pxp_blend.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/nxp/pxp/lv_draw_pxp_blend.h new file mode 100644 index 0000000..9615667 --- /dev/null +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/nxp/pxp/lv_draw_pxp_blend.h @@ -0,0 +1,130 @@ +/** + * @file lv_draw_pxp_blend.h + * + */ + +/** + * MIT License + * + * Copyright 2020-2023 NXP + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next paragraph) + * shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A + * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF + * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE + * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + */ + +#ifndef LV_DRAW_PXP_BLEND_H +#define LV_DRAW_PXP_BLEND_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../../../lv_conf_internal.h" + +#if LV_USE_GPU_NXP_PXP +#include "lv_gpu_nxp_pxp.h" +#include "../../sw/lv_draw_sw.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Fill area, with optional opacity. + * + * @param[in/out] dest_buf Destination buffer + * @param[in] dest_area Area with relative coordinates of destination buffer + * @param[in] dest_stride Stride of destination buffer in pixels + * @param[in] color Color + * @param[in] opa Opacity + */ +void lv_gpu_nxp_pxp_fill(lv_color_t * dest_buf, const lv_area_t * dest_area, lv_coord_t dest_stride, + lv_color_t color, lv_opa_t opa); + +/** + * BLock Image Transfer - copy rectangular image from src_buf to dst_buf with effects. + * By default, image is copied directly, with optional opacity. This function can also + * rotate the display output buffer to a specified angle (90x step). + * + * @param[in/out] dest_buf Destination buffer + * @param[in] dest_area Area with relative coordinates of destination buffer + * @param[in] dest_stride Stride of destination buffer in pixels + * @param[in] src_buf Source buffer + * @param[in] src_area Source area with relative coordinates of source buffer + * @param[in] src_stride Stride of source buffer in pixels + * @param[in] opa Opacity + * @param[in] angle Display rotation angle (90x) + */ +void lv_gpu_nxp_pxp_blit(lv_color_t * dest_buf, const lv_area_t * dest_area, lv_coord_t dest_stride, + const lv_color_t * src_buf, const lv_area_t * src_area, lv_coord_t src_stride, + lv_opa_t opa, lv_disp_rot_t angle); + +/** + * BLock Image Transfer - copy rectangular image from src_buf to dst_buf with transformation. + * + * + * @param[in/out] dest_buf Destination buffer + * @param[in] dest_area Area with relative coordinates of destination buffer + * @param[in] dest_stride Stride of destination buffer in pixels + * @param[in] src_buf Source buffer + * @param[in] src_area Area with relative coordinates of source buffer + * @param[in] src_stride Stride of source buffer in pixels + * @param[in] dsc Image descriptor + * @param[in] cf Color format + */ +void lv_gpu_nxp_pxp_blit_transform(lv_color_t * dest_buf, lv_area_t * dest_area, lv_coord_t dest_stride, + const lv_color_t * src_buf, const lv_area_t * src_area, lv_coord_t src_stride, + const lv_draw_img_dsc_t * dsc, lv_img_cf_t cf); + +/** + * BLock Image Transfer - copy rectangular image from src_buf to dst_buf, no transformation or blending. + * + * + * @param[in/out] dest_buf Destination buffer + * @param[in] dest_area Area with relative coordinates of destination buffer + * @param[in] dest_stride Stride of destination buffer in pixels + * @param[in] src_buf Source buffer + * @param[in] src_area Area with relative coordinates of source buffer + * @param[in] src_stride Stride of source buffer in pixels + */ +void lv_gpu_nxp_pxp_buffer_copy(lv_color_t * dest_buf, const lv_area_t * dest_area, lv_coord_t dest_stride, + const lv_color_t * src_buf, const lv_area_t * src_area, lv_coord_t src_stride); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_GPU_NXP_PXP*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_DRAW_PXP_BLEND_H*/ diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/nxp/pxp/lv_gpu_nxp_pxp.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/nxp/pxp/lv_gpu_nxp_pxp.c similarity index 74% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/nxp/pxp/lv_gpu_nxp_pxp.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/nxp/pxp/lv_gpu_nxp_pxp.c index 94d242a..164216f 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/nxp/pxp/lv_gpu_nxp_pxp.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/nxp/pxp/lv_gpu_nxp_pxp.c @@ -6,7 +6,7 @@ /** * MIT License * - * Copyright 2020-2022 NXP + * Copyright 2020-2023 NXP * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -50,9 +50,9 @@ **********************/ /** - * Clean & invalidate cache. + * Clean and invalidate cache. */ -static void invalidate_cache(void); +static inline void invalidate_cache(void); /********************** * STATIC VARIABLES @@ -70,16 +70,23 @@ static lv_nxp_pxp_cfg_t * pxp_cfg; lv_res_t lv_gpu_nxp_pxp_init(void) { +#if LV_USE_GPU_NXP_PXP_AUTO_INIT pxp_cfg = lv_gpu_nxp_pxp_get_cfg(); +#endif - if(!pxp_cfg || !pxp_cfg->pxp_interrupt_deinit || !pxp_cfg->pxp_interrupt_init || !pxp_cfg->pxp_run) + if(!pxp_cfg || !pxp_cfg->pxp_interrupt_deinit || !pxp_cfg->pxp_interrupt_init || + !pxp_cfg->pxp_run || !pxp_cfg->pxp_wait) PXP_RETURN_INV("PXP configuration error."); PXP_Init(LV_GPU_NXP_PXP_ID); + PXP_EnableCsc1(LV_GPU_NXP_PXP_ID, false); /*Disable CSC1, it is enabled by default.*/ + PXP_SetProcessBlockSize(LV_GPU_NXP_PXP_ID, kPXP_BlockSize16); /*Block size 16x16 for higher performance*/ + PXP_EnableInterrupts(LV_GPU_NXP_PXP_ID, kPXP_CompleteInterruptEnable); if(pxp_cfg->pxp_interrupt_init() != LV_RES_OK) { + PXP_DisableInterrupts(LV_GPU_NXP_PXP_ID, kPXP_CompleteInterruptEnable); PXP_Deinit(LV_GPU_NXP_PXP_ID); PXP_RETURN_INV("PXP interrupt init failed."); } @@ -90,23 +97,38 @@ lv_res_t lv_gpu_nxp_pxp_init(void) void lv_gpu_nxp_pxp_deinit(void) { pxp_cfg->pxp_interrupt_deinit(); - PXP_DisableInterrupts(PXP, kPXP_CompleteInterruptEnable); + PXP_DisableInterrupts(LV_GPU_NXP_PXP_ID, kPXP_CompleteInterruptEnable); PXP_Deinit(LV_GPU_NXP_PXP_ID); } +void lv_gpu_nxp_pxp_reset(void) +{ + /* Wait for previous command to complete before resetting the registers. */ + lv_gpu_nxp_pxp_wait(); + + PXP_ResetControl(LV_GPU_NXP_PXP_ID); + + PXP_EnableCsc1(LV_GPU_NXP_PXP_ID, false); /*Disable CSC1, it is enabled by default.*/ + PXP_SetProcessBlockSize(LV_GPU_NXP_PXP_ID, kPXP_BlockSize16); /*Block size 16x16 for higher performance*/ +} + void lv_gpu_nxp_pxp_run(void) { - /*Clean & invalidate cache*/ invalidate_cache(); pxp_cfg->pxp_run(); } +void lv_gpu_nxp_pxp_wait(void) +{ + pxp_cfg->pxp_wait(); +} + /********************** * STATIC FUNCTIONS **********************/ -static void invalidate_cache(void) +static inline void invalidate_cache(void) { lv_disp_t * disp = _lv_refr_get_disp_refreshing(); if(disp->driver->clean_dcache_cb) diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/nxp/pxp/lv_gpu_nxp_pxp.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/nxp/pxp/lv_gpu_nxp_pxp.h similarity index 92% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/nxp/pxp/lv_gpu_nxp_pxp.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/nxp/pxp/lv_gpu_nxp_pxp.h index e695d8f..46f4a0b 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/nxp/pxp/lv_gpu_nxp_pxp.h +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/nxp/pxp/lv_gpu_nxp_pxp.h @@ -6,7 +6,7 @@ /** * MIT License * - * Copyright 2020-2022 NXP + * Copyright 2020-2023 NXP * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -81,8 +81,11 @@ typedef struct { /** Callback for PXP interrupt de-initialization*/ void (*pxp_interrupt_deinit)(void); - /** Callback that should start PXP and wait for operation complete*/ + /** Callback for PXP start*/ void (*pxp_run)(void); + + /** Callback for waiting of PXP completion*/ + void (*pxp_wait)(void); } lv_nxp_pxp_cfg_t; /********************** @@ -104,10 +107,20 @@ lv_res_t lv_gpu_nxp_pxp_init(void); void lv_gpu_nxp_pxp_deinit(void); /** - * Start PXP job and wait for completion. + * Reset PXP device. + */ +void lv_gpu_nxp_pxp_reset(void); + +/** + * Clear cache and start PXP. */ void lv_gpu_nxp_pxp_run(void); +/** + * Wait for PXP completion. + */ +void lv_gpu_nxp_pxp_wait(void); + /********************** * MACROS **********************/ @@ -136,7 +149,7 @@ void lv_gpu_nxp_pxp_run(void); #if LV_GPU_NXP_PXP_LOG_TRACES #define PXP_LOG_TRACE(fmt, ...) \ do { \ - LV_LOG_ERROR(fmt, ##__VA_ARGS__); \ + LV_LOG(fmt, ##__VA_ARGS__); \ } while (0) #else #define PXP_LOG_TRACE(fmt, ...) \ diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/nxp/pxp/lv_gpu_nxp_pxp_osa.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/nxp/pxp/lv_gpu_nxp_pxp_osa.c similarity index 74% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/nxp/pxp/lv_gpu_nxp_pxp_osa.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/nxp/pxp/lv_gpu_nxp_pxp_osa.c index c4b8dbe..b094928 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/nxp/pxp/lv_gpu_nxp_pxp_osa.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/nxp/pxp/lv_gpu_nxp_pxp_osa.c @@ -6,7 +6,7 @@ /** * MIT License * - * Copyright 2020, 2022 NXP + * Copyright 2020, 2022, 2023 NXP * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -42,6 +42,10 @@ #include "semphr.h" #endif +#if defined(__ZEPHYR__) + #include +#endif + /********************* * DEFINES *********************/ @@ -65,24 +69,32 @@ static lv_res_t _lv_gpu_nxp_pxp_interrupt_init(void); static void _lv_gpu_nxp_pxp_interrupt_deinit(void); /** - * Start the PXP job and wait for task completion. + * Start the PXP job. */ static void _lv_gpu_nxp_pxp_run(void); +/** + * Wait for PXP completion. + */ +static void _lv_gpu_nxp_pxp_wait(void); + /********************** * STATIC VARIABLES **********************/ #if defined(SDK_OS_FREE_RTOS) - static SemaphoreHandle_t s_pxpIdle; -#else - static volatile bool s_pxpIdle; + static SemaphoreHandle_t s_pxpIdleSem; #endif +#if defined(__ZEPHYR__) + static K_SEM_DEFINE(s_pxpIdleSem, 0, 1); +#endif +static volatile bool s_pxpIdle; static lv_nxp_pxp_cfg_t pxp_default_cfg = { .pxp_interrupt_init = _lv_gpu_nxp_pxp_interrupt_init, .pxp_interrupt_deinit = _lv_gpu_nxp_pxp_interrupt_deinit, - .pxp_run = _lv_gpu_nxp_pxp_run + .pxp_run = _lv_gpu_nxp_pxp_run, + .pxp_wait = _lv_gpu_nxp_pxp_wait, }; /********************** @@ -102,8 +114,10 @@ void PXP_IRQHandler(void) if(kPXP_CompleteFlag & PXP_GetStatusFlags(LV_GPU_NXP_PXP_ID)) { PXP_ClearStatusFlags(LV_GPU_NXP_PXP_ID, kPXP_CompleteFlag); #if defined(SDK_OS_FREE_RTOS) - xSemaphoreGiveFromISR(s_pxpIdle, &taskAwake); + xSemaphoreGiveFromISR(s_pxpIdleSem, &taskAwake); portYIELD_FROM_ISR(taskAwake); +#elif defined(__ZEPHYR__) + k_sem_give(&s_pxpIdleSem); #else s_pxpIdle = true; #endif @@ -122,14 +136,13 @@ lv_nxp_pxp_cfg_t * lv_gpu_nxp_pxp_get_cfg(void) static lv_res_t _lv_gpu_nxp_pxp_interrupt_init(void) { #if defined(SDK_OS_FREE_RTOS) - s_pxpIdle = xSemaphoreCreateBinary(); - if(s_pxpIdle == NULL) + s_pxpIdleSem = xSemaphoreCreateBinary(); + if(s_pxpIdleSem == NULL) return LV_RES_INV; NVIC_SetPriority(LV_GPU_NXP_PXP_IRQ_ID, configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY + 1); -#else - s_pxpIdle = true; #endif + s_pxpIdle = true; NVIC_EnableIRQ(LV_GPU_NXP_PXP_IRQ_ID); @@ -140,21 +153,39 @@ static void _lv_gpu_nxp_pxp_interrupt_deinit(void) { NVIC_DisableIRQ(LV_GPU_NXP_PXP_IRQ_ID); #if defined(SDK_OS_FREE_RTOS) - vSemaphoreDelete(s_pxpIdle); + vSemaphoreDelete(s_pxpIdleSem); +#elif defined(__ZEPHYR__) + k_sem_reset(&s_pxpIdleSem); #endif } +/** + * Function to start PXP job. + */ static void _lv_gpu_nxp_pxp_run(void) { -#if !defined(SDK_OS_FREE_RTOS) s_pxpIdle = false; -#endif PXP_EnableInterrupts(LV_GPU_NXP_PXP_ID, kPXP_CompleteInterruptEnable); PXP_Start(LV_GPU_NXP_PXP_ID); +} -#if defined(SDK_OS_FREE_RTOS) - PXP_COND_STOP(!xSemaphoreTake(s_pxpIdle, portMAX_DELAY), "xSemaphoreTake failed."); +/** + * Function to wait for PXP completion. + */ +static void _lv_gpu_nxp_pxp_wait(void) +{ +#if defined(SDK_OS_FREE_RTOS) || defined(__ZEPHYR__) + /* Return if PXP was never started, otherwise the semaphore will lock forever. */ + if(s_pxpIdle == true) + return; +#endif +#if defined (SDK_OS_FREE_RTOS) + if(xSemaphoreTake(s_pxpIdleSem, portMAX_DELAY) == pdTRUE) + s_pxpIdle = true; +#elif defined(__ZEPHYR__) + if(k_sem_take(&s_pxpIdleSem, K_FOREVER) == 0) + s_pxpIdle = true; #else while(s_pxpIdle == false) { } diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/nxp/pxp/lv_gpu_nxp_pxp_osa.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/nxp/pxp/lv_gpu_nxp_pxp_osa.h similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/nxp/pxp/lv_gpu_nxp_pxp_osa.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/nxp/pxp/lv_gpu_nxp_pxp_osa.h diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/nxp/vglite/lv_draw_nxp_vglite.mk b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/nxp/vglite/lv_draw_nxp_vglite.mk similarity index 72% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/nxp/vglite/lv_draw_nxp_vglite.mk rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/nxp/vglite/lv_draw_nxp_vglite.mk index c84e2e4..c9473cc 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/nxp/vglite/lv_draw_nxp_vglite.mk +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/nxp/vglite/lv_draw_nxp_vglite.mk @@ -1,7 +1,10 @@ +CSRCS += lv_draw_vglite.c CSRCS += lv_draw_vglite_arc.c CSRCS += lv_draw_vglite_blend.c +CSRCS += lv_draw_vglite_line.c CSRCS += lv_draw_vglite_rect.c -CSRCS += lv_gpu_nxp_vglite.c +CSRCS += lv_vglite_buf.c +CSRCS += lv_vglite_utils.c DEPPATH += --dep-path $(LVGL_DIR)/$(LVGL_DIR_NAME)/src/draw/nxp/vglite VPATH += :$(LVGL_DIR)/$(LVGL_DIR_NAME)/src/draw/nxp/vglite diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/nxp/vglite/lv_draw_vglite.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/nxp/vglite/lv_draw_vglite.c new file mode 100644 index 0000000..031f57e --- /dev/null +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/nxp/vglite/lv_draw_vglite.c @@ -0,0 +1,557 @@ +/** + * @file lv_draw_vglite.c + * + */ + +/** + * MIT License + * + * Copyright 2022, 2023 NXP + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next paragraph) + * shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A + * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF + * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE + * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_draw_vglite.h" + +#if LV_USE_GPU_NXP_VG_LITE +#include +#include "lv_draw_vglite_blend.h" +#include "lv_draw_vglite_line.h" +#include "lv_draw_vglite_rect.h" +#include "lv_draw_vglite_arc.h" +#include "lv_vglite_buf.h" + +#if LV_COLOR_DEPTH != 32 + #include "../../../core/lv_refr.h" +#endif + +/********************* + * DEFINES + *********************/ + +/* Minimum area (in pixels) for VG-Lite blit/fill processing. */ +#ifndef LV_GPU_NXP_VG_LITE_SIZE_LIMIT + #define LV_GPU_NXP_VG_LITE_SIZE_LIMIT 5000 +#endif + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +static void lv_draw_vglite_init_buf(lv_draw_ctx_t * draw_ctx); + +static void lv_draw_vglite_wait_for_finish(lv_draw_ctx_t * draw_ctx); + +static void lv_draw_vglite_img_decoded(lv_draw_ctx_t * draw_ctx, const lv_draw_img_dsc_t * dsc, + const lv_area_t * coords, const uint8_t * map_p, lv_img_cf_t cf); + +static void lv_draw_vglite_buffer_copy(lv_draw_ctx_t * draw_ctx, + void * dest_buf, lv_coord_t dest_stride, const lv_area_t * dest_area, + void * src_buf, lv_coord_t src_stride, const lv_area_t * src_area); + +static void lv_draw_vglite_blend(lv_draw_ctx_t * draw_ctx, const lv_draw_sw_blend_dsc_t * dsc); + +static void lv_draw_vglite_line(lv_draw_ctx_t * draw_ctx, const lv_draw_line_dsc_t * dsc, const lv_point_t * point1, + const lv_point_t * point2); + +static void lv_draw_vglite_rect(lv_draw_ctx_t * draw_ctx, const lv_draw_rect_dsc_t * dsc, const lv_area_t * coords); + +static lv_res_t lv_draw_vglite_bg(lv_draw_ctx_t * draw_ctx, const lv_draw_rect_dsc_t * dsc, const lv_area_t * coords); + +static lv_res_t lv_draw_vglite_border(lv_draw_ctx_t * draw_ctx, const lv_draw_rect_dsc_t * dsc, + const lv_area_t * coords); + +static lv_res_t lv_draw_vglite_outline(lv_draw_ctx_t * draw_ctx, const lv_draw_rect_dsc_t * dsc, + const lv_area_t * coords); + +static void lv_draw_vglite_arc(lv_draw_ctx_t * draw_ctx, const lv_draw_arc_dsc_t * dsc, const lv_point_t * center, + uint16_t radius, uint16_t start_angle, uint16_t end_angle); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_draw_vglite_ctx_init(lv_disp_drv_t * drv, lv_draw_ctx_t * draw_ctx) +{ + lv_draw_sw_init_ctx(drv, draw_ctx); + + lv_draw_vglite_ctx_t * vglite_draw_ctx = (lv_draw_sw_ctx_t *)draw_ctx; + vglite_draw_ctx->base_draw.init_buf = lv_draw_vglite_init_buf; + vglite_draw_ctx->base_draw.draw_line = lv_draw_vglite_line; + vglite_draw_ctx->base_draw.draw_arc = lv_draw_vglite_arc; + vglite_draw_ctx->base_draw.draw_rect = lv_draw_vglite_rect; + vglite_draw_ctx->base_draw.draw_img_decoded = lv_draw_vglite_img_decoded; + vglite_draw_ctx->blend = lv_draw_vglite_blend; + vglite_draw_ctx->base_draw.wait_for_finish = lv_draw_vglite_wait_for_finish; + vglite_draw_ctx->base_draw.buffer_copy = lv_draw_vglite_buffer_copy; +} + +void lv_draw_vglite_ctx_deinit(lv_disp_drv_t * drv, lv_draw_ctx_t * draw_ctx) +{ + lv_draw_sw_deinit_ctx(drv, draw_ctx); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +/** + * During rendering, LVGL might initializes new draw_ctxs and start drawing into + * a separate buffer (called layer). If the content to be rendered has "holes", + * e.g. rounded corner, LVGL temporarily sets the disp_drv.screen_transp flag. + * It means the renderers should draw into an ARGB buffer. + * With 32 bit color depth it's not a big problem but with 16 bit color depth + * the target pixel format is ARGB8565 which is not supported by the GPU. + * In this case, the VG-Lite callbacks should fallback to SW rendering. + */ +static inline bool need_argb8565_support() +{ +#if LV_COLOR_DEPTH != 32 + lv_disp_t * disp = _lv_refr_get_disp_refreshing(); + + if(disp->driver->screen_transp == 1) + return true; +#endif + + return false; +} + +static void lv_draw_vglite_init_buf(lv_draw_ctx_t * draw_ctx) +{ + lv_gpu_nxp_vglite_init_buf(draw_ctx->buf, draw_ctx->buf_area, lv_area_get_width(draw_ctx->buf_area)); +} + +static void lv_draw_vglite_wait_for_finish(lv_draw_ctx_t * draw_ctx) +{ + vg_lite_finish(); + + lv_draw_sw_wait_for_finish(draw_ctx); +} + +static void lv_draw_vglite_blend(lv_draw_ctx_t * draw_ctx, const lv_draw_sw_blend_dsc_t * dsc) +{ + if(dsc->opa <= (lv_opa_t)LV_OPA_MIN) + return; + + if(need_argb8565_support()) { + lv_draw_sw_blend_basic(draw_ctx, dsc); + return; + } + + lv_area_t blend_area; + if(!_lv_area_intersect(&blend_area, dsc->blend_area, draw_ctx->clip_area)) + return; /*Fully clipped, nothing to do*/ + + lv_area_move(&blend_area, -draw_ctx->buf_area->x1, -draw_ctx->buf_area->y1); + + bool done = false; + /*Fill/Blend only non masked, normal blended*/ + if(dsc->mask_buf == NULL && dsc->blend_mode == LV_BLEND_MODE_NORMAL && + lv_area_get_size(&blend_area) >= LV_GPU_NXP_VG_LITE_SIZE_LIMIT) { + const lv_color_t * src_buf = dsc->src_buf; + + if(src_buf == NULL) { + done = (lv_gpu_nxp_vglite_fill(&blend_area, dsc->color, dsc->opa) == LV_RES_OK); + if(!done) + VG_LITE_LOG_TRACE("VG-Lite fill failed. Fallback."); + } + else { + lv_area_t src_area; + src_area.x1 = blend_area.x1 - (dsc->blend_area->x1 - draw_ctx->buf_area->x1); + src_area.y1 = blend_area.y1 - (dsc->blend_area->y1 - draw_ctx->buf_area->y1); + src_area.x2 = src_area.x1 + lv_area_get_width(dsc->blend_area) - 1; + src_area.y2 = src_area.y1 + lv_area_get_height(dsc->blend_area) - 1; + lv_coord_t src_stride = lv_area_get_width(dsc->blend_area); + +#if VG_LITE_BLIT_SPLIT_ENABLED + lv_color_t * dest_buf = draw_ctx->buf; + lv_coord_t dest_stride = lv_area_get_width(draw_ctx->buf_area); + + done = (lv_gpu_nxp_vglite_blit_split(dest_buf, &blend_area, dest_stride, + src_buf, &src_area, src_stride, dsc->opa) == LV_RES_OK); +#else + done = (lv_gpu_nxp_vglite_blit(&blend_area, src_buf, &src_area, src_stride, dsc->opa) == LV_RES_OK); +#endif + + if(!done) + VG_LITE_LOG_TRACE("VG-Lite blit failed. Fallback."); + } + } + + if(!done) + lv_draw_sw_blend_basic(draw_ctx, dsc); +} + +static void lv_draw_vglite_img_decoded(lv_draw_ctx_t * draw_ctx, const lv_draw_img_dsc_t * dsc, + const lv_area_t * coords, const uint8_t * map_p, lv_img_cf_t cf) +{ + if(dsc->opa <= (lv_opa_t)LV_OPA_MIN) + return; + + if(need_argb8565_support()) { + lv_draw_sw_img_decoded(draw_ctx, dsc, coords, map_p, cf); + return; + } + + const lv_color_t * src_buf = (const lv_color_t *)map_p; + if(!src_buf) { + lv_draw_sw_img_decoded(draw_ctx, dsc, coords, map_p, cf); + return; + } + + lv_area_t rel_coords; + lv_area_copy(&rel_coords, coords); + lv_area_move(&rel_coords, -draw_ctx->buf_area->x1, -draw_ctx->buf_area->y1); + + lv_area_t rel_clip_area; + lv_area_copy(&rel_clip_area, draw_ctx->clip_area); + lv_area_move(&rel_clip_area, -draw_ctx->buf_area->x1, -draw_ctx->buf_area->y1); + + lv_area_t blend_area; + bool has_transform = dsc->angle != 0 || dsc->zoom != LV_IMG_ZOOM_NONE; + + if(has_transform) + lv_area_copy(&blend_area, &rel_coords); + else if(!_lv_area_intersect(&blend_area, &rel_coords, &rel_clip_area)) + return; /*Fully clipped, nothing to do*/ + + bool has_mask = lv_draw_mask_is_any(&blend_area); + bool has_recolor = (dsc->recolor_opa != LV_OPA_TRANSP); + + bool done = false; + if(!has_mask && !has_recolor && !lv_img_cf_is_chroma_keyed(cf) && + lv_area_get_size(&blend_area) >= LV_GPU_NXP_VG_LITE_SIZE_LIMIT +#if LV_COLOR_DEPTH != 32 + && !lv_img_cf_has_alpha(cf) +#endif + ) { + lv_area_t src_area; + src_area.x1 = blend_area.x1 - (coords->x1 - draw_ctx->buf_area->x1); + src_area.y1 = blend_area.y1 - (coords->y1 - draw_ctx->buf_area->y1); + src_area.x2 = src_area.x1 + lv_area_get_width(coords) - 1; + src_area.y2 = src_area.y1 + lv_area_get_height(coords) - 1; + lv_coord_t src_stride = lv_area_get_width(coords); + +#if VG_LITE_BLIT_SPLIT_ENABLED + lv_color_t * dest_buf = draw_ctx->buf; + lv_coord_t dest_stride = lv_area_get_width(draw_ctx->buf_area); + + if(has_transform) + /* VG-Lite blit split with transformation is not supported! */ + done = false; + else + done = (lv_gpu_nxp_vglite_blit_split(dest_buf, &blend_area, dest_stride, + src_buf, &src_area, src_stride, dsc->opa) == LV_RES_OK); +#else + if(has_transform) + done = (lv_gpu_nxp_vglite_blit_transform(&blend_area, &rel_clip_area, + src_buf, &src_area, src_stride, dsc) == LV_RES_OK); + else + done = (lv_gpu_nxp_vglite_blit(&blend_area, src_buf, &src_area, src_stride, dsc->opa) == LV_RES_OK); +#endif + + if(!done) + VG_LITE_LOG_TRACE("VG-Lite blit %sfailed. Fallback.", has_transform ? "transform " : ""); + } + + if(!done) + lv_draw_sw_img_decoded(draw_ctx, dsc, coords, map_p, cf); +} + +static void lv_draw_vglite_buffer_copy(lv_draw_ctx_t * draw_ctx, + void * dest_buf, lv_coord_t dest_stride, const lv_area_t * dest_area, + void * src_buf, lv_coord_t src_stride, const lv_area_t * src_area) +{ + bool done = false; + + if(lv_area_get_size(dest_area) >= LV_GPU_NXP_VG_LITE_SIZE_LIMIT) { + done = lv_gpu_nxp_vglite_buffer_copy(dest_buf, dest_area, dest_stride, src_buf, src_area, src_stride); + if(!done) + VG_LITE_LOG_TRACE("VG-Lite buffer copy failed. Fallback."); + } + + if(!done) + lv_draw_sw_buffer_copy(draw_ctx, dest_buf, dest_stride, dest_area, src_buf, src_stride, src_area); +} + +static void lv_draw_vglite_line(lv_draw_ctx_t * draw_ctx, const lv_draw_line_dsc_t * dsc, const lv_point_t * point1, + const lv_point_t * point2) +{ + if(dsc->width == 0) + return; + if(dsc->opa <= (lv_opa_t)LV_OPA_MIN) + return; + if(point1->x == point2->x && point1->y == point2->y) + return; + + if(need_argb8565_support()) { + lv_draw_sw_line(draw_ctx, dsc, point1, point2); + return; + } + + lv_area_t rel_clip_area; + rel_clip_area.x1 = LV_MIN(point1->x, point2->x) - dsc->width / 2; + rel_clip_area.x2 = LV_MAX(point1->x, point2->x) + dsc->width / 2; + rel_clip_area.y1 = LV_MIN(point1->y, point2->y) - dsc->width / 2; + rel_clip_area.y2 = LV_MAX(point1->y, point2->y) + dsc->width / 2; + + lv_area_t clipped_coords; + if(!_lv_area_intersect(&clipped_coords, &rel_clip_area, draw_ctx->clip_area)) + return; /*Fully clipped, nothing to do*/ + + lv_area_move(&rel_clip_area, -draw_ctx->buf_area->x1, -draw_ctx->buf_area->y1); + + lv_point_t rel_point1 = { point1->x - draw_ctx->buf_area->x1, point1->y - draw_ctx->buf_area->y1 }; + lv_point_t rel_point2 = { point2->x - draw_ctx->buf_area->x1, point2->y - draw_ctx->buf_area->y1 }; + + bool done = false; + bool has_mask = lv_draw_mask_is_any(&rel_clip_area); + + if(!has_mask) { + done = (lv_gpu_nxp_vglite_draw_line(&rel_point1, &rel_point2, &rel_clip_area, dsc) == LV_RES_OK); + if(!done) + VG_LITE_LOG_TRACE("VG-Lite draw line failed. Fallback."); + } + + if(!done) + lv_draw_sw_line(draw_ctx, dsc, point1, point2); +} + +static void lv_draw_vglite_rect(lv_draw_ctx_t * draw_ctx, const lv_draw_rect_dsc_t * dsc, const lv_area_t * coords) +{ + if(need_argb8565_support()) { + lv_draw_sw_rect(draw_ctx, dsc, coords); + return; + } + + lv_draw_rect_dsc_t vglite_dsc; + + lv_memcpy(&vglite_dsc, dsc, sizeof(vglite_dsc)); + vglite_dsc.bg_opa = 0; + vglite_dsc.bg_img_opa = 0; + vglite_dsc.border_opa = 0; + vglite_dsc.outline_opa = 0; +#if LV_DRAW_COMPLEX + /* Draw the shadow with CPU */ + lv_draw_sw_rect(draw_ctx, &vglite_dsc, coords); + vglite_dsc.shadow_opa = 0; +#endif /*LV_DRAW_COMPLEX*/ + + /* Draw the background */ + vglite_dsc.bg_opa = dsc->bg_opa; + if(lv_draw_vglite_bg(draw_ctx, &vglite_dsc, coords) != LV_RES_OK) + lv_draw_sw_rect(draw_ctx, &vglite_dsc, coords); + vglite_dsc.bg_opa = 0; + + /* Draw the background image + * It will be done once draw_ctx->draw_img_decoded() + * callback gets called from lv_draw_sw_rect(). + */ + vglite_dsc.bg_img_opa = dsc->bg_img_opa; + lv_draw_sw_rect(draw_ctx, &vglite_dsc, coords); + vglite_dsc.bg_img_opa = 0; + + /* Draw the border */ + vglite_dsc.border_opa = dsc->border_opa; + if(lv_draw_vglite_border(draw_ctx, &vglite_dsc, coords) != LV_RES_OK) + lv_draw_sw_rect(draw_ctx, &vglite_dsc, coords); + vglite_dsc.border_opa = 0; + + /* Draw the outline */ + vglite_dsc.outline_opa = dsc->outline_opa; + if(lv_draw_vglite_outline(draw_ctx, &vglite_dsc, coords) != LV_RES_OK) + lv_draw_sw_rect(draw_ctx, &vglite_dsc, coords); +} + +static lv_res_t lv_draw_vglite_bg(lv_draw_ctx_t * draw_ctx, const lv_draw_rect_dsc_t * dsc, const lv_area_t * coords) +{ + if(dsc->bg_opa <= (lv_opa_t)LV_OPA_MIN) + return LV_RES_INV; + + lv_area_t rel_coords; + lv_area_copy(&rel_coords, coords); + + /*If the border fully covers make the bg area 1px smaller to avoid artifacts on the corners*/ + if(dsc->border_width > 1 && dsc->border_opa >= (lv_opa_t)LV_OPA_MAX && dsc->radius != 0) { + rel_coords.x1 += (dsc->border_side & LV_BORDER_SIDE_LEFT) ? 1 : 0; + rel_coords.y1 += (dsc->border_side & LV_BORDER_SIDE_TOP) ? 1 : 0; + rel_coords.x2 -= (dsc->border_side & LV_BORDER_SIDE_RIGHT) ? 1 : 0; + rel_coords.y2 -= (dsc->border_side & LV_BORDER_SIDE_BOTTOM) ? 1 : 0; + } + lv_area_move(&rel_coords, -draw_ctx->buf_area->x1, -draw_ctx->buf_area->y1); + + lv_area_t rel_clip_area; + lv_area_copy(&rel_clip_area, draw_ctx->clip_area); + lv_area_move(&rel_clip_area, -draw_ctx->buf_area->x1, -draw_ctx->buf_area->y1); + + lv_area_t clipped_coords; + if(!_lv_area_intersect(&clipped_coords, &rel_coords, &rel_clip_area)) + return LV_RES_OK; /*Fully clipped, nothing to do*/ + + bool has_mask = lv_draw_mask_is_any(&rel_coords); + lv_grad_dir_t grad_dir = dsc->bg_grad.dir; + lv_color_t bg_color = (grad_dir == (lv_grad_dir_t)LV_GRAD_DIR_NONE) ? + dsc->bg_color : dsc->bg_grad.stops[0].color; + if(bg_color.full == dsc->bg_grad.stops[1].color.full) + grad_dir = LV_GRAD_DIR_NONE; + + /* + * Most simple case: just a plain rectangle (no mask, no radius, no gradient) + * shall be handled by draw_ctx->blend(). + * + * Complex case: gradient or radius but no mask. + */ + if(!has_mask && ((dsc->radius != 0) || (grad_dir != (lv_grad_dir_t)LV_GRAD_DIR_NONE))) { + lv_res_t res = lv_gpu_nxp_vglite_draw_bg(&rel_coords, &rel_clip_area, dsc); + if(res != LV_RES_OK) + VG_LITE_LOG_TRACE("VG-Lite draw bg failed. Fallback."); + + return res; + } + + return LV_RES_INV; +} + +static lv_res_t lv_draw_vglite_border(lv_draw_ctx_t * draw_ctx, const lv_draw_rect_dsc_t * dsc, + const lv_area_t * coords) +{ + if(dsc->border_opa <= (lv_opa_t)LV_OPA_MIN) + return LV_RES_INV; + if(dsc->border_width == 0) + return LV_RES_INV; + if(dsc->border_post) + return LV_RES_INV; + if(dsc->border_side != (lv_border_side_t)LV_BORDER_SIDE_FULL) + return LV_RES_INV; + + lv_area_t rel_coords; + lv_coord_t border_width = dsc->border_width; + + /* Move border inwards to align with software rendered border */ + rel_coords.x1 = coords->x1 + ceil(border_width / 2.0f); + rel_coords.x2 = coords->x2 - floor(border_width / 2.0f); + rel_coords.y1 = coords->y1 + ceil(border_width / 2.0f); + rel_coords.y2 = coords->y2 - floor(border_width / 2.0f); + + lv_area_move(&rel_coords, -draw_ctx->buf_area->x1, -draw_ctx->buf_area->y1); + + lv_area_t rel_clip_area; + lv_area_copy(&rel_clip_area, draw_ctx->clip_area); + lv_area_move(&rel_clip_area, -draw_ctx->buf_area->x1, -draw_ctx->buf_area->y1); + + lv_area_t clipped_coords; + if(!_lv_area_intersect(&clipped_coords, &rel_coords, &rel_clip_area)) + return LV_RES_OK; /*Fully clipped, nothing to do*/ + + lv_res_t res = lv_gpu_nxp_vglite_draw_border_generic(&rel_coords, &rel_clip_area, dsc, true); + if(res != LV_RES_OK) + VG_LITE_LOG_TRACE("VG-Lite draw border failed. Fallback."); + + return res; +} + +static lv_res_t lv_draw_vglite_outline(lv_draw_ctx_t * draw_ctx, const lv_draw_rect_dsc_t * dsc, + const lv_area_t * coords) +{ + if(dsc->outline_opa <= (lv_opa_t)LV_OPA_MIN) + return LV_RES_INV; + if(dsc->outline_width == 0) + return LV_RES_INV; + + /* Move outline outwards to align with software rendered outline */ + lv_coord_t outline_pad = dsc->outline_pad - 1; + lv_area_t rel_coords; + rel_coords.x1 = coords->x1 - outline_pad - floor(dsc->outline_width / 2.0f); + rel_coords.x2 = coords->x2 + outline_pad + ceil(dsc->outline_width / 2.0f); + rel_coords.y1 = coords->y1 - outline_pad - floor(dsc->outline_width / 2.0f); + rel_coords.y2 = coords->y2 + outline_pad + ceil(dsc->outline_width / 2.0f); + + lv_area_move(&rel_coords, -draw_ctx->buf_area->x1, -draw_ctx->buf_area->y1); + + lv_area_t rel_clip_area; + lv_area_copy(&rel_clip_area, draw_ctx->clip_area); + lv_area_move(&rel_clip_area, -draw_ctx->buf_area->x1, -draw_ctx->buf_area->y1); + + lv_area_t clipped_coords; + if(!_lv_area_intersect(&clipped_coords, &rel_coords, &rel_clip_area)) + return LV_RES_OK; /*Fully clipped, nothing to do*/ + + lv_res_t res = lv_gpu_nxp_vglite_draw_border_generic(&rel_coords, &rel_clip_area, dsc, false); + if(res != LV_RES_OK) + VG_LITE_LOG_TRACE("VG-Lite draw outline failed. Fallback."); + + return res; +} + +static void lv_draw_vglite_arc(lv_draw_ctx_t * draw_ctx, const lv_draw_arc_dsc_t * dsc, const lv_point_t * center, + uint16_t radius, uint16_t start_angle, uint16_t end_angle) +{ + bool done = false; + +#if LV_DRAW_COMPLEX + if(dsc->opa <= (lv_opa_t)LV_OPA_MIN) + return; + if(dsc->width == 0) + return; + if(start_angle == end_angle) + return; + + if(need_argb8565_support()) { + lv_draw_sw_arc(draw_ctx, dsc, center, radius, start_angle, end_angle); + return; + } + + lv_point_t rel_center = {center->x - draw_ctx->buf_area->x1, center->y - draw_ctx->buf_area->y1}; + + lv_area_t rel_clip_area; + lv_area_copy(&rel_clip_area, draw_ctx->clip_area); + lv_area_move(&rel_clip_area, -draw_ctx->buf_area->x1, -draw_ctx->buf_area->y1); + + bool has_mask = lv_draw_mask_is_any(&rel_clip_area); + + if(!has_mask) { + done = (lv_gpu_nxp_vglite_draw_arc(&rel_center, (int32_t)radius, (int32_t)start_angle, (int32_t)end_angle, + &rel_clip_area, dsc) == LV_RES_OK); + if(!done) + VG_LITE_LOG_TRACE("VG-Lite draw arc failed. Fallback."); + } + +#endif/*LV_DRAW_COMPLEX*/ + + if(!done) + lv_draw_sw_arc(draw_ctx, dsc, center, radius, start_angle, end_angle); +} + +#endif /*LV_USE_GPU_NXP_VG_LITE*/ diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/nxp/vglite/lv_draw_vglite_rect.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/nxp/vglite/lv_draw_vglite.h similarity index 75% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/nxp/vglite/lv_draw_vglite_rect.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/nxp/vglite/lv_draw_vglite.h index d708e7b..c44cb8f 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/nxp/vglite/lv_draw_vglite_rect.h +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/nxp/vglite/lv_draw_vglite.h @@ -1,12 +1,12 @@ /** - * @file lv_draw_vglite_rect.h + * @file lv_draw_vglite.h * */ /** * MIT License * - * Copyright 2021, 2022 NXP + * Copyright 2022, 2023 NXP * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -27,8 +27,8 @@ * */ -#ifndef LV_DRAW_VGLITE_RECT_H -#define LV_DRAW_VGLITE_RECT_H +#ifndef LV_DRAW_VGLITE_H +#define LV_DRAW_VGLITE_H #ifdef __cplusplus extern "C" { @@ -37,11 +37,11 @@ extern "C" { /********************* * INCLUDES *********************/ + #include "../../../lv_conf_internal.h" #if LV_USE_GPU_NXP_VG_LITE -#include "lv_gpu_nxp_vglite.h" -#include "../../lv_draw_rect.h" +#include "../../sw/lv_draw_sw.h" /********************* * DEFINES @@ -50,28 +50,23 @@ extern "C" { /********************** * TYPEDEFS **********************/ +typedef lv_draw_sw_ctx_t lv_draw_vglite_ctx_t; /********************** * GLOBAL PROTOTYPES **********************/ -/** - * Draw rectangle shape with effects (rounded corners, gradient) - * - * @param draw_ctx drawing context - * @param dsc description of the rectangle - * @param coords the area where rectangle is clipped - */ -lv_res_t lv_gpu_nxp_vglite_draw_bg(lv_draw_ctx_t * draw_ctx, const lv_draw_rect_dsc_t * dsc, const lv_area_t * coords); +void lv_draw_vglite_ctx_init(struct _lv_disp_drv_t * drv, lv_draw_ctx_t * draw_ctx); + +void lv_draw_vglite_ctx_deinit(struct _lv_disp_drv_t * drv, lv_draw_ctx_t * draw_ctx); /********************** * MACROS **********************/ - #endif /*LV_USE_GPU_NXP_VG_LITE*/ #ifdef __cplusplus } /*extern "C"*/ #endif -#endif /*LV_DRAW_VGLITE_RECT_H*/ +#endif /*LV_DRAW_VGLITE_H*/ diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/nxp/vglite/lv_draw_vglite_arc.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/nxp/vglite/lv_draw_vglite_arc.c similarity index 82% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/nxp/vglite/lv_draw_vglite_arc.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/nxp/vglite/lv_draw_vglite_arc.c index 194f03d..ef6d25a 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/nxp/vglite/lv_draw_vglite_arc.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/nxp/vglite/lv_draw_vglite_arc.c @@ -6,7 +6,7 @@ /** * MIT License * - * Copyright 2021, 2022 NXP + * Copyright 2021-2023 NXP * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -34,7 +34,8 @@ #include "lv_draw_vglite_arc.h" #if LV_USE_GPU_NXP_VG_LITE -#include "math.h" +#include "lv_vglite_buf.h" +#include /********************* * DEFINES @@ -88,7 +89,7 @@ typedef struct _cubic_cont_pt { static void rotate_point(int32_t angle, int32_t * x, int32_t * y); static void add_arc_path(int32_t * arc_path, int * pidx, int32_t radius, - int32_t start_angle, int32_t end_angle, lv_point_t center, bool cw); + int32_t start_angle, int32_t end_angle, const lv_point_t * center, bool cw); /********************** * STATIC VARIABLES @@ -102,31 +103,20 @@ static void add_arc_path(int32_t * arc_path, int * pidx, int32_t radius, * GLOBAL FUNCTIONS **********************/ -lv_res_t lv_gpu_nxp_vglite_draw_arc(lv_draw_ctx_t * draw_ctx, const lv_draw_arc_dsc_t * dsc, const lv_point_t * center, - int32_t radius, int32_t start_angle, int32_t end_angle) +lv_res_t lv_gpu_nxp_vglite_draw_arc(const lv_point_t * center, int32_t radius, int32_t start_angle, int32_t end_angle, + const lv_area_t * clip_area, const lv_draw_arc_dsc_t * dsc) { - - vg_lite_buffer_t vgbuf; vg_lite_error_t err = VG_LITE_SUCCESS; lv_color32_t col32 = {.full = lv_color_to32(dsc->color)}; /*Convert color to RGBA8888*/ - lv_coord_t dest_width = lv_area_get_width(draw_ctx->buf_area); - lv_coord_t dest_height = lv_area_get_height(draw_ctx->buf_area); vg_lite_path_t path; vg_lite_color_t vgcol; /* vglite takes ABGR */ - vg_lite_matrix_t matrix; - lv_opa_t opa = dsc->opa; bool donut = ((end_angle - start_angle) % 360 == 0) ? true : false; - lv_point_t clip_center = {center->x - draw_ctx->buf_area->x1, center->y - draw_ctx->buf_area->y1}; + vg_lite_buffer_t * vgbuf = lv_vglite_get_dest_buf(); /* path: max size = 16 cubic bezier (7 words each) */ int32_t arc_path[16 * 7]; lv_memset_00(arc_path, sizeof(arc_path)); - /*** Init destination buffer ***/ - if(lv_vglite_init_buf(&vgbuf, (uint32_t)dest_width, (uint32_t)dest_height, (uint32_t)dest_width * sizeof(lv_color_t), - (const lv_color_t *)draw_ctx->buf, false) != LV_RES_OK) - VG_LITE_RETURN_INV("Init buffer failed."); - /*** Init path ***/ lv_coord_t width = dsc->width; /* inner arc radius = outer arc radius - width */ if(width > (lv_coord_t)radius) @@ -140,11 +130,11 @@ lv_res_t lv_gpu_nxp_vglite_draw_arc(lv_draw_ctx_t * draw_ctx, const lv_draw_arc_ cp_y = 0; rotate_point(start_angle, &cp_x, &cp_y); arc_path[pidx++] = VLC_OP_MOVE; - arc_path[pidx++] = clip_center.x + cp_x; - arc_path[pidx++] = clip_center.y + cp_y; + arc_path[pidx++] = center->x + cp_x; + arc_path[pidx++] = center->y + cp_y; /* draw 1-5 outer quarters */ - add_arc_path(arc_path, &pidx, radius, start_angle, end_angle, clip_center, true); + add_arc_path(arc_path, &pidx, radius, start_angle, end_angle, center, true); if(donut) { /* close outer circle */ @@ -152,24 +142,24 @@ lv_res_t lv_gpu_nxp_vglite_draw_arc(lv_draw_ctx_t * draw_ctx, const lv_draw_arc_ cp_y = 0; rotate_point(start_angle, &cp_x, &cp_y); arc_path[pidx++] = VLC_OP_LINE; - arc_path[pidx++] = clip_center.x + cp_x; - arc_path[pidx++] = clip_center.y + cp_y; + arc_path[pidx++] = center->x + cp_x; + arc_path[pidx++] = center->y + cp_y; /* start inner circle */ cp_x = radius - width; cp_y = 0; rotate_point(start_angle, &cp_x, &cp_y); arc_path[pidx++] = VLC_OP_MOVE; - arc_path[pidx++] = clip_center.x + cp_x; - arc_path[pidx++] = clip_center.y + cp_y; + arc_path[pidx++] = center->x + cp_x; + arc_path[pidx++] = center->y + cp_y; } else if(dsc->rounded != 0U) { /* 1st rounded arc ending */ cp_x = radius - width / 2; cp_y = 0; rotate_point(end_angle, &cp_x, &cp_y); - lv_point_t round_center = {clip_center.x + cp_x, clip_center.y + cp_y}; + lv_point_t round_center = {center->x + cp_x, center->y + cp_y}; add_arc_path(arc_path, &pidx, width / 2, end_angle, (end_angle + 180), - round_center, true); + &round_center, true); } else { /* 1st flat ending */ @@ -177,12 +167,12 @@ lv_res_t lv_gpu_nxp_vglite_draw_arc(lv_draw_ctx_t * draw_ctx, const lv_draw_arc_ cp_y = 0; rotate_point(end_angle, &cp_x, &cp_y); arc_path[pidx++] = VLC_OP_LINE; - arc_path[pidx++] = clip_center.x + cp_x; - arc_path[pidx++] = clip_center.y + cp_y; + arc_path[pidx++] = center->x + cp_x; + arc_path[pidx++] = center->y + cp_y; } /* draw 1-5 inner quarters */ - add_arc_path(arc_path, &pidx, radius - width, start_angle, end_angle, clip_center, false); + add_arc_path(arc_path, &pidx, radius - width, start_angle, end_angle, center, false); /* last control point of curve */ if(donut) { /* close the loop */ @@ -190,17 +180,17 @@ lv_res_t lv_gpu_nxp_vglite_draw_arc(lv_draw_ctx_t * draw_ctx, const lv_draw_arc_ cp_y = 0; rotate_point(start_angle, &cp_x, &cp_y); arc_path[pidx++] = VLC_OP_LINE; - arc_path[pidx++] = clip_center.x + cp_x; - arc_path[pidx++] = clip_center.y + cp_y; + arc_path[pidx++] = center->x + cp_x; + arc_path[pidx++] = center->y + cp_y; } else if(dsc->rounded != 0U) { /* 2nd rounded arc ending */ cp_x = radius - width / 2; cp_y = 0; rotate_point(start_angle, &cp_x, &cp_y); - lv_point_t round_center = {clip_center.x + cp_x, clip_center.y + cp_y}; + lv_point_t round_center = {center->x + cp_x, center->y + cp_y}; add_arc_path(arc_path, &pidx, width / 2, (start_angle + 180), (start_angle + 360), - round_center, true); + &round_center, true); } else { /* 2nd flat ending */ @@ -208,46 +198,34 @@ lv_res_t lv_gpu_nxp_vglite_draw_arc(lv_draw_ctx_t * draw_ctx, const lv_draw_arc_ cp_y = 0; rotate_point(start_angle, &cp_x, &cp_y); arc_path[pidx++] = VLC_OP_LINE; - arc_path[pidx++] = clip_center.x + cp_x; - arc_path[pidx++] = clip_center.y + cp_y; + arc_path[pidx++] = center->x + cp_x; + arc_path[pidx++] = center->y + cp_y; } arc_path[pidx++] = VLC_OP_END; err = vg_lite_init_path(&path, VG_LITE_S32, VG_LITE_HIGH, (uint32_t)pidx * sizeof(int32_t), arc_path, - (vg_lite_float_t) draw_ctx->clip_area->x1, (vg_lite_float_t) draw_ctx->clip_area->y1, - ((vg_lite_float_t) draw_ctx->clip_area->x2) + 1.0f, ((vg_lite_float_t) draw_ctx->clip_area->y2) + 1.0f); + (vg_lite_float_t)clip_area->x1, (vg_lite_float_t)clip_area->y1, + ((vg_lite_float_t)clip_area->x2) + 1.0f, ((vg_lite_float_t)clip_area->y2) + 1.0f); VG_LITE_ERR_RETURN_INV(err, "Init path failed."); - /* set rotation angle */ + vg_lite_buffer_format_t color_format = LV_COLOR_DEPTH == 16 ? VG_LITE_BGRA8888 : VG_LITE_ABGR8888; + if(lv_vglite_premult_and_swizzle(&vgcol, col32, dsc->opa, color_format) != LV_RES_OK) + VG_LITE_RETURN_INV("Premultiplication and swizzle failed."); + + vg_lite_matrix_t matrix; vg_lite_identity(&matrix); - if(opa <= (lv_opa_t)LV_OPA_MAX) { - /* Only pre-multiply color if hardware pre-multiplication is not present */ - if(!vg_lite_query_feature(gcFEATURE_BIT_VG_PE_PREMULTIPLY)) { - col32.ch.red = (uint8_t)(((uint16_t)col32.ch.red * opa) >> 8); - col32.ch.green = (uint8_t)(((uint16_t)col32.ch.green * opa) >> 8); - col32.ch.blue = (uint8_t)(((uint16_t)col32.ch.blue * opa) >> 8); - } - col32.ch.alpha = opa; - } - -#if LV_COLOR_DEPTH==16 - vgcol = col32.full; -#else /*LV_COLOR_DEPTH==32*/ - vgcol = ((uint32_t)col32.ch.alpha << 24) | ((uint32_t)col32.ch.blue << 16) | ((uint32_t)col32.ch.green << 8) | - (uint32_t)col32.ch.red; -#endif - - /*Clean & invalidate cache*/ - lv_vglite_invalidate_cache(); + lv_vglite_set_scissor(clip_area); /*** Draw arc ***/ - err = vg_lite_draw(&vgbuf, &path, VG_LITE_FILL_NON_ZERO, &matrix, VG_LITE_BLEND_SRC_OVER, vgcol); + err = vg_lite_draw(vgbuf, &path, VG_LITE_FILL_NON_ZERO, &matrix, VG_LITE_BLEND_SRC_OVER, vgcol); VG_LITE_ERR_RETURN_INV(err, "Draw arc failed."); - err = vg_lite_finish(); - VG_LITE_ERR_RETURN_INV(err, "Finish failed."); + if(lv_vglite_run() != LV_RES_OK) + VG_LITE_RETURN_INV("Run failed."); + + lv_vglite_disable_scissor(); err = vg_lite_clear_path(&path); VG_LITE_ERR_RETURN_INV(err, "Clear path failed."); @@ -564,50 +542,50 @@ static void get_arc_control_points(vg_arc * arc, bool start) * center: (in) the center of the circle in draw coordinates * cw: (in) true if arc is clockwise */ -static void add_split_arc_path(int32_t * arc_path, int * pidx, vg_arc * q_arc, lv_point_t center, bool cw) +static void add_split_arc_path(int32_t * arc_path, int * pidx, vg_arc * q_arc, const lv_point_t * center, bool cw) { /* assumes first control point already in array arc_path[] */ int idx = *pidx; if(cw) { #if BEZIER_DBG_CONTROL_POINTS arc_path[idx++] = VLC_OP_LINE; - arc_path[idx++] = q_arc->p1x + center.x; - arc_path[idx++] = q_arc->p1y + center.y; + arc_path[idx++] = q_arc->p1x + center->x; + arc_path[idx++] = q_arc->p1y + center->y; arc_path[idx++] = VLC_OP_LINE; - arc_path[idx++] = q_arc->p2x + center.x; - arc_path[idx++] = q_arc->p2y + center.y; + arc_path[idx++] = q_arc->p2x + center->x; + arc_path[idx++] = q_arc->p2y + center->y; arc_path[idx++] = VLC_OP_LINE; - arc_path[idx++] = q_arc->p3x + center.x; - arc_path[idx++] = q_arc->p3y + center.y; + arc_path[idx++] = q_arc->p3x + center->x; + arc_path[idx++] = q_arc->p3y + center->y; #else arc_path[idx++] = VLC_OP_CUBIC; - arc_path[idx++] = q_arc->p1x + center.x; - arc_path[idx++] = q_arc->p1y + center.y; - arc_path[idx++] = q_arc->p2x + center.x; - arc_path[idx++] = q_arc->p2y + center.y; - arc_path[idx++] = q_arc->p3x + center.x; - arc_path[idx++] = q_arc->p3y + center.y; + arc_path[idx++] = q_arc->p1x + center->x; + arc_path[idx++] = q_arc->p1y + center->y; + arc_path[idx++] = q_arc->p2x + center->x; + arc_path[idx++] = q_arc->p2y + center->y; + arc_path[idx++] = q_arc->p3x + center->x; + arc_path[idx++] = q_arc->p3y + center->y; #endif } else { /* reverse points order when counter-clockwise */ #if BEZIER_DBG_CONTROL_POINTS arc_path[idx++] = VLC_OP_LINE; - arc_path[idx++] = q_arc->p2x + center.x; - arc_path[idx++] = q_arc->p2y + center.y; + arc_path[idx++] = q_arc->p2x + center->x; + arc_path[idx++] = q_arc->p2y + center->y; arc_path[idx++] = VLC_OP_LINE; - arc_path[idx++] = q_arc->p1x + center.x; - arc_path[idx++] = q_arc->p1y + center.y; + arc_path[idx++] = q_arc->p1x + center->x; + arc_path[idx++] = q_arc->p1y + center->y; arc_path[idx++] = VLC_OP_LINE; - arc_path[idx++] = q_arc->p0x + center.x; - arc_path[idx++] = q_arc->p0y + center.y; + arc_path[idx++] = q_arc->p0x + center->x; + arc_path[idx++] = q_arc->p0y + center->y; #else arc_path[idx++] = VLC_OP_CUBIC; - arc_path[idx++] = q_arc->p2x + center.x; - arc_path[idx++] = q_arc->p2y + center.y; - arc_path[idx++] = q_arc->p1x + center.x; - arc_path[idx++] = q_arc->p1y + center.y; - arc_path[idx++] = q_arc->p0x + center.x; - arc_path[idx++] = q_arc->p0y + center.y; + arc_path[idx++] = q_arc->p2x + center->x; + arc_path[idx++] = q_arc->p2y + center->y; + arc_path[idx++] = q_arc->p1x + center->x; + arc_path[idx++] = q_arc->p1y + center->y; + arc_path[idx++] = q_arc->p0x + center->x; + arc_path[idx++] = q_arc->p0y + center->y; #endif } /* update index i n path array*/ @@ -615,8 +593,10 @@ static void add_split_arc_path(int32_t * arc_path, int * pidx, vg_arc * q_arc, l } static void add_arc_path(int32_t * arc_path, int * pidx, int32_t radius, - int32_t start_angle, int32_t end_angle, lv_point_t center, bool cw) + int32_t start_angle, int32_t end_angle, const lv_point_t * center, bool cw) { + if(end_angle < start_angle) end_angle += 360; + /* set number of arcs to draw */ vg_arc q_arc; int32_t start_arc_angle = start_angle % 90; diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/nxp/vglite/lv_draw_vglite_arc.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/nxp/vglite/lv_draw_vglite_arc.h similarity index 71% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/nxp/vglite/lv_draw_vglite_arc.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/nxp/vglite/lv_draw_vglite_arc.h index 98ba8a3..0fbff3d 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/nxp/vglite/lv_draw_vglite_arc.h +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/nxp/vglite/lv_draw_vglite_arc.h @@ -6,7 +6,7 @@ /** * MIT License * - * Copyright 2021, 2022 NXP + * Copyright 2021-2023 NXP * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -40,7 +40,7 @@ extern "C" { #include "../../../lv_conf_internal.h" #if LV_USE_GPU_NXP_VG_LITE -#include "lv_gpu_nxp_vglite.h" +#include "lv_vglite_utils.h" /********************* * DEFINES @@ -54,17 +54,21 @@ extern "C" { * GLOBAL PROTOTYPES **********************/ -/*** +/** * Draw arc shape with effects - * @param draw_ctx drawing context - * @param dsc the arc description structure (width, rounded ending, opacity) - * @param center the coordinates of the arc center - * @param radius the radius of external arc - * @param start_angle the starting angle in degrees - * @param end_angle the ending angle in degrees + * + * @param[in] center Arc center with relative coordinates + * @param[in] radius Radius of external arc + * @param[in] start_angle Starting angle in degrees + * @param[in] end_angle Ending angle in degrees + * @param[in] clip_area Clipping area with relative coordinates to dest buff + * @param[in] dsc Arc description structure (width, rounded ending, opacity) + * + * @retval LV_RES_OK Draw completed + * @retval LV_RES_INV Error occurred (\see LV_GPU_NXP_VG_LITE_LOG_ERRORS) */ -lv_res_t lv_gpu_nxp_vglite_draw_arc(lv_draw_ctx_t * draw_ctx, const lv_draw_arc_dsc_t * dsc, const lv_point_t * center, - int32_t radius, int32_t start_angle, int32_t end_angle); +lv_res_t lv_gpu_nxp_vglite_draw_arc(const lv_point_t * center, int32_t radius, int32_t start_angle, int32_t end_angle, + const lv_area_t * clip_area, const lv_draw_arc_dsc_t * dsc); /********************** * MACROS diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/nxp/vglite/lv_draw_vglite_blend.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/nxp/vglite/lv_draw_vglite_blend.c new file mode 100644 index 0000000..a0f31e8 --- /dev/null +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/nxp/vglite/lv_draw_vglite_blend.c @@ -0,0 +1,634 @@ +/** + * @file lv_draw_vglite_blend.c + * + */ + +/** + * MIT License + * + * Copyright 2020-2023 NXP + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next paragraph) + * shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A + * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF + * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE + * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_draw_vglite_blend.h" + +#if LV_USE_GPU_NXP_VG_LITE +#include "lv_vglite_buf.h" +#include "lv_vglite_utils.h" + +/********************* + * DEFINES + *********************/ + +/** Stride in px required by VG-Lite HW*/ +#define LV_GPU_NXP_VG_LITE_STRIDE_ALIGN_PX 16U + +#if VG_LITE_BLIT_SPLIT_ENABLED + /** + * BLIT split threshold - BLITs with width or height higher than this value will be done + * in multiple steps. Value must be 16-aligned. Don't change. + */ + #define LV_GPU_NXP_VG_LITE_BLIT_SPLIT_THR 352 +#endif + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/** + * Blit image, with optional opacity. + * + * @param[in] src_area Source area with relative coordinates of source buffer + * @param[in] opa Opacity + * + * @retval LV_RES_OK Transfer complete + * @retval LV_RES_INV Error occurred (\see LV_GPU_NXP_VG_LITE_LOG_ERRORS) + */ +static lv_res_t lv_vglite_blit(const lv_area_t * src_area, lv_opa_t opa); + +/** + * Check source memory and stride alignment. + * + * @param[in] src_buf Source buffer + * @param[in] src_stride Stride of source buffer in pixels + * + * @retval LV_RES_OK Alignment OK + * @retval LV_RES_INV Error occurred (\see LV_GPU_NXP_VG_LITE_LOG_ERRORS) + */ +static lv_res_t check_src_alignment(const lv_color_t * src_buf, lv_coord_t src_stride); + +/** + * Creates matrix that translates to origin of given destination area. + * + * @param[in] dest_area Area with relative coordinates of destination buffer + */ +static inline void lv_vglite_set_translation_matrix(const lv_area_t * dest_area); + +/** + * Creates matrix that translates to origin of given destination area with transformation (scale or rotate). + * + * @param[in] dest_area Area with relative coordinates of destination buffer + * @param[in] dsc Image descriptor + */ +static inline void lv_vglite_set_transformation_matrix(const lv_area_t * dest_area, const lv_draw_img_dsc_t * dsc); + +#if VG_LITE_BLIT_SPLIT_ENABLED +/** + * Move buffer pointer as close as possible to area, but with respect to alignment requirements. X-axis only. + * + * @param[in/out] area Area to be updated + * @param[in/out] buf Pointer to be updated + */ +static void align_x(lv_area_t * area, lv_color_t ** buf); + +/** + * Move buffer pointer to the area start and update variables, Y-axis only. + * + * @param[in/out] area Area to be updated + * @param[in/out] buf Pointer to be updated + * @param[in] stride Buffer stride in pixels + */ +static void align_y(lv_area_t * area, lv_color_t ** buf, lv_coord_t stride); + +/** + * Blit image split in tiles, with optional opacity. + * + * @param[in/out] dest_buf Destination buffer + * @param[in] dest_area Area with relative coordinates of destination buffer + * @param[in] dest_stride Stride of destination buffer in pixels + * @param[in] src_buf Source buffer + * @param[in] src_area Source area with relative coordinates of source buffer + * @param[in] src_stride Stride of source buffer in pixels + * @param[in] opa Opacity + * + * @retval LV_RES_OK Transfer complete + * @retval LV_RES_INV Error occurred (\see LV_GPU_NXP_VG_LITE_LOG_ERRORS) + */ +static lv_res_t lv_vglite_blit_split(lv_color_t * dest_buf, lv_area_t * dest_area, lv_coord_t dest_stride, + const lv_color_t * src_buf, lv_area_t * src_area, lv_coord_t src_stride, + lv_opa_t opa); +#endif /*VG_LITE_BLIT_SPLIT_ENABLED*/ + +/********************** + * STATIC VARIABLES + **********************/ + +static vg_lite_matrix_t vgmatrix; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_res_t lv_gpu_nxp_vglite_fill(const lv_area_t * dest_area, lv_color_t color, lv_opa_t opa) +{ + vg_lite_error_t err = VG_LITE_SUCCESS; + lv_color32_t col32 = {.full = lv_color_to32(color)}; /*Convert color to RGBA8888*/ + vg_lite_color_t vgcol; /* vglite takes ABGR */ + vg_lite_buffer_t * vgbuf = lv_vglite_get_dest_buf(); + + vg_lite_buffer_format_t color_format = LV_COLOR_DEPTH == 16 ? VG_LITE_BGRA8888 : VG_LITE_ABGR8888; + if(lv_vglite_premult_and_swizzle(&vgcol, col32, opa, color_format) != LV_RES_OK) + VG_LITE_RETURN_INV("Premultiplication and swizzle failed."); + + if(opa >= (lv_opa_t)LV_OPA_MAX) { /*Opaque fill*/ + vg_lite_rectangle_t rect = { + .x = dest_area->x1, + .y = dest_area->y1, + .width = lv_area_get_width(dest_area), + .height = lv_area_get_height(dest_area) + }; + + err = vg_lite_clear(vgbuf, &rect, vgcol); + VG_LITE_ERR_RETURN_INV(err, "Clear failed."); + + if(lv_vglite_run() != LV_RES_OK) + VG_LITE_RETURN_INV("Run failed."); + } + else { /*fill with transparency*/ + + vg_lite_path_t path; + int32_t path_data[] = { /*VG rectangular path*/ + VLC_OP_MOVE, dest_area->x1, dest_area->y1, + VLC_OP_LINE, dest_area->x2 + 1, dest_area->y1, + VLC_OP_LINE, dest_area->x2 + 1, dest_area->y2 + 1, + VLC_OP_LINE, dest_area->x1, dest_area->y2 + 1, + VLC_OP_LINE, dest_area->x1, dest_area->y1, + VLC_OP_END + }; + + err = vg_lite_init_path(&path, VG_LITE_S32, VG_LITE_LOW, sizeof(path_data), path_data, + (vg_lite_float_t) dest_area->x1, (vg_lite_float_t) dest_area->y1, + ((vg_lite_float_t) dest_area->x2) + 1.0f, ((vg_lite_float_t) dest_area->y2) + 1.0f); + VG_LITE_ERR_RETURN_INV(err, "Init path failed."); + + vg_lite_matrix_t matrix; + vg_lite_identity(&matrix); + + /*Draw rectangle*/ + err = vg_lite_draw(vgbuf, &path, VG_LITE_FILL_EVEN_ODD, &matrix, VG_LITE_BLEND_SRC_OVER, vgcol); + VG_LITE_ERR_RETURN_INV(err, "Draw rectangle failed."); + + if(lv_vglite_run() != LV_RES_OK) + VG_LITE_RETURN_INV("Run failed."); + + err = vg_lite_clear_path(&path); + VG_LITE_ERR_RETURN_INV(err, "Clear path failed."); + } + + return LV_RES_OK; +} + +#if VG_LITE_BLIT_SPLIT_ENABLED +lv_res_t lv_gpu_nxp_vglite_blit_split(lv_color_t * dest_buf, lv_area_t * dest_area, lv_coord_t dest_stride, + const lv_color_t * src_buf, lv_area_t * src_area, lv_coord_t src_stride, + lv_opa_t opa) +{ + /* Set src_vgbuf structure. */ + lv_vglite_set_src_buf(src_buf, src_area, src_stride); + + lv_color_t * orig_dest_buf = dest_buf; + + lv_res_t rv = lv_vglite_blit_split(dest_buf, dest_area, dest_stride, src_buf, src_area, src_stride, opa); + + /* Restore the original dest_vgbuf memory address. */ + lv_vglite_set_dest_buf_ptr(orig_dest_buf); + + return rv; +} +#else +lv_res_t lv_gpu_nxp_vglite_blit(const lv_area_t * dest_area, + const lv_color_t * src_buf, const lv_area_t * src_area, lv_coord_t src_stride, + lv_opa_t opa) +{ + if(check_src_alignment(src_buf, src_stride) != LV_RES_OK) + VG_LITE_RETURN_INV("Check src alignment failed."); + + /* Set src_vgbuf structure. */ + lv_vglite_set_src_buf(src_buf, src_area, src_stride); + + /* Set scissor. */ + lv_vglite_set_scissor(dest_area); + + /* Set vgmatrix. */ + lv_vglite_set_translation_matrix(dest_area); + + /* Start blit. */ + lv_res_t rv = lv_vglite_blit(src_area, opa); + + /* Disable scissor. */ + lv_vglite_disable_scissor(); + + return rv; +} + +lv_res_t lv_gpu_nxp_vglite_blit_transform(const lv_area_t * dest_area, const lv_area_t * clip_area, + const lv_color_t * src_buf, const lv_area_t * src_area, lv_coord_t src_stride, + const lv_draw_img_dsc_t * dsc) +{ + lv_res_t rv = LV_RES_INV; + + if(check_src_alignment(src_buf, src_stride) != LV_RES_OK) + VG_LITE_RETURN_INV("Check src alignment failed."); + + /* Set src_vgbuf structure. */ + lv_vglite_set_src_buf(src_buf, src_area, src_stride); + + /* Set scissor */ + lv_vglite_set_scissor(clip_area); + + /* Set vgmatrix. */ + lv_vglite_set_transformation_matrix(dest_area, dsc); + + /* Start blit. */ + rv = lv_vglite_blit(src_area, dsc->opa); + + /* Disable scissor. */ + lv_vglite_disable_scissor(); + + return rv; +} +#endif /*VG_LITE_BLIT_SPLIT_ENABLED*/ + +lv_res_t lv_gpu_nxp_vglite_buffer_copy(lv_color_t * dest_buf, const lv_area_t * dest_area, lv_coord_t dest_stride, + const lv_color_t * src_buf, const lv_area_t * src_area, lv_coord_t src_stride) +{ + vg_lite_error_t err = VG_LITE_SUCCESS; + + if(check_src_alignment(src_buf, src_stride) != LV_RES_OK) + VG_LITE_RETURN_INV("Check src alignment failed."); + + vg_lite_buffer_t src_vgbuf; + /* Set src_vgbuf structure. */ + lv_vglite_set_buf(&src_vgbuf, src_buf, src_area, src_stride); + + vg_lite_buffer_t dest_vgbuf; + /* Set dest_vgbuf structure. */ + lv_vglite_set_buf(&dest_vgbuf, dest_buf, dest_area, dest_stride); + + uint32_t rect[] = { + (uint32_t)src_area->x1, /* start x */ + (uint32_t)src_area->y1, /* start y */ + (uint32_t)lv_area_get_width(src_area), /* width */ + (uint32_t)lv_area_get_height(src_area) /* height */ + }; + + /* Set scissor. */ + lv_vglite_set_scissor(dest_area); + + /* Set vgmatrix. */ + lv_vglite_set_translation_matrix(dest_area); + + err = vg_lite_blit_rect(&dest_vgbuf, &src_vgbuf, rect, &vgmatrix, + VG_LITE_BLEND_NONE, 0xFFFFFFFFU, VG_LITE_FILTER_POINT); + if(err != VG_LITE_SUCCESS) { + LV_LOG_ERROR("Blit rectangle failed."); + /* Disable scissor. */ + lv_vglite_disable_scissor(); + + return LV_RES_INV; + } + + if(lv_vglite_run() != LV_RES_OK) { + LV_LOG_ERROR("Run failed."); + /* Disable scissor. */ + lv_vglite_disable_scissor(); + + return LV_RES_INV; + } + + /* Disable scissor. */ + lv_vglite_disable_scissor(); + + return LV_RES_OK; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +#if VG_LITE_BLIT_SPLIT_ENABLED +static lv_res_t lv_vglite_blit_split(lv_color_t * dest_buf, lv_area_t * dest_area, lv_coord_t dest_stride, + const lv_color_t * src_buf, lv_area_t * src_area, lv_coord_t src_stride, + lv_opa_t opa) +{ + lv_res_t rv = LV_RES_INV; + + VG_LITE_LOG_TRACE("Blit " + "Area: ([%d,%d], [%d,%d]) -> ([%d,%d], [%d,%d]) | " + "Size: ([%dx%d] -> [%dx%d]) | " + "Addr: (0x%x -> 0x%x)", + src_area->x1, src_area->y1, src_area->x2, src_area->y2, + dest_area->x1, dest_area->y1, dest_area->x2, dest_area->y2, + lv_area_get_width(src_area), lv_area_get_height(src_area), + lv_area_get_width(dest_area), lv_area_get_height(dest_area), + (uintptr_t)src_buf, (uintptr_t)dest_buf); + + /* Stage 1: Move starting pointers as close as possible to [x1, y1], so coordinates are as small as possible. */ + align_x(src_area, (lv_color_t **)&src_buf); + align_y(src_area, (lv_color_t **)&src_buf, src_stride); + align_x(dest_area, (lv_color_t **)&dest_buf); + align_y(dest_area, (lv_color_t **)&dest_buf, dest_stride); + + /* Stage 2: If we're in limit, do a single BLIT */ + if((src_area->x2 < LV_GPU_NXP_VG_LITE_BLIT_SPLIT_THR) && + (src_area->y2 < LV_GPU_NXP_VG_LITE_BLIT_SPLIT_THR)) { + if(check_src_alignment(src_buf, src_stride) != LV_RES_OK) + VG_LITE_RETURN_INV("Check src alignment failed."); + + /* Set new dest_vgbuf and src_vgbuf memory addresses. */ + lv_vglite_set_dest_buf_ptr(dest_buf); + lv_vglite_set_src_buf_ptr(src_buf); + + /* Set scissor */ + lv_vglite_set_scissor(dest_area); + + /* Set vgmatrix. */ + lv_vglite_set_translation_matrix(dest_area); + + /* Start blit. */ + rv = lv_vglite_blit(src_area, opa); + + /* Disable scissor. */ + lv_vglite_disable_scissor(); + + VG_LITE_LOG_TRACE("Single " + "Area: ([%d,%d], [%d,%d]) -> ([%d,%d], [%d,%d]) | " + "Size: ([%dx%d] -> [%dx%d]) | " + "Addr: (0x%x -> 0x%x) %s", + src_area->x1, src_area->y1, src_area->x2, src_area->y2, + dest_area->x1, dest_area->y1, dest_area->x2, dest_area->y2, + lv_area_get_width(src_area), lv_area_get_height(src_area), + lv_area_get_width(dest_area), lv_area_get_height(dest_area), + (uintptr_t)src_buf, (uintptr_t)dest_buf, + rv == LV_RES_OK ? "OK!" : "FAILED!"); + + return rv; + }; + + /* Stage 3: Split the BLIT into multiple tiles */ + VG_LITE_LOG_TRACE("Split " + "Area: ([%d,%d], [%d,%d]) -> ([%d,%d], [%d,%d]) | " + "Size: ([%dx%d] -> [%dx%d]) | " + "Addr: (0x%x -> 0x%x)", + src_area->x1, src_area->y1, src_area->x2, src_area->y2, + dest_area->x1, dest_area->y1, dest_area->x2, dest_area->y2, + lv_area_get_width(src_area), lv_area_get_height(src_area), + lv_area_get_width(dest_area), lv_area_get_height(dest_area), + (uintptr_t)src_buf, (uintptr_t)dest_buf); + + lv_coord_t width = lv_area_get_width(src_area); + lv_coord_t height = lv_area_get_height(src_area); + + /* Number of tiles needed */ + int total_tiles_x = (src_area->x1 + width + LV_GPU_NXP_VG_LITE_BLIT_SPLIT_THR - 1) / + LV_GPU_NXP_VG_LITE_BLIT_SPLIT_THR; + int total_tiles_y = (src_area->y1 + height + LV_GPU_NXP_VG_LITE_BLIT_SPLIT_THR - 1) / + LV_GPU_NXP_VG_LITE_BLIT_SPLIT_THR; + + /* src and dst buffer shift against each other. Src buffer real data [0,0] may start actually at [3,0] in buffer, as + * the buffer pointer has to be aligned, while dst buffer real data [0,0] may start at [1,0] in buffer. alignment may be + * different */ + int shift_src_x = (src_area->x1 > dest_area->x1) ? (src_area->x1 - dest_area->x1) : 0; + int shift_dest_x = (src_area->x1 < dest_area->x1) ? (dest_area->x1 - src_area->x1) : 0; + + VG_LITE_LOG_TRACE("X shift: src: %d, dst: %d", shift_src_x, shift_dest_x); + + lv_color_t * tile_dest_buf; + lv_area_t tile_dest_area; + const lv_color_t * tile_src_buf; + lv_area_t tile_src_area; + + for(int y = 0; y < total_tiles_y; y++) { + + tile_src_area.y1 = 0; /* no vertical alignment, always start from 0 */ + tile_src_area.y2 = height - y * LV_GPU_NXP_VG_LITE_BLIT_SPLIT_THR - 1; + if(tile_src_area.y2 >= LV_GPU_NXP_VG_LITE_BLIT_SPLIT_THR) { + tile_src_area.y2 = LV_GPU_NXP_VG_LITE_BLIT_SPLIT_THR - 1; /* Should never happen */ + } + tile_src_buf = src_buf + y * LV_GPU_NXP_VG_LITE_BLIT_SPLIT_THR * src_stride; + + tile_dest_area.y1 = tile_src_area.y1; /* y has no alignment, always in sync with src */ + tile_dest_area.y2 = tile_src_area.y2; + + tile_dest_buf = dest_buf + y * LV_GPU_NXP_VG_LITE_BLIT_SPLIT_THR * dest_stride; + + for(int x = 0; x < total_tiles_x; x++) { + + if(x == 0) { + /* 1st tile is special - there may be a gap between buffer start pointer + * and area.x1 value, as the pointer has to be aligned. + * tile_src_buf pointer - keep init value from Y-loop. + * Also, 1st tile start is not shifted! shift is applied from 2nd tile */ + tile_src_area.x1 = src_area->x1; + tile_dest_area.x1 = dest_area->x1; + } + else { + /* subsequent tiles always starts from 0, but shifted*/ + tile_src_area.x1 = 0 + shift_src_x; + tile_dest_area.x1 = 0 + shift_dest_x; + /* and advance start pointer + 1 tile size */ + tile_src_buf += LV_GPU_NXP_VG_LITE_BLIT_SPLIT_THR; + tile_dest_buf += LV_GPU_NXP_VG_LITE_BLIT_SPLIT_THR; + } + + /* Clip tile end coordinates */ + tile_src_area.x2 = width + src_area->x1 - x * LV_GPU_NXP_VG_LITE_BLIT_SPLIT_THR - 1; + if(tile_src_area.x2 >= LV_GPU_NXP_VG_LITE_BLIT_SPLIT_THR) { + tile_src_area.x2 = LV_GPU_NXP_VG_LITE_BLIT_SPLIT_THR - 1; + } + + tile_dest_area.x2 = width + dest_area->x1 - x * LV_GPU_NXP_VG_LITE_BLIT_SPLIT_THR - 1; + if(tile_dest_area.x2 >= LV_GPU_NXP_VG_LITE_BLIT_SPLIT_THR) { + tile_dest_area.x2 = LV_GPU_NXP_VG_LITE_BLIT_SPLIT_THR - 1; + } + + if(x < (total_tiles_x - 1)) { + /* And adjust end coords if shifted, but not for last tile! */ + tile_src_area.x2 += shift_src_x; + tile_dest_area.x2 += shift_dest_x; + } + + if(check_src_alignment(tile_src_buf, src_stride) != LV_RES_OK) + VG_LITE_RETURN_INV("Check src alignment failed."); + + /* Set new dest_vgbuf and src_vgbuf memory addresses. */ + lv_vglite_set_dest_buf_ptr(tile_dest_buf); + lv_vglite_set_src_buf_ptr(tile_src_buf); + + /* Set scissor */ + lv_vglite_set_scissor(&tile_dest_area); + + /* Set vgmatrix. */ + lv_vglite_set_translation_matrix(&tile_dest_area); + + /* Start blit. */ + rv = lv_vglite_blit(&tile_src_area, opa); + + /* Disable scissor. */ + lv_vglite_disable_scissor(); + + VG_LITE_LOG_TRACE("Tile [%d, %d] " + "Area: ([%d,%d], [%d,%d]) -> ([%d,%d], [%d,%d]) | " + "Size: ([%dx%d] -> [%dx%d]) | " + "Addr: (0x%x -> 0x%x) %s", + x, y, + tile_src_area.x1, tile_src_area.y1, tile_src_area.x2, tile_src_area.y2, + tile_dest_area.x1, tile_dest_area.y1, tile_dest_area.x2, tile_dest_area.y2, + lv_area_get_width(&tile_src_area), lv_area_get_height(&tile_src_area), + lv_area_get_width(&tile_dest_area), lv_area_get_height(&tile_dest_area), + (uintptr_t)tile_src_buf, (uintptr_t)tile_dest_buf, + rv == LV_RES_OK ? "OK!" : "FAILED!"); + + if(rv != LV_RES_OK) { + return rv; + } + } + } + + return rv; +} +#endif /*VG_LITE_BLIT_SPLIT_ENABLED*/ + +static lv_res_t lv_vglite_blit(const lv_area_t * src_area, lv_opa_t opa) +{ + vg_lite_error_t err = VG_LITE_SUCCESS; + vg_lite_buffer_t * dst_vgbuf = lv_vglite_get_dest_buf(); + vg_lite_buffer_t * src_vgbuf = lv_vglite_get_src_buf(); + + uint32_t rect[] = { + (uint32_t)src_area->x1, /* start x */ + (uint32_t)src_area->y1, /* start y */ + (uint32_t)lv_area_get_width(src_area), /* width */ + (uint32_t)lv_area_get_height(src_area) /* height */ + }; + + uint32_t color; + vg_lite_blend_t blend; + if(opa >= (lv_opa_t)LV_OPA_MAX) { + color = 0xFFFFFFFFU; + blend = VG_LITE_BLEND_SRC_OVER; + src_vgbuf->transparency_mode = VG_LITE_IMAGE_TRANSPARENT; + } + else { + if(vg_lite_query_feature(gcFEATURE_BIT_VG_PE_PREMULTIPLY)) { + color = (opa << 24) | 0x00FFFFFFU; + } + else { + color = (opa << 24) | (opa << 16) | (opa << 8) | opa; + } + blend = VG_LITE_BLEND_SRC_OVER; + src_vgbuf->image_mode = VG_LITE_MULTIPLY_IMAGE_MODE; + src_vgbuf->transparency_mode = VG_LITE_IMAGE_TRANSPARENT; + } + + err = vg_lite_blit_rect(dst_vgbuf, src_vgbuf, rect, &vgmatrix, blend, color, VG_LITE_FILTER_POINT); + VG_LITE_ERR_RETURN_INV(err, "Blit rectangle failed."); + + if(lv_vglite_run() != LV_RES_OK) + VG_LITE_RETURN_INV("Run failed."); + + return LV_RES_OK; +} + +static lv_res_t check_src_alignment(const lv_color_t * src_buf, lv_coord_t src_stride) +{ + /* No alignment requirement for destination pixel buffer when using mode VG_LITE_LINEAR */ + + /* Test for pointer alignment */ + if((((uintptr_t)src_buf) % (uintptr_t)LV_ATTRIBUTE_MEM_ALIGN_SIZE) != (uintptr_t)0x0U) + VG_LITE_RETURN_INV("Src buffer ptr (0x%x) not aligned to 0x%x bytes.", + (size_t)src_buf, LV_ATTRIBUTE_MEM_ALIGN_SIZE); + + /* Test for stride alignment */ + if((src_stride % (lv_coord_t)LV_GPU_NXP_VG_LITE_STRIDE_ALIGN_PX) != 0x0U) + VG_LITE_RETURN_INV("Src buffer stride (%d px) not aligned to %d px.", + src_stride, LV_GPU_NXP_VG_LITE_STRIDE_ALIGN_PX); + return LV_RES_OK; +} + +static inline void lv_vglite_set_translation_matrix(const lv_area_t * dest_area) +{ + vg_lite_identity(&vgmatrix); + vg_lite_translate((vg_lite_float_t)dest_area->x1, (vg_lite_float_t)dest_area->y1, &vgmatrix); +} + +static inline void lv_vglite_set_transformation_matrix(const lv_area_t * dest_area, const lv_draw_img_dsc_t * dsc) +{ + lv_vglite_set_translation_matrix(dest_area); + + bool has_scale = (dsc->zoom != LV_IMG_ZOOM_NONE); + bool has_rotation = (dsc->angle != 0); + + vg_lite_translate(dsc->pivot.x, dsc->pivot.y, &vgmatrix); + if(has_rotation) + vg_lite_rotate(dsc->angle / 10.0f, &vgmatrix); /* angle is 1/10 degree */ + if(has_scale) { + vg_lite_float_t scale = 1.0f * dsc->zoom / LV_IMG_ZOOM_NONE; + vg_lite_scale(scale, scale, &vgmatrix); + } + vg_lite_translate(0.0f - dsc->pivot.x, 0.0f - dsc->pivot.y, &vgmatrix); +} + +#if VG_LITE_BLIT_SPLIT_ENABLED +static void align_x(lv_area_t * area, lv_color_t ** buf) +{ + int alignedAreaStartPx = area->x1 - (area->x1 % (LV_ATTRIBUTE_MEM_ALIGN_SIZE / sizeof(lv_color_t))); + VG_LITE_COND_STOP(alignedAreaStartPx < 0, "Negative X alignment."); + + area->x1 -= alignedAreaStartPx; + area->x2 -= alignedAreaStartPx; + *buf += alignedAreaStartPx; +} + +static void align_y(lv_area_t * area, lv_color_t ** buf, lv_coord_t stride) +{ + int LineToAlignMem; + int alignedAreaStartPy; + /* find how many lines of pixels will respect memory alignment requirement */ + if((stride % (lv_coord_t)LV_ATTRIBUTE_MEM_ALIGN_SIZE) == 0x0U) { + alignedAreaStartPy = area->y1; + } + else { + LineToAlignMem = LV_ATTRIBUTE_MEM_ALIGN_SIZE / (LV_GPU_NXP_VG_LITE_STRIDE_ALIGN_PX * sizeof(lv_color_t)); + VG_LITE_COND_STOP(LV_ATTRIBUTE_MEM_ALIGN_SIZE % (LV_GPU_NXP_VG_LITE_STRIDE_ALIGN_PX * sizeof(lv_color_t)), + "Complex case: need gcd function."); + alignedAreaStartPy = area->y1 - (area->y1 % LineToAlignMem); + VG_LITE_COND_STOP(alignedAreaStartPy < 0, "Negative Y alignment."); + } + + area->y1 -= alignedAreaStartPy; + area->y2 -= alignedAreaStartPy; + *buf += (uint32_t)(alignedAreaStartPy * stride); +} +#endif /*VG_LITE_BLIT_SPLIT_ENABLED*/ + +#endif /*LV_USE_GPU_NXP_VG_LITE*/ diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/nxp/vglite/lv_draw_vglite_blend.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/nxp/vglite/lv_draw_vglite_blend.h new file mode 100644 index 0000000..1aae34b --- /dev/null +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/nxp/vglite/lv_draw_vglite_blend.h @@ -0,0 +1,168 @@ +/** + * @file lv_draw_vglite_blend.h + * + */ + +/** + * MIT License + * + * Copyright 2020-2023 NXP + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next paragraph) + * shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A + * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF + * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE + * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + */ + +#ifndef LV_DRAW_VGLITE_BLEND_H +#define LV_DRAW_VGLITE_BLEND_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../../../lv_conf_internal.h" + +#if LV_USE_GPU_NXP_VG_LITE +#include "lv_vglite_utils.h" + +/********************* + * DEFINES + *********************/ + +/** + * Enable BLIT quality degradation workaround for RT595, + * recommended for screen's dimension > 352 pixels. + */ +#define RT595_BLIT_WRKRND_ENABLED 1 + +/* Internal compound symbol */ +#if (defined(CPU_MIMXRT595SFFOB) || defined(CPU_MIMXRT595SFFOB_cm33) || \ + defined(CPU_MIMXRT595SFFOC) || defined(CPU_MIMXRT595SFFOC_cm33)) && \ + RT595_BLIT_WRKRND_ENABLED +#define VG_LITE_BLIT_SPLIT_ENABLED 1 +#else +#define VG_LITE_BLIT_SPLIT_ENABLED 0 +#endif + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Fill area, with optional opacity. + * + * @param[in] dest_area Area with relative coordinates of destination buffer + * @param[in] color Color + * @param[in] opa Opacity (255 = full, 128 = 50% background/50% color, 0 = no fill) + * + * @retval LV_RES_OK Fill completed + * @retval LV_RES_INV Error occurred (\see LV_GPU_NXP_VG_LITE_LOG_ERRORS) + */ +lv_res_t lv_gpu_nxp_vglite_fill(const lv_area_t * dest_area, lv_color_t color, lv_opa_t opa); + +#if VG_LITE_BLIT_SPLIT_ENABLED +/** + * BLock Image Transfer - copy rectangular image from src_buf to dst_buf with effects. + * By default, image is copied directly, with optional opacity. + * + * @param[in/out] dest_buf Destination buffer + * @param[in] dest_area Area with relative coordinates of destination buffer + * @param[in] dest_stride Stride of destination buffer in pixels + * @param[in] src_buf Source buffer + * @param[in] src_area Source area with relative coordinates of source buffer + * @param[in] src_stride Stride of source buffer in pixels + * @param[in] opa Opacity + * + * @retval LV_RES_OK Transfer complete + * @retval LV_RES_INV Error occurred (\see LV_GPU_NXP_VG_LITE_LOG_ERRORS) + */ +lv_res_t lv_gpu_nxp_vglite_blit_split(lv_color_t * dest_buf, lv_area_t * dest_area, lv_coord_t dest_stride, + const lv_color_t * src_buf, lv_area_t * src_area, lv_coord_t src_stride, + lv_opa_t opa); +#else +/** + * BLock Image Transfer - copy rectangular image from src_buf to dst_buf with effects. + * By default, image is copied directly, with optional opacity. + * + * @param[in] dest_stride Stride of destination buffer in pixels + * @param[in] src_buf Source buffer + * @param[in] src_area Source area with relative coordinates of source buffer + * @param[in] src_stride Stride of source buffer in pixels + * @param[in] opa Opacity + * + * @retval LV_RES_OK Transfer complete + * @retval LV_RES_INV Error occurred (\see LV_GPU_NXP_VG_LITE_LOG_ERRORS) + */ +lv_res_t lv_gpu_nxp_vglite_blit(const lv_area_t * dest_area, + const lv_color_t * src_buf, const lv_area_t * src_area, lv_coord_t src_stride, + lv_opa_t opa); + +/** + * BLock Image Transfer - copy rectangular image from src_buf to dst_buf with transformation. + * By default, image is copied directly, with optional opacity. + * + * @param[in] dest_area Area with relative coordinates of destination buffer + * @param[in] clip_area Clip area with relative coordinates of destination buffer + * @param[in] src_buf Source buffer + * @param[in] src_area Source area with relative coordinates of source buffer + * @param[in] src_stride Stride of source buffer in pixels + * @param[in] dsc Image descriptor + * + * @retval LV_RES_OK Transfer complete + * @retval LV_RES_INV Error occurred (\see LV_GPU_NXP_VG_LITE_LOG_ERRORS) + */ +lv_res_t lv_gpu_nxp_vglite_blit_transform(const lv_area_t * dest_area, const lv_area_t * clip_area, + const lv_color_t * src_buf, const lv_area_t * src_area, lv_coord_t src_stride, + const lv_draw_img_dsc_t * dsc); + +#endif /*VG_LITE_BLIT_SPLIT_ENABLED*/ + +/** + * BLock Image Transfer - simple copy of rectangular image from source to destination. + * + * @param[in] dest_buf Destination buffer + * @param[in] dest_area Area with relative coordinates of destination buffer + * @param[in] dest_stride Stride of destination buffer in pixels + * @param[in] src_buf Source buffer + * @param[in] src_area Source area with relative coordinates of source buffer + * @param[in] src_stride Stride of source buffer in pixels + * + * @retval LV_RES_OK Transfer complete + * @retval LV_RES_INV Error occurred (\see LV_GPU_NXP_VG_LITE_LOG_ERRORS) + */ +lv_res_t lv_gpu_nxp_vglite_buffer_copy(lv_color_t * dest_buf, const lv_area_t * dest_area, lv_coord_t dest_stride, + const lv_color_t * src_buf, const lv_area_t * src_area, lv_coord_t src_stride); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_GPU_NXP_VG_LITE*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_DRAW_VGLITE_BLEND_H*/ diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/nxp/vglite/lv_draw_vglite_line.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/nxp/vglite/lv_draw_vglite_line.c new file mode 100644 index 0000000..bf7bee1 --- /dev/null +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/nxp/vglite/lv_draw_vglite_line.c @@ -0,0 +1,142 @@ +/** + * @file lv_draw_vglite_line.c + * + */ + +/** + * MIT License + * + * Copyright 2022, 2023 NXP + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next paragraph) + * shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A + * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF + * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE + * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_draw_vglite_line.h" + +#if LV_USE_GPU_NXP_VG_LITE +#include "lv_vglite_buf.h" +#include + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_res_t lv_gpu_nxp_vglite_draw_line(const lv_point_t * point1, const lv_point_t * point2, + const lv_area_t * clip_area, const lv_draw_line_dsc_t * dsc) +{ + vg_lite_error_t err = VG_LITE_SUCCESS; + vg_lite_path_t path; + vg_lite_color_t vgcol; /* vglite takes ABGR */ + vg_lite_buffer_t * vgbuf = lv_vglite_get_dest_buf(); + vg_lite_cap_style_t cap_style = (dsc->round_start || dsc->round_end) ? VG_LITE_CAP_ROUND : VG_LITE_CAP_BUTT; + vg_lite_join_style_t join_style = (dsc->round_start || dsc->round_end) ? VG_LITE_JOIN_ROUND : VG_LITE_JOIN_MITER; + + bool is_dashed = (dsc->dash_width && dsc->dash_gap); + + vg_lite_float_t stroke_dash_pattern[2] = {0, 0}; + uint32_t stroke_dash_count = 0; + vg_lite_float_t stroke_dash_phase = 0; + if(is_dashed) { + stroke_dash_pattern[0] = (vg_lite_float_t)dsc->dash_width; + stroke_dash_pattern[1] = (vg_lite_float_t)dsc->dash_gap; + stroke_dash_count = sizeof(stroke_dash_pattern) / sizeof(vg_lite_float_t); + stroke_dash_phase = (vg_lite_float_t)dsc->dash_width / 2; + } + + /* Choose vglite blend mode based on given lvgl blend mode */ + vg_lite_blend_t vglite_blend_mode = lv_vglite_get_blend_mode(dsc->blend_mode); + + /*** Init path ***/ + lv_coord_t width = dsc->width; + + int32_t line_path[] = { /*VG line path*/ + VLC_OP_MOVE, point1->x, point1->y, + VLC_OP_LINE, point2->x, point2->y, + VLC_OP_END + }; + + err = vg_lite_init_path(&path, VG_LITE_S32, VG_LITE_HIGH, sizeof(line_path), line_path, + (vg_lite_float_t)clip_area->x1, (vg_lite_float_t)clip_area->y1, + ((vg_lite_float_t)clip_area->x2) + 1.0f, ((vg_lite_float_t)clip_area->y2) + 1.0f); + VG_LITE_ERR_RETURN_INV(err, "Init path failed."); + + vg_lite_matrix_t matrix; + vg_lite_identity(&matrix); + + lv_color32_t col32 = { .full = lv_color_to32(dsc->color) }; /*Convert color to RGBA8888*/ + vg_lite_buffer_format_t color_format = LV_COLOR_DEPTH == 16 ? VG_LITE_BGRA8888 : VG_LITE_ABGR8888; + if(lv_vglite_premult_and_swizzle(&vgcol, col32, dsc->opa, color_format) != LV_RES_OK) + VG_LITE_RETURN_INV("Premultiplication and swizzle failed."); + + /*** Draw line ***/ + err = vg_lite_set_draw_path_type(&path, VG_LITE_DRAW_STROKE_PATH); + VG_LITE_ERR_RETURN_INV(err, "Set draw path type failed."); + + err = vg_lite_set_stroke(&path, cap_style, join_style, width, 8, stroke_dash_pattern, stroke_dash_count, + stroke_dash_phase, vgcol); + VG_LITE_ERR_RETURN_INV(err, "Set stroke failed."); + + err = vg_lite_update_stroke(&path); + VG_LITE_ERR_RETURN_INV(err, "Update stroke failed."); + + lv_vglite_set_scissor(clip_area); + + err = vg_lite_draw(vgbuf, &path, VG_LITE_FILL_NON_ZERO, &matrix, vglite_blend_mode, vgcol); + VG_LITE_ERR_RETURN_INV(err, "Draw line failed."); + + if(lv_vglite_run() != LV_RES_OK) + VG_LITE_RETURN_INV("Run failed."); + + lv_vglite_disable_scissor(); + + err = vg_lite_clear_path(&path); + VG_LITE_ERR_RETURN_INV(err, "Clear path failed."); + + return LV_RES_OK; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +#endif /*LV_USE_GPU_NXP_VG_LITE*/ diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/nxp/vglite/lv_draw_vglite_line.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/nxp/vglite/lv_draw_vglite_line.h new file mode 100644 index 0000000..cbd4b95 --- /dev/null +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/nxp/vglite/lv_draw_vglite_line.h @@ -0,0 +1,83 @@ +/** + * @file lv_draw_vglite_line.h + * + */ + +/** + * MIT License + * + * Copyright 2022, 2023 NXP + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next paragraph) + * shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A + * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF + * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE + * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + */ + +#ifndef LV_DRAW_VGLITE_LINE_H +#define LV_DRAW_VGLITE_LINE_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../../lv_conf_internal.h" + +#if LV_USE_GPU_NXP_VG_LITE +#include "lv_vglite_utils.h" +#include "../../lv_draw_line.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Draw line shape with effects + * + * @param[in] point1 Starting point with relative coordinates + * @param[in] point2 Ending point with relative coordinates + * @param[in] clip_area Clipping area with relative coordinates to dest buff + * @param[in] dsc Line description structure (width, rounded ending, opacity, ...) + * + * @retval LV_RES_OK Draw completed + * @retval LV_RES_INV Error occurred (\see LV_GPU_NXP_VG_LITE_LOG_ERRORS) + */ +lv_res_t lv_gpu_nxp_vglite_draw_line(const lv_point_t * point1, const lv_point_t * point2, + const lv_area_t * clip_area, const lv_draw_line_dsc_t * dsc); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_GPU_NXP_VG_LITE*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_DRAW_VGLITE_RECT_H*/ diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/nxp/vglite/lv_draw_vglite_rect.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/nxp/vglite/lv_draw_vglite_rect.c new file mode 100644 index 0000000..e9db57d --- /dev/null +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/nxp/vglite/lv_draw_vglite_rect.c @@ -0,0 +1,459 @@ +/** + * @file lv_draw_vglite_rect.c + * + */ + +/** + * MIT License + * + * Copyright 2021-2023 NXP + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next paragraph) + * shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A + * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF + * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE + * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_draw_vglite_rect.h" + +#if LV_USE_GPU_NXP_VG_LITE +#include "lv_vglite_buf.h" +#include + +/********************* + * DEFINES + *********************/ +/********************* + * DEFINES + *********************/ + +/* Path data sizes for different elements */ +#define CUBIC_PATH_DATA_SIZE 7 /* 1 opcode, 6 arguments */ +#define LINE_PATH_DATA_SIZE 3 /* 1 opcode, 2 arguments */ +#define MOVE_PATH_DATA_SIZE 3 /* 1 opcode, 2 arguments */ +#define END_PATH_DATA_SIZE 1 /* 1 opcode, 0 arguments */ +/* Maximum possible rectangle path size + * is in the rounded rectangle case: + * - 1 move for the path start + * - 4 cubics for the corners + * - 4 lines for the sides + * - 1 end for the path end */ +#define RECT_PATH_DATA_MAX_SIZE 1 * MOVE_PATH_DATA_SIZE + 4 * CUBIC_PATH_DATA_SIZE + 4 * LINE_PATH_DATA_SIZE + 1 * END_PATH_DATA_SIZE + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/** + * Generates path data for rectangle drawing. + * + * @param[in/out] path The path data to initialize + * @param[in/out] path_size The resulting size of the created path data + * @param[in] dsc The style descriptor for the rectangle to be drawn + * @param[in] coords The coordinates of the rectangle to be drawn + */ +static void lv_vglite_create_rect_path_data(int32_t * path_data, uint32_t * path_data_size, + lv_coord_t radius, + const lv_area_t * coords); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_res_t lv_gpu_nxp_vglite_draw_bg(const lv_area_t * coords, const lv_area_t * clip_area, + const lv_draw_rect_dsc_t * dsc) +{ + vg_lite_error_t err = VG_LITE_SUCCESS; + lv_coord_t width = lv_area_get_width(coords); + lv_coord_t height = lv_area_get_height(coords); + vg_lite_color_t vgcol; + lv_coord_t radius = dsc->radius; + vg_lite_buffer_t * vgbuf = lv_vglite_get_dest_buf(); + + if(dsc->radius < 0) + return LV_RES_INV; + + /*** Init path ***/ + int32_t path_data[RECT_PATH_DATA_MAX_SIZE]; + uint32_t path_data_size; + lv_vglite_create_rect_path_data(path_data, &path_data_size, radius, coords); + vg_lite_quality_t path_quality = dsc->radius > 0 ? VG_LITE_HIGH : VG_LITE_LOW; + + vg_lite_path_t path; + err = vg_lite_init_path(&path, VG_LITE_S32, path_quality, path_data_size, path_data, + (vg_lite_float_t)clip_area->x1, (vg_lite_float_t)clip_area->y1, + ((vg_lite_float_t)clip_area->x2) + 1.0f, ((vg_lite_float_t)clip_area->y2) + 1.0f); + VG_LITE_ERR_RETURN_INV(err, "Init path failed."); + + vg_lite_matrix_t matrix; + vg_lite_identity(&matrix); + + vg_lite_matrix_t * grad_matrix; + vg_lite_linear_gradient_t gradient; + + /*** Init Color/Gradient ***/ + if(dsc->bg_grad.dir != (lv_grad_dir_t)LV_GRAD_DIR_NONE) { + uint32_t colors[2]; + uint32_t stops[2]; + lv_color32_t col32[2]; + + /* Gradient setup */ + uint8_t cnt = LV_MAX(dsc->bg_grad.stops_count, 2); + for(uint8_t i = 0; i < cnt; i++) { + col32[i].full = lv_color_to32(dsc->bg_grad.stops[i].color); /*Convert color to RGBA8888*/ + stops[i] = dsc->bg_grad.stops[i].frac; + + vg_lite_buffer_format_t color_format = LV_COLOR_DEPTH == 16 ? VG_LITE_ABGR8888 : VG_LITE_ARGB8888; + if(lv_vglite_premult_and_swizzle(&colors[i], col32[i], dsc->bg_opa, color_format) != LV_RES_OK) + VG_LITE_RETURN_INV("Premultiplication and swizzle failed."); + } + + lv_memset_00(&gradient, sizeof(vg_lite_linear_gradient_t)); + + err = vg_lite_init_grad(&gradient); + VG_LITE_ERR_RETURN_INV(err, "Init gradient failed"); + + err = vg_lite_set_grad(&gradient, cnt, colors, stops); + VG_LITE_ERR_RETURN_INV(err, "Set gradient failed."); + + err = vg_lite_update_grad(&gradient); + VG_LITE_ERR_RETURN_INV(err, "Update gradient failed."); + + grad_matrix = vg_lite_get_grad_matrix(&gradient); + vg_lite_identity(grad_matrix); + vg_lite_translate((float)coords->x1, (float)coords->y1, grad_matrix); + + if(dsc->bg_grad.dir == (lv_grad_dir_t)LV_GRAD_DIR_VER) { + vg_lite_scale(1.0f, (float)height / 256.0f, grad_matrix); + vg_lite_rotate(90.0f, grad_matrix); + } + else { /*LV_GRAD_DIR_HOR*/ + vg_lite_scale((float)width / 256.0f, 1.0f, grad_matrix); + } + } + + lv_color32_t bg_col32 = {.full = lv_color_to32(dsc->bg_color)}; /*Convert color to RGBA8888*/ + vg_lite_buffer_format_t color_format = LV_COLOR_DEPTH == 16 ? VG_LITE_BGRA8888 : VG_LITE_ABGR8888; + if(lv_vglite_premult_and_swizzle(&vgcol, bg_col32, dsc->bg_opa, color_format) != LV_RES_OK) + VG_LITE_RETURN_INV("Premultiplication and swizzle failed."); + + lv_vglite_set_scissor(clip_area); + + /*** Draw rectangle ***/ + if(dsc->bg_grad.dir == (lv_grad_dir_t)LV_GRAD_DIR_NONE) { + err = vg_lite_draw(vgbuf, &path, VG_LITE_FILL_EVEN_ODD, &matrix, VG_LITE_BLEND_SRC_OVER, vgcol); + } + else { + err = vg_lite_draw_gradient(vgbuf, &path, VG_LITE_FILL_EVEN_ODD, &matrix, &gradient, VG_LITE_BLEND_SRC_OVER); + } + VG_LITE_ERR_RETURN_INV(err, "Draw gradient failed."); + + if(lv_vglite_run() != LV_RES_OK) + VG_LITE_RETURN_INV("Run failed."); + + lv_vglite_disable_scissor(); + + err = vg_lite_clear_path(&path); + VG_LITE_ERR_RETURN_INV(err, "Clear path failed."); + + if(dsc->bg_grad.dir != (lv_grad_dir_t)LV_GRAD_DIR_NONE) { + err = vg_lite_clear_grad(&gradient); + VG_LITE_ERR_RETURN_INV(err, "Clear gradient failed."); + } + + return LV_RES_OK; +} + +lv_res_t lv_gpu_nxp_vglite_draw_border_generic(const lv_area_t * coords, const lv_area_t * clip_area, + const lv_draw_rect_dsc_t * dsc, bool border) +{ + vg_lite_error_t err = VG_LITE_SUCCESS; + vg_lite_color_t vgcol; /* vglite takes ABGR */ + lv_coord_t radius = dsc->radius; + vg_lite_buffer_t * vgbuf = lv_vglite_get_dest_buf(); + + if(radius < 0) + return LV_RES_INV; + + if(border) { + /* Draw border - only has radius if object has radius*/ + lv_coord_t border_half = (lv_coord_t)floor(dsc->border_width / 2.0f); + if(radius > border_half) + radius = radius - border_half; + } + else { + /* Draw outline - always has radius, leave the same radius in the circle case */ + lv_coord_t outline_half = (lv_coord_t)ceil(dsc->outline_width / 2.0f); + if(radius < (lv_coord_t)LV_RADIUS_CIRCLE - outline_half) + radius = radius + outline_half; + } + + vg_lite_cap_style_t cap_style = (radius) ? VG_LITE_CAP_ROUND : VG_LITE_CAP_BUTT; + vg_lite_join_style_t join_style = (radius) ? VG_LITE_JOIN_ROUND : VG_LITE_JOIN_MITER; + + /* Choose vglite blend mode based on given lvgl blend mode */ + vg_lite_blend_t vglite_blend_mode = lv_vglite_get_blend_mode(dsc->blend_mode); + + /*** Init path ***/ + int32_t path_data[RECT_PATH_DATA_MAX_SIZE]; + uint32_t path_data_size; + lv_vglite_create_rect_path_data(path_data, &path_data_size, radius, coords); + vg_lite_quality_t path_quality = dsc->radius > 0 ? VG_LITE_HIGH : VG_LITE_LOW; + + vg_lite_path_t path; + err = vg_lite_init_path(&path, VG_LITE_S32, path_quality, path_data_size, path_data, + (vg_lite_float_t)clip_area->x1, (vg_lite_float_t)clip_area->y1, + ((vg_lite_float_t)clip_area->x2) + 1.0f, ((vg_lite_float_t)clip_area->y2) + 1.0f); + VG_LITE_ERR_RETURN_INV(err, "Init path failed."); + + vg_lite_matrix_t matrix; + vg_lite_identity(&matrix); + + lv_opa_t opa; + lv_color32_t col32; + lv_coord_t line_width; + + if(border) { + opa = dsc->border_opa; + col32.full = lv_color_to32(dsc->border_color); /*Convert color to RGBA8888*/ + line_width = dsc->border_width; + } + else { + opa = dsc->outline_opa; + col32.full = lv_color_to32(dsc->outline_color); /*Convert color to RGBA8888*/ + line_width = dsc->outline_width; + } + + vg_lite_buffer_format_t color_format = LV_COLOR_DEPTH == 16 ? VG_LITE_BGRA8888 : VG_LITE_ABGR8888; + if(lv_vglite_premult_and_swizzle(&vgcol, col32, opa, color_format) != LV_RES_OK) + VG_LITE_RETURN_INV("Premultiplication and swizzle failed."); + + /*** Draw border ***/ + err = vg_lite_set_draw_path_type(&path, VG_LITE_DRAW_STROKE_PATH); + VG_LITE_ERR_RETURN_INV(err, "Set draw path type failed."); + + err = vg_lite_set_stroke(&path, cap_style, join_style, line_width, 8, NULL, 0, 0, vgcol); + VG_LITE_ERR_RETURN_INV(err, "Set stroke failed."); + + err = vg_lite_update_stroke(&path); + VG_LITE_ERR_RETURN_INV(err, "Update stroke failed."); + + lv_vglite_set_scissor(clip_area); + + err = vg_lite_draw(vgbuf, &path, VG_LITE_FILL_NON_ZERO, &matrix, vglite_blend_mode, vgcol); + VG_LITE_ERR_RETURN_INV(err, "Draw border failed."); + + if(lv_vglite_run() != LV_RES_OK) + VG_LITE_RETURN_INV("Run failed."); + + lv_vglite_disable_scissor(); + + err = vg_lite_clear_path(&path); + VG_LITE_ERR_RETURN_INV(err, "Clear path failed."); + + return LV_RES_OK; + +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void lv_vglite_create_rect_path_data(int32_t * path_data, uint32_t * path_data_size, + lv_coord_t radius, + const lv_area_t * coords) +{ + lv_coord_t rect_width = lv_area_get_width(coords); + lv_coord_t rect_height = lv_area_get_height(coords); + + /* Get the final radius. Can't be larger than the half of the shortest side */ + int32_t shortest_side = LV_MIN(rect_width, rect_height); + int32_t final_radius = LV_MIN(radius, shortest_side / 2); + + /* Path data element index */ + uint8_t pidx = 0; + + if((radius == (lv_coord_t)LV_RADIUS_CIRCLE) && (rect_width == rect_height)) { + + /* Get the control point offset for rounded cases */ + int32_t cpoff = (int32_t)((float)final_radius * BEZIER_OPTIM_CIRCLE); + + /* Circle case */ + /* Starting point */ + path_data[pidx++] = VLC_OP_MOVE; + path_data[pidx++] = coords->x1 + final_radius; + path_data[pidx++] = coords->y1; + + /* Top-right arc */ + path_data[pidx++] = VLC_OP_CUBIC_REL; + path_data[pidx++] = cpoff; + path_data[pidx++] = 0; + path_data[pidx++] = final_radius; + path_data[pidx++] = final_radius - cpoff; + path_data[pidx++] = final_radius; + path_data[pidx++] = final_radius; + + /* Bottom-right arc*/ + path_data[pidx++] = VLC_OP_CUBIC_REL; + path_data[pidx++] = 0; + path_data[pidx++] = cpoff; + path_data[pidx++] = cpoff - final_radius; + path_data[pidx++] = final_radius; + path_data[pidx++] = 0 - final_radius; + path_data[pidx++] = final_radius; + + /* Bottom-left arc */ + path_data[pidx++] = VLC_OP_CUBIC_REL; + path_data[pidx++] = 0 - cpoff; + path_data[pidx++] = 0; + path_data[pidx++] = 0 - final_radius; + path_data[pidx++] = cpoff - final_radius; + path_data[pidx++] = 0 - final_radius; + path_data[pidx++] = 0 - final_radius; + + /* Top-left arc*/ + path_data[pidx++] = VLC_OP_CUBIC_REL; + path_data[pidx++] = 0; + path_data[pidx++] = 0 - cpoff; + path_data[pidx++] = final_radius - cpoff; + path_data[pidx++] = 0 - final_radius; + path_data[pidx++] = final_radius; + path_data[pidx++] = 0 - final_radius; + + /* Ending point */ + path_data[pidx++] = VLC_OP_END; + } + else if(radius > 0) { + /* Get the control point offset for rounded cases */ + int32_t cpoff = (int32_t)((float)final_radius * BEZIER_OPTIM_CIRCLE); + + /* Rounded rectangle case */ + /* Starting point */ + path_data[pidx++] = VLC_OP_MOVE; + path_data[pidx++] = coords->x1 + final_radius; + path_data[pidx++] = coords->y1; + + /* Top side */ + path_data[pidx++] = VLC_OP_LINE; + path_data[pidx++] = coords->x2 - final_radius + 1; // Extended for VGLite + path_data[pidx++] = coords->y1; + + /* Top-right corner */ + path_data[pidx++] = VLC_OP_CUBIC_REL; + path_data[pidx++] = cpoff; + path_data[pidx++] = 0; + path_data[pidx++] = final_radius; + path_data[pidx++] = final_radius - cpoff; + path_data[pidx++] = final_radius; + path_data[pidx++] = final_radius; + + /* Right side */ + path_data[pidx++] = VLC_OP_LINE; + path_data[pidx++] = coords->x2 + 1; // Extended for VGLite + path_data[pidx++] = coords->y2 - final_radius + 1; // Extended for VGLite + + /* Bottom-right corner*/ + path_data[pidx++] = VLC_OP_CUBIC_REL; + path_data[pidx++] = 0; + path_data[pidx++] = cpoff; + path_data[pidx++] = cpoff - final_radius; + path_data[pidx++] = final_radius; + path_data[pidx++] = 0 - final_radius; + path_data[pidx++] = final_radius; + + /* Bottom side */ + path_data[pidx++] = VLC_OP_LINE; + path_data[pidx++] = coords->x1 + final_radius; + path_data[pidx++] = coords->y2 + 1; // Extended for VGLite + + /* Bottom-left corner */ + path_data[pidx++] = VLC_OP_CUBIC_REL; + path_data[pidx++] = 0 - cpoff; + path_data[pidx++] = 0; + path_data[pidx++] = 0 - final_radius; + path_data[pidx++] = cpoff - final_radius; + path_data[pidx++] = 0 - final_radius; + path_data[pidx++] = 0 - final_radius; + + /* Left side*/ + path_data[pidx++] = VLC_OP_LINE; + path_data[pidx++] = coords->x1; + path_data[pidx++] = coords->y1 + final_radius; + + /* Top-left corner */ + path_data[pidx++] = VLC_OP_CUBIC_REL; + path_data[pidx++] = 0; + path_data[pidx++] = 0 - cpoff; + path_data[pidx++] = final_radius - cpoff; + path_data[pidx++] = 0 - final_radius; + path_data[pidx++] = final_radius; + path_data[pidx++] = 0 - final_radius; + + /* Ending point */ + path_data[pidx++] = VLC_OP_END; + } + else { + /* Non-rounded rectangle case */ + /* Starting point */ + path_data[pidx++] = VLC_OP_MOVE; + path_data[pidx++] = coords->x1; + path_data[pidx++] = coords->y1; + + /* Top side */ + path_data[pidx++] = VLC_OP_LINE; + path_data[pidx++] = coords->x2 + 1; // Extended for VGLite + path_data[pidx++] = coords->y1; + + /* Right side */ + path_data[pidx++] = VLC_OP_LINE; + path_data[pidx++] = coords->x2 + 1; // Extended for VGLite + path_data[pidx++] = coords->y2 + 1; // Extended for VGLite + + /* Bottom side */ + path_data[pidx++] = VLC_OP_LINE; + path_data[pidx++] = coords->x1; + path_data[pidx++] = coords->y2 + 1; // Extended for VGLite + + /* Left side*/ + path_data[pidx++] = VLC_OP_LINE; + path_data[pidx++] = coords->x1; + path_data[pidx++] = coords->y1; + + /* Ending point */ + path_data[pidx++] = VLC_OP_END; + } + + /* Resulting path size */ + *path_data_size = pidx * sizeof(int32_t); +} + +#endif /*LV_USE_GPU_NXP_VG_LITE*/ diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/nxp/vglite/lv_draw_vglite_rect.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/nxp/vglite/lv_draw_vglite_rect.h new file mode 100644 index 0000000..7958227 --- /dev/null +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/nxp/vglite/lv_draw_vglite_rect.h @@ -0,0 +1,97 @@ +/** + * @file lv_draw_vglite_rect.h + * + */ + +/** + * MIT License + * + * Copyright 2021-2023 NXP + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next paragraph) + * shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A + * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF + * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE + * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + */ + +#ifndef LV_DRAW_VGLITE_RECT_H +#define LV_DRAW_VGLITE_RECT_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../../lv_conf_internal.h" + +#if LV_USE_GPU_NXP_VG_LITE +#include "lv_vglite_utils.h" +#include "../../lv_draw_rect.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Draw rectangle background with effects (rounded corners, gradient) + * + * @param[in] coords Coordinates of the rectangle background (relative to dest buff) + * @param[in] clip_area Clipping area with relative coordinates to dest buff + * @param[in] dsc Description of the rectangle background + * + * @retval LV_RES_OK Draw completed + * @retval LV_RES_INV Error occurred (\see LV_GPU_NXP_VG_LITE_LOG_ERRORS) + * + */ +lv_res_t lv_gpu_nxp_vglite_draw_bg(const lv_area_t * coords, const lv_area_t * clip_area, + const lv_draw_rect_dsc_t * dsc); + +/** + * Draw rectangle border/outline shape with effects (rounded corners, opacity) + * + * @param[in] coords Coordinates of the rectangle border/outline (relative to dest buff) + * @param[in] clip_area Clipping area with relative coordinates to dest buff + * @param[in] dsc Description of the rectangle border/outline + * @param[in] border True for border, False for outline + * + * @retval LV_RES_OK Draw completed + * @retval LV_RES_INV Error occurred (\see LV_GPU_NXP_VG_LITE_LOG_ERRORS) + * + */ +lv_res_t lv_gpu_nxp_vglite_draw_border_generic(const lv_area_t * coords, const lv_area_t * clip_area, + const lv_draw_rect_dsc_t * dsc, bool border); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_GPU_NXP_VG_LITE*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_DRAW_VGLITE_RECT_H*/ diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/nxp/vglite/lv_vglite_buf.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/nxp/vglite/lv_vglite_buf.c new file mode 100644 index 0000000..e1ff6a2 --- /dev/null +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/nxp/vglite/lv_vglite_buf.c @@ -0,0 +1,141 @@ +/** + * @file lv_vglite_buf.c + * + */ + +/** + * MIT License + * + * Copyright 2023 NXP + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next paragraph) + * shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A + * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF + * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE + * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_vglite_buf.h" + +#if LV_USE_GPU_NXP_VG_LITE + +/********************* + * DEFINES + *********************/ + +#if LV_COLOR_DEPTH == 16 + #define VG_LITE_PX_FMT VG_LITE_RGB565 +#elif LV_COLOR_DEPTH == 32 + #define VG_LITE_PX_FMT VG_LITE_BGRA8888 +#else + #error Only 16bit and 32bit color depth are supported. Set LV_COLOR_DEPTH to 16 or 32. +#endif + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +static inline void lv_vglite_set_dest_buf(const lv_color_t * buf, const lv_area_t * area, lv_coord_t stride); +static inline void lv_vglite_set_buf_ptr(vg_lite_buffer_t * vgbuf, const lv_color_t * buf); + +/********************** + * STATIC VARIABLES + **********************/ + +static vg_lite_buffer_t dest_vgbuf; +static vg_lite_buffer_t src_vgbuf; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_gpu_nxp_vglite_init_buf(const lv_color_t * buf, const lv_area_t * area, lv_coord_t stride) +{ + lv_vglite_set_dest_buf(buf, area, stride); +} + +vg_lite_buffer_t * lv_vglite_get_dest_buf(void) +{ + return &dest_vgbuf; +} + +vg_lite_buffer_t * lv_vglite_get_src_buf(void) +{ + return &src_vgbuf; +} + +void lv_vglite_set_dest_buf_ptr(const lv_color_t * buf) +{ + lv_vglite_set_buf_ptr(&dest_vgbuf, buf); +} + +void lv_vglite_set_src_buf_ptr(const lv_color_t * buf) +{ + lv_vglite_set_buf_ptr(&src_vgbuf, buf); +} + +void lv_vglite_set_src_buf(const lv_color_t * buf, const lv_area_t * area, lv_coord_t stride) +{ + if(src_vgbuf.memory != (void *)buf) + lv_vglite_set_buf(&src_vgbuf, buf, area, stride); +} + +void lv_vglite_set_buf(vg_lite_buffer_t * vgbuf, const lv_color_t * buf, + const lv_area_t * area, lv_coord_t stride) +{ + vgbuf->format = VG_LITE_PX_FMT; + vgbuf->tiled = VG_LITE_LINEAR; + vgbuf->image_mode = VG_LITE_NORMAL_IMAGE_MODE; + vgbuf->transparency_mode = VG_LITE_IMAGE_OPAQUE; + + vgbuf->width = (int32_t)lv_area_get_width(area); + vgbuf->height = (int32_t)lv_area_get_height(area); + vgbuf->stride = (int32_t)(stride) * sizeof(lv_color_t); + + lv_memset_00(&vgbuf->yuv, sizeof(vgbuf->yuv)); + + vgbuf->memory = (void *)buf; + vgbuf->address = (uint32_t)vgbuf->memory; + vgbuf->handle = NULL; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static inline void lv_vglite_set_dest_buf(const lv_color_t * buf, const lv_area_t * area, lv_coord_t stride) +{ + lv_vglite_set_buf(&dest_vgbuf, buf, area, stride); +} + +static inline void lv_vglite_set_buf_ptr(vg_lite_buffer_t * vgbuf, const lv_color_t * buf) +{ + vgbuf->memory = (void *)buf; + vgbuf->address = (uint32_t)vgbuf->memory; +} + +#endif /*LV_USE_GPU_NXP_VG_LITE*/ diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/nxp/vglite/lv_vglite_buf.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/nxp/vglite/lv_vglite_buf.h new file mode 100644 index 0000000..e89af1c --- /dev/null +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/nxp/vglite/lv_vglite_buf.h @@ -0,0 +1,124 @@ +/** + * @file lv_vglite_buf.h + * + */ + +/** + * MIT License + * + * Copyright 2023 NXP + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next paragraph) + * shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A + * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF + * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE + * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + */ + +#ifndef LV_VGLITE_BUF_H +#define LV_VGLITE_BUF_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../../lv_conf_internal.h" + +#if LV_USE_GPU_NXP_VG_LITE +#include "vg_lite.h" +#include "../../sw/lv_draw_sw.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ +/** + * Init vglite destination buffer. It will be done once per frame. + * + * @param[in] buf Destination buffer address (does not require alignment for VG_LITE_LINEAR mode) + * @param[in] area Destination buffer area (for width and height) + * @param[in] stride Stride of destination buffer + */ +void lv_gpu_nxp_vglite_init_buf(const lv_color_t * buf, const lv_area_t * area, lv_coord_t stride); + +/** + * Get vglite destination buffer pointer. + * + * @retval The vglite destination buffer + */ +vg_lite_buffer_t * lv_vglite_get_dest_buf(void); + +/** + * Get vglite source buffer pointer. + * + * @retval The vglite source buffer + */ +vg_lite_buffer_t * lv_vglite_get_src_buf(void); + +/** + * Set vglite destination buffer address only. + * + * @param[in] buf Destination buffer address (does not require alignment for VG_LITE_LINEAR mode) + */ +void lv_vglite_set_dest_buf_ptr(const lv_color_t * buf); + +/** + * Set vglite source buffer address only. + * + * @param[in] buf Source buffer address + */ +void lv_vglite_set_src_buf_ptr(const lv_color_t * buf); + +/** + * Set vglite source buffer. It will be done only if buffer addreess is different. + * + * @param[in] buf Source buffer address + * @param[in] area Source buffer area (for width and height) + * @param[in] stride Stride of source buffer + */ +void lv_vglite_set_src_buf(const lv_color_t * buf, const lv_area_t * area, lv_coord_t stride); + +/** + * Set vglite buffer. + * + * @param[in] vgbuf Address of the VGLite buffer object + * @param[in] buf Address of the memory for the VGLite buffer + * @param[in] area buffer area (for width and height) + * @param[in] stride buffer stride + */ +void lv_vglite_set_buf(vg_lite_buffer_t * vgbuf, const lv_color_t * buf, + const lv_area_t * area, lv_coord_t stride); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_GPU_NXP_VG_LITE*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_VGLITE_BUF_H*/ diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/nxp/vglite/lv_vglite_utils.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/nxp/vglite/lv_vglite_utils.c new file mode 100644 index 0000000..adc9f77 --- /dev/null +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/nxp/vglite/lv_vglite_utils.c @@ -0,0 +1,149 @@ +/** + * @file lv_vglite_utils.c + * + */ + +/** + * MIT License + * + * Copyright 2022, 2023 NXP + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next paragraph) + * shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A + * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF + * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE + * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_vglite_utils.h" + +#if LV_USE_GPU_NXP_VG_LITE +#include "../../../core/lv_refr.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/** + * Clean and invalidate cache. + */ +static inline void invalidate_cache(void); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_res_t lv_vglite_run(void) +{ + invalidate_cache(); + + VG_LITE_ERR_RETURN_INV(vg_lite_flush(), "Flush failed."); + + return LV_RES_OK; +} + +lv_res_t lv_vglite_premult_and_swizzle(vg_lite_color_t * vg_col32, lv_color32_t lv_col32, lv_opa_t opa, + vg_lite_buffer_format_t vg_col_format) +{ + + lv_color32_t lv_col32_premul = lv_col32; + if(opa <= (lv_opa_t)LV_OPA_MAX) { + /* Only pre-multiply color if hardware pre-multiplication is not present */ + if(!vg_lite_query_feature(gcFEATURE_BIT_VG_PE_PREMULTIPLY)) { + lv_col32_premul.ch.red = (uint8_t)(((uint16_t)lv_col32.ch.red * opa) >> 8); + lv_col32_premul.ch.green = (uint8_t)(((uint16_t)lv_col32.ch.green * opa) >> 8); + lv_col32_premul.ch.blue = (uint8_t)(((uint16_t)lv_col32.ch.blue * opa) >> 8); + } + lv_col32_premul.ch.alpha = opa; + } + + switch(vg_col_format) { + case VG_LITE_BGRA8888: + *vg_col32 = lv_col32_premul.full; + break; + case VG_LITE_RGBA8888: + *vg_col32 = ((uint32_t)lv_col32_premul.ch.red << 24) | ((uint32_t)lv_col32_premul.ch.green << 16) | + ((uint32_t)lv_col32_premul.ch.blue << 8) | (uint32_t)lv_col32_premul.ch.alpha; + break; + case VG_LITE_ABGR8888: + *vg_col32 = ((uint32_t)lv_col32_premul.ch.alpha << 24) | ((uint32_t)lv_col32_premul.ch.blue << 16) | + ((uint32_t)lv_col32_premul.ch.green << 8) | (uint32_t)lv_col32_premul.ch.red; + break; + case VG_LITE_ARGB8888: + *vg_col32 = ((uint32_t)lv_col32_premul.ch.alpha << 24) | ((uint32_t)lv_col32_premul.ch.red << 16) | + ((uint32_t)lv_col32_premul.ch.green << 8) | (uint32_t)lv_col32_premul.ch.blue; + break; + default: + return LV_RES_INV; + } + + return LV_RES_OK; +} + +vg_lite_blend_t lv_vglite_get_blend_mode(lv_blend_mode_t lv_blend_mode) +{ + vg_lite_blend_t vg_blend_mode; + switch(lv_blend_mode) { + case LV_BLEND_MODE_ADDITIVE: + vg_blend_mode = VG_LITE_BLEND_ADDITIVE; + break; + case LV_BLEND_MODE_SUBTRACTIVE: + vg_blend_mode = VG_LITE_BLEND_SUBTRACT; + break; + case LV_BLEND_MODE_MULTIPLY: + vg_blend_mode = VG_LITE_BLEND_MULTIPLY; + break; + case LV_BLEND_MODE_REPLACE: + vg_blend_mode = VG_LITE_BLEND_NONE; + break; + default: + vg_blend_mode = VG_LITE_BLEND_SRC_OVER; + break; + } + return vg_blend_mode; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static inline void invalidate_cache(void) +{ + lv_disp_t * disp = _lv_refr_get_disp_refreshing(); + if(disp->driver->clean_dcache_cb) + disp->driver->clean_dcache_cb(disp->driver); +} + +#endif /*LV_USE_GPU_NXP_VG_LITE*/ diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/nxp/vglite/lv_gpu_nxp_vglite.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/nxp/vglite/lv_vglite_utils.h similarity index 64% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/nxp/vglite/lv_gpu_nxp_vglite.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/nxp/vglite/lv_vglite_utils.h index c22cae1..3122d68 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/nxp/vglite/lv_gpu_nxp_vglite.h +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/nxp/vglite/lv_vglite_utils.h @@ -1,12 +1,12 @@ /** - * @file lv_gpu_nxp_vglite.h + * @file lv_vglite_utils.h * */ /** * MIT License * - * Copyright 2020-2022 NXP + * Copyright 2022, 2023 NXP * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -27,8 +27,8 @@ * */ -#ifndef LV_GPU_NXP_VGLITE_H -#define LV_GPU_NXP_VGLITE_H +#ifndef LV_VGLITE_UTILS_H +#define LV_VGLITE_UTILS_H #ifdef __cplusplus extern "C" { @@ -43,41 +43,21 @@ extern "C" { #include "vg_lite.h" #include "../../sw/lv_draw_sw.h" #include "../../../misc/lv_log.h" -#include "fsl_debug_console.h" /********************* * DEFINES *********************/ -/** Use this symbol as limit to disable feature (value has to be larger than supported resolution) */ -#define LV_GPU_NXP_VG_LITE_FEATURE_DISABLED (1920*1080+1) - -/** Stride in px required by VG-Lite HW. Don't change this. */ -#define LV_GPU_NXP_VG_LITE_STRIDE_ALIGN_PX 16U - #ifndef LV_GPU_NXP_VG_LITE_LOG_ERRORS /** Enable logging of VG-Lite errors (\see LV_LOG_ERROR)*/ #define LV_GPU_NXP_VG_LITE_LOG_ERRORS 1 #endif #ifndef LV_GPU_NXP_VG_LITE_LOG_TRACES -/** Enable logging of VG-Lite errors (\see LV_LOG_ERROR)*/ +/** Enable logging of VG-Lite traces (\see LV_LOG_ERROR)*/ #define LV_GPU_NXP_VG_LITE_LOG_TRACES 0 #endif -/* Draw rectangles around BLIT tiles */ -#define BLIT_DBG_AREAS 0 - -/* Print detailed info to SDK console (NOT to LVGL log system) */ -#define BLIT_DBG_VERBOSE 0 - -/* Verbose debug print */ -#if BLIT_DBG_VERBOSE -#define PRINT_BLT PRINTF -#else -#define PRINT_BLT(...) -#endif - /* The optimal Bezier control point offset for radial unit * see: https://spencermortensen.com/articles/bezier-circle/ **/ @@ -90,41 +70,56 @@ extern "C" { * TYPEDEFS **********************/ +/********************** + * STATIC PROTOTYPES + **********************/ + +/** + * Enable scissor and set the clipping box. + * + * @param[in] clip_area Clip area with relative coordinates of destination buffer + */ +static inline void lv_vglite_set_scissor(const lv_area_t * clip_area); + +/** + * Disable scissor. + */ +static inline void lv_vglite_disable_scissor(void); + /********************** * GLOBAL PROTOTYPES **********************/ /** - * Fills vg_lite_buffer_t structure according given parameters. + * Premultiplies and swizzles given LVGL 32bit color to obtain vglite color. * - * @param[in/out] vgbuf Buffer structure to be filled - * @param[in] width Width of buffer in pixels - * @param[in] height Height of buffer in pixels - * @param[in] stride Stride of the buffer in bytes - * @param[in] ptr Pointer to the buffer (must be aligned according VG-Lite requirements) - * @param[in] source Boolean to check if this is a source buffer - */ -lv_res_t lv_vglite_init_buf(vg_lite_buffer_t * vgbuf, uint32_t width, uint32_t height, uint32_t stride, - const lv_color_t * ptr, bool source); - -#if BLIT_DBG_AREAS -/** - * Draw a simple rectangle, 1 px line width. + * @param[in/out] vg_col32 The obtained vglite color + * @param[in] lv_col32 The initial LVGL 32bit color + * @param[in] opa The opacity to premultiply with + * @param[in] vg_col_format The format of the resulting vglite color * - * @param dest_buf Destination buffer - * @param dest_width Destination buffer width (must be aligned on 16px) - * @param dest_height Destination buffer height - * @param fill_area Rectangle coordinates - * @param color Rectangle color + * @retval LV_RES_OK Operation completed + * @retval LV_RES_INV Error occurred (\see LV_GPU_NXP_VG_LITE_LOG_ERRORS) */ -void lv_vglite_dbg_draw_rectangle(lv_color_t * dest_buf, lv_coord_t dest_width, lv_coord_t dest_height, - lv_area_t * fill_area, lv_color_t color); -#endif +lv_res_t lv_vglite_premult_and_swizzle(vg_lite_color_t * vg_col32, lv_color32_t lv_col32, lv_opa_t opa, + vg_lite_buffer_format_t vg_col_format); /** - * Clean & invalidate cache. + * Get vglite blend mode. + * + * @param[in] lv_blend_mode The LVGL blend mode + * + * @retval The vglite blend mode */ -void lv_vglite_invalidate_cache(void); +vg_lite_blend_t lv_vglite_get_blend_mode(lv_blend_mode_t lv_blend_mode); + +/** + * Clear cache and flush command to VG-Lite. + * + * @retval LV_RES_OK Run completed + * @retval LV_RES_INV Error occurred (\see LV_GPU_NXP_VG_LITE_LOG_ERRORS) + */ +lv_res_t lv_vglite_run(void); /********************** * MACROS @@ -142,7 +137,8 @@ void lv_vglite_invalidate_cache(void); #define VG_LITE_ERR_RETURN_INV(err, fmt, ...) \ do { \ if(err != VG_LITE_SUCCESS) { \ - LV_LOG_ERROR(fmt, ##__VA_ARGS__); \ + LV_LOG_ERROR(fmt" (err = %d)", \ + err, ##__VA_ARGS__); \ return LV_RES_INV; \ } \ } while (0) @@ -158,7 +154,7 @@ void lv_vglite_invalidate_cache(void); #if LV_GPU_NXP_VG_LITE_LOG_TRACES #define VG_LITE_LOG_TRACE(fmt, ...) \ do { \ - LV_LOG_ERROR(fmt, ##__VA_ARGS__); \ + LV_LOG(fmt, ##__VA_ARGS__); \ } while (0) #define VG_LITE_RETURN_INV(fmt, ...) \ @@ -176,10 +172,27 @@ void lv_vglite_invalidate_cache(void); }while(0) #endif /*LV_GPU_NXP_VG_LITE_LOG_TRACES*/ +/********************** + * STATIC FUNCTIONS + **********************/ + +static inline void lv_vglite_set_scissor(const lv_area_t * clip_area) +{ + vg_lite_enable_scissor(); + vg_lite_set_scissor((int32_t)clip_area->x1, (int32_t)clip_area->y1, + (int32_t)lv_area_get_width(clip_area), + (int32_t)lv_area_get_height(clip_area)); +} + +static inline void lv_vglite_disable_scissor(void) +{ + vg_lite_disable_scissor(); +} + #endif /*LV_USE_GPU_NXP_VG_LITE*/ #ifdef __cplusplus } /*extern "C"*/ #endif -#endif /*LV_GPU_NXP_VGLITE_H*/ +#endif /*LV_VGLITE_UTILS_H*/ diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/renesas/lv_draw_renesas.mk b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/renesas/lv_draw_renesas.mk new file mode 100644 index 0000000..b5e3ad1 --- /dev/null +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/renesas/lv_draw_renesas.mk @@ -0,0 +1,7 @@ +CSRCS += lv_gpu_d2_ra6m3.c +CSRCS += lv_gpu_d2_draw_label.c + +DEPPATH += --dep-path $(LVGL_DIR)/$(LVGL_DIR_NAME)/src/draw/renesas +VPATH += :$(LVGL_DIR)/$(LVGL_DIR_NAME)/src/draw/renesas + +CFLAGS += "-I$(LVGL_DIR)/$(LVGL_DIR_NAME)/src/draw/renesas" diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/renesas/lv_gpu_d2_draw_label.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/renesas/lv_gpu_d2_draw_label.c new file mode 100644 index 0000000..e92ebf1 --- /dev/null +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/renesas/lv_gpu_d2_draw_label.c @@ -0,0 +1,292 @@ +/** + * @file lv_gpu_d2_draw_label.c + * + * @description HAL layer for display driver + * + */ + +/********************* + * INCLUDES + *********************/ +#include "../../draw/lv_draw_label.h" +#include "../../misc/lv_assert.h" +#include "../../core/lv_refr.h" +#include "lv_gpu_d2_ra6m3.h" + +#if LV_USE_GPU_RA6M3_G2D +#include LV_GPU_RA6M3_G2D_INCLUDE + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * GLOBAL VARIABLES + **********************/ +extern const uint8_t _lv_bpp1_opa_table[2]; +extern const uint8_t _lv_bpp2_opa_table[4]; +extern const uint8_t _lv_bpp4_opa_table[16]; +extern const uint8_t _lv_bpp8_opa_table[256]; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void LV_ATTRIBUTE_FAST_MEM draw_letter_normal(lv_draw_ctx_t * draw_ctx, const lv_draw_label_dsc_t * dsc, + const lv_point_t * pos, lv_font_glyph_dsc_t * g, const uint8_t * map_p) +{ + + const uint8_t * bpp_opa_table_p; + uint32_t bitmask_init; + uint32_t bitmask; + uint32_t bpp = g->bpp; + lv_opa_t opa = dsc->opa; + uint32_t shades; + if(bpp == 3) bpp = 4; + +#if LV_USE_IMGFONT + if(bpp == LV_IMGFONT_BPP) { //is imgfont + lv_area_t fill_area; + fill_area.x1 = pos->x; + fill_area.y1 = pos->y; + fill_area.x2 = pos->x + g->box_w - 1; + fill_area.y2 = pos->y + g->box_h - 1; + lv_draw_img_dsc_t img_dsc; + lv_draw_img_dsc_init(&img_dsc); + img_dsc.angle = 0; + img_dsc.zoom = LV_IMG_ZOOM_NONE; + img_dsc.opa = dsc->opa; + img_dsc.blend_mode = dsc->blend_mode; + lv_draw_img(draw_ctx, &img_dsc, &fill_area, map_p); + return; + } +#endif + + switch(bpp) { + case 1: + bpp_opa_table_p = _lv_bpp1_opa_table; + bitmask_init = 0x80; + shades = 2; + break; + case 2: + bpp_opa_table_p = _lv_bpp2_opa_table; + bitmask_init = 0xC0; + shades = 4; + break; + case 4: + bpp_opa_table_p = _lv_bpp4_opa_table; + bitmask_init = 0xF0; + shades = 16; + break; + case 8: + bpp_opa_table_p = _lv_bpp8_opa_table; + bitmask_init = 0xFF; + shades = 256; + break; /*No opa table, pixel value will be used directly*/ + default: + LV_LOG_WARN("lv_draw_letter: invalid bpp"); + return; /*Invalid bpp. Can't render the letter*/ + } + + static lv_opa_t opa_table[256]; + static lv_opa_t prev_opa = LV_OPA_TRANSP; + static uint32_t prev_bpp = 0; + if(opa < LV_OPA_MAX) { + if(prev_opa != opa || prev_bpp != bpp) { + uint32_t i; + for(i = 0; i < shades; i++) { + opa_table[i] = bpp_opa_table_p[i] == LV_OPA_COVER ? opa : ((bpp_opa_table_p[i] * opa) >> 8); + } + } + bpp_opa_table_p = opa_table; + prev_opa = opa; + prev_bpp = bpp; + } + + int32_t col, row; + int32_t box_w = g->box_w; + int32_t box_h = g->box_h; + int32_t width_bit = box_w * bpp; /*Letter width in bits*/ + + /*Calculate the col/row start/end on the map*/ + int32_t col_start = pos->x >= draw_ctx->clip_area->x1 ? 0 : draw_ctx->clip_area->x1 - pos->x; + int32_t col_end = pos->x + box_w <= draw_ctx->clip_area->x2 ? box_w : draw_ctx->clip_area->x2 - pos->x + 1; + int32_t row_start = pos->y >= draw_ctx->clip_area->y1 ? 0 : draw_ctx->clip_area->y1 - pos->y; + int32_t row_end = pos->y + box_h <= draw_ctx->clip_area->y2 ? box_h : draw_ctx->clip_area->y2 - pos->y + 1; + + /*Move on the map too*/ + uint32_t bit_ofs = (row_start * width_bit) + (col_start * bpp); + map_p += bit_ofs >> 3; + + uint8_t letter_px; + uint32_t col_bit; + col_bit = bit_ofs & 0x7; /*"& 0x7" equals to "% 8" just faster*/ + + lv_draw_sw_blend_dsc_t blend_dsc; + lv_memset_00(&blend_dsc, sizeof(blend_dsc)); + blend_dsc.color = dsc->color; + blend_dsc.opa = LV_OPA_COVER; + blend_dsc.blend_mode = dsc->blend_mode; + + lv_coord_t hor_res = lv_disp_get_hor_res(_lv_refr_get_disp_refreshing()); + uint32_t mask_buf_size = box_w * box_h > hor_res ? hor_res : box_w * box_h; + lv_opa_t * mask_buf = lv_mem_buf_get(mask_buf_size); + blend_dsc.mask_buf = mask_buf; + int32_t mask_p = 0; + + lv_area_t fill_area; + fill_area.x1 = col_start + pos->x; + fill_area.x2 = col_end + pos->x - 1; + fill_area.y1 = row_start + pos->y; + fill_area.y2 = fill_area.y1; +#if LV_DRAW_COMPLEX + lv_coord_t fill_w = lv_area_get_width(&fill_area); + lv_area_t mask_area; + lv_area_copy(&mask_area, &fill_area); + mask_area.y2 = mask_area.y1 + row_end; + bool mask_any = lv_draw_mask_is_any(&mask_area); +#endif + blend_dsc.blend_area = &fill_area; + blend_dsc.mask_area = &fill_area; + + uint32_t col_bit_max = 8 - bpp; + uint32_t col_bit_row_ofs = (box_w + col_start - col_end) * bpp; + + for(row = row_start ; row < row_end; row++) { +#if LV_DRAW_COMPLEX + int32_t mask_p_start = mask_p; +#endif + bitmask = bitmask_init >> col_bit; + for(col = col_start; col < col_end; col++) { + /*Load the pixel's opacity into the mask*/ + letter_px = (*map_p & bitmask) >> (col_bit_max - col_bit); + if(letter_px) { + mask_buf[mask_p] = bpp_opa_table_p[letter_px]; + } + else { + mask_buf[mask_p] = 0; + } + + /*Go to the next column*/ + if(col_bit < col_bit_max) { + col_bit += bpp; + bitmask = bitmask >> bpp; + } + else { + col_bit = 0; + bitmask = bitmask_init; + map_p++; + } + + /*Next mask byte*/ + mask_p++; + } + +#if LV_DRAW_COMPLEX + /*Apply masks if any*/ + if(mask_any) { + blend_dsc.mask_res = lv_draw_mask_apply(mask_buf + mask_p_start, fill_area.x1, fill_area.y2, + fill_w); + if(blend_dsc.mask_res == LV_DRAW_MASK_RES_TRANSP) { + lv_memset_00(mask_buf + mask_p_start, fill_w); + } + } +#endif + + if((uint32_t) mask_p + (col_end - col_start) < mask_buf_size) { + fill_area.y2 ++; + } + else { + blend_dsc.mask_res = LV_DRAW_MASK_RES_CHANGED; + lv_draw_ra6m3_2d_blend(draw_ctx, &blend_dsc); + + fill_area.y1 = fill_area.y2 + 1; + fill_area.y2 = fill_area.y1; + mask_p = 0; + } + + col_bit += col_bit_row_ofs; + map_p += (col_bit >> 3); + col_bit = col_bit & 0x7; + } + + /*Flush the last part*/ + if(fill_area.y1 != fill_area.y2) { + fill_area.y2--; + blend_dsc.mask_res = LV_DRAW_MASK_RES_CHANGED; + lv_draw_ra6m3_2d_blend(draw_ctx, &blend_dsc); + mask_p = 0; + } + + lv_mem_buf_release(mask_buf); +} + +void lv_draw_gpu_letter(lv_draw_ctx_t * draw_ctx, const lv_draw_label_dsc_t * dsc, const lv_point_t * pos_p, + uint32_t letter) +{ + const lv_font_t * font_p = dsc->font; + + lv_opa_t opa = dsc->opa; + if(opa < LV_OPA_MIN) return; + if(opa > LV_OPA_MAX) opa = LV_OPA_COVER; + + if(font_p == NULL) { + LV_LOG_WARN("lv_draw_letter: font is NULL"); + return; + } + + lv_font_glyph_dsc_t g; + bool g_ret = lv_font_get_glyph_dsc(font_p, &g, letter, '\0'); + if(g_ret == false) { + /*Add warning if the dsc is not found + *but do not print warning for non printable ASCII chars (e.g. '\n')*/ + if(letter >= 0x20 && + letter != 0xf8ff && /*LV_SYMBOL_DUMMY*/ + letter != 0x200c) { /*ZERO WIDTH NON-JOINER*/ + LV_LOG_WARN("lv_draw_letter: glyph dsc. not found for U+%X", letter); + } + return; + } + + /*Don't draw anything if the character is empty. E.g. space*/ + if((g.box_h == 0) || (g.box_w == 0)) return; + + lv_point_t gpos; + gpos.x = pos_p->x + g.ofs_x; + gpos.y = pos_p->y + (dsc->font->line_height - dsc->font->base_line) - g.box_h - g.ofs_y; + + /*If the letter is completely out of mask don't draw it*/ + if(gpos.x + g.box_w < draw_ctx->clip_area->x1 || + gpos.x > draw_ctx->clip_area->x2 || + gpos.y + g.box_h < draw_ctx->clip_area->y1 || + gpos.y > draw_ctx->clip_area->y2) { + return; + } + + const uint8_t * map_p = lv_font_get_glyph_bitmap(font_p, letter); + if(map_p == NULL) { + LV_LOG_WARN("lv_draw_letter: character's bitmap not found"); + return; + } + + if(font_p->subpx) { +#if LV_DRAW_COMPLEX && LV_USE_FONT_SUBPX + draw_letter_subpx(pos_x, pos_y, &g, clip_area, map_p, color, opa, blend_mode); +#else + LV_LOG_WARN("Can't draw sub-pixel rendered letter because LV_USE_FONT_SUBPX == 0 in lv_conf.h"); +#endif + } + else { + draw_letter_normal(draw_ctx, dsc, &gpos, &g, map_p); + } +} + +#endif diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/renesas/lv_gpu_d2_ra6m3.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/renesas/lv_gpu_d2_ra6m3.c new file mode 100644 index 0000000..ba4c084 --- /dev/null +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/renesas/lv_gpu_d2_ra6m3.c @@ -0,0 +1,742 @@ +/** + * @file lv_gpu_d2_ra6m3.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_gpu_d2_ra6m3.h" +#include "../../core/lv_refr.h" +#include + +#if LV_USE_GPU_RA6M3_G2D + +#include LV_GPU_RA6M3_G2D_INCLUDE + +/********************* + * DEFINES + *********************/ +#define LOG_ERRORS +#ifdef LOG_ERRORS + #define STRINGIFY(x) #x + #define TOSTRING(x) STRINGIFY(x) + + #define ERROR_LIST_SIZE (4) + #define D2_EXEC(a) lv_port_gpu_log_error(a, __func__, __LINE__) +#else + /* here is error logging not enabled */ + #define D2_EXEC(a) a; +#endif + +/********************** + * TYPEDEFS + **********************/ +typedef struct { + d2_s32 error; + const char * func; + int line; +} log_error_entry; + +/********************** + * STATIC PROTOTYPES + **********************/ +#ifdef LOG_ERRORS + static void lv_port_gpu_log_error(d2_s32 status, const char * func, int line); +#endif +static void invalidate_cache(void); + +void lv_draw_gpu_letter(lv_draw_ctx_t * draw_ctx, const lv_draw_label_dsc_t * dsc, const lv_point_t * pos_p, + uint32_t letter); + +/********************** + * STATIC VARIABLES + **********************/ +#ifdef LOG_ERRORS + static log_error_entry log_error_list[ERROR_LIST_SIZE]; + static int error_list_index; + static int error_count; +#endif + +static d2_device * _d2_handle; +static d2_renderbuffer * renderbuffer; + +static d2_s32 src_cf_val, dst_cf_val; +static lv_draw_img_dsc_t img_dsc; +static bool color_key_enabled, alpha_enabled, blend_enabled, colorize_enabled; + +/********************** + * STATIC FUNCTIONS + **********************/ +static d2_s32 lv_port_gpu_cf_lv_to_d2(lv_img_cf_t cf) +{ + d2_s32 d2_cf; + +#if (DLG_LVGL_CF == 1) + switch(cf & ~(1 << 5)) { +#else + switch(cf) { +#endif /* (DLG_LVGL_CF == 1) */ + case LV_IMG_CF_TRUE_COLOR: + d2_cf = d2_mode_rgb565; + break; + case LV_IMG_CF_TRUE_COLOR_CHROMA_KEYED: + d2_cf = d2_mode_rgb565; + break; + case LV_IMG_CF_ALPHA_1BIT: + d2_cf = d2_mode_alpha1; + break; + case LV_IMG_CF_ALPHA_2BIT: + d2_cf = d2_mode_alpha2; + break; + case LV_IMG_CF_ALPHA_4BIT: + d2_cf = d2_mode_alpha4; + break; + case LV_IMG_CF_ALPHA_8BIT: + d2_cf = d2_mode_alpha8; + break; + case LV_IMG_CF_INDEXED_1BIT: + d2_cf = d2_mode_i1 | d2_mode_clut; + break; + case LV_IMG_CF_INDEXED_2BIT: + d2_cf = d2_mode_i2 | d2_mode_clut; + break; + case LV_IMG_CF_INDEXED_4BIT: + d2_cf = d2_mode_i4 | d2_mode_clut; + break; + case LV_IMG_CF_INDEXED_8BIT: + d2_cf = d2_mode_i8 | d2_mode_clut; + break; +#if (DLG_LVGL_CF == 1) + case LV_IMG_CF_RGB565: + d2_cf = d2_mode_rgb565; + break; + case LV_IMG_CF_RGB888: + d2_cf = d2_mode_rgb888; + break; + case LV_IMG_CF_RGBA8888: + d2_cf = d2_mode_rgba8888; + break; +#endif /* DLG_LVGL_CF */ + default: + return -1; + } + +#if (DLG_LVGL_CF == 1) + return d2_cf | (cf & (1 << 5) ? d2_mode_rle : 0); +#else + return d2_cf; +#endif /* (DLG_LVGL_CF == 1) */ +} + +static bool lv_port_gpu_cf_fb_valid(d2_s32 cf) +{ + if((cf & (d2_mode_rle | d2_mode_clut)) || cf < 0) { + return false; + } + + switch(cf) { + case d2_mode_alpha8: + case d2_mode_rgb565: + case d2_mode_argb8888: + case d2_mode_argb4444: + case d2_mode_rgba8888: + case d2_mode_rgba4444: + return true; + default: + return false; + } +} + +static bool lv_port_gpu_cf_has_alpha(d2_s32 cf) +{ + switch(cf & ~(d2_mode_clut | d2_mode_rle)) { + case d2_mode_argb8888: + case d2_mode_rgba8888: + case d2_mode_argb4444: + case d2_mode_rgba4444: + case d2_mode_argb1555: + case d2_mode_rgba5551: + case d2_mode_ai44: + case d2_mode_i8: + case d2_mode_i4: + case d2_mode_i2: + case d2_mode_i1: + case d2_mode_alpha8: + case d2_mode_alpha4: + case d2_mode_alpha2: + case d2_mode_alpha1: + return true; + default: + return false; + } +} + +static bool lv_port_gpu_cf_is_alpha(d2_s32 cf) +{ + switch(cf & ~d2_mode_rle) { + case d2_mode_alpha8: + case d2_mode_alpha4: + case d2_mode_alpha2: + case d2_mode_alpha1: + return true; + default: + return false; + } +} + +static d2_color lv_port_gpu_color_lv_to_d2(lv_color_t color) +{ + uint8_t alpha, red, green, blue; + + alpha = 0xFF; + red = color.ch.red << 3 | color.ch.red >> 2; + green = color.ch.green << 2 | color.ch.green >> 4; + blue = color.ch.blue << 3 | color.ch.blue >> 2; + + return (alpha) << 24UL + | (red) << 16UL + | (green) << 8UL + | (blue) << 0UL; +} + +static void lv_port_gpu_get_recolor_consts(d2_color * cl, d2_color * ch) +{ + d2_color c = lv_port_gpu_color_lv_to_d2(img_dsc.recolor); + d2_alpha r, g, b, opa = img_dsc.recolor_opa > LV_OPA_MAX ? LV_OPA_COVER : img_dsc.recolor_opa; + + r = ((uint32_t)((uint8_t)(c >> 16UL)) * opa) / 255; + g = ((uint32_t)((uint8_t)(c >> 8UL)) * opa) / 255; + b = ((uint32_t)((uint8_t)(c >> 0UL)) * opa) / 255; + *cl = r << 16UL | g << 8UL | b << 0UL; + + r += 255 - opa; + g += 255 - opa; + b += 255 - opa; + *ch = r << 16UL | g << 8UL | b << 0UL; +} + +static int lv_port_gpu_handle_indexed_color(const lv_color_t ** src, const d2_color ** clut, d2_s32 cf) +{ + int clut_len = 0; + + if(cf & d2_mode_clut) { + /* Calculate CLUT length in entries */ + switch(cf & ~(d2_mode_clut | d2_mode_rle)) { + case d2_mode_i1: + clut_len = 2; + break; + case d2_mode_i2: + clut_len = 4; + break; + case d2_mode_i4: + clut_len = 16; + break; + case d2_mode_i8: + clut_len = 256; + break; + case d2_mode_ai44: + clut_len = 16; + break; + default: + return 0; + } + + *clut = (const d2_color *)*src; + *src = (const lv_color_t *)((const uint32_t *)*src + clut_len); + } + return clut_len; +} + +static int lv_port_gpu_cf_bpp(d2_s32 cf) +{ + switch(cf & ~(d2_mode_clut | d2_mode_rle)) { + case d2_mode_argb8888: + return 32; + case d2_mode_rgba8888: + return 32; + case d2_mode_rgb888: + return 32; + case d2_mode_argb4444: + return 16; + case d2_mode_rgba4444: + return 16; + case d2_mode_argb1555: + return 16; + case d2_mode_rgba5551: + return 16; + case d2_mode_rgb565: + return 16; + case d2_mode_ai44: + return 8; + case d2_mode_i8: + return 8; + case d2_mode_i4: + return 4; + case d2_mode_i2: + return 2; + case d2_mode_i1: + return 1; + case d2_mode_alpha8: + return 8; + case d2_mode_alpha4: + return 4; + case d2_mode_alpha2: + return 2; + case d2_mode_alpha1: + return 1; + default: + return 0; + } +} + +static d2_s32 lv_port_gpu_cf_get_default(void) +{ + return d2_mode_rgb565; +} + +static void lv_port_gpu_config_blit_clear(void) +{ + alpha_enabled = false; + color_key_enabled = false; + blend_enabled = true; + colorize_enabled = false; + + lv_draw_img_dsc_init(&img_dsc); + + src_cf_val = lv_port_gpu_cf_get_default(); + dst_cf_val = lv_port_gpu_cf_get_default(); +} + +void lv_port_gpu_init(void) +{ + lv_port_gpu_config_blit_clear(); +} + +static void lv_port_gpu_rotate_point(int * x, int * y, float cos_angle, float sin_angle, int pivot_x, int pivot_y) +{ + float fx, fy; + + *x -= pivot_x; + *y -= pivot_y; + + fx = ((float) * x) / 16.0f; + fy = ((float) * y) / 16.0f; + + *x = (int)(((fx * cos_angle) - (fy * sin_angle)) * 16.0f); + *y = (int)(((fx * sin_angle) + (fy * cos_angle)) * 16.0f); + + *x += pivot_x; + *y += pivot_y; +} + +void lv_draw_ra6m3_g2d_init(void) +{ + if(_d2_handle != NULL) { + return; + } + + _d2_handle = d2_opendevice(0); + + if(_d2_handle == NULL) + return; + + /* set blocksize for default displaylist */ + if(d2_setdlistblocksize(_d2_handle, 25) != D2_OK) { + LV_LOG_ERROR("Could NOT d2_setdlistblocksize\n"); + d2_closedevice(_d2_handle); + + return; + } + + /* bind the hardware */ + if(d2_inithw(_d2_handle, 0) != D2_OK) { + LV_LOG_ERROR("Could NOT d2_inithw\n"); + d2_closedevice(_d2_handle); + + return; + } + + renderbuffer = d2_newrenderbuffer(_d2_handle, 20, 20); + if(!renderbuffer) { + LV_LOG_ERROR("NO renderbuffer\n"); + d2_closedevice(_d2_handle); + + return; + } +} + +static void lv_port_gpu_hw_deinit(void) +{ + if(_d2_handle == NULL) + return; + + D2_EXEC(d2_freerenderbuffer(_d2_handle, renderbuffer)); + D2_EXEC(d2_closedevice(_d2_handle)); + + renderbuffer = NULL; + _d2_handle = NULL; +} + +void lv_port_gpu_flush(void) +{ + lv_port_gpu_hw_deinit(); +} + +static void lv_port_gpu_start_render(void) +{ + D2_EXEC(d2_selectrenderbuffer(_d2_handle, renderbuffer)); +} + +static void lv_port_gpu_complete_render(void) +{ + D2_EXEC(d2_flushframe(_d2_handle)); +} + +void lv_port_gpu_wait(lv_draw_ctx_t * draw_ctx) +{ + lv_port_gpu_complete_render(); + + lv_draw_sw_wait_for_finish(draw_ctx); +} + +static void lv_port_gpu_execute_render(void) +{ + if(_d2_handle) { + D2_EXEC(d2_executerenderbuffer(_d2_handle, renderbuffer, 0)); + } +} + +void lv_port_gpu_blit(int32_t x, int32_t y, lv_color_t * dst, const lv_area_t * fill_area) +{ + uint32_t ModeSrc; + + ModeSrc = d2_mode_rgb565; + + lv_coord_t dst_width, dst_hight; + dst_width = lv_area_get_width(fill_area); + dst_hight = lv_area_get_height(fill_area); + + d2_selectrenderbuffer(_d2_handle, renderbuffer); + + // Generate render operations + d2_framebuffer(_d2_handle, (uint16_t *)&fb_background[0], LV_HOR_RES_MAX, LV_HOR_RES_MAX, + MAX(fill_area->y2 + 1, 2), lv_port_gpu_cf_get_default()); + + d2_cliprect(_d2_handle, 0, 0, LV_HOR_RES_MAX - 1, fill_area->y2); + d2_setblitsrc(_d2_handle, (void *) dst, dst_width, dst_width, dst_hight, ModeSrc); + d2_blitcopy(_d2_handle, dst_width, dst_hight, 0, 0, D2_FIX4(dst_width), D2_FIX4(dst_hight), + D2_FIX4(fill_area->x1), D2_FIX4(fill_area->y1), 0); + + // Execute render operations + d2_executerenderbuffer(_d2_handle, renderbuffer, 0); +} + +void lv_port_gpu_fill(lv_color_t * dest_buf, const lv_area_t * fill_area, lv_coord_t dst_width, + lv_color_t color, lv_opa_t opa) +{ + invalidate_cache(); + + lv_port_gpu_start_render(); + + D2_EXEC(d2_framebuffer(_d2_handle, d1_maptovidmem(_d2_handle, dest_buf), MAX(dst_width, 2), MAX(dst_width, 2), + MAX(fill_area->y2 + 1, 2), lv_port_gpu_cf_get_default())); + + D2_EXEC(d2_cliprect(_d2_handle, 0, 0, dst_width - 1, fill_area->y2)); + D2_EXEC(d2_setalpha(_d2_handle, opa > LV_OPA_MAX ? 0xFF : opa)); + D2_EXEC(d2_setcolor(_d2_handle, 0, lv_port_gpu_color_lv_to_d2(color))); + D2_EXEC(d2_renderbox(_d2_handle, D2_FIX4(fill_area->x1), D2_FIX4(fill_area->y1), + D2_FIX4(lv_area_get_width(fill_area)), D2_FIX4(lv_area_get_height(fill_area)))); + + lv_port_gpu_execute_render(); +} + +bool lv_port_gpu_config_blit(const lv_draw_img_dsc_t * draw_dsc, lv_img_cf_t dst_cf, + lv_img_cf_t src_cf, bool alpha_en, bool color_key_en, bool blend_en, bool colorize_en) +{ + d2_s32 d2_src_cf, d2_dst_cf; + + if(blend_en && draw_dsc->blend_mode != LV_BLEND_MODE_NORMAL + && draw_dsc->blend_mode != LV_BLEND_MODE_ADDITIVE) { + return false; + } + + d2_src_cf = lv_port_gpu_cf_lv_to_d2(src_cf); + d2_dst_cf = lv_port_gpu_cf_lv_to_d2(dst_cf); + if(d2_src_cf < 0 || !lv_port_gpu_cf_fb_valid(d2_dst_cf)) { + return false; + } + src_cf_val = d2_src_cf; + dst_cf_val = d2_dst_cf; + + img_dsc = *draw_dsc; + + /* Disable alpha if alpha channel does not exist */ + alpha_enabled = lv_port_gpu_cf_has_alpha(src_cf_val) ? alpha_en : 0; + color_key_enabled = color_key_en; + blend_enabled = blend_en; + colorize_enabled = colorize_en | lv_port_gpu_cf_is_alpha(src_cf_val); + + return true; +} + +static void lv_port_gpu_blit_internal(const lv_area_t * dest_area, const lv_color_t * src_buf, + const lv_area_t * src_area, d2_u32 flags) +{ + const lv_area_t * img_area = src_area; + lv_area_t img_area_scaled; + lv_coord_t w, h, img_w, img_h; + d2_s32 pitch; + int bpp = lv_port_gpu_cf_bpp(src_cf_val); + + D2_EXEC(d2_cliprect(_d2_handle, dest_area->x1, dest_area->y1, dest_area->x2, dest_area->y2)); + + pitch = w = lv_area_get_width(src_area); + h = lv_area_get_height(src_area); + + if(img_dsc.zoom != LV_IMG_ZOOM_NONE) { + img_area_scaled.x1 = src_area->x1 + ((((int32_t)0 - img_dsc.pivot.x) * img_dsc.zoom) >> 8) + img_dsc.pivot.x; + img_area_scaled.x2 = src_area->x1 + ((((int32_t)w - img_dsc.pivot.x) * img_dsc.zoom) >> 8) + img_dsc.pivot.x; + img_area_scaled.y1 = src_area->y1 + ((((int32_t)0 - img_dsc.pivot.y) * img_dsc.zoom) >> 8) + img_dsc.pivot.y; + img_area_scaled.y2 = src_area->y1 + ((((int32_t)h - img_dsc.pivot.y) * img_dsc.zoom) >> 8) + img_dsc.pivot.y; + img_area = &img_area_scaled; + } + + img_w = lv_area_get_width(img_area); + img_h = lv_area_get_height(img_area); + + if(0 < bpp && bpp < 8) { + pitch = (w + (8 - bpp)) & (~(8 - bpp)); + } + + if(img_dsc.angle == 0) { + D2_EXEC(d2_setblitsrc(_d2_handle, (void *) src_buf, pitch, w, h, src_cf_val)); + + D2_EXEC(d2_blitcopy(_d2_handle, w, h, 0, 0, + D2_FIX4(img_w), D2_FIX4(img_h), D2_FIX4(img_area->x1), D2_FIX4(img_area->y1), flags)); + } + else { + int x, y, x1, y1, x2, y2, x3, y3, x4, y4, dxu, dxv, dyu, dyv, xx, xy, yx, yy; + int pivot_scaled_x, pivot_scaled_y; + int tex_offset = (flags & d2_bf_filter) ? -32767 : 0; + d2_u8 amode, cmode = d2_to_copy; + float angle = ((float)img_dsc.angle / 10) * M_PI / 180; + float cos_angle = cosf(angle); + float sin_angle = sinf(angle); + d2_u8 fillmode_backup; + + /* setup texture params */ + fillmode_backup = d2_getfillmode(_d2_handle); + D2_EXEC(d2_setfillmode(_d2_handle, d2_fm_texture)); + D2_EXEC(d2_settexture(_d2_handle, (void *) src_buf, pitch, w, h, src_cf_val)); + D2_EXEC(d2_settexturemode(_d2_handle, flags & (d2_bf_filter | d2_bf_wrap))); + amode = flags & d2_bf_usealpha ? d2_to_copy : d2_to_one; + cmode = flags & d2_bf_colorize2 ? d2_to_blend : d2_to_copy; + D2_EXEC(d2_settextureoperation(_d2_handle, amode, cmode, cmode, cmode)); + if(flags & d2_bf_colorize2) { + d2_color cl = d2_getcolor(_d2_handle, 0), ch = d2_getcolor(_d2_handle, 1); + D2_EXEC(d2_settexopparam(_d2_handle, d2_cc_red, (uint8_t)(cl >> 16UL), + (uint8_t)(ch >> 16UL))); + D2_EXEC(d2_settexopparam(_d2_handle, d2_cc_green, (uint8_t)(cl >> 8UL), + (uint8_t)(ch >> 8UL))); + D2_EXEC(d2_settexopparam(_d2_handle, d2_cc_blue, (uint8_t)(cl >> 0UL), + (uint8_t)(ch >> 0UL))); + } + + x = D2_FIX4(img_area->x1); + y = D2_FIX4(img_area->y1); + + /* define quad points */ + x1 = D2_FIX4(0); + y1 = D2_FIX4(0); + x2 = D2_FIX4(img_w); + y2 = D2_FIX4(0); + x3 = D2_FIX4(img_w); + y3 = D2_FIX4(img_h); + x4 = D2_FIX4(0); + y4 = D2_FIX4(img_h); + + /* rotate points for quad */ + pivot_scaled_x = (img_dsc.pivot.x * img_dsc.zoom) >> 4; + pivot_scaled_y = (img_dsc.pivot.y * img_dsc.zoom) >> 4; + + lv_port_gpu_rotate_point(&x1, &y1, cos_angle, sin_angle, pivot_scaled_x, pivot_scaled_y); + lv_port_gpu_rotate_point(&x2, &y2, cos_angle, sin_angle, pivot_scaled_x, pivot_scaled_y); + lv_port_gpu_rotate_point(&x3, &y3, cos_angle, sin_angle, pivot_scaled_x, pivot_scaled_y); + lv_port_gpu_rotate_point(&x4, &y4, cos_angle, sin_angle, pivot_scaled_x, pivot_scaled_y); + + /* compute texture increments */ + xx = (int)(cos_angle * 65536.0f); + xy = (int)(sin_angle * 65536.0f); + yx = (int)(-sin_angle * 65536.0f); + yy = (int)(cos_angle * 65536.0f); + dxu = ((D2_FIX16(w) / D2_FIX4(img_w)) * xx) >> 12; + dxv = ((D2_FIX16(w) / D2_FIX4(img_w)) * xy) >> 12; + dyu = ((D2_FIX16(h) / D2_FIX4(img_h)) * yx) >> 12; + dyv = ((D2_FIX16(h) / D2_FIX4(img_h)) * yy) >> 12; + + /* map texture exactly to rotated quad, so texel center is always (0/0) top-left */ + D2_EXEC(d2_settexelcenter(_d2_handle, 0, 0)); + D2_EXEC(d2_settexturemapping(_d2_handle, (d2_point)(x + x1), (d2_point)(y + y1), + tex_offset, tex_offset, dxu, dxv, dyu, dyv)); + + int minx = MAX(dest_area->x1, D2_INT4(x + MIN(x1, MIN(x2, MIN(x3, x4))))); + int maxx = MIN(dest_area->x2, D2_INT4(x + MAX(x1, MAX(x2, MAX(x3, x4))))); + int slice = (flags & d2_bf_filter) ? 6 : 8; + + /* Perform render operation in slices to acheive better performance */ + for(int posx = minx; posx < maxx; posx += slice) { + D2_EXEC(d2_cliprect(_d2_handle, posx, dest_area->y1, MIN(posx + slice - 1, maxx), dest_area->y2)); + D2_EXEC(d2_renderquad(_d2_handle, (d2_point)(x + x1), (d2_point)(y + y1), + (d2_point)(x + x2), (d2_point)(y + y2), + (d2_point)(x + x3), (d2_point)(y + y3), + (d2_point)(x + x4), (d2_point)(y + y4), 0)); + } + D2_EXEC(d2_setfillmode(_d2_handle, fillmode_backup)); + } +} + +void lv_port_ra_gpu_blit(lv_color_t * dst, const lv_area_t * dst_area, lv_coord_t dest_stride, + const lv_color_t * src, const lv_area_t * src_area, lv_opa_t opa) +{ + d2_u32 flags = 0; + const d2_color * clut = NULL; + int clut_len = 0; + + invalidate_cache(); + + clut_len = lv_port_gpu_handle_indexed_color(&src, &clut, src_cf_val); + + lv_port_gpu_start_render(); + + D2_EXEC(d2_framebuffer(_d2_handle, d1_maptovidmem(_d2_handle, dst), MAX(dest_stride, 2), + MAX(dst_area->x2 + 1, 2), MAX(dst_area->y2 + 1, 2), dst_cf_val)); + + flags |= alpha_enabled ? d2_bf_usealpha : 0; + + D2_EXEC(d2_setalpha(_d2_handle, opa > LV_OPA_MAX ? LV_OPA_COVER : opa)); + + if(clut) { + D2_EXEC(d2_writetexclut_direct(_d2_handle, clut, 0, clut_len)); + } + + flags |= color_key_enabled ? d2_bf_usealpha : 0; + flags |= (colorize_enabled || img_dsc.recolor_opa != LV_OPA_TRANSP) ? d2_bf_colorize2 : 0; + if(colorize_enabled) { + D2_EXEC(d2_setcolor(_d2_handle, 0, lv_port_gpu_color_lv_to_d2(img_dsc.recolor))); + D2_EXEC(d2_setcolor(_d2_handle, 1, lv_port_gpu_color_lv_to_d2(img_dsc.recolor))); + } + else if(img_dsc.recolor_opa != LV_OPA_TRANSP) { + d2_color cl = 0, ch = 0; + lv_port_gpu_get_recolor_consts(&cl, &ch); + D2_EXEC(d2_setcolor(_d2_handle, 0, cl)); + D2_EXEC(d2_setcolor(_d2_handle, 1, ch)); + } + + flags |= ((img_dsc.angle || img_dsc.zoom != LV_IMG_ZOOM_NONE) && img_dsc.antialias) ? d2_bf_filter : 0; + + if(blend_enabled) { + D2_EXEC(d2_setblendmode(_d2_handle, d2_bm_alpha, + img_dsc.blend_mode != LV_BLEND_MODE_NORMAL ? d2_bm_one : d2_bm_one_minus_alpha)); + D2_EXEC(d2_setalphablendmode(_d2_handle, d2_bm_one, d2_bm_one_minus_alpha)); + } + else { + D2_EXEC(d2_setblendmode(_d2_handle, d2_bm_one, d2_bm_zero)); + D2_EXEC(d2_setalphablendmode(_d2_handle, d2_bm_one, d2_bm_zero)); + } + + lv_port_gpu_blit_internal(dst_area, src, src_area, flags); + + lv_port_gpu_execute_render(); +} + +void lv_draw_ra6m3_2d_blend(lv_draw_ctx_t * draw_ctx, const lv_draw_sw_blend_dsc_t * dsc) +{ + lv_area_t blend_area; + if(!_lv_area_intersect(&blend_area, dsc->blend_area, draw_ctx->clip_area)) return; + + bool done = false; + + if(dsc->mask_buf == NULL && dsc->blend_mode == LV_BLEND_MODE_NORMAL && lv_area_get_size(&blend_area) > 100) { + lv_coord_t dest_stride = lv_area_get_width(draw_ctx->buf_area); + + lv_color_t * dest_buf = draw_ctx->buf; + + const lv_color_t * src_buf = dsc->src_buf; + if(src_buf) { + lv_draw_sw_blend_basic(draw_ctx, dsc); + + lv_area_t src_area; + src_area.x1 = blend_area.x1 - (dsc->blend_area->x1 - draw_ctx->buf_area->x1); + src_area.y1 = blend_area.y1 - (dsc->blend_area->y1 - draw_ctx->buf_area->y1); + src_area.x2 = src_area.x1 + lv_area_get_width(dsc->blend_area) - 1; + src_area.y2 = src_area.y1 + lv_area_get_height(dsc->blend_area) - 1; + + lv_port_ra_gpu_blit(dest_buf, &blend_area, dest_stride, src_buf, &src_area, dsc->opa); + done = true; + } + else if(dsc->opa >= LV_OPA_MAX) { + lv_area_move(&blend_area, -draw_ctx->buf_area->x1, -draw_ctx->buf_area->y1); + lv_port_gpu_fill(dest_buf, &blend_area, dest_stride, dsc->color, dsc->opa); + done = true; + } + } + + if(!done) lv_draw_sw_blend_basic(draw_ctx, dsc); +} + +static void lv_port_gpu_img_decoded(lv_draw_ctx_t * draw_ctx, const lv_draw_img_dsc_t * dsc, + const lv_area_t * coords, const uint8_t * map_p, lv_img_cf_t color_format) +{ + /*TODO basic ARGB8888 image can be handles here*/ + + lv_draw_sw_img_decoded(draw_ctx, dsc, coords, map_p, color_format); +} + +void lv_draw_ra6m3_2d_ctx_init(lv_disp_drv_t * drv, lv_draw_ctx_t * draw_ctx) +{ + lv_draw_sw_init_ctx(drv, draw_ctx); + + lv_draw_ra6m3_dma2d_ctx_t * ra_2d_draw_ctx = (lv_draw_sw_ctx_t *)draw_ctx; + + ra_2d_draw_ctx->blend = lv_draw_ra6m3_2d_blend; + ra_2d_draw_ctx->base_draw.draw_img_decoded = lv_port_gpu_img_decoded; + ra_2d_draw_ctx->base_draw.wait_for_finish = lv_port_gpu_wait; + ra_2d_draw_ctx->base_draw.draw_letter = lv_draw_gpu_letter; + //ra_2d_draw_ctx->base_draw.buffer_copy = lv_draw_ra6m3_2d_buffer_copy; +} + +void lv_draw_stm32_dma2d_ctx_deinit(lv_disp_t * disp, lv_draw_ctx_t * draw_ctx) +{ + LV_UNUSED(disp); + LV_UNUSED(draw_ctx); +} + +static void invalidate_cache(void) +{ + lv_disp_t * disp = _lv_refr_get_disp_refreshing(); + if(disp->driver->clean_dcache_cb) disp->driver->clean_dcache_cb(disp->driver); +} + +#ifdef LOG_ERRORS +static void lv_port_gpu_log_error(d2_s32 status, const char * func, int line) +{ + if(status) { + log_error_list[error_list_index].error = status; + log_error_list[error_list_index].func = func; + log_error_list[error_list_index].line = line; + LV_LOG_ERROR("%s\r\n", d2_geterrorstring(_d2_handle)); + LV_LOG_ERROR("%d:\t%d - %s : %d\r\n", error_count, + log_error_list[error_list_index].error, + log_error_list[error_list_index].func, + log_error_list[error_list_index].line); + + error_count++; + error_list_index++; + if(error_list_index >= ERROR_LIST_SIZE) { + error_list_index = 0; + } + } +} +#endif +#endif /* LV_USE_GPU_RA6M3_G2D */ diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/renesas/lv_gpu_d2_ra6m3.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/renesas/lv_gpu_d2_ra6m3.h new file mode 100644 index 0000000..5d37ce4 --- /dev/null +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/renesas/lv_gpu_d2_ra6m3.h @@ -0,0 +1,56 @@ +/** + * @file lv_gpu_d2_ra6m3.h + * + */ +#ifndef LV_GPU_D2_RA6M3_H +#define LV_GPU_D2_RA6M3_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../misc/lv_color.h" + +#if LV_USE_GPU_RA6M3_G2D +#include "../../core/lv_disp.h" +#include "../sw/lv_draw_sw.h" + +/********************** + * DEFINE + **********************/ +#define MIN(A, B) ((A) < (B) ? (A) : (B)) +#define MAX(A, B) ((A) > (B) ? (A) : (B)) +#define M_PI 3.1415926 + +/********************** + * TYPEDEFS + **********************/ +typedef lv_draw_sw_ctx_t lv_draw_ra6m3_dma2d_ctx_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ +void lv_draw_ra6m3_g2d_init(void); + +void lv_port_gpu_init(void); + +void lv_port_gpu_flush(void); + +void lv_port_gpu_blit(int32_t x, int32_t y, lv_color_t * dst, const lv_area_t * fill_area); + +void lv_draw_ra6m3_2d_blend(lv_draw_ctx_t * draw_ctx, const lv_draw_sw_blend_dsc_t * dsc); + +void lv_draw_ra6m3_2d_ctx_init(lv_disp_drv_t * drv, lv_draw_ctx_t * draw_ctx); + +void lv_draw_ra6m3_2d_ctx_deinit(lv_disp_drv_t * disp, lv_draw_ctx_t * draw_ctx); + +#endif /*LV_USE_GPU_GD32_IPA*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sdl/README.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/sdl/README.md similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sdl/README.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/sdl/README.md diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/sdl/lv_draw_sdl.c similarity index 99% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/sdl/lv_draw_sdl.c index e3cdf57..91dbfff 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/sdl/lv_draw_sdl.c @@ -7,7 +7,6 @@ * INCLUDES *********************/ - #include "../../lv_conf_internal.h" #if LV_USE_GPU_SDL diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/sdl/lv_draw_sdl.h similarity index 99% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/sdl/lv_draw_sdl.h index 9b44a7b..7b3b3d1 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl.h +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/sdl/lv_draw_sdl.h @@ -6,7 +6,6 @@ #ifndef LV_DRAW_SDL_H #define LV_DRAW_SDL_H - #ifdef __cplusplus extern "C" { #endif diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl.mk b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/sdl/lv_draw_sdl.mk similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl.mk rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/sdl/lv_draw_sdl.mk diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_arc.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/sdl/lv_draw_sdl_arc.c similarity index 96% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_arc.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/sdl/lv_draw_sdl_arc.c index 5786eae..9361daf 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_arc.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/sdl/lv_draw_sdl_arc.c @@ -67,7 +67,6 @@ void lv_draw_sdl_draw_arc(lv_draw_ctx_t * draw_ctx, const lv_draw_arc_dsc_t * ds area_in.x2 -= dsc->width; area_in.y2 -= dsc->width; - while(start_angle >= 360) start_angle -= 360; while(end_angle >= 360) end_angle -= 360; @@ -104,7 +103,9 @@ void lv_draw_sdl_draw_arc(lv_draw_ctx_t * draw_ctx, const lv_draw_arc_dsc_t * ds } lv_coord_t w = lv_area_get_width(&draw_area), h = lv_area_get_height(&draw_area); - SDL_Texture * texture = lv_draw_sdl_composite_texture_obtain(ctx, LV_DRAW_SDL_COMPOSITE_TEXTURE_ID_STREAM1, w, h); + bool texture_cached = false; + SDL_Texture * texture = lv_draw_sdl_composite_texture_obtain(ctx, LV_DRAW_SDL_COMPOSITE_TEXTURE_ID_STREAM1, w, h, + &texture_cached); SDL_SetTextureBlendMode(texture, SDL_BLENDMODE_BLEND); dump_masks(texture, &draw_area, mask_ids, mask_ids_count, cap_ids[0] != LV_MASK_ID_INV ? cap_ids : NULL); @@ -135,6 +136,11 @@ void lv_draw_sdl_draw_arc(lv_draw_ctx_t * draw_ctx, const lv_draw_arc_dsc_t * ds SDL_SetTextureColorMod(texture, color.r, color.g, color.b); SDL_SetTextureAlphaMod(texture, dsc->opa); SDL_RenderCopy(ctx->renderer, texture, &srcrect, &dstrect); + + if(!texture_cached) { + LV_LOG_WARN("Texture is not cached, this will impact performance."); + SDL_DestroyTexture(texture); + } } /********************** diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_bg.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/sdl/lv_draw_sdl_bg.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_bg.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/sdl/lv_draw_sdl_bg.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_composite.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/sdl/lv_draw_sdl_composite.c similarity index 90% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_composite.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/sdl/lv_draw_sdl_composite.c index 4d0603d..9bf6385 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_composite.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/sdl/lv_draw_sdl_composite.c @@ -86,7 +86,8 @@ bool lv_draw_sdl_composite_begin(lv_draw_sdl_ctx_t * ctx, const lv_area_t * coor LV_ASSERT(internals->mask == NULL && internals->composition == NULL && internals->target_backup == NULL); lv_coord_t w = lv_area_get_width(apply_area), h = lv_area_get_height(apply_area); - internals->composition = lv_draw_sdl_composite_texture_obtain(ctx, LV_DRAW_SDL_COMPOSITE_TEXTURE_ID_TARGET0, w, h); + internals->composition = lv_draw_sdl_composite_texture_obtain(ctx, LV_DRAW_SDL_COMPOSITE_TEXTURE_ID_TARGET0, w, h, + &internals->composition_cached); /* Don't need to worry about integral overflow */ lv_coord_t ofs_x = (lv_coord_t) - apply_area->x1, ofs_y = (lv_coord_t) - apply_area->y1; /* Offset draw area to start with (0,0) of coords */ @@ -100,7 +101,8 @@ bool lv_draw_sdl_composite_begin(lv_draw_sdl_ctx_t * ctx, const lv_area_t * coor SDL_RenderFillRect(ctx->renderer, NULL); SDL_SetRenderDrawBlendMode(ctx->renderer, SDL_BLENDMODE_BLEND); #if LV_GPU_SDL_CUSTOM_BLEND_MODE - internals->mask = lv_draw_sdl_composite_texture_obtain(ctx, LV_DRAW_SDL_COMPOSITE_TEXTURE_ID_STREAM0, w, h); + internals->mask = lv_draw_sdl_composite_texture_obtain(ctx, LV_DRAW_SDL_COMPOSITE_TEXTURE_ID_STREAM0, w, h, + &internals->composition_cached); dump_masks(internals->mask, apply_area); #endif } @@ -174,19 +176,23 @@ void lv_draw_sdl_composite_end(lv_draw_sdl_ctx_t * ctx, const lv_area_t * apply_ break; } SDL_RenderCopy(ctx->renderer, internals->composition, &src_rect, &dst_rect); + if(!internals->composition_cached) { + LV_LOG_WARN("Texture is not cached, this will impact performance."); + SDL_DestroyTexture(internals->composition); + } } internals->mask = internals->composition = internals->target_backup = NULL; } SDL_Texture * lv_draw_sdl_composite_texture_obtain(lv_draw_sdl_ctx_t * ctx, lv_draw_sdl_composite_texture_id_t id, - lv_coord_t w, lv_coord_t h) + lv_coord_t w, lv_coord_t h, bool * texture_in_cache) { lv_point_t * tex_size = NULL; composite_key_t mask_key = mask_key_create(id); SDL_Texture * result = lv_draw_sdl_texture_cache_get_with_userdata(ctx, &mask_key, sizeof(composite_key_t), NULL, (void **) &tex_size); - if(!result || tex_size->x < w || tex_size->y < h) { + if(result == NULL || tex_size->x < w || tex_size->y < h) { lv_coord_t size = next_pow_of_2(LV_MAX(w, h)); int access = SDL_TEXTUREACCESS_STREAMING; if(id >= LV_DRAW_SDL_COMPOSITE_TEXTURE_ID_TRANSFORM0) { @@ -198,8 +204,19 @@ SDL_Texture * lv_draw_sdl_composite_texture_obtain(lv_draw_sdl_ctx_t * ctx, lv_d result = SDL_CreateTexture(ctx->renderer, LV_DRAW_SDL_TEXTURE_FORMAT, access, size, size); tex_size = lv_mem_alloc(sizeof(lv_point_t)); tex_size->x = tex_size->y = size; - lv_draw_sdl_texture_cache_put_advanced(ctx, &mask_key, sizeof(composite_key_t), result, tex_size, lv_mem_free, 0); + bool in_cache = lv_draw_sdl_texture_cache_put_advanced(ctx, &mask_key, sizeof(composite_key_t), result, + tex_size, lv_mem_free, 0); + if(!in_cache) { + lv_mem_free(tex_size); + } + if(texture_in_cache != NULL) { + *texture_in_cache = in_cache; + } } + else if(texture_in_cache != NULL) { + *texture_in_cache = true; + } + return result; } diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_composite.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/sdl/lv_draw_sdl_composite.h similarity index 85% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_composite.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/sdl/lv_draw_sdl_composite.h index 72a2dae..57191bb 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_composite.h +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/sdl/lv_draw_sdl_composite.h @@ -45,6 +45,7 @@ typedef enum lv_draw_sdl_composite_texture_id_t { /** * Begin drawing with mask. Render target will be switched to a temporary texture, * and drawing coordinates may get clipped or translated + * @param ctx Drawing context * @param coords_in Original coordinates * @param clip_in Original clip area * @param extension Useful for shadows or outlines, can be NULL @@ -59,8 +60,18 @@ bool lv_draw_sdl_composite_begin(lv_draw_sdl_ctx_t * ctx, const lv_area_t * coor void lv_draw_sdl_composite_end(lv_draw_sdl_ctx_t * ctx, const lv_area_t * apply_area, lv_blend_mode_t blend_mode); +/** + * + * @param ctx Drawing context + * @param id Texture ID + * @param w Maximum width needed + * @param h Maximum height needed + * @param texture_in_cache output to query if the texture is in cache. If it's not in cache, you'll need to destroy it + * by yourself + * @return Obtained texture + */ SDL_Texture * lv_draw_sdl_composite_texture_obtain(lv_draw_sdl_ctx_t * ctx, lv_draw_sdl_composite_texture_id_t id, - lv_coord_t w, lv_coord_t h); + lv_coord_t w, lv_coord_t h, bool * texture_in_cache); /********************** * MACROS diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_img.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/sdl/lv_draw_sdl_img.c similarity index 91% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_img.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/sdl/lv_draw_sdl_img.c index 3c955d8..0136a26 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_img.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/sdl/lv_draw_sdl_img.c @@ -72,7 +72,8 @@ static void draw_img_rounded(lv_draw_sdl_ctx_t * ctx, SDL_Texture * texture, con lv_coord_t radius); static SDL_Texture * img_rounded_frag_obtain(lv_draw_sdl_ctx_t * ctx, SDL_Texture * texture, - const lv_draw_sdl_img_header_t * header, int w, int h, lv_coord_t radius); + const lv_draw_sdl_img_header_t * header, int w, int h, lv_coord_t radius, + bool * in_cache); static lv_draw_img_rounded_key_t rounded_key_create(const SDL_Texture * texture, lv_coord_t w, lv_coord_t h, lv_coord_t radius); @@ -87,7 +88,6 @@ static void calc_draw_part(SDL_Texture * texture, const lv_draw_sdl_img_header_t * MACROS **********************/ - static void apply_recolor_opa(SDL_Texture * texture, const lv_draw_img_dsc_t * draw_dsc); /********************** @@ -106,11 +106,16 @@ lv_res_t lv_draw_sdl_img_core(lv_draw_ctx_t * draw_ctx, const lv_draw_img_dsc_t lv_draw_sdl_img_header_t * header = NULL; SDL_Texture * texture = lv_draw_sdl_texture_cache_get_with_userdata(ctx, key, key_size, &texture_found, (void **) &header); + bool texture_in_cache = false; if(!texture_found) { - lv_draw_sdl_img_load_texture(ctx, key, key_size, src, draw_dsc->frame_id, &texture, &header); + lv_draw_sdl_img_load_texture(ctx, key, key_size, src, draw_dsc->frame_id, &texture, &header, + &texture_in_cache); + } + else { + texture_in_cache = true; } SDL_free(key); - if(!texture) { + if(!texture || !header) { return LV_RES_INV; } @@ -148,6 +153,14 @@ lv_res_t lv_draw_sdl_img_core(lv_draw_ctx_t * draw_ctx, const lv_draw_img_dsc_t lv_draw_sdl_composite_end(ctx, &apply_area, draw_dsc->blend_mode); + if(!texture_in_cache) { + LV_LOG_WARN("Texture is not cached, this will impact performance."); + if(!header->managed) { + SDL_DestroyTexture(texture); + } + lv_mem_free(header); + } + return LV_RES_OK; } @@ -185,7 +198,7 @@ static void calc_draw_part(SDL_Texture * texture, const lv_draw_sdl_img_header_t bool lv_draw_sdl_img_load_texture(lv_draw_sdl_ctx_t * ctx, lv_draw_sdl_cache_key_head_img_t * key, size_t key_size, const void * src, int32_t frame_id, SDL_Texture ** texture, - lv_draw_sdl_img_header_t ** header) + lv_draw_sdl_img_header_t ** header, bool * texture_in_cache) { _lv_img_cache_entry_t * cdsc = _lv_img_cache_open(src, lv_color_white(), frame_id); lv_draw_sdl_cache_flag_t tex_flags = 0; @@ -210,16 +223,18 @@ bool lv_draw_sdl_img_load_texture(lv_draw_sdl_ctx_t * ctx, lv_draw_sdl_cache_key #endif } if(texture && cdsc) { - *header = SDL_malloc(sizeof(lv_draw_sdl_img_header_t)); + *header = lv_mem_alloc(sizeof(lv_draw_sdl_img_header_t)); SDL_memcpy(&(*header)->base, &cdsc->dec_dsc.header, sizeof(lv_img_header_t)); (*header)->rect = rect; - lv_draw_sdl_texture_cache_put_advanced(ctx, key, key_size, *texture, *header, SDL_free, tex_flags); + (*header)->managed = (tex_flags & LV_DRAW_SDL_CACHE_FLAG_MANAGED) != 0; + *texture_in_cache = lv_draw_sdl_texture_cache_put_advanced(ctx, key, key_size, *texture, *header, SDL_free, + tex_flags); + return true; } else { - lv_draw_sdl_texture_cache_put(ctx, key, key_size, NULL); + *texture_in_cache = lv_draw_sdl_texture_cache_put(ctx, key, key_size, NULL); return false; } - return true; } /********************** @@ -313,14 +328,14 @@ static void draw_img_simple(lv_draw_sdl_ctx_t * ctx, SDL_Texture * texture, cons } } - static void draw_img_rounded(lv_draw_sdl_ctx_t * ctx, SDL_Texture * texture, const lv_draw_sdl_img_header_t * header, const lv_draw_img_dsc_t * draw_dsc, const lv_area_t * coords, const lv_area_t * clip, lv_coord_t radius) { const int w = lv_area_get_width(coords), h = lv_area_get_height(coords); lv_coord_t real_radius = LV_MIN3(radius, w, h); - SDL_Texture * frag = img_rounded_frag_obtain(ctx, texture, header, w, h, real_radius); + bool frag_in_cache = false; + SDL_Texture * frag = img_rounded_frag_obtain(ctx, texture, header, w, h, real_radius, &frag_in_cache); apply_recolor_opa(frag, draw_dsc); lv_draw_sdl_rect_bg_frag_draw_corners(ctx, frag, real_radius, coords, clip, true); @@ -360,6 +375,11 @@ static void draw_img_rounded(lv_draw_sdl_ctx_t * ctx, SDL_Texture * texture, con SDL_RenderCopy(ctx->renderer, texture, &src_rect, &dst_rect); } SDL_RenderSetClipRect(ctx->renderer, NULL); + + if(!frag_in_cache) { + LV_LOG_WARN("Texture is not cached, this will impact performance."); + SDL_DestroyTexture(frag); + } } static void apply_recolor_opa(SDL_Texture * texture, const lv_draw_img_dsc_t * draw_dsc) @@ -377,15 +397,18 @@ static void apply_recolor_opa(SDL_Texture * texture, const lv_draw_img_dsc_t * d } static SDL_Texture * img_rounded_frag_obtain(lv_draw_sdl_ctx_t * ctx, SDL_Texture * texture, - const lv_draw_sdl_img_header_t * header, int w, int h, lv_coord_t radius) + const lv_draw_sdl_img_header_t * header, int w, int h, lv_coord_t radius, + bool * in_cache) { lv_draw_img_rounded_key_t key = rounded_key_create(texture, w, h, radius); - SDL_Texture * mask_frag = lv_draw_sdl_rect_bg_frag_obtain(ctx, radius); + bool mask_frag_in_cache = false; + SDL_Texture * mask_frag = lv_draw_sdl_rect_bg_frag_obtain(ctx, radius, &mask_frag_in_cache); SDL_Texture * img_frag = lv_draw_sdl_texture_cache_get(ctx, &key, sizeof(key), NULL); if(img_frag == NULL) { const lv_coord_t full_frag_size = radius * 2 + 3; img_frag = SDL_CreateTexture(ctx->renderer, LV_DRAW_SDL_TEXTURE_FORMAT, SDL_TEXTUREACCESS_TARGET, full_frag_size, full_frag_size); + SDL_assert(img_frag); SDL_SetTextureBlendMode(img_frag, SDL_BLENDMODE_BLEND); SDL_Texture * old_target = SDL_GetRenderTarget(ctx->renderer); SDL_SetRenderTarget(ctx->renderer, img_frag); @@ -395,7 +418,7 @@ static SDL_Texture * img_rounded_frag_obtain(lv_draw_sdl_ctx_t * ctx, SDL_Textur SDL_RenderFillRect(ctx->renderer, NULL); SDL_SetRenderDrawBlendMode(ctx->renderer, SDL_BLENDMODE_BLEND); - lv_area_t coords = {0, 0, w - 1, h - 1}, clip; + lv_area_t coords = {0, 0, w - 1, h - 1}; lv_area_t frag_coords = {0, 0, full_frag_size - 1, full_frag_size - 1}; lv_draw_sdl_rect_bg_frag_draw_corners(ctx, mask_frag, radius, &frag_coords, NULL, false); @@ -446,7 +469,14 @@ static SDL_Texture * img_rounded_frag_obtain(lv_draw_sdl_ctx_t * ctx, SDL_Textur SDL_SetTextureBlendMode(texture, SDL_BLENDMODE_BLEND); SDL_SetRenderTarget(ctx->renderer, old_target); - lv_draw_sdl_texture_cache_put(ctx, &key, sizeof(key), img_frag); + *in_cache = lv_draw_sdl_texture_cache_put(ctx, &key, sizeof(key), img_frag); + } + else { + *in_cache = true; + } + if(!mask_frag_in_cache) { + LV_LOG_WARN("Texture is not cached, this will impact performance."); + SDL_DestroyTexture(mask_frag); } return img_frag; } diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_img.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/sdl/lv_draw_sdl_img.h similarity index 70% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_img.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/sdl/lv_draw_sdl_img.h index 0e27027..e027bd9 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_img.h +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/sdl/lv_draw_sdl_img.h @@ -6,7 +6,6 @@ #ifndef LV_DRAW_SDL_IMG_H #define LV_DRAW_SDL_IMG_H - #ifdef __cplusplus extern "C" { #endif @@ -35,6 +34,7 @@ extern "C" { typedef struct lv_draw_sdl_img_header_t { lv_img_header_t base; SDL_Rect rect; + bool managed; } lv_draw_sdl_img_header_t; /********************** @@ -56,9 +56,22 @@ typedef struct lv_draw_sdl_img_header_t { /*===================== * Other functions *====================*/ +/** + * + * @param ctx Drawing context + * @param key Texture cache key + * @param key_size Size of texture cache key + * @param src Image source pointer + * @param frame_id Frame ID for animated image + * @param texture Texture for render + * @param header Header also holds sdl image info + * @param texture_in_cache Whether the texture has been put in the cache. Please note for managed texture, + * this will be false too. So you'll need to check header.managed too. + * @return Whether the image has been loaded successfully + */ bool lv_draw_sdl_img_load_texture(lv_draw_sdl_ctx_t * ctx, lv_draw_sdl_cache_key_head_img_t * key, size_t key_size, const void * src, int32_t frame_id, SDL_Texture ** texture, - lv_draw_sdl_img_header_t ** header); + lv_draw_sdl_img_header_t ** header, bool * texture_in_cache); /********************** * MACROS **********************/ diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_label.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/sdl/lv_draw_sdl_label.c similarity index 91% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_label.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/sdl/lv_draw_sdl_label.c index b8c79ae..2e51fee 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_label.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/sdl/lv_draw_sdl_label.c @@ -41,7 +41,6 @@ typedef struct { static lv_font_glyph_key_t font_key_glyph_create(const lv_font_t * font_p, uint32_t letter); - /********************** * STATIC VARIABLES **********************/ @@ -54,7 +53,7 @@ static lv_font_glyph_key_t font_key_glyph_create(const lv_font_t * font_p, uint3 * GLOBAL FUNCTIONS **********************/ -void lv_draw_sdl_draw_letter(lv_draw_ctx_t * draw_ctx, const lv_draw_label_dsc_t * dsc, const lv_point_t * pos_p, +void lv_draw_sdl_draw_letter(lv_draw_ctx_t * draw_ctx, const lv_draw_label_dsc_t * dsc, const lv_point_t * pos_p, uint32_t letter) { const lv_area_t * clip_area = draw_ctx->clip_area; @@ -117,6 +116,7 @@ void lv_draw_sdl_draw_letter(lv_draw_ctx_t * draw_ctx, const lv_draw_label_dsc_t lv_font_glyph_key_t glyph_key = font_key_glyph_create(font_p, letter); bool glyph_found = false; SDL_Texture * texture = lv_draw_sdl_texture_cache_get(ctx, &glyph_key, sizeof(glyph_key), &glyph_found); + bool in_cache = false; if(!glyph_found) { if(g.resolved_font) { font_p = g.resolved_font; @@ -128,7 +128,10 @@ void lv_draw_sdl_draw_letter(lv_draw_ctx_t * draw_ctx, const lv_draw_label_dsc_t texture = SDL_CreateTextureFromSurface(renderer, mask); SDL_FreeSurface(mask); lv_mem_free(buf); - lv_draw_sdl_texture_cache_put(ctx, &glyph_key, sizeof(glyph_key), texture); + in_cache = lv_draw_sdl_texture_cache_put(ctx, &glyph_key, sizeof(glyph_key), texture); + } + else { + in_cache = true; } if(!texture) { return; @@ -142,6 +145,10 @@ void lv_draw_sdl_draw_letter(lv_draw_ctx_t * draw_ctx, const lv_draw_label_dsc_t /*If the letter is completely out of mask don't draw it*/ if(!_lv_area_intersect(&draw_area, &t_letter, &t_clip)) { + if(!in_cache) { + LV_LOG_WARN("Texture is not cached, this will impact performance."); + SDL_DestroyTexture(texture); + } return; } SDL_Rect srcrect, dstrect; @@ -156,6 +163,11 @@ void lv_draw_sdl_draw_letter(lv_draw_ctx_t * draw_ctx, const lv_draw_label_dsc_t SDL_RenderCopy(renderer, texture, &srcrect, &dstrect); lv_draw_sdl_composite_end(ctx, &apply_area, dsc->blend_mode); + + if(!in_cache) { + LV_LOG_WARN("Texture is not cached, this will impact performance."); + SDL_DestroyTexture(texture); + } } /********************** diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_layer.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/sdl/lv_draw_sdl_layer.c similarity index 91% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_layer.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/sdl/lv_draw_sdl_layer.c index ae5c327..d517636 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_layer.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/sdl/lv_draw_sdl_layer.c @@ -58,7 +58,8 @@ lv_draw_layer_ctx_t * lv_draw_sdl_layer_init(lv_draw_ctx_t * draw_ctx, lv_draw_l enum lv_draw_sdl_composite_texture_id_t texture_id = LV_DRAW_SDL_COMPOSITE_TEXTURE_ID_TRANSFORM0 + ctx->internals->transform_count; - transform_ctx->target = lv_draw_sdl_composite_texture_obtain(ctx, texture_id, target_w, target_h); + transform_ctx->target = lv_draw_sdl_composite_texture_obtain(ctx, texture_id, target_w, target_h, + &transform_ctx->target_in_cache); transform_ctx->target_rect.x = 0; transform_ctx->target_rect.y = 0; transform_ctx->target_rect.w = target_w; @@ -117,6 +118,11 @@ void lv_draw_sdl_layer_blend(lv_draw_ctx_t * draw_ctx, lv_draw_layer_ctx_t * lay void lv_draw_sdl_layer_destroy(lv_draw_ctx_t * draw_ctx, lv_draw_layer_ctx_t * layer_ctx) { lv_draw_sdl_ctx_t * ctx = (lv_draw_sdl_ctx_t *) draw_ctx; + lv_draw_sdl_layer_ctx_t * transform_ctx = (lv_draw_sdl_layer_ctx_t *) layer_ctx; + if(!transform_ctx->target_in_cache && transform_ctx->target != NULL) { + LV_LOG_WARN("Texture is not cached, this will impact performance."); + SDL_DestroyTexture(transform_ctx->target); + } ctx->internals->transform_count -= 1; } diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_layer.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/sdl/lv_draw_sdl_layer.h similarity index 98% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_layer.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/sdl/lv_draw_sdl_layer.h index b60303c..f6aa668 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_layer.h +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/sdl/lv_draw_sdl_layer.h @@ -28,6 +28,7 @@ typedef struct _lv_draw_sdl_layer_ctx_t { SDL_Texture * orig_target; SDL_Texture * target; SDL_Rect target_rect; + bool target_in_cache; lv_draw_layer_flags_t flags; } lv_draw_sdl_layer_ctx_t; /********************** diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_line.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/sdl/lv_draw_sdl_line.c similarity index 97% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_line.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/sdl/lv_draw_sdl_line.c index 3a15d6d..204e1a3 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_line.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/sdl/lv_draw_sdl_line.c @@ -53,7 +53,7 @@ static SDL_Texture * line_texture_create(lv_draw_sdl_ctx_t * sdl_ctx, const lv_d * GLOBAL FUNCTIONS **********************/ void lv_draw_sdl_draw_line(lv_draw_ctx_t * draw_ctx, const lv_draw_line_dsc_t * dsc, const lv_point_t * point1, - const lv_point_t * point2) + const lv_point_t * point2, bool * in_cache) { lv_draw_sdl_ctx_t * sdl_ctx = (lv_draw_sdl_ctx_t *) draw_ctx; SDL_Renderer * renderer = sdl_ctx->renderer; @@ -68,7 +68,7 @@ void lv_draw_sdl_draw_line(lv_draw_ctx_t * draw_ctx, const lv_draw_line_dsc_t * SDL_Texture * texture = lv_draw_sdl_texture_cache_get(sdl_ctx, &key, sizeof(key), NULL); if(!texture) { texture = line_texture_create(sdl_ctx, dsc, (lv_coord_t) length); - lv_draw_sdl_texture_cache_put(sdl_ctx, &key, sizeof(key), texture); + *in_cache = lv_draw_sdl_texture_cache_put(sdl_ctx, &key, sizeof(key), texture); } lv_area_t coords = {x1, y1, x2, y2}; diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_mask.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/sdl/lv_draw_sdl_mask.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_mask.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/sdl/lv_draw_sdl_mask.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_mask.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/sdl/lv_draw_sdl_mask.h similarity index 99% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_mask.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/sdl/lv_draw_sdl_mask.h index a562d73..66e78b8 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_mask.h +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/sdl/lv_draw_sdl_mask.h @@ -39,7 +39,6 @@ lv_opa_t * lv_draw_sdl_mask_dump_opa(const lv_area_t * coords, const int16_t * i SDL_Texture * lv_draw_sdl_mask_dump_texture(SDL_Renderer * renderer, const lv_area_t * coords, const int16_t * ids, int16_t ids_count); - /********************** * MACROS **********************/ diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_polygon.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/sdl/lv_draw_sdl_polygon.c similarity index 92% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_polygon.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/sdl/lv_draw_sdl_polygon.c index c5df50c..68305c7 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_polygon.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/sdl/lv_draw_sdl_polygon.c @@ -77,7 +77,9 @@ void lv_draw_sdl_polygon(lv_draw_ctx_t * draw_ctx, const lv_draw_rect_dsc_t * dr int16_t mask_id = lv_draw_mask_add(&polygon_param, NULL); lv_coord_t w = lv_area_get_width(&draw_area), h = lv_area_get_height(&draw_area); - SDL_Texture * texture = lv_draw_sdl_composite_texture_obtain(ctx, LV_DRAW_SDL_COMPOSITE_TEXTURE_ID_STREAM1, w, h); + bool texture_in_cache = false; + SDL_Texture * texture = lv_draw_sdl_composite_texture_obtain(ctx, LV_DRAW_SDL_COMPOSITE_TEXTURE_ID_STREAM1, w, h, + &texture_in_cache); SDL_SetTextureBlendMode(texture, SDL_BLENDMODE_BLEND); dump_masks(texture, &draw_area); @@ -91,6 +93,10 @@ void lv_draw_sdl_polygon(lv_draw_ctx_t * draw_ctx, const lv_draw_rect_dsc_t * dr SDL_SetTextureColorMod(texture, color.r, color.g, color.b); SDL_SetTextureAlphaMod(texture, draw_dsc->bg_opa); SDL_RenderCopy(ctx->renderer, texture, &srcrect, &dstrect); + if(!texture_in_cache) { + LV_LOG_WARN("Texture is not cached, this will impact performance."); + SDL_DestroyTexture(texture); + } } /********************** diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_priv.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/sdl/lv_draw_sdl_priv.h similarity index 97% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_priv.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/sdl/lv_draw_sdl_priv.h index 24a8762..716edac 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_priv.h +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/sdl/lv_draw_sdl_priv.h @@ -6,7 +6,6 @@ #ifndef LV_DRAW_SDL_PRIV_H #define LV_DRAW_SDL_PRIV_H - #ifdef __cplusplus extern "C" { #endif @@ -35,6 +34,7 @@ typedef struct lv_draw_sdl_context_internals_t { lv_lru_t * texture_cache; SDL_Texture * mask; SDL_Texture * composition; + bool composition_cached; SDL_Texture * target_backup; uint8_t transform_count; } lv_draw_sdl_context_internals_t; diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_rect.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/sdl/lv_draw_sdl_rect.c similarity index 68% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_rect.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/sdl/lv_draw_sdl_rect.c index a303ac7..96f7f21 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_rect.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/sdl/lv_draw_sdl_rect.c @@ -27,6 +27,8 @@ * DEFINES *********************/ +#define FRAG_SPACING 3 + /********************** * TYPEDEFS **********************/ @@ -37,6 +39,23 @@ typedef struct { lv_coord_t size; } lv_draw_rect_bg_key_t; +typedef struct { + lv_sdl_cache_key_magic_t magic; + lv_gradient_stop_t stops[LV_GRADIENT_MAX_STOPS]; + uint8_t stops_count; + lv_grad_dir_t dir; +} lv_draw_rect_grad_strip_key_t; + +typedef struct { + lv_sdl_cache_key_magic_t magic; + lv_gradient_stop_t stops[LV_GRADIENT_MAX_STOPS]; + uint8_t stops_count; + lv_grad_dir_t dir; + lv_coord_t w; + lv_coord_t h; + lv_coord_t radius; +} lv_draw_rect_grad_frag_key_t; + typedef struct { lv_sdl_cache_key_magic_t magic; lv_coord_t radius; @@ -57,6 +76,12 @@ typedef struct { static void draw_bg_color(lv_draw_sdl_ctx_t * ctx, const lv_area_t * coords, const lv_area_t * draw_area, const lv_draw_rect_dsc_t * dsc); +static void draw_bg_grad_simple(lv_draw_sdl_ctx_t * ctx, const lv_area_t * coords, const lv_area_t * draw_area, + const lv_grad_dsc_t * grad, bool blend_mod); + +static void draw_bg_grad_radius(lv_draw_sdl_ctx_t * ctx, const lv_area_t * coords, const lv_area_t * draw_area, + const lv_draw_rect_dsc_t * dsc); + static void draw_bg_img(lv_draw_sdl_ctx_t * ctx, const lv_area_t * coords, const lv_area_t * draw_area, const lv_draw_rect_dsc_t * dsc); @@ -81,6 +106,11 @@ static void frag_render_center(SDL_Renderer * renderer, SDL_Texture * frag, lv_c static lv_draw_rect_bg_key_t rect_bg_key_create(lv_coord_t radius, lv_coord_t size); +static lv_draw_rect_grad_frag_key_t rect_grad_frag_key_create(const lv_grad_dsc_t * grad, lv_coord_t w, lv_coord_t h, + lv_coord_t radius); + +static lv_draw_rect_grad_strip_key_t rect_grad_strip_key_create(const lv_grad_dsc_t * grad); + static lv_draw_rect_shadow_key_t rect_shadow_key_create(lv_coord_t radius, lv_coord_t size, lv_coord_t blur); static lv_draw_rect_border_key_t rect_border_key_create(lv_coord_t rout, lv_coord_t rin, const lv_area_t * outer_area, @@ -145,20 +175,106 @@ void lv_draw_sdl_draw_rect(lv_draw_ctx_t * draw_ctx, const lv_draw_rect_dsc_t * lv_draw_sdl_composite_end(ctx, &apply_area, dsc->blend_mode); } -SDL_Texture * lv_draw_sdl_rect_bg_frag_obtain(lv_draw_sdl_ctx_t * ctx, lv_coord_t radius) +SDL_Texture * lv_draw_sdl_rect_bg_frag_obtain(lv_draw_sdl_ctx_t * ctx, lv_coord_t radius, bool * in_cache) { lv_draw_rect_bg_key_t key = rect_bg_key_create(radius, radius); - lv_area_t coords = {0, 0, radius * 2 - 1, radius * 2 - 1}; - lv_area_t coords_frag = {0, 0, radius - 1, radius - 1}; SDL_Texture * texture = lv_draw_sdl_texture_cache_get(ctx, &key, sizeof(key), NULL); if(texture == NULL) { + lv_area_t coords = {0, 0, radius * 2 - 1, radius * 2 - 1}; + lv_area_t coords_frag = {0, 0, radius - 1, radius - 1}; lv_draw_mask_radius_param_t mask_rout_param; lv_draw_mask_radius_init(&mask_rout_param, &coords, radius, false); int16_t mask_id = lv_draw_mask_add(&mask_rout_param, NULL); texture = lv_draw_sdl_mask_dump_texture(ctx->renderer, &coords_frag, &mask_id, 1); + SDL_assert(texture != NULL); lv_draw_mask_remove_id(mask_id); - SDL_assert(texture); - lv_draw_sdl_texture_cache_put(ctx, &key, sizeof(key), texture); + *in_cache = lv_draw_sdl_texture_cache_put(ctx, &key, sizeof(key), texture); + } + else { + *in_cache = true; + } + return texture; +} + +SDL_Texture * lv_draw_sdl_rect_grad_frag_obtain(lv_draw_sdl_ctx_t * ctx, const lv_grad_dsc_t * grad, lv_coord_t w, + lv_coord_t h, lv_coord_t radius, bool * in_cache) +{ + lv_draw_rect_grad_frag_key_t key = rect_grad_frag_key_create(grad, w, h, radius); + SDL_Texture * texture = lv_draw_sdl_texture_cache_get(ctx, &key, sizeof(key), NULL); + if(texture == NULL) { + lv_area_t coords = {0, 0, radius * 2 + FRAG_SPACING - 1, radius * 2 + FRAG_SPACING - 1}; + texture = SDL_CreateTexture(ctx->renderer, LV_DRAW_SDL_TEXTURE_FORMAT, SDL_TEXTUREACCESS_TARGET, + lv_area_get_width(&coords), lv_area_get_height(&coords)); + SDL_assert(texture != NULL); + + lv_draw_mask_radius_param_t mask_rout_param; + lv_draw_mask_radius_init(&mask_rout_param, &coords, radius, false); + int16_t mask_id = lv_draw_mask_add(&mask_rout_param, NULL); + SDL_Texture * mask = lv_draw_sdl_mask_dump_texture(ctx->renderer, &coords, &mask_id, 1); + SDL_assert(mask != NULL); + SDL_SetTextureBlendMode(mask, SDL_BLENDMODE_NONE); + lv_draw_mask_remove_id(mask_id); + + SDL_Texture * target_backup = SDL_GetRenderTarget(ctx->renderer); + SDL_SetRenderTarget(ctx->renderer, texture); + SDL_RenderCopy(ctx->renderer, mask, NULL, NULL); + SDL_DestroyTexture(mask); + + lv_area_t blend_coords = {.x1 = 0, .y1 = 0, .x2 = w - 1, .y2 = h - 1}; + lv_area_t draw_area = {.x1 = 0, .y1 = 0, .x2 = radius - 1, .y2 = radius - 1}; + /* Align to top left */ + lv_area_align(&coords, &draw_area, LV_ALIGN_TOP_LEFT, 0, 0); + lv_area_align(&coords, &blend_coords, LV_ALIGN_TOP_LEFT, 0, 0); + draw_bg_grad_simple(ctx, &blend_coords, &draw_area, grad, true); + + /* Align to top right */ + lv_area_align(&coords, &draw_area, LV_ALIGN_TOP_RIGHT, 0, 0); + lv_area_align(&coords, &blend_coords, LV_ALIGN_TOP_RIGHT, 0, 0); + draw_bg_grad_simple(ctx, &blend_coords, &draw_area, grad, true); + + /* Align to bottom right */ + lv_area_align(&coords, &draw_area, LV_ALIGN_BOTTOM_RIGHT, 0, 0); + lv_area_align(&coords, &blend_coords, LV_ALIGN_BOTTOM_RIGHT, 0, 0); + draw_bg_grad_simple(ctx, &blend_coords, &draw_area, grad, true); + + /* Align to bottom left */ + lv_area_align(&coords, &draw_area, LV_ALIGN_BOTTOM_LEFT, 0, 0); + lv_area_align(&coords, &blend_coords, LV_ALIGN_BOTTOM_LEFT, 0, 0); + draw_bg_grad_simple(ctx, &blend_coords, &draw_area, grad, true); + + SDL_SetRenderTarget(ctx->renderer, target_backup); + *in_cache = lv_draw_sdl_texture_cache_put(ctx, &key, sizeof(key), texture); + } + else { + *in_cache = true; + } + return texture; +} + +SDL_Texture * lv_draw_sdl_rect_grad_strip_obtain(lv_draw_sdl_ctx_t * ctx, const lv_grad_dsc_t * grad, bool * in_cache) +{ + lv_draw_rect_grad_strip_key_t key = rect_grad_strip_key_create(grad); + SDL_Texture * texture = lv_draw_sdl_texture_cache_get(ctx, &key, sizeof(key), NULL); + if(texture == NULL) { + Uint32 amask = 0xFF000000; + Uint32 rmask = 0x00FF0000; + Uint32 gmask = 0x0000FF00; + Uint32 bmask = 0x000000FF; + lv_color_t pixels[256]; + for(int i = 0; i < 256; i++) { + pixels[i] = lv_gradient_calculate(grad, 256, i); + } + int width = grad->dir == LV_GRAD_DIR_VER ? 1 : 256; + int height = grad->dir == LV_GRAD_DIR_VER ? 256 : 1; + SDL_Surface * surface = SDL_CreateRGBSurfaceFrom(pixels, width, height, LV_COLOR_DEPTH, width * LV_COLOR_DEPTH / 8, + rmask, gmask, bmask, amask); + texture = SDL_CreateTextureFromSurface(ctx->renderer, surface); + SDL_assert(texture != NULL); + SDL_FreeSurface(surface); + *in_cache = lv_draw_sdl_texture_cache_put(ctx, &key, sizeof(key), texture); + } + else { + *in_cache = true; } return texture; } @@ -193,7 +309,7 @@ void lv_draw_sdl_rect_bg_frag_draw_corners(lv_draw_sdl_ctx_t * ctx, SDL_Texture if(full) { lv_coord_t sx = (lv_coord_t)(dst_area.x1 - corner_area.x1), sy = (lv_coord_t)(dst_area.y1 - corner_area.y1); - SDL_Rect src_rect = {frag_size + 3 + sx, sy, dw, dh}; + SDL_Rect src_rect = {frag_size + FRAG_SPACING + sx, sy, dw, dh}; SDL_RenderCopy(ctx->renderer, frag, &src_rect, &dst_rect); } else { @@ -212,7 +328,7 @@ void lv_draw_sdl_rect_bg_frag_draw_corners(lv_draw_sdl_ctx_t * ctx, SDL_Texture if(full) { lv_coord_t sx = (lv_coord_t)(dst_area.x1 - corner_area.x1), sy = (lv_coord_t)(dst_area.y1 - corner_area.y1); - SDL_Rect src_rect = {frag_size + 3 + sx, frag_size + 3 + sy, dw, dh}; + SDL_Rect src_rect = {frag_size + FRAG_SPACING + sx, frag_size + FRAG_SPACING + sy, dw, dh}; SDL_RenderCopy(ctx->renderer, frag, &src_rect, &dst_rect); } else { @@ -220,7 +336,7 @@ void lv_draw_sdl_rect_bg_frag_draw_corners(lv_draw_sdl_ctx_t * ctx, SDL_Texture SDL_RenderCopyEx(ctx->renderer, frag, &src_rect, &dst_rect, 0, NULL, SDL_FLIP_HORIZONTAL | SDL_FLIP_VERTICAL); } } - /* Lower left, right edge should not be clip */ + /* Lower left, right edge should not be clipped */ corner_area.x1 = coords->x1; corner_area.x2 = coords->x1 + frag_size - 1; if(_lv_area_intersect(&dst_area, &corner_area, clip)) { @@ -231,7 +347,7 @@ void lv_draw_sdl_rect_bg_frag_draw_corners(lv_draw_sdl_ctx_t * ctx, SDL_Texture if(full) { lv_coord_t sx = (lv_coord_t)(dst_area.x1 - corner_area.x1), sy = (lv_coord_t)(dst_area.y1 - corner_area.y1); - SDL_Rect src_rect = {sx, frag_size + 3 + sy, dw, dh}; + SDL_Rect src_rect = {sx, frag_size + FRAG_SPACING + sy, dw, dh}; SDL_RenderCopy(ctx->renderer, frag, &src_rect, &dst_rect); } else { @@ -241,7 +357,6 @@ void lv_draw_sdl_rect_bg_frag_draw_corners(lv_draw_sdl_ctx_t * ctx, SDL_Texture } } - /********************** * STATIC FUNCTIONS **********************/ @@ -252,9 +367,23 @@ static void draw_bg_color(lv_draw_sdl_ctx_t * ctx, const lv_area_t * coords, con if(dsc->bg_opa == 0) { return; } - SDL_Color bg_color; - lv_color_to_sdl_color(&dsc->bg_color, &bg_color); lv_coord_t radius = dsc->radius; + SDL_Color bg_color; + if(dsc->bg_grad.dir == LV_GRAD_DIR_NONE) { + lv_color_to_sdl_color(&dsc->bg_color, &bg_color); + } + else if(dsc->bg_grad.stops_count == 1) { + lv_color_to_sdl_color(&dsc->bg_grad.stops[0].color, &bg_color); + } + else { + if(radius <= 0) { + draw_bg_grad_simple(ctx, coords, draw_area, &dsc->bg_grad, false); + } + else { + draw_bg_grad_radius(ctx, coords, draw_area, dsc); + } + return; + } if(radius <= 0) { SDL_Rect rect; lv_area_to_sdl_rect(draw_area, &rect); @@ -267,7 +396,8 @@ static void draw_bg_color(lv_draw_sdl_ctx_t * ctx, const lv_area_t * coords, con /*A small texture with a quarter of the rect is enough*/ lv_coord_t bg_w = lv_area_get_width(coords), bg_h = lv_area_get_height(coords); lv_coord_t real_radius = LV_MIN3(bg_w / 2, bg_h / 2, radius); - SDL_Texture * texture = lv_draw_sdl_rect_bg_frag_obtain(ctx, real_radius); + bool texture_in_cache = false; + SDL_Texture * texture = lv_draw_sdl_rect_bg_frag_obtain(ctx, real_radius, &texture_in_cache); SDL_SetTextureBlendMode(texture, SDL_BLENDMODE_BLEND); SDL_SetTextureAlphaMod(texture, dsc->bg_opa); @@ -275,11 +405,131 @@ static void draw_bg_color(lv_draw_sdl_ctx_t * ctx, const lv_area_t * coords, con lv_draw_sdl_rect_bg_frag_draw_corners(ctx, texture, real_radius, coords, draw_area, false); frag_render_borders(ctx->renderer, texture, real_radius, coords, draw_area, false); frag_render_center(ctx->renderer, texture, real_radius, coords, draw_area, false); + + if(!texture_in_cache) { + LV_LOG_WARN("Texture is not cached, this will impact performance."); + SDL_DestroyTexture(texture); + } +} + +static void draw_bg_grad_simple(lv_draw_sdl_ctx_t * ctx, const lv_area_t * coords, const lv_area_t * draw_area, + const lv_grad_dsc_t * grad, bool blend_mod) +{ + SDL_Rect dstrect; + lv_area_to_sdl_rect(draw_area, &dstrect); + SDL_Rect srcrect; + if(grad->dir == LV_GRAD_DIR_VER) { + lv_coord_t coords_h = lv_area_get_height(coords); + srcrect.x = 0; + srcrect.y = (draw_area->y1 - coords->y1) * 255 / coords_h; + srcrect.w = 1; + srcrect.h = dstrect.h * 256 / coords_h; + + if(srcrect.y < 0 || srcrect.y > 255) { + return; + } + } + else { + lv_coord_t coords_w = lv_area_get_width(coords); + srcrect.x = (draw_area->x1 - coords->x1) * 255 / coords_w; + srcrect.y = 0; + srcrect.w = dstrect.w * 256 / coords_w; + srcrect.h = 1; + + if(srcrect.x < 0 || srcrect.x > 255) { + return; + } + } + + bool grad_texture_in_cache = false; + SDL_Texture * grad_texture = lv_draw_sdl_rect_grad_strip_obtain(ctx, grad, &grad_texture_in_cache); + if(blend_mod) { + SDL_SetTextureBlendMode(grad_texture, SDL_BLENDMODE_MOD); + } + else { + SDL_SetTextureBlendMode(grad_texture, SDL_BLENDMODE_BLEND); + } + + SDL_RenderCopy(ctx->renderer, grad_texture, &srcrect, &dstrect); + + if(!grad_texture_in_cache) { + LV_LOG_WARN("Texture is not cached, this will impact performance."); + SDL_DestroyTexture(grad_texture); + } +} + +static void draw_bg_grad_radius(lv_draw_sdl_ctx_t * ctx, const lv_area_t * coords, const lv_area_t * draw_area, + const lv_draw_rect_dsc_t * dsc) +{ + lv_coord_t radius = dsc->radius; + /*A small texture with a quarter of the rect is enough*/ + lv_coord_t bg_w = lv_area_get_width(coords), bg_h = lv_area_get_height(coords); + lv_coord_t real_radius = LV_MIN3(bg_w / 2, bg_h / 2, radius); + bool grad_texture_in_cache = false; + SDL_Texture * grad_texture = lv_draw_sdl_rect_grad_frag_obtain(ctx, &dsc->bg_grad, bg_w, bg_h, radius, + &grad_texture_in_cache); + SDL_SetTextureBlendMode(grad_texture, SDL_BLENDMODE_BLEND); + + lv_draw_sdl_rect_bg_frag_draw_corners(ctx, grad_texture, real_radius, coords, draw_area, true); + lv_area_t part_coords; + lv_area_t part_area; + if(bg_w > radius * 2) { + /*Draw left, middle, right*/ + part_coords.x1 = 0; + part_coords.x2 = radius - 1; + part_coords.y1 = radius; + part_coords.y2 = bg_h - radius - 1; + + lv_area_align(coords, &part_coords, LV_ALIGN_LEFT_MID, 0, 0); + _lv_area_intersect(&part_area, &part_coords, draw_area); + draw_bg_grad_simple(ctx, coords, &part_area, &dsc->bg_grad, false); + + lv_area_align(coords, &part_coords, LV_ALIGN_RIGHT_MID, 0, 0); + _lv_area_intersect(&part_area, &part_coords, draw_area); + draw_bg_grad_simple(ctx, coords, &part_area, &dsc->bg_grad, false); + + part_coords.x1 = radius; + part_coords.x2 = bg_w - radius - 1; + part_coords.y1 = 0; + part_coords.y2 = bg_h - 1; + lv_area_align(coords, &part_coords, LV_ALIGN_CENTER, 0, 0); + _lv_area_intersect(&part_area, &part_coords, draw_area); + draw_bg_grad_simple(ctx, coords, &part_area, &dsc->bg_grad, false); + } + else if(bg_h > radius * 2) { + /*Draw top, middle, bottom*/ + part_coords.x1 = radius; + part_coords.x2 = bg_w - radius - 1; + part_coords.y1 = 0; + part_coords.y2 = radius - 1; + + lv_area_align(coords, &part_coords, LV_ALIGN_TOP_MID, 0, 0); + _lv_area_intersect(&part_area, &part_coords, draw_area); + draw_bg_grad_simple(ctx, coords, &part_area, &dsc->bg_grad, false); + + lv_area_align(coords, &part_coords, LV_ALIGN_BOTTOM_MID, 0, 0); + _lv_area_intersect(&part_area, &part_coords, draw_area); + draw_bg_grad_simple(ctx, coords, &part_area, &dsc->bg_grad, false); + + part_coords.x1 = 0; + part_coords.x2 = bg_w - 1; + part_coords.y1 = radius; + part_coords.y2 = bg_h - radius - 1; + lv_area_align(coords, &part_coords, LV_ALIGN_CENTER, 0, 0); + _lv_area_intersect(&part_area, &part_coords, draw_area); + draw_bg_grad_simple(ctx, coords, &part_area, &dsc->bg_grad, false); + } + + if(!grad_texture_in_cache) { + LV_LOG_WARN("Texture is not cached, this will impact performance."); + SDL_DestroyTexture(grad_texture); + } } static void draw_bg_img(lv_draw_sdl_ctx_t * ctx, const lv_area_t * coords, const lv_area_t * draw_area, const lv_draw_rect_dsc_t * dsc) { + LV_UNUSED(draw_area); if(SKIP_IMAGE(dsc)) return; lv_img_src_t src_type = lv_img_src_get_type(dsc->bg_img_src); @@ -409,6 +659,7 @@ static void draw_shadow(lv_draw_sdl_ctx_t * ctx, const lv_area_t * coords, const lv_draw_rect_shadow_key_t key = rect_shadow_key_create(radius, frag_size, sw); SDL_Texture * texture = lv_draw_sdl_texture_cache_get(ctx, &key, sizeof(key), NULL); + bool texture_in_cache = false; if(texture == NULL) { lv_area_t mask_area = {blur_growth, blur_growth}, mask_area_blurred = {0, 0}; lv_area_set_width(&mask_area, frag_size * 2); @@ -427,7 +678,10 @@ static void draw_shadow(lv_draw_sdl_ctx_t * ctx, const lv_area_t * coords, const lv_mem_buf_release(mask_buf); lv_draw_mask_remove_id(mask_id); SDL_assert(texture); - lv_draw_sdl_texture_cache_put(ctx, &key, sizeof(key), texture); + texture_in_cache = lv_draw_sdl_texture_cache_put(ctx, &key, sizeof(key), texture); + } + else { + texture_in_cache = true; } SDL_Color shadow_color; @@ -439,8 +693,12 @@ static void draw_shadow(lv_draw_sdl_ctx_t * ctx, const lv_area_t * coords, const lv_draw_sdl_rect_bg_frag_draw_corners(ctx, texture, blur_frag_size, &shadow_area, clip, false); frag_render_borders(ctx->renderer, texture, blur_frag_size, &shadow_area, clip, false); frag_render_center(ctx->renderer, texture, blur_frag_size, &shadow_area, clip, false); -} + if(!texture_in_cache) { + LV_LOG_WARN("Texture is not cached, this will impact performance."); + SDL_DestroyTexture(texture); + } +} static void draw_border(lv_draw_sdl_ctx_t * ctx, const lv_area_t * coords, const lv_area_t * draw_area, const lv_draw_rect_dsc_t * dsc) @@ -520,9 +778,10 @@ static void draw_border_generic(lv_draw_sdl_ctx_t * ctx, const lv_area_t * outer lv_coord_t max_side = LV_MAX4(key.offsets.x1, key.offsets.y1, -key.offsets.x2, -key.offsets.y2); lv_coord_t frag_size = LV_MAX(radius, max_side); SDL_Texture * texture = lv_draw_sdl_texture_cache_get(ctx, &key, sizeof(key), NULL); + bool texture_in_cache; if(texture == NULL) { - /* Create a mask texture with size of (frag_size * 2 + 3) */ - const lv_area_t frag_area = {0, 0, frag_size * 2 + 2, frag_size * 2 + 2}; + /* Create a mask texture with size of (frag_size * 2 + FRAG_SPACING) */ + const lv_area_t frag_area = {0, 0, frag_size * 2 + FRAG_SPACING - 1, frag_size * 2 + FRAG_SPACING - 1}; /*Create mask for the outer area*/ int16_t mask_ids[2] = {LV_MASK_ID_INV, LV_MASK_ID_INV}; @@ -546,7 +805,10 @@ static void draw_border_generic(lv_draw_sdl_ctx_t * ctx, const lv_area_t * outer lv_draw_mask_remove_id(mask_ids[1]); lv_draw_mask_remove_id(mask_ids[0]); SDL_assert(texture); - lv_draw_sdl_texture_cache_put(ctx, &key, sizeof(key), texture); + texture_in_cache = lv_draw_sdl_texture_cache_put(ctx, &key, sizeof(key), texture); + } + else { + texture_in_cache = true; } SDL_Rect outer_rect; @@ -560,6 +822,11 @@ static void draw_border_generic(lv_draw_sdl_ctx_t * ctx, const lv_area_t * outer lv_draw_sdl_rect_bg_frag_draw_corners(ctx, texture, frag_size, outer_area, clip, true); frag_render_borders(renderer, texture, frag_size, outer_area, clip, true); + + if(!texture_in_cache) { + LV_LOG_WARN("Texture is not cached, this will impact performance."); + SDL_DestroyTexture(texture); + } } static void frag_render_borders(SDL_Renderer * renderer, SDL_Texture * frag, lv_coord_t frag_size, @@ -595,7 +862,7 @@ static void frag_render_borders(SDL_Renderer * renderer, SDL_Texture * frag, lv_ lv_coord_t dh = lv_area_get_height(&dst_area); if(full) { lv_coord_t sy = (lv_coord_t)(dst_area.y1 - border_area.y1); - SDL_Rect src_rect = {frag_size + 1, frag_size + 3 + sy, 1, dh}; + SDL_Rect src_rect = {frag_size + 1, frag_size + FRAG_SPACING + sy, 1, dh}; SDL_RenderCopy(renderer, frag, &src_rect, &dst_rect); } else { @@ -634,7 +901,7 @@ static void frag_render_borders(SDL_Renderer * renderer, SDL_Texture * frag, lv_ lv_coord_t dw = lv_area_get_width(&dst_area); if(full) { lv_coord_t sx = (lv_coord_t)(dst_area.x1 - border_area.x1); - SDL_Rect src_rect = {frag_size + 3 + sx, frag_size + 1, dw, 1}; + SDL_Rect src_rect = {frag_size + FRAG_SPACING + sx, frag_size + 1, dw, 1}; SDL_RenderCopy(renderer, frag, &src_rect, &dst_rect); } else { @@ -682,6 +949,38 @@ static lv_draw_rect_bg_key_t rect_bg_key_create(lv_coord_t radius, lv_coord_t si return key; } +static lv_draw_rect_grad_frag_key_t rect_grad_frag_key_create(const lv_grad_dsc_t * grad, lv_coord_t w, lv_coord_t h, + lv_coord_t radius) +{ + lv_draw_rect_grad_frag_key_t key; + SDL_memset(&key, 0, sizeof(key)); + key.magic = LV_GPU_CACHE_KEY_MAGIC_RECT_GRAD; + key.stops_count = grad->stops_count; + key.dir = grad->dir; + for(uint8_t i = 0; i < grad->stops_count; i++) { + key.stops[i].frac = grad->stops[i].frac; + key.stops[i].color = grad->stops[i].color; + } + key.w = w; + key.h = h; + key.radius = radius; + return key; +} + +static lv_draw_rect_grad_strip_key_t rect_grad_strip_key_create(const lv_grad_dsc_t * grad) +{ + lv_draw_rect_grad_strip_key_t key; + SDL_memset(&key, 0, sizeof(key)); + key.magic = LV_GPU_CACHE_KEY_MAGIC_RECT_GRAD; + key.stops_count = grad->stops_count; + key.dir = grad->dir; + for(uint8_t i = 0; i < grad->stops_count; i++) { + key.stops[i].frac = grad->stops[i].frac; + key.stops[i].color = grad->stops[i].color; + } + return key; +} + static lv_draw_rect_shadow_key_t rect_shadow_key_create(lv_coord_t radius, lv_coord_t size, lv_coord_t blur) { lv_draw_rect_shadow_key_t key; diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_rect.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/sdl/lv_draw_sdl_rect.h similarity index 57% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_rect.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/sdl/lv_draw_sdl_rect.h index 1e9be34..0fc3d77 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_rect.h +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/sdl/lv_draw_sdl_rect.h @@ -6,7 +6,6 @@ #ifndef LV_DRAW_SDL_RECT_H #define LV_DRAW_SDL_RECT_H - #ifdef __cplusplus extern "C" { #endif @@ -57,7 +56,36 @@ typedef struct lv_draw_sdl_rect_header_t { * Other functions *====================*/ -SDL_Texture * lv_draw_sdl_rect_bg_frag_obtain(lv_draw_sdl_ctx_t * ctx, lv_coord_t radius); +/** + * + * @param ctx Drawing context + * @param radius Corner radius of the rectangle + * @param in_cache Whether the texture has been put in the cache + * @return Background fragment texture + */ +SDL_Texture * lv_draw_sdl_rect_bg_frag_obtain(lv_draw_sdl_ctx_t * ctx, lv_coord_t radius, bool * in_cache); + +/** + * + * @param ctx Drawing context + * @param grad Gradient info + * @param w Width of the rectangle + * @param h Height of the rectangle + * @param radius Corner radius of the rectangle + * @param in_cache Whether the texture has been put in the cache + * @return Gradient fragment texture + */ +SDL_Texture * lv_draw_sdl_rect_grad_frag_obtain(lv_draw_sdl_ctx_t * ctx, const lv_grad_dsc_t * grad, lv_coord_t w, + lv_coord_t h, lv_coord_t radius, bool * in_cache); + +/** + * + * @param ctx Drawing context + * @param grad Gradient info + * @param in_cache Whether the texture has been put in the cache + * @return Gradient strip texture + */ +SDL_Texture * lv_draw_sdl_rect_grad_strip_obtain(lv_draw_sdl_ctx_t * ctx, const lv_grad_dsc_t * grad, bool * in_cache); void lv_draw_sdl_rect_bg_frag_draw_corners(lv_draw_sdl_ctx_t * ctx, SDL_Texture * frag, lv_coord_t frag_size, const lv_area_t * coords, const lv_area_t * clip, bool full); diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_stack_blur.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/sdl/lv_draw_sdl_stack_blur.c similarity index 98% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_stack_blur.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/sdl/lv_draw_sdl_stack_blur.c index 1c411b0..dd94c6c 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_stack_blur.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/sdl/lv_draw_sdl_stack_blur.c @@ -122,8 +122,8 @@ static void stack_blur_job(lv_opa_t * src, unsigned int w, unsigned int h, unsig for(y = minY; y < maxY; y++) { sum_r = - sum_in_r = - sum_out_r = 0; + sum_in_r = + sum_out_r = 0; src_ptr = src + stride * y; // start of line (0,y) @@ -134,7 +134,6 @@ static void stack_blur_job(lv_opa_t * src, unsigned int w, unsigned int h, unsig sum_out_r += src_ptr[0]; } - for(i = 1; i <= radius; i++) { if(i <= wm) src_ptr += 1; stack_ptr = &stack[i + radius]; @@ -143,7 +142,6 @@ static void stack_blur_job(lv_opa_t * src, unsigned int w, unsigned int h, unsig sum_in_r += src_ptr[0]; } - sp = radius; xp = radius; if(xp > wm) xp = wm; @@ -189,8 +187,8 @@ static void stack_blur_job(lv_opa_t * src, unsigned int w, unsigned int h, unsig for(x = minX; x < maxX; x++) { sum_r = - sum_in_r = - sum_out_r = 0; + sum_in_r = + sum_out_r = 0; src_ptr = src + x; // x,0 for(i = 0; i <= radius; i++) { diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_stack_blur.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/sdl/lv_draw_sdl_stack_blur.h similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_stack_blur.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/sdl/lv_draw_sdl_stack_blur.h diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_texture_cache.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/sdl/lv_draw_sdl_texture_cache.c similarity index 91% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_texture_cache.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/sdl/lv_draw_sdl_texture_cache.c index 6845add..4067417 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_texture_cache.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/sdl/lv_draw_sdl_texture_cache.c @@ -81,12 +81,12 @@ SDL_Texture * lv_draw_sdl_texture_cache_get_with_userdata(lv_draw_sdl_ctx_t * ct return value->texture; } -void lv_draw_sdl_texture_cache_put(lv_draw_sdl_ctx_t * ctx, const void * key, size_t key_length, SDL_Texture * texture) +bool lv_draw_sdl_texture_cache_put(lv_draw_sdl_ctx_t * ctx, const void * key, size_t key_length, SDL_Texture * texture) { - lv_draw_sdl_texture_cache_put_advanced(ctx, key, key_length, texture, NULL, NULL, 0); + return lv_draw_sdl_texture_cache_put_advanced(ctx, key, key_length, texture, NULL, NULL, 0); } -void lv_draw_sdl_texture_cache_put_advanced(lv_draw_sdl_ctx_t * ctx, const void * key, size_t key_length, +bool lv_draw_sdl_texture_cache_put_advanced(lv_draw_sdl_ctx_t * ctx, const void * key, size_t key_length, SDL_Texture * texture, void * userdata, void userdata_free(void *), lv_draw_sdl_cache_flag_t flags) { @@ -97,22 +97,20 @@ void lv_draw_sdl_texture_cache_put_advanced(lv_draw_sdl_ctx_t * ctx, const void value->userdata_free = userdata_free; value->flags = flags; if(!texture) { - lv_lru_set(lru, key, key_length, value, 1); - return; + return lv_lru_set(lru, key, key_length, value, 1) == LV_LRU_OK; } if(flags & LV_DRAW_SDL_CACHE_FLAG_MANAGED) { /* Managed texture doesn't count into cache size */ LV_LOG_INFO("cache texture %p", texture); - lv_lru_set(lru, key, key_length, value, 1); - return; + return lv_lru_set(lru, key, key_length, value, 1) == LV_LRU_OK; } Uint32 format; int access, width, height; if(SDL_QueryTexture(texture, &format, &access, &width, &height) != 0) { - return; + return false; } LV_LOG_INFO("cache texture %p, %d*%d@%dbpp", texture, width, height, SDL_BITSPERPIXEL(format)); - lv_lru_set(lru, key, key_length, value, width * height * SDL_BITSPERPIXEL(format) / 8); + return lv_lru_set(lru, key, key_length, value, width * height * SDL_BITSPERPIXEL(format) / 8) == LV_LRU_OK; } lv_draw_sdl_cache_key_head_img_t * lv_draw_sdl_texture_img_key_create(const void * src, int32_t frame_id, size_t * size) diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_texture_cache.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/sdl/lv_draw_sdl_texture_cache.h similarity index 90% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_texture_cache.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/sdl/lv_draw_sdl_texture_cache.h index dc8b578..3a799f5 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_texture_cache.h +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/sdl/lv_draw_sdl_texture_cache.h @@ -50,6 +50,7 @@ typedef enum { LV_GPU_CACHE_KEY_MAGIC_RECT_BG = 0x31, LV_GPU_CACHE_KEY_MAGIC_RECT_SHADOW = 0x32, LV_GPU_CACHE_KEY_MAGIC_RECT_BORDER = 0x33, + LV_GPU_CACHE_KEY_MAGIC_RECT_GRAD = 0x34, LV_GPU_CACHE_KEY_MAGIC_FONT_GLYPH = 0x41, LV_GPU_CACHE_KEY_MAGIC_MASK = 0x51, } lv_sdl_cache_key_magic_t; @@ -81,9 +82,15 @@ SDL_Texture * lv_draw_sdl_texture_cache_get(lv_draw_sdl_ctx_t * ctx, const void SDL_Texture * lv_draw_sdl_texture_cache_get_with_userdata(lv_draw_sdl_ctx_t * ctx, const void * key, size_t key_length, bool * found, void ** userdata); -void lv_draw_sdl_texture_cache_put(lv_draw_sdl_ctx_t * ctx, const void * key, size_t key_length, SDL_Texture * texture); +/** + * @return Whether the texture has been put in the cache + */ +bool lv_draw_sdl_texture_cache_put(lv_draw_sdl_ctx_t * ctx, const void * key, size_t key_length, SDL_Texture * texture); -void lv_draw_sdl_texture_cache_put_advanced(lv_draw_sdl_ctx_t * ctx, const void * key, size_t key_length, +/** + * @return Whether the texture has been put in the cache + */ +bool lv_draw_sdl_texture_cache_put_advanced(lv_draw_sdl_ctx_t * ctx, const void * key, size_t key_length, SDL_Texture * texture, void * userdata, void userdata_free(void *), lv_draw_sdl_cache_flag_t flags); diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_utils.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/sdl/lv_draw_sdl_utils.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_utils.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/sdl/lv_draw_sdl_utils.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_utils.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/sdl/lv_draw_sdl_utils.h similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_utils.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/sdl/lv_draw_sdl_utils.h diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/stm32_dma2d/lv_draw_stm32_dma2d.mk b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/stm32_dma2d/lv_draw_stm32_dma2d.mk similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/stm32_dma2d/lv_draw_stm32_dma2d.mk rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/stm32_dma2d/lv_draw_stm32_dma2d.mk diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/stm32_dma2d/lv_gpu_stm32_dma2d.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/stm32_dma2d/lv_gpu_stm32_dma2d.c new file mode 100644 index 0000000..458561d --- /dev/null +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/stm32_dma2d/lv_gpu_stm32_dma2d.c @@ -0,0 +1,773 @@ +/** + * @file lv_gpu_stm32_dma2d.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_gpu_stm32_dma2d.h" +#include "../../core/lv_refr.h" + +#if LV_USE_GPU_STM32_DMA2D + +/********************* + * DEFINES + *********************/ +#if LV_COLOR_16_SWAP + // Note: DMA2D red/blue swap (RBS) works for all color modes + #define RBS_BIT 1U +#else + #define RBS_BIT 0U +#endif + +#define CACHE_ROW_SIZE 32U // cache row size in Bytes + +// For code/implementation discussion refer to https://github.com/lvgl/lvgl/issues/3714#issuecomment-1365187036 +// astyle --options=lvgl/scripts/code-format.cfg --ignore-exclude-errors lvgl/src/draw/stm32_dma2d/*.c lvgl/src/draw/stm32_dma2d/*.h + +#if LV_COLOR_DEPTH == 16 + const dma2d_color_format_t LvglColorFormat = RGB565; +#elif LV_COLOR_DEPTH == 32 + const dma2d_color_format_t LvglColorFormat = ARGB8888; +#else + #error "Cannot use DMA2D with LV_COLOR_DEPTH other than 16 or 32" +#endif + +#if defined (LV_STM32_DMA2D_USE_M7_CACHE) + // Cortex-M7 DCache present + #define __lv_gpu_stm32_dma2d_clean_cache(address, offset, width, height, pixel_size) _lv_gpu_stm32_dma2d_clean_cache(address, offset, width, height, pixel_size) + #define __lv_gpu_stm32_dma2d_invalidate_cache(address, offset, width, height, pixel_size) _lv_gpu_stm32_dma2d_invalidate_cache(address, offset, width, height, pixel_size) +#else + #define __lv_gpu_stm32_dma2d_clean_cache(address, offset, width, height, pixel_size) + #define __lv_gpu_stm32_dma2d_invalidate_cache(address, offset, width, height, pixel_size) +#endif + +/********************** + * STATIC PROTOTYPES + **********************/ +static void lv_draw_stm32_dma2d_blend(lv_draw_ctx_t * draw_ctx, const lv_draw_sw_blend_dsc_t * dsc); +static void lv_draw_stm32_dma2d_buffer_copy(lv_draw_ctx_t * draw_ctx, + void * dest_buf, lv_coord_t dest_stride, const lv_area_t * dest_area, + void * src_buf, lv_coord_t src_stride, const lv_area_t * src_area); +static void lv_draw_stm32_dma2d_img_decoded(lv_draw_ctx_t * draw_ctx, const lv_draw_img_dsc_t * img_dsc, + const lv_area_t * coords, const uint8_t * src_buf, lv_img_cf_t color_format); +static dma2d_color_format_t lv_color_format_to_dma2d_color_format(lv_img_cf_t color_format); +static lv_point_t lv_area_get_offset(const lv_area_t * area1, const lv_area_t * area2); + +lv_res_t lv_draw_stm32_dma2d_img(lv_draw_ctx_t * draw_ctx, const lv_draw_img_dsc_t * img_dsc, + const lv_area_t * src_area, const void * src); +LV_STM32_DMA2D_STATIC void _lv_draw_stm32_dma2d_blend_fill(const lv_color_t * dst_buf, lv_coord_t dst_stride, + const lv_area_t * draw_area, lv_color_t color, lv_opa_t opa); +LV_STM32_DMA2D_STATIC void _lv_draw_stm32_dma2d_blend_map(const lv_color_t * dest_buf, lv_coord_t dest_stride, + const lv_area_t * draw_area, const void * src_buf, lv_coord_t src_stride, const lv_point_t * src_offset, lv_opa_t opa, + dma2d_color_format_t src_color_format, bool ignore_src_alpha); +LV_STM32_DMA2D_STATIC void _lv_draw_stm32_dma2d_blend_paint(const lv_color_t * dst_buf, lv_coord_t dst_stride, + const lv_area_t * draw_area, const lv_opa_t * mask_buf, lv_coord_t mask_stride, const lv_point_t * mask_offset, + lv_color_t color, lv_opa_t opa); +LV_STM32_DMA2D_STATIC void _lv_gpu_stm32_dma2d_await_dma_transfer_finish(lv_disp_drv_t * disp_drv); +LV_STM32_DMA2D_STATIC void _lv_gpu_stm32_dma2d_start_dma_transfer(void); + +#if defined(LV_STM32_DMA2D_TEST) + LV_STM32_DMA2D_STATIC bool _lv_gpu_stm32_dwt_init(void); + LV_STM32_DMA2D_STATIC void _lv_gpu_stm32_dwt_reset(void); + LV_STM32_DMA2D_STATIC uint32_t _lv_gpu_stm32_dwt_get_us(void); +#endif + +static bool isDma2dInProgess = false; // indicates whether DMA2D transfer *initiated here* is in progress + +/** + * Turn on the peripheral and set output color mode, this only needs to be done once + */ +void lv_draw_stm32_dma2d_init(void) +{ + // Enable DMA2D clock +#if defined(STM32F4) || defined(STM32F7) || defined(STM32U5) + RCC->AHB1ENR |= RCC_AHB1ENR_DMA2DEN; // enable DMA2D + // wait for hardware access to complete + __asm volatile("DSB\n"); + volatile uint32_t temp = RCC->AHB1ENR; + LV_UNUSED(temp); +#elif defined(STM32H7) + RCC->AHB3ENR |= RCC_AHB3ENR_DMA2DEN; + // wait for hardware access to complete + __asm volatile("DSB\n"); + volatile uint32_t temp = RCC->AHB3ENR; + LV_UNUSED(temp); +#else +# warning "LVGL can't enable the clock of DMA2D" +#endif + // AHB master timer configuration + DMA2D->AMTCR = 0; // AHB bus guaranteed dead time disabled +#if defined(LV_STM32_DMA2D_TEST) + _lv_gpu_stm32_dwt_init(); // init µs timer +#endif +} + +void lv_draw_stm32_dma2d_ctx_init(lv_disp_drv_t * drv, lv_draw_ctx_t * draw_ctx) +{ + lv_draw_sw_init_ctx(drv, draw_ctx); + + lv_draw_stm32_dma2d_ctx_t * dma2d_draw_ctx = (lv_draw_sw_ctx_t *)draw_ctx; + + dma2d_draw_ctx->blend = lv_draw_stm32_dma2d_blend; + dma2d_draw_ctx->base_draw.draw_img_decoded = lv_draw_stm32_dma2d_img_decoded; + //dma2d_draw_ctx->base_draw.draw_img = lv_draw_stm32_dma2d_img; + dma2d_draw_ctx->base_draw.buffer_copy = lv_draw_stm32_dma2d_buffer_copy; +} + +void lv_draw_stm32_dma2d_ctx_deinit(lv_disp_drv_t * drv, lv_draw_ctx_t * draw_ctx) +{ + LV_UNUSED(drv); + LV_UNUSED(draw_ctx); +} + +static void lv_draw_stm32_dma2d_blend(lv_draw_ctx_t * draw_ctx, const lv_draw_sw_blend_dsc_t * dsc) +{ + if(dsc->blend_mode != LV_BLEND_MODE_NORMAL) { + lv_draw_sw_blend_basic(draw_ctx, dsc); + return; + } + // Note: x1 must be zero. Otherwise, there is no way to correctly calculate dest_stride. + //LV_ASSERT_MSG(draw_ctx->buf_area->x1 == 0); // critical? + // Both draw buffer start address and buffer size *must* be 32-byte aligned since draw buffer cache is being invalidated. + //uint32_t drawBufferLength = lv_area_get_size(draw_ctx->buf_area) * sizeof(lv_color_t); + //LV_ASSERT_MSG(drawBufferLength % CACHE_ROW_SIZE == 0); // critical, but this is not the way to test it + //LV_ASSERT_MSG((uint32_t)draw_ctx->buf % CACHE_ROW_SIZE == 0, "draw_ctx.buf is not 32B aligned"); // critical? + + if(dsc->src_buf) { + // For performance reasons, both source buffer start address and buffer size *should* be 32-byte aligned since source buffer cache is being cleaned. + //uint32_t srcBufferLength = lv_area_get_size(dsc->blend_area) * sizeof(lv_color_t); + //LV_ASSERT_MSG(srcBufferLength % CACHE_ROW_SIZE == 0); // FIXME: assert fails (performance, non-critical) + //LV_ASSERT_MSG((uint32_t)dsc->src_buf % CACHE_ROW_SIZE == 0); // FIXME: assert fails (performance, non-critical) + } + + lv_area_t draw_area; + if(!_lv_area_intersect(&draw_area, dsc->blend_area, draw_ctx->clip_area)) return; + // + draw_ctx->buf_area has the entire draw buffer location + // + draw_ctx->clip_area has the current draw buffer location + // + dsc->blend_area has the location of the area intended to be painted - image etc. + // + draw_area has the area actually being painted + // All coordinates are relative to the screen. + + const lv_opa_t * mask = dsc->mask_buf; + + if(dsc->mask_buf && dsc->mask_res == LV_DRAW_MASK_RES_TRANSP) return; + else if(dsc->mask_res == LV_DRAW_MASK_RES_FULL_COVER) mask = NULL; + + lv_coord_t dest_stride = lv_area_get_width(draw_ctx->buf_area); + if(mask != NULL) { + // For performance reasons, both mask buffer start address and buffer size *should* be 32-byte aligned since mask buffer cache is being cleaned. + //uint32_t srcBufferLength = lv_area_get_size(dsc->mask_area) * sizeof(lv_opa_t); + //LV_ASSERT_MSG(srcBufferLength % CACHE_ROW_SIZE == 0); // FIXME: assert fails (performance, non-critical) + //LV_ASSERT_MSG((uint32_t)mask % CACHE_ROW_SIZE == 0); // FIXME: assert fails (performance, non-critical) + + lv_coord_t mask_stride = lv_area_get_width(dsc->mask_area); + lv_point_t mask_offset = lv_area_get_offset(dsc->mask_area, &draw_area); // mask offset in relation to draw_area + + if(dsc->src_buf == NULL) { // 93.5% + lv_area_move(&draw_area, -draw_ctx->buf_area->x1, -draw_ctx->buf_area->y1); + _lv_draw_stm32_dma2d_blend_paint(draw_ctx->buf, dest_stride, &draw_area, mask, mask_stride, &mask_offset, dsc->color, + dsc->opa); + } + else { // 0.2% + // note: (x)RGB dsc->src_buf does not carry alpha channel bytes, + // alpha channel bytes are carried in dsc->mask_buf +#if LV_COLOR_DEPTH == 32 + lv_coord_t src_stride = lv_area_get_width(dsc->blend_area); + lv_point_t src_offset = lv_area_get_offset(dsc->blend_area, &draw_area); // source image offset in relation to draw_area + lv_coord_t draw_width = lv_area_get_width(&draw_area); + lv_coord_t draw_height = lv_area_get_height(&draw_area); + + // merge mask alpha bytes with src RGB bytes + // TODO: optimize by reading 4 or 8 mask bytes at a time + mask += (mask_stride * mask_offset.y) + mask_offset.x; + lv_color_t * src_buf = (lv_color_t *)dsc->src_buf; + src_buf += (src_stride * src_offset.y) + src_offset.x; + uint16_t mask_buffer_offset = mask_stride - draw_width; + uint16_t src_buffer_offset = src_stride - draw_width; + while(draw_height > 0) { + draw_height--; + for(uint16_t x = 0; x < draw_width; x++) { + (*src_buf).ch.alpha = *mask; + src_buf++; + mask++; + } + mask += mask_buffer_offset; + src_buf += src_buffer_offset; + } + + lv_area_move(&draw_area, -draw_ctx->buf_area->x1, + -draw_ctx->buf_area->y1); // translate the screen draw area to the origin of the buffer area + _lv_draw_stm32_dma2d_blend_map(draw_ctx->buf, dest_stride, &draw_area, dsc->src_buf, src_stride, &src_offset, dsc->opa, + ARGB8888, false); +#else + // Note: 16-bit bitmap hardware blending with mask and background is possible, but requires a temp 24 or 32-bit buffer to combine bitmap with mask first. + + lv_draw_sw_blend_basic(draw_ctx, dsc); // (e.g. Shop Items) + // clean cache after software drawing - this does not help since this is not the only place where buffer is written without dma2d + // lv_coord_t draw_width = lv_area_get_width(&draw_area); + // lv_coord_t draw_height = lv_area_get_height(&draw_area); + // uint32_t dest_address = (uint32_t)(draw_ctx->buf + (dest_stride * draw_area.y1) + draw_area.x1); + // __lv_gpu_stm32_dma2d_clean_cache(dest_address, dest_stride - draw_width, draw_width, draw_height, sizeof(lv_color_t)); +#endif + } + } + else { + if(dsc->src_buf == NULL) { // 6.1% + lv_area_move(&draw_area, -draw_ctx->buf_area->x1, + -draw_ctx->buf_area->y1); // translate the screen draw area to the origin of the buffer area + _lv_draw_stm32_dma2d_blend_fill(draw_ctx->buf, dest_stride, &draw_area, dsc->color, dsc->opa); + } + else { // 0.2% + lv_coord_t src_stride = lv_area_get_width(dsc->blend_area); + lv_point_t src_offset = lv_area_get_offset(dsc->blend_area, &draw_area); // source image offset in relation to draw_area + lv_area_move(&draw_area, -draw_ctx->buf_area->x1, + -draw_ctx->buf_area->y1); // translate the screen draw area to the origin of the buffer area + _lv_draw_stm32_dma2d_blend_map(draw_ctx->buf, dest_stride, &draw_area, dsc->src_buf, src_stride, &src_offset, dsc->opa, + LvglColorFormat, true); + } + } +} + +// Does dest_area = intersect(draw_ctx->clip_area, src_area) ? +// See: https://github.com/lvgl/lvgl/issues/3714#issuecomment-1331710788 +static void lv_draw_stm32_dma2d_buffer_copy(lv_draw_ctx_t * draw_ctx, void * dest_buf, lv_coord_t dest_stride, + const lv_area_t * dest_area, void * src_buf, lv_coord_t src_stride, const lv_area_t * src_area) +{ + // Both draw buffer start address and buffer size *must* be 32-byte aligned since draw buffer cache is being invalidated. + //uint32_t drawBufferLength = lv_area_get_size(draw_ctx->buf_area) * sizeof(lv_color_t); + //LV_ASSERT_MSG(drawBufferLength % CACHE_ROW_SIZE == 0); // critical, but this is not the way to test it + //LV_ASSERT_MSG((uint32_t)draw_ctx->buf % CACHE_ROW_SIZE == 0, "draw_ctx.buf is not 32B aligned"); // critical? + // FIXME: + // 1. Both src_buf and dest_buf pixel size *must* be known to use DMA2D. + // 2. Verify both buffers start addresses and lengths are 32-byte (cache row size) aligned. + LV_UNUSED(draw_ctx); + lv_point_t src_offset = lv_area_get_offset(src_area, dest_area); + // FIXME: use lv_area_move(dest_area, -dest_area->x1, -dest_area->y1) here ? + // TODO: It is assumed that dest_buf and src_buf buffers are of lv_color_t type. Verify it, this assumption may be incorrect. + _lv_draw_stm32_dma2d_blend_map((const lv_color_t *)dest_buf, dest_stride, dest_area, (const lv_color_t *)src_buf, + src_stride, &src_offset, 0xff, LvglColorFormat, true); + // TODO: Investigate if output buffer cache needs to be invalidated. It depends on what the destination buffer is and how it is used next - by dma2d or not. + _lv_gpu_stm32_dma2d_await_dma_transfer_finish(NULL); // TODO: is this line needed here? +} + +static void lv_draw_stm32_dma2d_img_decoded(lv_draw_ctx_t * draw_ctx, const lv_draw_img_dsc_t * img_dsc, + const lv_area_t * coords, const uint8_t * src_buf, lv_img_cf_t color_format) +{ + if(draw_ctx->draw_img_decoded == NULL) return; + lv_area_t draw_area; + lv_area_copy(&draw_area, draw_ctx->clip_area); + + bool mask_any = lv_draw_mask_is_any(&draw_area); + bool transform = img_dsc->angle != 0 || img_dsc->zoom != LV_IMG_ZOOM_NONE; + const dma2d_color_format_t bitmapColorFormat = lv_color_format_to_dma2d_color_format(color_format); + const bool ignoreBitmapAlpha = (color_format == LV_IMG_CF_RGBX8888); + + if(!mask_any && !transform && bitmapColorFormat != UNSUPPORTED && img_dsc->recolor_opa == LV_OPA_TRANSP) { + // simple bitmap blending, optionally with supported color format conversion - handle directly by dma2d + lv_coord_t dest_stride = lv_area_get_width(draw_ctx->buf_area); + lv_coord_t src_stride = lv_area_get_width(coords); + lv_point_t src_offset = lv_area_get_offset(coords, &draw_area); // source image offset in relation to draw_area + lv_area_move(&draw_area, -draw_ctx->buf_area->x1, -draw_ctx->buf_area->y1); + _lv_draw_stm32_dma2d_blend_map(draw_ctx->buf, dest_stride, &draw_area, src_buf, src_stride, &src_offset, + img_dsc->opa, bitmapColorFormat, ignoreBitmapAlpha); + } + else { + // all more complex cases which require additional image transformations + lv_draw_sw_img_decoded(draw_ctx, img_dsc, coords, src_buf, color_format); + + } +} + +static lv_point_t lv_area_get_offset(const lv_area_t * area1, const lv_area_t * area2) +{ + lv_point_t offset = {x: area2->x1 - area1->x1, y: area2->y1 - area1->y1}; + return offset; +} + +static dma2d_color_format_t lv_color_format_to_dma2d_color_format(lv_img_cf_t color_format) +{ + switch(color_format) { + case LV_IMG_CF_RGBA8888: + // note: LV_IMG_CF_RGBA8888 is actually ARGB8888 + return ARGB8888; + case LV_IMG_CF_RGBX8888: + // note: LV_IMG_CF_RGBX8888 is actually XRGB8888 + return ARGB8888; + case LV_IMG_CF_RGB565: + return RGB565; + case LV_IMG_CF_TRUE_COLOR: + return LvglColorFormat; + case LV_IMG_CF_TRUE_COLOR_ALPHA: +#if LV_COLOR_DEPTH == 16 + // bitmap color format is 24b ARGB8565 - dma2d unsupported + return UNSUPPORTED; +#elif LV_COLOR_DEPTH == 32 + return ARGB8888; +#else + // unknown bitmap color format + return UNSUPPORTED; +#endif + default: + return UNSUPPORTED; + } +} + +lv_res_t lv_draw_stm32_dma2d_img(lv_draw_ctx_t * draw_ctx, const lv_draw_img_dsc_t * img_dsc, + const lv_area_t * src_area, const void * src) +{ + //if(lv_img_src_get_type(src) != LV_IMG_SRC_VARIABLE) return LV_RES_INV; + return LV_RES_INV; + if(img_dsc->opa <= LV_OPA_MIN) return LV_RES_OK; + const lv_img_dsc_t * img = src; + const dma2d_color_format_t bitmapColorFormat = lv_color_format_to_dma2d_color_format(img->header.cf); + const bool ignoreBitmapAlpha = (img->header.cf == LV_IMG_CF_RGBX8888); + + if(bitmapColorFormat == UNSUPPORTED || img_dsc->angle != 0 || img_dsc->zoom != LV_IMG_ZOOM_NONE) { + return LV_RES_INV; // sorry, dma2d can handle this + } + + // FIXME: handle dsc.pivot, dsc.recolor, dsc.blend_mode + // FIXME: src pixel size *must* be known to use DMA2D + // FIXME: If image is drawn by SW, then output cache needs to be cleaned next. Currently it is not possible. + // Both draw buffer start address and buffer size *must* be 32-byte aligned since draw buffer cache is being invalidated. + //uint32_t drawBufferLength = lv_area_get_size(draw_ctx->buf_area) * sizeof(lv_color_t); + //LV_ASSERT_MSG(drawBufferLength % CACHE_ROW_SIZE == 0); // critical, but this is not the way to test it + //LV_ASSERT_MSG((uint32_t)draw_ctx->buf % CACHE_ROW_SIZE == 0, "draw_ctx.buf is not 32B aligned"); // critical? + + // For performance reasons, both source buffer start address and buffer size *should* be 32-byte aligned since source buffer cache is being cleaned. + //uint32_t srcBufferLength = lv_area_get_size(src_area) * sizeof(lv_color_t); // TODO: verify src pixel size = sizeof(lv_color_t) + //LV_ASSERT_MSG(srcBufferLength % CACHE_ROW_SIZE == 0); // FIXME: assert fails (performance, non-critical) + //LV_ASSERT_MSG((uint32_t)src % CACHE_ROW_SIZE == 0); // FIXME: assert fails (performance, non-critical) + + lv_area_t draw_area; + if(!_lv_area_intersect(&draw_area, src_area, draw_ctx->clip_area)) return LV_RES_OK; + + lv_coord_t dest_stride = lv_area_get_width(draw_ctx->buf_area); + lv_point_t src_offset = lv_area_get_offset(src_area, &draw_area); // source image offset in relation to draw_area + lv_area_move(&draw_area, -draw_ctx->buf_area->x1, -draw_ctx->buf_area->y1); + _lv_draw_stm32_dma2d_blend_map(draw_ctx->buf, dest_stride, &draw_area, img->data, img->header.w, + &src_offset, img_dsc->opa, bitmapColorFormat, ignoreBitmapAlpha); + return LV_RES_OK; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +/** + * @brief Fills draw_area with specified color. + * @param color color to be painted, note: alpha is ignored + */ +LV_STM32_DMA2D_STATIC void _lv_draw_stm32_dma2d_blend_fill(const lv_color_t * dest_buf, lv_coord_t dest_stride, + const lv_area_t * draw_area, lv_color_t color, lv_opa_t opa) +{ + LV_ASSERT_MSG(!isDma2dInProgess, "dma2d transfer has not finished"); // critical + lv_coord_t draw_width = lv_area_get_width(draw_area); + lv_coord_t draw_height = lv_area_get_height(draw_area); + + _lv_gpu_stm32_dma2d_await_dma_transfer_finish(NULL); + + if(opa >= LV_OPA_MAX) { + DMA2D->CR = 0x3UL << DMA2D_CR_MODE_Pos; // Register-to-memory (no FG nor BG, only output stage active) + + DMA2D->OPFCCR = LvglColorFormat; +#if defined(DMA2D_OPFCCR_RBS_Pos) + DMA2D->OPFCCR |= (RBS_BIT << DMA2D_OPFCCR_RBS_Pos); +#endif + DMA2D->OMAR = (uint32_t)(dest_buf + (dest_stride * draw_area->y1) + draw_area->x1); + DMA2D->OOR = dest_stride - draw_width; // out buffer offset + // Note: unlike FGCOLR and BGCOLR, OCOLR bits must match DMA2D_OUTPUT_COLOR, alpha can be specified +#if RBS_BIT + // swap red/blue bits + DMA2D->OCOLR = (color.ch.blue << 11) | (color.ch.green_l << 5 | color.ch.green_h << 8) | (color.ch.red); +#else + DMA2D->OCOLR = color.full; +#endif + } + else { + DMA2D->CR = 0x2UL << DMA2D_CR_MODE_Pos; // Memory-to-memory with blending (FG and BG fetch with PFC and blending) + + DMA2D->FGPFCCR = A8; + DMA2D->FGPFCCR |= (opa << DMA2D_FGPFCCR_ALPHA_Pos); + // Alpha Mode 1: Replace original foreground image alpha channel value by FGPFCCR.ALPHA + DMA2D->FGPFCCR |= (0x1UL << DMA2D_FGPFCCR_AM_Pos); + //DMA2D->FGPFCCR |= (RBS_BIT << DMA2D_FGPFCCR_RBS_Pos); + + // Note: in Alpha Mode 1 FGMAR and FGOR are not used to supply foreground A8 bytes, + // those bytes are replaced by constant ALPHA defined in FGPFCCR + DMA2D->FGMAR = (uint32_t)dest_buf; + DMA2D->FGOR = dest_stride; + DMA2D->FGCOLR = lv_color_to32(color) & 0x00ffffff; // swap FGCOLR R/B bits if FGPFCCR.RBS (RBS_BIT) bit is set + + DMA2D->BGPFCCR = LvglColorFormat; +#if defined(DMA2D_BGPFCCR_RBS_Pos) + DMA2D->BGPFCCR |= (RBS_BIT << DMA2D_BGPFCCR_RBS_Pos); +#endif + DMA2D->BGMAR = (uint32_t)(dest_buf + (dest_stride * draw_area->y1) + draw_area->x1); + DMA2D->BGOR = dest_stride - draw_width; + DMA2D->BGCOLR = 0; // used in A4 and A8 modes only + __lv_gpu_stm32_dma2d_clean_cache(DMA2D->BGMAR, DMA2D->BGOR, draw_width, draw_height, sizeof(lv_color_t)); + + DMA2D->OPFCCR = LvglColorFormat; +#if defined(DMA2D_OPFCCR_RBS_Pos) + DMA2D->OPFCCR |= (RBS_BIT << DMA2D_OPFCCR_RBS_Pos); +#endif + DMA2D->OMAR = DMA2D->BGMAR; + DMA2D->OOR = DMA2D->BGOR; + DMA2D->OCOLR = 0; + } + // PL - pixel per lines (14 bit), NL - number of lines (16 bit) + DMA2D->NLR = (draw_width << DMA2D_NLR_PL_Pos) | (draw_height << DMA2D_NLR_NL_Pos); + + _lv_gpu_stm32_dma2d_start_dma_transfer(); +} + +/** + * @brief Draws src (foreground) map on dst (background) map. + * @param src_offset src offset in relation to dst, useful when src is larger than draw_area + * @param opa constant opacity to be applied + * @param bitmapColorCode bitmap color type + * @param ignoreAlpha if TRUE, bitmap src alpha channel is ignored + */ +LV_STM32_DMA2D_STATIC void _lv_draw_stm32_dma2d_blend_map(const lv_color_t * dest_buf, lv_coord_t dest_stride, + const lv_area_t * draw_area, const void * src_buf, lv_coord_t src_stride, const lv_point_t * src_offset, lv_opa_t opa, + dma2d_color_format_t src_color_format, bool ignore_src_alpha) +{ + LV_ASSERT_MSG(!isDma2dInProgess, "dma2d transfer has not finished"); // critical + if(opa <= LV_OPA_MIN || src_color_format == UNSUPPORTED) return; + lv_coord_t draw_width = lv_area_get_width(draw_area); + lv_coord_t draw_height = lv_area_get_height(draw_area); + bool bitmapHasOpacity = !ignore_src_alpha && (src_color_format == ARGB8888 || src_color_format == ARGB1555 || + src_color_format == ARGB4444); + + if(opa >= LV_OPA_MAX) opa = 0xff; + + uint8_t srcBpp; // source bytes per pixel + switch(src_color_format) { + case ARGB8888: + srcBpp = 4; + break; + case RGB888: + srcBpp = 3; + break; + case RGB565: + case ARGB1555: + case ARGB4444: + srcBpp = 2; + break; + default: + LV_LOG_ERROR("unsupported color format"); + return; + } + + _lv_gpu_stm32_dma2d_await_dma_transfer_finish(NULL); + + DMA2D->FGPFCCR = src_color_format; + + if(opa == 0xff && !bitmapHasOpacity) { + // no need to blend + if(src_color_format == LvglColorFormat) { + // no need to convert pixel format (PFC) either + DMA2D->CR = 0x0UL; + } + else { + DMA2D->CR = 0x1UL << DMA2D_CR_MODE_Pos; // Memory-to-memory with PFC (FG fetch only with FG PFC active) + } + // Alpha Mode 0: No modification of the foreground image alpha channel value + } + else { + // blend + DMA2D->CR = 0x2UL << DMA2D_CR_MODE_Pos; // Memory-to-memory with blending (FG and BG fetch with PFC and blending) + DMA2D->FGPFCCR |= (opa << DMA2D_FGPFCCR_ALPHA_Pos); + if(bitmapHasOpacity) { + // Alpha Mode 2: Replace original foreground image alpha channel value by FGPFCCR.ALPHA multiplied with original alpha channel value + DMA2D->FGPFCCR |= (0x2UL << DMA2D_FGPFCCR_AM_Pos); + } + else { + // Alpha Mode 1: Replace original foreground image alpha channel value by FGPFCCR.ALPHA + DMA2D->FGPFCCR |= (0x1UL << DMA2D_FGPFCCR_AM_Pos); + } + } +#if defined(DMA2D_FGPFCCR_RBS_Pos) + DMA2D->FGPFCCR |= (RBS_BIT << DMA2D_FGPFCCR_RBS_Pos); +#endif + DMA2D->FGMAR = ((uint32_t)src_buf) + srcBpp * ((src_stride * src_offset->y) + src_offset->x); + DMA2D->FGOR = src_stride - draw_width; + DMA2D->FGCOLR = 0; // used in A4 and A8 modes only + __lv_gpu_stm32_dma2d_clean_cache(DMA2D->FGMAR, DMA2D->FGOR, draw_width, draw_height, srcBpp); + + DMA2D->OPFCCR = LvglColorFormat; +#if defined(DMA2D_OPFCCR_RBS_Pos) + DMA2D->OPFCCR |= (RBS_BIT << DMA2D_OPFCCR_RBS_Pos); +#endif + DMA2D->OMAR = (uint32_t)(dest_buf + (dest_stride * draw_area->y1) + draw_area->x1); + DMA2D->OOR = dest_stride - draw_width; + DMA2D->OCOLR = 0; + + if(opa != 0xff || bitmapHasOpacity) { + // use background (BG*) registers + DMA2D->BGPFCCR = LvglColorFormat; +#if defined(DMA2D_BGPFCCR_RBS_Pos) + DMA2D->BGPFCCR |= (RBS_BIT << DMA2D_BGPFCCR_RBS_Pos); +#endif + DMA2D->BGMAR = DMA2D->OMAR; + DMA2D->BGOR = DMA2D->OOR; + DMA2D->BGCOLR = 0; // used in A4 and A8 modes only + __lv_gpu_stm32_dma2d_clean_cache(DMA2D->BGMAR, DMA2D->BGOR, draw_width, draw_height, sizeof(lv_color_t)); + } + + // PL - pixel per lines (14 bit), NL - number of lines (16 bit) + DMA2D->NLR = (draw_width << DMA2D_NLR_PL_Pos) | (draw_height << DMA2D_NLR_NL_Pos); + + _lv_gpu_stm32_dma2d_start_dma_transfer(); +} + +/** + * @brief Paints solid color with alpha mask with additional constant opacity. Useful e.g. for painting anti-aliased fonts. + * @param src_offset src offset in relation to dst, useful when src (alpha mask) is larger than draw_area + * @param color color to paint, note: alpha is ignored + * @param opa constant opacity to be applied + */ +LV_STM32_DMA2D_STATIC void _lv_draw_stm32_dma2d_blend_paint(const lv_color_t * dest_buf, lv_coord_t dest_stride, + const lv_area_t * draw_area, const lv_opa_t * mask_buf, lv_coord_t mask_stride, const lv_point_t * mask_offset, + lv_color_t color, lv_opa_t opa) +{ + LV_ASSERT_MSG(!isDma2dInProgess, "dma2d transfer has not finished"); // critical + lv_coord_t draw_width = lv_area_get_width(draw_area); + lv_coord_t draw_height = lv_area_get_height(draw_area); + + _lv_gpu_stm32_dma2d_await_dma_transfer_finish(NULL); + + DMA2D->CR = 0x2UL << DMA2D_CR_MODE_Pos; // Memory-to-memory with blending (FG and BG fetch with PFC and blending) + + DMA2D->FGPFCCR = A8; + if(opa < LV_OPA_MAX) { + DMA2D->FGPFCCR |= (opa << DMA2D_FGPFCCR_ALPHA_Pos); + DMA2D->FGPFCCR |= (0x2UL << + DMA2D_FGPFCCR_AM_Pos); // Alpha Mode: Replace original foreground image alpha channel value by FGPFCCR.ALPHA multiplied with original alpha channel value + } + //DMA2D->FGPFCCR |= (RBS_BIT << DMA2D_FGPFCCR_RBS_Pos); + DMA2D->FGMAR = (uint32_t)(mask_buf + (mask_stride * mask_offset->y) + mask_offset->x); + DMA2D->FGOR = mask_stride - draw_width; + DMA2D->FGCOLR = lv_color_to32(color) & 0x00ffffff; // swap FGCOLR R/B bits if FGPFCCR.RBS (RBS_BIT) bit is set + __lv_gpu_stm32_dma2d_clean_cache(DMA2D->FGMAR, DMA2D->FGOR, draw_width, draw_height, sizeof(lv_opa_t)); + + DMA2D->BGPFCCR = LvglColorFormat; +#if defined(DMA2D_BGPFCCR_RBS_Pos) + DMA2D->BGPFCCR |= (RBS_BIT << DMA2D_BGPFCCR_RBS_Pos); +#endif + DMA2D->BGMAR = (uint32_t)(dest_buf + (dest_stride * draw_area->y1) + draw_area->x1); + DMA2D->BGOR = dest_stride - draw_width; + DMA2D->BGCOLR = 0; // used in A4 and A8 modes only + __lv_gpu_stm32_dma2d_clean_cache(DMA2D->BGMAR, DMA2D->BGOR, draw_width, draw_height, sizeof(lv_color_t)); + + DMA2D->OPFCCR = LvglColorFormat; +#if defined(DMA2D_OPFCCR_RBS_Pos) + DMA2D->OPFCCR |= (RBS_BIT << DMA2D_OPFCCR_RBS_Pos); +#endif + DMA2D->OMAR = DMA2D->BGMAR; + DMA2D->OOR = DMA2D->BGOR; + DMA2D->OCOLR = 0; + // PL - pixel per lines (14 bit), NL - number of lines (16 bit) + DMA2D->NLR = (draw_width << DMA2D_NLR_PL_Pos) | (draw_height << DMA2D_NLR_NL_Pos); + + _lv_gpu_stm32_dma2d_start_dma_transfer(); +} + +/** + * @brief Copies src (foreground) map to the dst (background) map. + * @param src_offset src offset in relation to dst, useful when src is larger than draw_area + */ +void _lv_draw_stm32_dma2d_copy_buffer(const lv_color_t * dest_buf, lv_coord_t dest_stride, + const lv_area_t * draw_area, const lv_color_t * src_buf, lv_coord_t src_stride, const lv_point_t * src_offset) +{ + LV_ASSERT_MSG(!isDma2dInProgess, "dma2d transfer has not finished"); // critical + lv_coord_t draw_width = lv_area_get_width(draw_area); + lv_coord_t draw_height = lv_area_get_height(draw_area); + + _lv_gpu_stm32_dma2d_await_dma_transfer_finish(NULL); + + DMA2D->CR = 0x0UL; // Memory-to-memory (FG fetch only) + + DMA2D->FGPFCCR = LvglColorFormat; +#if defined(DMA2D_FGPFCCR_RBS_Pos) + DMA2D->FGPFCCR |= (RBS_BIT << DMA2D_FGPFCCR_RBS_Pos); +#endif + DMA2D->FGMAR = (uint32_t)(src_buf + (src_stride * src_offset->y) + src_offset->x); + DMA2D->FGOR = src_stride - draw_width; + DMA2D->FGCOLR = 0; // used in A4 and A8 modes only + __lv_gpu_stm32_dma2d_clean_cache(DMA2D->FGMAR, DMA2D->FGOR, draw_width, draw_height, sizeof(lv_color_t)); + + // Note BG* registers do not need to be set up since BG is not used + + DMA2D->OPFCCR = LvglColorFormat; +#if defined(DMA2D_OPFCCR_RBS_Pos) + DMA2D->OPFCCR |= (RBS_BIT << DMA2D_OPFCCR_RBS_Pos); +#endif + DMA2D->OMAR = (uint32_t)(dest_buf + (dest_stride * draw_area->y1) + draw_area->x1); + DMA2D->OOR = dest_stride - draw_width; + DMA2D->OCOLR = 0; + + // PL - pixel per lines (14 bit), NL - number of lines (16 bit) + DMA2D->NLR = (draw_width << DMA2D_NLR_PL_Pos) | (draw_height << DMA2D_NLR_NL_Pos); + + _lv_gpu_stm32_dma2d_start_dma_transfer(); +} + +LV_STM32_DMA2D_STATIC void _lv_gpu_stm32_dma2d_start_dma_transfer(void) +{ + LV_ASSERT_MSG(!isDma2dInProgess, "dma2d transfer has not finished"); + isDma2dInProgess = true; + DMA2D->IFCR = 0x3FU; // trigger ISR flags reset + // Note: cleaning output buffer cache is needed only when buffer may be misaligned or adjacent area may have been drawn in sw-fashion, e.g. using lv_draw_sw_blend_basic() +#if LV_COLOR_DEPTH == 16 + __lv_gpu_stm32_dma2d_clean_cache(DMA2D->OMAR, DMA2D->OOR, (DMA2D->NLR & DMA2D_NLR_PL_Msk) >> DMA2D_NLR_PL_Pos, + (DMA2D->NLR & DMA2D_NLR_NL_Msk) >> DMA2D_NLR_NL_Pos, sizeof(lv_color_t)); +#endif + DMA2D->CR |= DMA2D_CR_START; + // Note: for some reason mask buffer gets damaged during transfer if waiting is postponed + _lv_gpu_stm32_dma2d_await_dma_transfer_finish(NULL); // FIXME: this line should not be needed here, but it is +} + +LV_STM32_DMA2D_STATIC void _lv_gpu_stm32_dma2d_await_dma_transfer_finish(lv_disp_drv_t * disp_drv) +{ + if(disp_drv && disp_drv->wait_cb) { + while((DMA2D->CR & DMA2D_CR_START) != 0U) { + disp_drv->wait_cb(disp_drv); + } + } + else { + while((DMA2D->CR & DMA2D_CR_START) != 0U); + } + + __IO uint32_t isrFlags = DMA2D->ISR; + + if(isrFlags & DMA2D_ISR_CEIF) { + LV_LOG_ERROR("DMA2D config error"); + } + + if(isrFlags & DMA2D_ISR_TEIF) { + LV_LOG_ERROR("DMA2D transfer error"); + } + + DMA2D->IFCR = 0x3FU; // trigger ISR flags reset + + if(isDma2dInProgess) { + // invalidate output buffer cached memory ONLY after DMA2D transfer + //__lv_gpu_stm32_dma2d_invalidate_cache(DMA2D->OMAR, DMA2D->OOR, (DMA2D->NLR & DMA2D_NLR_PL_Msk) >> DMA2D_NLR_PL_Pos, (DMA2D->NLR & DMA2D_NLR_NL_Msk) >> DMA2D_NLR_NL_Pos, sizeof(lv_color_t)); + isDma2dInProgess = false; + } +} + +#if defined (LV_STM32_DMA2D_USE_M7_CACHE) +// Cortex-M7 DCache present +void _lv_gpu_stm32_dma2d_invalidate_cache(uint32_t address, lv_coord_t offset, lv_coord_t width, + lv_coord_t height, uint8_t pixel_size) +{ + if(((SCB->CCR) & SCB_CCR_DC_Msk) == 0) return; // L1 data cache is disabled + uint16_t stride = pixel_size * (width + offset); // in bytes + uint16_t ll = pixel_size * width; // line length in bytes + uint32_t n = 0; // address of the next cache row after the last invalidated row + lv_coord_t h = 0; + + __DSB(); + + while(h < height) { + uint32_t a = address + (h * stride); + uint32_t e = a + ll; // end address, address of the first byte after the current line + a &= ~(CACHE_ROW_SIZE - 1U); + if(a < n) a = n; // prevent the previous last cache row from being invalidated again + + while(a < e) { + SCB->DCIMVAC = a; + a += CACHE_ROW_SIZE; + } + + n = a; + h++; + }; + + __DSB(); + __ISB(); +} + +void _lv_gpu_stm32_dma2d_clean_cache(uint32_t address, lv_coord_t offset, lv_coord_t width, + lv_coord_t height, uint8_t pixel_size) +{ + if(((SCB->CCR) & SCB_CCR_DC_Msk) == 0) return; // L1 data cache is disabled + uint16_t stride = pixel_size * (width + offset); // in bytes + uint16_t ll = pixel_size * width; // line length in bytes + uint32_t n = 0; // address of the next cache row after the last cleaned row + lv_coord_t h = 0; + __DSB(); + + while(h < height) { + uint32_t a = address + (h * stride); + uint32_t e = a + ll; // end address, address of the first byte after the current line + a &= ~(CACHE_ROW_SIZE - 1U); + if(a < n) a = n; // prevent the previous last cache row from being cleaned again + + while(a < e) { + SCB->DCCMVAC = a; + a += CACHE_ROW_SIZE; + } + + n = a; + h++; + }; + + __DSB(); + __ISB(); +} +#endif // LV_STM32_DMA2D_USE_M7_CACHE + +#if defined(LV_STM32_DMA2D_TEST) +// initialize µs timer +LV_STM32_DMA2D_STATIC bool _lv_gpu_stm32_dwt_init(void) +{ + // disable TRC + CoreDebug->DEMCR &= ~CoreDebug_DEMCR_TRCENA_Msk; + // enable TRC + CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk; + +#if defined(__CORTEX_M) && (__CORTEX_M == 7U) + DWT->LAR = 0xC5ACCE55; +#endif + // disable clock cycle counter + DWT->CTRL &= ~DWT_CTRL_CYCCNTENA_Msk; + // enable clock cycle counter + DWT->CTRL |= DWT_CTRL_CYCCNTENA_Msk; + + // reset the clock cycle counter value + DWT->CYCCNT = 0; + + // 3 NO OPERATION instructions + __ASM volatile("NOP"); + __ASM volatile("NOP"); + __ASM volatile("NOP"); + + // check if clock cycle counter has started + if(DWT->CYCCNT) { + return true; // clock cycle counter started + } + else { + return false; // clock cycle counter not started + } +} + +// get elapsed µs since reset +LV_STM32_DMA2D_STATIC uint32_t _lv_gpu_stm32_dwt_get_us(void) +{ + uint32_t us = (DWT->CYCCNT * 1000000) / HAL_RCC_GetHCLKFreq(); + return us; +} + +// reset µs timer +LV_STM32_DMA2D_STATIC void _lv_gpu_stm32_dwt_reset(void) +{ + DWT->CYCCNT = 0; +} +#endif // LV_STM32_DMA2D_TEST +#endif // LV_USE_GPU_STM32_DMA2D diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/stm32_dma2d/lv_gpu_stm32_dma2d.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/stm32_dma2d/lv_gpu_stm32_dma2d.h new file mode 100644 index 0000000..42d8256 --- /dev/null +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/stm32_dma2d/lv_gpu_stm32_dma2d.h @@ -0,0 +1,81 @@ +/** + * @file lv_gpu_stm32_dma2d.h + * + */ + +#ifndef LV_GPU_STM32_DMA2D_H +#define LV_GPU_STM32_DMA2D_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "../../misc/lv_color.h" +#include "../../hal/lv_hal_disp.h" +#include "../sw/lv_draw_sw.h" + +#if LV_USE_GPU_STM32_DMA2D + +/********************* + * INCLUDES + *********************/ +#include LV_GPU_DMA2D_CMSIS_INCLUDE + +/********************* + * DEFINES + *********************/ +#if defined(LV_STM32_DMA2D_TEST) +// removes "static" modifier for some internal methods in order to test them +#define LV_STM32_DMA2D_STATIC +#else +#define LV_STM32_DMA2D_STATIC static +#endif + +#if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U) +#define LV_STM32_DMA2D_USE_M7_CACHE +#endif + +/********************** + * TYPEDEFS + **********************/ +enum dma2d_color_format { + ARGB8888 = 0x0, + RGB888 = 0x01, + RGB565 = 0x02, + ARGB1555 = 0x03, + ARGB4444 = 0x04, + A8 = 0x09, + UNSUPPORTED = 0xff, +}; +typedef enum dma2d_color_format dma2d_color_format_t; +typedef lv_draw_sw_ctx_t lv_draw_stm32_dma2d_ctx_t; +struct _lv_disp_drv_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ +void lv_draw_stm32_dma2d_init(void); +void lv_draw_stm32_dma2d_ctx_init(struct _lv_disp_drv_t * drv, lv_draw_ctx_t * draw_ctx); +void lv_draw_stm32_dma2d_ctx_deinit(struct _lv_disp_drv_t * drv, lv_draw_ctx_t * draw_ctx); +void _lv_draw_stm32_dma2d_copy_buffer(const lv_color_t * dest_buf, lv_coord_t dest_stride, + const lv_area_t * draw_area, const lv_color_t * src_buf, lv_coord_t src_stride, const lv_point_t * src_offset); + +#if defined (LV_STM32_DMA2D_USE_M7_CACHE) +void _lv_gpu_stm32_dma2d_invalidate_cache(uint32_t address, lv_coord_t offset, + lv_coord_t width, lv_coord_t height, uint8_t pixel_size); +void _lv_gpu_stm32_dma2d_clean_cache(uint32_t address, lv_coord_t offset, lv_coord_t width, + lv_coord_t height, uint8_t pixel_size); +#endif + + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_GPU_STM32_DMA2D*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_GPU_STM32_DMA2D_H*/ diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sw/Makefile b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/sw/Makefile similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sw/Makefile rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/sw/Makefile diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sw/lv_draw_sw.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/sw/lv_draw_sw.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sw/lv_draw_sw.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/sw/lv_draw_sw.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sw/lv_draw_sw.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/sw/lv_draw_sw.h similarity index 84% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sw/lv_draw_sw.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/sw/lv_draw_sw.h index 1618649..0f6d46b 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sw/lv_draw_sw.h +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/sw/lv_draw_sw.h @@ -61,11 +61,13 @@ void lv_draw_sw_bg(lv_draw_ctx_t * draw_ctx, const lv_draw_rect_dsc_t * dsc, con void lv_draw_sw_letter(lv_draw_ctx_t * draw_ctx, const lv_draw_label_dsc_t * dsc, const lv_point_t * pos_p, uint32_t letter); -LV_ATTRIBUTE_FAST_MEM void lv_draw_sw_img_decoded(struct _lv_draw_ctx_t * draw_ctx, const lv_draw_img_dsc_t * draw_dsc, - const lv_area_t * coords, const uint8_t * src_buf, lv_img_cf_t cf); +void /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_sw_img_decoded(struct _lv_draw_ctx_t * draw_ctx, + const lv_draw_img_dsc_t * draw_dsc, + const lv_area_t * coords, const uint8_t * src_buf, + lv_img_cf_t cf); -LV_ATTRIBUTE_FAST_MEM void lv_draw_sw_line(struct _lv_draw_ctx_t * draw_ctx, const lv_draw_line_dsc_t * dsc, - const lv_point_t * point1, const lv_point_t * point2); +void /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_sw_line(struct _lv_draw_ctx_t * draw_ctx, const lv_draw_line_dsc_t * dsc, + const lv_point_t * point1, const lv_point_t * point2); void lv_draw_sw_polygon(struct _lv_draw_ctx_t * draw_ctx, const lv_draw_rect_dsc_t * draw_dsc, const lv_point_t * points, uint16_t point_cnt); diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sw/lv_draw_sw.mk b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/sw/lv_draw_sw.mk similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sw/lv_draw_sw.mk rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/sw/lv_draw_sw.mk diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sw/lv_draw_sw_arc.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/sw/lv_draw_sw_arc.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sw/lv_draw_sw_arc.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/sw/lv_draw_sw_arc.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sw/lv_draw_sw_blend.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/sw/lv_draw_sw_blend.c similarity index 91% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sw/lv_draw_sw_blend.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/sw/lv_draw_sw_blend.c index 428aba6..7d595ec 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sw/lv_draw_sw_blend.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/sw/lv_draw_sw_blend.c @@ -26,13 +26,14 @@ static void fill_set_px(lv_color_t * dest_buf, const lv_area_t * blend_area, lv_coord_t dest_stride, lv_color_t color, lv_opa_t opa, const lv_opa_t * mask, lv_coord_t mask_stide); -LV_ATTRIBUTE_FAST_MEM static void fill_normal(lv_color_t * dest_buf, const lv_area_t * dest_area, - lv_coord_t dest_stride, lv_color_t color, lv_opa_t opa, const lv_opa_t * mask, lv_coord_t mask_stride); - +static void /* LV_ATTRIBUTE_FAST_MEM */ fill_normal(lv_color_t * dest_buf, const lv_area_t * dest_area, + lv_coord_t dest_stride, lv_color_t color, lv_opa_t opa, + const lv_opa_t * mask, lv_coord_t mask_stride); #if LV_COLOR_SCREEN_TRANSP -LV_ATTRIBUTE_FAST_MEM static void fill_argb(lv_color_t * dest_buf, const lv_area_t * dest_area, - lv_coord_t dest_stride, lv_color_t color, lv_opa_t opa, const lv_opa_t * mask, lv_coord_t mask_stride); +static void /* LV_ATTRIBUTE_FAST_MEM */ fill_argb(lv_color_t * dest_buf, const lv_area_t * dest_area, + lv_coord_t dest_stride, lv_color_t color, lv_opa_t opa, + const lv_opa_t * mask, lv_coord_t mask_stride); #endif /*LV_COLOR_SCREEN_TRANSP*/ #if LV_DRAW_COMPLEX @@ -41,15 +42,19 @@ static void fill_blended(lv_color_t * dest_buf, const lv_area_t * dest_area, lv_ #endif /*LV_DRAW_COMPLEX*/ static void map_set_px(lv_color_t * dest_buf, const lv_area_t * dest_area, lv_coord_t dest_stride, - const lv_color_t * src_buf, lv_coord_t src_stride, lv_opa_t opa, const lv_opa_t * mask, lv_coord_t mask_stride); + const lv_color_t * src_buf, lv_coord_t src_stride, lv_opa_t opa, + const lv_opa_t * mask, lv_coord_t mask_stride); -LV_ATTRIBUTE_FAST_MEM static void map_normal(lv_color_t * dest_buf, const lv_area_t * dest_area, lv_coord_t dest_stride, - const lv_color_t * src_buf, lv_coord_t src_stride, lv_opa_t opa, const lv_opa_t * mask, lv_coord_t mask_stride); +static void /* LV_ATTRIBUTE_FAST_MEM */ map_normal(lv_color_t * dest_buf, const lv_area_t * dest_area, + lv_coord_t dest_stride, const lv_color_t * src_buf, + lv_coord_t src_stride, lv_opa_t opa, const lv_opa_t * mask, + lv_coord_t mask_stride); #if LV_COLOR_SCREEN_TRANSP -LV_ATTRIBUTE_FAST_MEM static void map_argb(lv_color_t * dest_buf, const lv_area_t * dest_area, lv_coord_t dest_stride, - const lv_color_t * src_buf, lv_coord_t src_stride, lv_opa_t opa, - const lv_opa_t * mask, lv_coord_t mask_stride, lv_blend_mode_t blend_mode); +static void /* LV_ATTRIBUTE_FAST_MEM */ map_argb(lv_color_t * dest_buf, const lv_area_t * dest_area, + lv_coord_t dest_stride, const lv_color_t * src_buf, + lv_coord_t src_stride, lv_opa_t opa, const lv_opa_t * mask, + lv_coord_t mask_stride, lv_blend_mode_t blend_mode); #endif /*LV_COLOR_SCREEN_TRANSP*/ @@ -83,7 +88,6 @@ static inline lv_color_t color_blend_true_color_multiply(lv_color_t fg, lv_color } \ mask_tmp_x++; - /********************** * GLOBAL FUNCTIONS **********************/ @@ -101,9 +105,10 @@ void lv_draw_sw_blend(lv_draw_ctx_t * draw_ctx, const lv_draw_sw_blend_dsc_t * d ((lv_draw_sw_ctx_t *)draw_ctx)->blend(draw_ctx, dsc); } -LV_ATTRIBUTE_FAST_MEM void lv_draw_sw_blend_basic(lv_draw_ctx_t * draw_ctx, const lv_draw_sw_blend_dsc_t * dsc) +void LV_ATTRIBUTE_FAST_MEM lv_draw_sw_blend_basic(lv_draw_ctx_t * draw_ctx, + const lv_draw_sw_blend_dsc_t * dsc) { - const lv_opa_t * mask; + lv_opa_t * mask; if(dsc->mask_buf == NULL) mask = NULL; if(dsc->mask_buf && dsc->mask_res == LV_DRAW_MASK_RES_TRANSP) return; else if(dsc->mask_res == LV_DRAW_MASK_RES_FULL_COVER) mask = NULL; @@ -129,7 +134,6 @@ LV_ATTRIBUTE_FAST_MEM void lv_draw_sw_blend_basic(lv_draw_ctx_t * draw_ctx, cons } } - const lv_color_t * src_buf = dsc->src_buf; lv_coord_t src_stride; if(src_buf) { @@ -142,8 +146,18 @@ LV_ATTRIBUTE_FAST_MEM void lv_draw_sw_blend_basic(lv_draw_ctx_t * draw_ctx, cons lv_coord_t mask_stride; if(mask) { + /*Round the values in the mask if anti-aliasing is disabled*/ + if(disp->driver->antialiasing == 0) { + int32_t mask_size = lv_area_get_size(dsc->mask_area); + int32_t i; + for(i = 0; i < mask_size; i++) { + mask[i] = mask[i] > 128 ? LV_OPA_COVER : LV_OPA_TRANSP; + } + } + mask_stride = lv_area_get_width(dsc->mask_area); mask += mask_stride * (blend_area.y1 - dsc->mask_area->y1) + (blend_area.x1 - dsc->mask_area->x1); + } else { mask_stride = 0; @@ -151,7 +165,6 @@ LV_ATTRIBUTE_FAST_MEM void lv_draw_sw_blend_basic(lv_draw_ctx_t * draw_ctx, cons lv_area_move(&blend_area, -draw_ctx->buf_area->x1, -draw_ctx->buf_area->y1); - if(disp->driver->set_px_cb) { if(dsc->src_buf == NULL) { fill_set_px(dest_buf, &blend_area, dest_stride, dsc->color, dsc->opa, mask, mask_stride); @@ -190,7 +203,6 @@ LV_ATTRIBUTE_FAST_MEM void lv_draw_sw_blend_basic(lv_draw_ctx_t * draw_ctx, cons } } - /********************** * STATIC FUNCTIONS **********************/ @@ -218,7 +230,6 @@ static void fill_set_px(lv_color_t * dest_buf, const lv_area_t * blend_area, lv_ for(x = 0; x < w; x++) { if(mask[x]) { - disp->driver->set_px_cb(disp->driver, (void *)dest_buf, dest_stride, blend_area->x1 + x, blend_area->y1 + y, color, (uint32_t)((uint32_t)opa * mask[x]) >> 8); } @@ -228,8 +239,9 @@ static void fill_set_px(lv_color_t * dest_buf, const lv_area_t * blend_area, lv_ } } -LV_ATTRIBUTE_FAST_MEM static void fill_normal(lv_color_t * dest_buf, const lv_area_t * dest_area, - lv_coord_t dest_stride, lv_color_t color, lv_opa_t opa, const lv_opa_t * mask, lv_coord_t mask_stride) +static LV_ATTRIBUTE_FAST_MEM void fill_normal(lv_color_t * dest_buf, const lv_area_t * dest_area, + lv_coord_t dest_stride, lv_color_t color, lv_opa_t opa, + const lv_opa_t * mask, lv_coord_t mask_stride) { int32_t w = lv_area_get_width(dest_area); int32_t h = lv_area_get_height(dest_area); @@ -421,7 +433,7 @@ static inline void set_px_argb_blend(uint8_t * buf, lv_color_t color, lv_opa_t o /*Set the result color*/ #if LV_COLOR_DEPTH == 8 - buf[0] = res_color.full; + buf[0] = last_res_color.full; #elif LV_COLOR_DEPTH == 16 buf[0] = last_res_color.full & 0xff; buf[1] = last_res_color.full >> 8; @@ -433,8 +445,9 @@ static inline void set_px_argb_blend(uint8_t * buf, lv_color_t color, lv_opa_t o } -LV_ATTRIBUTE_FAST_MEM static void fill_argb(lv_color_t * dest_buf, const lv_area_t * dest_area, - lv_coord_t dest_stride, lv_color_t color, lv_opa_t opa, const lv_opa_t * mask, lv_coord_t mask_stride) +static void LV_ATTRIBUTE_FAST_MEM fill_argb(lv_color_t * dest_buf, const lv_area_t * dest_area, + lv_coord_t dest_stride, lv_color_t color, lv_opa_t opa, + const lv_opa_t * mask, lv_coord_t mask_stride) { uint8_t * dest_buf8 = (uint8_t *) dest_buf; int32_t w = lv_area_get_width(dest_area); @@ -590,7 +603,8 @@ static void fill_blended(lv_color_t * dest_buf, const lv_area_t * dest_area, #endif static void map_set_px(lv_color_t * dest_buf, const lv_area_t * dest_area, lv_coord_t dest_stride, - const lv_color_t * src_buf, lv_coord_t src_stride, lv_opa_t opa, const lv_opa_t * mask, lv_coord_t mask_stride) + const lv_color_t * src_buf, lv_coord_t src_stride, lv_opa_t opa, + const lv_opa_t * mask, lv_coord_t mask_stride) { lv_disp_t * disp = _lv_refr_get_disp_refreshing(); @@ -624,8 +638,10 @@ static void map_set_px(lv_color_t * dest_buf, const lv_area_t * dest_area, lv_co } } -LV_ATTRIBUTE_FAST_MEM static void map_normal(lv_color_t * dest_buf, const lv_area_t * dest_area, lv_coord_t dest_stride, - const lv_color_t * src_buf, lv_coord_t src_stride, lv_opa_t opa, const lv_opa_t * mask, lv_coord_t mask_stride) +static void LV_ATTRIBUTE_FAST_MEM map_normal(lv_color_t * dest_buf, const lv_area_t * dest_area, + lv_coord_t dest_stride, const lv_color_t * src_buf, + lv_coord_t src_stride, lv_opa_t opa, const lv_opa_t * mask, + lv_coord_t mask_stride) { int32_t w = lv_area_get_width(dest_area); @@ -717,12 +733,11 @@ LV_ATTRIBUTE_FAST_MEM static void map_normal(lv_color_t * dest_buf, const lv_are } } - - #if LV_COLOR_SCREEN_TRANSP -LV_ATTRIBUTE_FAST_MEM static void map_argb(lv_color_t * dest_buf, const lv_area_t * dest_area, lv_coord_t dest_stride, - const lv_color_t * src_buf, lv_coord_t src_stride, lv_opa_t opa, - const lv_opa_t * mask, lv_coord_t mask_stride, lv_blend_mode_t blend_mode) +static void LV_ATTRIBUTE_FAST_MEM map_argb(lv_color_t * dest_buf, const lv_area_t * dest_area, + lv_coord_t dest_stride, const lv_color_t * src_buf, + lv_coord_t src_stride, lv_opa_t opa, const lv_opa_t * mask, + lv_coord_t mask_stride, lv_blend_mode_t blend_mode) { uint8_t * dest_buf8 = (uint8_t *) dest_buf; @@ -859,7 +874,6 @@ LV_ATTRIBUTE_FAST_MEM static void map_argb(lv_color_t * dest_buf, const lv_area_ } #endif - #if LV_DRAW_COMPLEX static void map_blended(lv_color_t * dest_buf, const lv_area_t * dest_area, lv_coord_t dest_stride, const lv_color_t * src_buf, lv_coord_t src_stride, lv_opa_t opa, @@ -1036,4 +1050,3 @@ static inline lv_color_t color_blend_true_color_multiply(lv_color_t fg, lv_color } #endif - diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sw/lv_draw_sw_blend.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/sw/lv_draw_sw_blend.h similarity index 91% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sw/lv_draw_sw_blend.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/sw/lv_draw_sw_blend.h index 9a00e53..3158d98 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sw/lv_draw_sw_blend.h +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/sw/lv_draw_sw_blend.h @@ -56,7 +56,8 @@ void lv_draw_sw_blend(struct _lv_draw_ctx_t * draw_ctx, const lv_draw_sw_blend_d * @param draw_ctx pointer to a draw context * @param dsc pointer to an initialized blend descriptor */ -LV_ATTRIBUTE_FAST_MEM void lv_draw_sw_blend_basic(struct _lv_draw_ctx_t * draw_ctx, const lv_draw_sw_blend_dsc_t * dsc); +void /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_sw_blend_basic(struct _lv_draw_ctx_t * draw_ctx, + const lv_draw_sw_blend_dsc_t * dsc); /********************** * MACROS diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sw/lv_draw_sw_dither.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/sw/lv_draw_sw_dither.c similarity index 96% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sw/lv_draw_sw_dither.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/sw/lv_draw_sw_dither.c index ff9ebf3..d910490 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sw/lv_draw_sw_dither.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/sw/lv_draw_sw_dither.c @@ -14,10 +14,9 @@ * STATIC FUNCTIONS **********************/ - #if _DITHER_GRADIENT -LV_ATTRIBUTE_FAST_MEM void lv_dither_none(lv_grad_t * grad, lv_coord_t x, lv_coord_t y, lv_coord_t w) +void LV_ATTRIBUTE_FAST_MEM lv_dither_none(lv_grad_t * grad, lv_coord_t x, lv_coord_t y, lv_coord_t w) { LV_UNUSED(x); LV_UNUSED(y); @@ -39,8 +38,7 @@ static const uint8_t dither_ordered_threshold_matrix[8 * 8] = { 42, 26, 38, 22, 41, 25, 37, 21 }; /* Shift by 6 to normalize */ - -LV_ATTRIBUTE_FAST_MEM void lv_dither_ordered_hor(lv_grad_t * grad, lv_coord_t x, lv_coord_t y, lv_coord_t w) +void LV_ATTRIBUTE_FAST_MEM lv_dither_ordered_hor(lv_grad_t * grad, lv_coord_t x, lv_coord_t y, lv_coord_t w) { LV_UNUSED(x); /* For vertical dithering, the error is spread on the next column (and not next line). @@ -63,7 +61,8 @@ LV_ATTRIBUTE_FAST_MEM void lv_dither_ordered_hor(lv_grad_t * grad, lv_coord_t x, grad->map[j] = lv_color_hex(t.full); } } -LV_ATTRIBUTE_FAST_MEM void lv_dither_ordered_ver(lv_grad_t * grad, lv_coord_t x, lv_coord_t y, lv_coord_t w) + +void LV_ATTRIBUTE_FAST_MEM lv_dither_ordered_ver(lv_grad_t * grad, lv_coord_t x, lv_coord_t y, lv_coord_t w) { /* For vertical dithering, the error is spread on the next column (and not next line). Since the renderer is scanline based, it's not obvious what could be used to perform the rendering efficiently. @@ -97,9 +96,8 @@ LV_ATTRIBUTE_FAST_MEM void lv_dither_ordered_ver(lv_grad_t * grad, lv_coord_t x, } } - #if LV_DITHER_ERROR_DIFFUSION == 1 -LV_ATTRIBUTE_FAST_MEM void lv_dither_err_diff_hor(lv_grad_t * grad, lv_coord_t xs, lv_coord_t y, lv_coord_t w) +void LV_ATTRIBUTE_FAST_MEM lv_dither_err_diff_hor(lv_grad_t * grad, lv_coord_t xs, lv_coord_t y, lv_coord_t w) { LV_UNUSED(xs); LV_UNUSED(y); @@ -153,7 +151,7 @@ LV_ATTRIBUTE_FAST_MEM void lv_dither_err_diff_hor(lv_grad_t * grad, lv_coord_t x grad->map[grad->size - 1] = lv_color_hex(grad->hmap[grad->size - 1].full); } -LV_ATTRIBUTE_FAST_MEM void lv_dither_err_diff_ver(lv_grad_t * grad, lv_coord_t xs, lv_coord_t y, lv_coord_t w) +void LV_ATTRIBUTE_FAST_MEM lv_dither_err_diff_ver(lv_grad_t * grad, lv_coord_t xs, lv_coord_t y, lv_coord_t w) { /* Try to implement error diffusion on a vertical gradient and an horizontal map using those tricks: Since the given hi-resolution gradient (in src) is vertical, the Floyd Steinberg algorithm pass need to be rotated, diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sw/lv_draw_sw_dither.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/sw/lv_draw_sw_dither.h similarity index 50% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sw/lv_draw_sw_dither.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/sw/lv_draw_sw_dither.h index 6362c5a..9aaefc9 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sw/lv_draw_sw_dither.h +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/sw/lv_draw_sw_dither.h @@ -15,7 +15,6 @@ extern "C" { *********************/ #include "../../core/lv_obj_pos.h" - /********************* * DEFINES *********************/ @@ -39,30 +38,29 @@ typedef void (*lv_dither_func_t)(struct _lv_gradient_cache_t * grad, lv_coord_t #endif - /********************** * PROTOTYPES **********************/ #if LV_DRAW_COMPLEX #if _DITHER_GRADIENT -LV_ATTRIBUTE_FAST_MEM void lv_dither_none(struct _lv_gradient_cache_t * grad, lv_coord_t x, lv_coord_t y, lv_coord_t w); +void /* LV_ATTRIBUTE_FAST_MEM */ lv_dither_none(struct _lv_gradient_cache_t * grad, lv_coord_t x, lv_coord_t y, + lv_coord_t w); -LV_ATTRIBUTE_FAST_MEM void lv_dither_ordered_hor(struct _lv_gradient_cache_t * grad, const lv_coord_t xs, - const lv_coord_t y, const lv_coord_t w); -LV_ATTRIBUTE_FAST_MEM void lv_dither_ordered_ver(struct _lv_gradient_cache_t * grad, const lv_coord_t xs, - const lv_coord_t y, const lv_coord_t w); +void /* LV_ATTRIBUTE_FAST_MEM */ lv_dither_ordered_hor(struct _lv_gradient_cache_t * grad, const lv_coord_t xs, + const lv_coord_t y, const lv_coord_t w); +void /* LV_ATTRIBUTE_FAST_MEM */ lv_dither_ordered_ver(struct _lv_gradient_cache_t * grad, const lv_coord_t xs, + const lv_coord_t y, const lv_coord_t w); #if LV_DITHER_ERROR_DIFFUSION == 1 -LV_ATTRIBUTE_FAST_MEM void lv_dither_err_diff_hor(struct _lv_gradient_cache_t * grad, const lv_coord_t xs, - const lv_coord_t y, const lv_coord_t w); -LV_ATTRIBUTE_FAST_MEM void lv_dither_err_diff_ver(struct _lv_gradient_cache_t * grad, const lv_coord_t xs, - const lv_coord_t y, const lv_coord_t w); +void /* LV_ATTRIBUTE_FAST_MEM */ lv_dither_err_diff_hor(struct _lv_gradient_cache_t * grad, const lv_coord_t xs, + const lv_coord_t y, const lv_coord_t w); +void /* LV_ATTRIBUTE_FAST_MEM */ lv_dither_err_diff_ver(struct _lv_gradient_cache_t * grad, const lv_coord_t xs, + const lv_coord_t y, const lv_coord_t w); #endif /* LV_DITHER_ERROR_DIFFUSION */ #endif /* _DITHER_GRADIENT */ #endif - #ifdef __cplusplus } /*extern "C"*/ #endif diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sw/lv_draw_sw_gradient.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/sw/lv_draw_sw_gradient.c similarity index 94% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sw/lv_draw_sw_gradient.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/sw/lv_draw_sw_gradient.c index 4e46632..f5b774e 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sw/lv_draw_sw_gradient.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/sw/lv_draw_sw_gradient.c @@ -45,8 +45,7 @@ static lv_res_t find_oldest_item_life(lv_grad_t * c, void * ctx); static lv_res_t kill_oldest_item(lv_grad_t * c, void * ctx); static lv_res_t find_item(lv_grad_t * c, void * ctx); static void free_item(lv_grad_t * c); -static uint32_t compute_key(const lv_grad_dsc_t * g, lv_coord_t w, lv_coord_t h); - +static uint32_t compute_key(const lv_grad_dsc_t * g, lv_coord_t size, lv_coord_t w); /********************** * STATIC VARIABLE @@ -57,16 +56,22 @@ static uint8_t * grad_cache_end = 0; /********************** * STATIC FUNCTIONS **********************/ -union void_cast { - const void * ptr; - const uint32_t value; -}; static uint32_t compute_key(const lv_grad_dsc_t * g, lv_coord_t size, lv_coord_t w) { - union void_cast v; - v.ptr = g; - return (v.value ^ size ^ (w >> 1)); /*Yes, this is correct, it's like a hash that changes if the width changes*/ + uint32_t key = + ((uint32_t) g->stops_count) | + (((uint32_t) g->dir) << 8) | + (((uint32_t) g->dither) << 16); + uint32_t frac_product = 1; + for(uint8_t i = 0; i < g->stops_count; i++) { + key ^= (uint32_t) g->stops[i].color.full; + frac_product *= ((uint32_t) g->stops[i].frac) + 1; + } + key ^= frac_product; + key ^= (uint32_t) size; + key ^= ((uint32_t) w) >> 1; /*Yes, this is correct, it's like a hash that changes if the width changes*/ + return key; } static size_t get_cache_item_size(lv_grad_t * c) @@ -228,7 +233,6 @@ static lv_grad_t * allocate_item(const lv_grad_dsc_t * g, lv_coord_t w, lv_coord return item; } - /********************** * FUNCTIONS **********************/ @@ -293,7 +297,7 @@ lv_grad_t * lv_gradient_get(const lv_grad_dsc_t * g, lv_coord_t w, lv_coord_t h) return item; } -LV_ATTRIBUTE_FAST_MEM lv_grad_color_t lv_gradient_calculate(const lv_grad_dsc_t * dsc, lv_coord_t range, +lv_grad_color_t LV_ATTRIBUTE_FAST_MEM lv_gradient_calculate(const lv_grad_dsc_t * dsc, lv_coord_t range, lv_coord_t frac) { lv_grad_color_t tmp; diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sw/lv_draw_sw_gradient.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/sw/lv_draw_sw_gradient.h similarity index 94% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sw/lv_draw_sw_gradient.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/sw/lv_draw_sw_gradient.h index f5f3215..ccccbaa 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sw/lv_draw_sw_gradient.h +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/sw/lv_draw_sw_gradient.h @@ -24,7 +24,6 @@ extern "C" { #error LVGL needs at least 2 stops for gradients. Please increase the LV_GRADIENT_MAX_STOPS #endif - /********************** * TYPEDEFS **********************/ @@ -59,7 +58,6 @@ typedef struct _lv_gradient_cache_t { #endif } lv_grad_t; - /********************** * PROTOTYPES **********************/ @@ -69,8 +67,8 @@ typedef struct _lv_gradient_cache_t { * @param range The range to use in computation. * @param frac The current part used in the range. frac is in [0; range] */ -LV_ATTRIBUTE_FAST_MEM lv_grad_color_t lv_gradient_calculate(const lv_grad_dsc_t * dsc, lv_coord_t range, - lv_coord_t frac); +lv_grad_color_t /* LV_ATTRIBUTE_FAST_MEM */ lv_gradient_calculate(const lv_grad_dsc_t * dsc, lv_coord_t range, + lv_coord_t frac); /** * Set the gradient cache size diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sw/lv_draw_sw_img.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/sw/lv_draw_sw_img.c similarity index 97% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sw/lv_draw_sw_img.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/sw/lv_draw_sw_img.c index 9578bc7..7b2f71a 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sw/lv_draw_sw_img.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/sw/lv_draw_sw_img.c @@ -41,9 +41,10 @@ static void convert_cb(const lv_area_t * dest_area, const void * src_buf, lv_coo * GLOBAL FUNCTIONS **********************/ - -LV_ATTRIBUTE_FAST_MEM void lv_draw_sw_img_decoded(struct _lv_draw_ctx_t * draw_ctx, const lv_draw_img_dsc_t * draw_dsc, - const lv_area_t * coords, const uint8_t * src_buf, lv_img_cf_t cf) +void LV_ATTRIBUTE_FAST_MEM lv_draw_sw_img_decoded(struct _lv_draw_ctx_t * draw_ctx, + const lv_draw_img_dsc_t * draw_dsc, + const lv_area_t * coords, const uint8_t * src_buf, + lv_img_cf_t cf) { /*Use the clip area as draw area*/ lv_area_t draw_area; diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sw/lv_draw_sw_layer.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/sw/lv_draw_sw_layer.c similarity index 99% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sw/lv_draw_sw_layer.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/sw/lv_draw_sw_layer.c index b53c662..d6a9bfb 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sw/lv_draw_sw_layer.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/sw/lv_draw_sw_layer.c @@ -39,7 +39,6 @@ * GLOBAL FUNCTIONS **********************/ - struct _lv_draw_layer_ctx_t * lv_draw_sw_layer_create(struct _lv_draw_ctx_t * draw_ctx, lv_draw_layer_ctx_t * layer_ctx, lv_draw_layer_flags_t flags) { @@ -144,7 +143,6 @@ void lv_draw_sw_layer_destroy(lv_draw_ctx_t * draw_ctx, lv_draw_layer_ctx_t * la lv_mem_free(layer_ctx->buf); } - /********************** * STATIC FUNCTIONS **********************/ diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sw/lv_draw_sw_letter.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/sw/lv_draw_sw_letter.c similarity index 98% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sw/lv_draw_sw_letter.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/sw/lv_draw_sw_letter.c index e05899a..0faab8d 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sw/lv_draw_sw_letter.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/sw/lv_draw_sw_letter.c @@ -27,9 +27,8 @@ * STATIC PROTOTYPES **********************/ -LV_ATTRIBUTE_FAST_MEM static void draw_letter_normal(lv_draw_ctx_t * draw_ctx, const lv_draw_label_dsc_t * dsc, - const lv_point_t * pos, lv_font_glyph_dsc_t * g, const uint8_t * map_p); - +static void /* LV_ATTRIBUTE_FAST_MEM */ draw_letter_normal(lv_draw_ctx_t * draw_ctx, const lv_draw_label_dsc_t * dsc, + const lv_point_t * pos, lv_font_glyph_dsc_t * g, const uint8_t * map_p); #if LV_DRAW_COMPLEX && LV_USE_FONT_SUBPX static void draw_letter_subpx(lv_draw_ctx_t * draw_ctx, const lv_draw_label_dsc_t * dsc, const lv_point_t * pos, @@ -103,7 +102,7 @@ void lv_draw_sw_letter(lv_draw_ctx_t * draw_ctx, const lv_draw_label_dsc_t * dsc if(letter >= 0x20 && letter != 0xf8ff && /*LV_SYMBOL_DUMMY*/ letter != 0x200c) { /*ZERO WIDTH NON-JOINER*/ - LV_LOG_WARN("lv_draw_letter: glyph dsc. not found for U+%u", letter); + LV_LOG_WARN("lv_draw_letter: glyph dsc. not found for U+%" LV_PRIX32, letter); #if LV_USE_FONT_PLACEHOLDER /* draw placeholder */ @@ -162,7 +161,7 @@ void lv_draw_sw_letter(lv_draw_ctx_t * draw_ctx, const lv_draw_label_dsc_t * dsc * STATIC FUNCTIONS **********************/ -LV_ATTRIBUTE_FAST_MEM static void draw_letter_normal(lv_draw_ctx_t * draw_ctx, const lv_draw_label_dsc_t * dsc, +static void LV_ATTRIBUTE_FAST_MEM draw_letter_normal(lv_draw_ctx_t * draw_ctx, const lv_draw_label_dsc_t * dsc, const lv_point_t * pos, lv_font_glyph_dsc_t * g, const uint8_t * map_p) { @@ -570,4 +569,3 @@ static void draw_letter_subpx(lv_draw_ctx_t * draw_ctx, const lv_draw_label_dsc_ lv_mem_buf_release(color_buf); } #endif /*LV_DRAW_COMPLEX && LV_USE_FONT_SUBPX*/ - diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sw/lv_draw_sw_line.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/sw/lv_draw_sw_line.c similarity index 93% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sw/lv_draw_sw_line.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/sw/lv_draw_sw_line.c index 73833c1..b323816 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sw/lv_draw_sw_line.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/sw/lv_draw_sw_line.c @@ -23,12 +23,12 @@ * STATIC PROTOTYPES **********************/ -LV_ATTRIBUTE_FAST_MEM static void draw_line_skew(struct _lv_draw_ctx_t * draw_ctx, const lv_draw_line_dsc_t * dsc, - const lv_point_t * point1, const lv_point_t * point2); -LV_ATTRIBUTE_FAST_MEM static void draw_line_hor(struct _lv_draw_ctx_t * draw_ctx, const lv_draw_line_dsc_t * dsc, - const lv_point_t * point1, const lv_point_t * point2); -LV_ATTRIBUTE_FAST_MEM static void draw_line_ver(struct _lv_draw_ctx_t * draw_ctx, const lv_draw_line_dsc_t * dsc, - const lv_point_t * point1, const lv_point_t * point2); +static void /* LV_ATTRIBUTE_FAST_MEM */ draw_line_skew(struct _lv_draw_ctx_t * draw_ctx, const lv_draw_line_dsc_t * dsc, + const lv_point_t * point1, const lv_point_t * point2); +static void /* LV_ATTRIBUTE_FAST_MEM */ draw_line_hor(struct _lv_draw_ctx_t * draw_ctx, const lv_draw_line_dsc_t * dsc, + const lv_point_t * point1, const lv_point_t * point2); +static void /* LV_ATTRIBUTE_FAST_MEM */ draw_line_ver(struct _lv_draw_ctx_t * draw_ctx, const lv_draw_line_dsc_t * dsc, + const lv_point_t * point1, const lv_point_t * point2); /********************** * STATIC VARIABLES @@ -49,7 +49,7 @@ LV_ATTRIBUTE_FAST_MEM static void draw_line_ver(struct _lv_draw_ctx_t * draw_ctx * @param clip the line will be drawn only in this area * @param dsc pointer to an initialized `lv_draw_line_dsc_t` variable */ -LV_ATTRIBUTE_FAST_MEM void lv_draw_sw_line(struct _lv_draw_ctx_t * draw_ctx, const lv_draw_line_dsc_t * dsc, +void LV_ATTRIBUTE_FAST_MEM lv_draw_sw_line(struct _lv_draw_ctx_t * draw_ctx, const lv_draw_line_dsc_t * dsc, const lv_point_t * point1, const lv_point_t * point2) { if(dsc->width == 0) return; @@ -108,8 +108,7 @@ LV_ATTRIBUTE_FAST_MEM void lv_draw_sw_line(struct _lv_draw_ctx_t * draw_ctx, con * STATIC FUNCTIONS **********************/ - -LV_ATTRIBUTE_FAST_MEM static void draw_line_hor(struct _lv_draw_ctx_t * draw_ctx, const lv_draw_line_dsc_t * dsc, +static void LV_ATTRIBUTE_FAST_MEM draw_line_hor(struct _lv_draw_ctx_t * draw_ctx, const lv_draw_line_dsc_t * dsc, const lv_point_t * point1, const lv_point_t * point2) { int32_t w = dsc->width - 1; @@ -195,7 +194,7 @@ LV_ATTRIBUTE_FAST_MEM static void draw_line_hor(struct _lv_draw_ctx_t * draw_ctx #endif /*LV_DRAW_COMPLEX*/ } -LV_ATTRIBUTE_FAST_MEM static void draw_line_ver(struct _lv_draw_ctx_t * draw_ctx, const lv_draw_line_dsc_t * dsc, +static void LV_ATTRIBUTE_FAST_MEM draw_line_ver(struct _lv_draw_ctx_t * draw_ctx, const lv_draw_line_dsc_t * dsc, const lv_point_t * point1, const lv_point_t * point2) { int32_t w = dsc->width - 1; @@ -275,7 +274,7 @@ LV_ATTRIBUTE_FAST_MEM static void draw_line_ver(struct _lv_draw_ctx_t * draw_ctx #endif /*LV_DRAW_COMPLEX*/ } -LV_ATTRIBUTE_FAST_MEM static void draw_line_skew(struct _lv_draw_ctx_t * draw_ctx, const lv_draw_line_dsc_t * dsc, +static void LV_ATTRIBUTE_FAST_MEM draw_line_skew(struct _lv_draw_ctx_t * draw_ctx, const lv_draw_line_dsc_t * dsc, const lv_point_t * point1, const lv_point_t * point2) { #if LV_DRAW_COMPLEX @@ -440,4 +439,3 @@ LV_ATTRIBUTE_FAST_MEM static void draw_line_skew(struct _lv_draw_ctx_t * draw_ct LV_LOG_WARN("Can't draw skewed line with LV_DRAW_COMPLEX == 0"); #endif /*LV_DRAW_COMPLEX*/ } - diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sw/lv_draw_sw_polygon.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/sw/lv_draw_sw_polygon.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sw/lv_draw_sw_polygon.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/sw/lv_draw_sw_polygon.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sw/lv_draw_sw_rect.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/sw/lv_draw_sw_rect.c similarity index 98% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sw/lv_draw_sw_rect.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/sw/lv_draw_sw_rect.c index 706ec6b..d201236 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sw/lv_draw_sw_rect.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/sw/lv_draw_sw_rect.c @@ -20,7 +20,6 @@ #define SHADOW_ENHANCE 1 #define SPLIT_LIMIT 50 - /********************** * TYPEDEFS **********************/ @@ -35,11 +34,11 @@ static void draw_border(lv_draw_ctx_t * draw_ctx, const lv_draw_rect_dsc_t * dsc static void draw_outline(lv_draw_ctx_t * draw_ctx, const lv_draw_rect_dsc_t * dsc, const lv_area_t * coords); #if LV_DRAW_COMPLEX -LV_ATTRIBUTE_FAST_MEM static void draw_shadow(lv_draw_ctx_t * draw_ctx, const lv_draw_rect_dsc_t * dsc, - const lv_area_t * coords); -LV_ATTRIBUTE_FAST_MEM static void shadow_draw_corner_buf(const lv_area_t * coords, uint16_t * sh_buf, lv_coord_t s, - lv_coord_t r); -LV_ATTRIBUTE_FAST_MEM static void shadow_blur_corner(lv_coord_t size, lv_coord_t sw, uint16_t * sh_ups_buf); +static void /* LV_ATTRIBUTE_FAST_MEM */ draw_shadow(lv_draw_ctx_t * draw_ctx, const lv_draw_rect_dsc_t * dsc, + const lv_area_t * coords); +static void /* LV_ATTRIBUTE_FAST_MEM */ shadow_draw_corner_buf(const lv_area_t * coords, uint16_t * sh_buf, + lv_coord_t s, lv_coord_t r); +static void /* LV_ATTRIBUTE_FAST_MEM */ shadow_blur_corner(lv_coord_t size, lv_coord_t sw, uint16_t * sh_ups_buf); #endif void draw_border_generic(lv_draw_ctx_t * draw_ctx, const lv_area_t * outer_area, const lv_area_t * inner_area, @@ -48,7 +47,6 @@ void draw_border_generic(lv_draw_ctx_t * draw_ctx, const lv_area_t * outer_area, static void draw_border_simple(lv_draw_ctx_t * draw_ctx, const lv_area_t * outer_area, const lv_area_t * inner_area, lv_color_t color, lv_opa_t opa); - /********************** * STATIC VARIABLES **********************/ @@ -92,7 +90,6 @@ void lv_draw_sw_bg(lv_draw_ctx_t * draw_ctx, const lv_draw_rect_dsc_t * dsc, con draw_bg_img(draw_ctx, dsc, coords); } - /********************** * STATIC FUNCTIONS **********************/ @@ -166,7 +163,6 @@ static void draw_bg(lv_draw_ctx_t * draw_ctx, const lv_draw_rect_dsc_t * dsc, co blend_dsc.mask_area = &blend_area; blend_dsc.opa = LV_OPA_COVER; - /*Get gradient if appropriate*/ lv_grad_t * grad = lv_gradient_get(&dsc->bg_grad, coords_bg_w, coords_bg_h); if(grad && grad_dir == LV_GRAD_DIR_HOR) { @@ -238,7 +234,6 @@ static void draw_bg(lv_draw_ctx_t * draw_ctx, const lv_draw_rect_dsc_t * dsc, co goto bg_clean_up; } - /* Draw the top of the rectangle line by line and mirror it to the bottom. */ for(h = 0; h < rout; h++) { lv_coord_t top_y = bg_coords.y1 + h; @@ -313,7 +308,6 @@ static void draw_bg(lv_draw_ctx_t * draw_ctx, const lv_draw_rect_dsc_t * dsc, co } } - bg_clean_up: if(mask_buf) lv_mem_buf_release(mask_buf); if(mask_rout_id != LV_MASK_ID_INV) { @@ -430,7 +424,7 @@ static void draw_border(lv_draw_ctx_t * draw_ctx, const lv_draw_rect_dsc_t * dsc } #if LV_DRAW_COMPLEX -LV_ATTRIBUTE_FAST_MEM static void draw_shadow(lv_draw_ctx_t * draw_ctx, const lv_draw_rect_dsc_t * dsc, +static void LV_ATTRIBUTE_FAST_MEM draw_shadow(lv_draw_ctx_t * draw_ctx, const lv_draw_rect_dsc_t * dsc, const lv_area_t * coords) { /*Check whether the shadow is visible*/ @@ -479,7 +473,6 @@ LV_ATTRIBUTE_FAST_MEM static void draw_shadow(lv_draw_ctx_t * draw_ctx, const lv short_side = LV_MIN(lv_area_get_width(&core_area), lv_area_get_height(&core_area)); if(r_sh > short_side >> 1) r_sh = short_side >> 1; - /*Get how many pixels are affected by the blur on the corners*/ int32_t corner_size = dsc->shadow_width + r_sh; @@ -681,7 +674,6 @@ LV_ATTRIBUTE_FAST_MEM static void draw_shadow(lv_draw_ctx_t * draw_ctx, const lv blend_area.y2 = shadow_area.y2; blend_area.y1 = LV_MAX(blend_area.y1, h_half + 1); - if(_lv_area_intersect(&clip_area_sub, &blend_area, draw_ctx->clip_area) && !_lv_area_is_in(&clip_area_sub, &bg_area, r_bg)) { lv_coord_t w = lv_area_get_width(&clip_area_sub); @@ -950,8 +942,8 @@ LV_ATTRIBUTE_FAST_MEM static void draw_shadow(lv_draw_ctx_t * draw_ctx, const lv * @param sw shadow width * @param r radius */ -LV_ATTRIBUTE_FAST_MEM static void shadow_draw_corner_buf(const lv_area_t * coords, uint16_t * sh_buf, lv_coord_t sw, - lv_coord_t r) +static void LV_ATTRIBUTE_FAST_MEM shadow_draw_corner_buf(const lv_area_t * coords, uint16_t * sh_buf, + lv_coord_t sw, lv_coord_t r) { int32_t sw_ori = sw; int32_t size = sw_ori + r; @@ -1037,7 +1029,7 @@ LV_ATTRIBUTE_FAST_MEM static void shadow_draw_corner_buf(const lv_area_t * coord } -LV_ATTRIBUTE_FAST_MEM static void shadow_blur_corner(lv_coord_t size, lv_coord_t sw, uint16_t * sh_ups_buf) +static void LV_ATTRIBUTE_FAST_MEM shadow_blur_corner(lv_coord_t size, lv_coord_t sw, uint16_t * sh_ups_buf) { int32_t s_left = sw >> 1; int32_t s_right = (sw >> 1); @@ -1139,7 +1131,6 @@ static void draw_outline(lv_draw_ctx_t * draw_ctx, const lv_draw_rect_dsc_t * ds area_outer.y1 -= dsc->outline_width; area_outer.y2 += dsc->outline_width; - int32_t inner_w = lv_area_get_width(&area_inner); int32_t inner_h = lv_area_get_height(&area_inner); int32_t rin = dsc->radius; @@ -1176,7 +1167,6 @@ void draw_border_generic(lv_draw_ctx_t * draw_ctx, const lv_area_t * outer_area, lv_memset_00(&blend_dsc, sizeof(blend_dsc)); blend_dsc.mask_buf = lv_mem_buf_get(draw_area_w);; - /*Create mask for the outer area*/ int16_t mask_rout_id = LV_MASK_ID_INV; lv_draw_mask_radius_param_t mask_rout_param; @@ -1400,7 +1390,6 @@ static void draw_border_simple(lv_draw_ctx_t * draw_ctx, const lv_area_t * outer bool left_side = outer_area->x1 <= inner_area->x1 ? true : false; bool right_side = outer_area->x2 >= inner_area->x2 ? true : false; - /*Top*/ a.x1 = outer_area->x1; a.x2 = outer_area->x2; @@ -1433,4 +1422,3 @@ static void draw_border_simple(lv_draw_ctx_t * draw_ctx, const lv_area_t * outer lv_draw_sw_blend(draw_ctx, &blend_dsc); } } - diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sw/lv_draw_sw_transform.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/sw/lv_draw_sw_transform.c similarity index 99% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sw/lv_draw_sw_transform.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/sw/lv_draw_sw_transform.c index 204503a..06d7e8c 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sw/lv_draw_sw_transform.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/sw/lv_draw_sw_transform.c @@ -264,7 +264,6 @@ static void rgb565a8_no_aa(const uint8_t * src, lv_coord_t src_w, lv_coord_t src } #endif - static void argb_and_rgb_aa(const uint8_t * src, lv_coord_t src_w, lv_coord_t src_h, lv_coord_t src_stride, int32_t xs_ups, int32_t ys_ups, int32_t xs_step, int32_t ys_step, int32_t x_end, lv_color_t * cbuf, uint8_t * abuf, lv_img_cf_t cf) @@ -273,7 +272,7 @@ static void argb_and_rgb_aa(const uint8_t * src, lv_coord_t src_w, lv_coord_t sr int32_t ys_ups_start = ys_ups; bool has_alpha; int32_t px_size; - lv_color_t ck = {0}; + lv_color_t ck = _LV_COLOR_ZERO_INITIALIZER; switch(cf) { case LV_IMG_CF_TRUE_COLOR: has_alpha = false; @@ -341,7 +340,6 @@ static void argb_and_rgb_aa(const uint8_t * src, lv_coord_t src_w, lv_coord_t sr const uint8_t * src_tmp = src; src_tmp += (ys_int * src_stride * px_size) + xs_int * px_size; - if(xs_int + x_next >= 0 && xs_int + x_next <= src_w - 1 && ys_int + y_next >= 0 && @@ -493,4 +491,3 @@ static void transform_point_upscaled(point_transform_dsc_t * t, int32_t xin, int } #endif - diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/swm341_dma2d/lv_draw_swm341_dma2d.mk b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/swm341_dma2d/lv_draw_swm341_dma2d.mk similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/swm341_dma2d/lv_draw_swm341_dma2d.mk rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/swm341_dma2d/lv_draw_swm341_dma2d.mk diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/swm341_dma2d/lv_gpu_swm341_dma2d.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/swm341_dma2d/lv_gpu_swm341_dma2d.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/swm341_dma2d/lv_gpu_swm341_dma2d.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/swm341_dma2d/lv_gpu_swm341_dma2d.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/swm341_dma2d/lv_gpu_swm341_dma2d.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/swm341_dma2d/lv_gpu_swm341_dma2d.h similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/swm341_dma2d/lv_gpu_swm341_dma2d.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/draw/swm341_dma2d/lv_gpu_swm341_dma2d.h diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/Makefile b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/Makefile similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/Makefile rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/Makefile diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/README.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/README.md similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/README.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/README.md diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/layouts/Makefile b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/layouts/Makefile similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/layouts/Makefile rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/layouts/Makefile diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/layouts/flex/Makefile b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/layouts/flex/Makefile similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/layouts/flex/Makefile rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/layouts/flex/Makefile diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/layouts/flex/lv_flex.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/layouts/flex/lv_flex.c similarity index 99% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/layouts/flex/lv_flex.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/layouts/flex/lv_flex.c index a53c95e..f76e4ea 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/layouts/flex/lv_flex.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/layouts/flex/lv_flex.c @@ -45,7 +45,6 @@ typedef struct { uint32_t grow_dsc_calc : 1; } track_t; - /********************** * GLOBAL PROTOTYPES **********************/ @@ -72,7 +71,6 @@ lv_style_prop_t LV_STYLE_FLEX_CROSS_PLACE; lv_style_prop_t LV_STYLE_FLEX_TRACK_PLACE; lv_style_prop_t LV_STYLE_FLEX_GROW; - /********************** * STATIC VARIABLES **********************/ @@ -97,6 +95,7 @@ void lv_flex_init(void) LV_STYLE_FLEX_MAIN_PLACE = lv_style_register_prop(LV_STYLE_PROP_LAYOUT_REFR); LV_STYLE_FLEX_CROSS_PLACE = lv_style_register_prop(LV_STYLE_PROP_LAYOUT_REFR); LV_STYLE_FLEX_TRACK_PLACE = lv_style_register_prop(LV_STYLE_PROP_LAYOUT_REFR); + LV_STYLE_FLEX_GROW = lv_style_register_prop(LV_STYLE_PROP_LAYOUT_REFR); } void lv_obj_set_flex_flow(lv_obj_t * obj, lv_flex_flow_t flow) @@ -120,7 +119,6 @@ void lv_obj_set_flex_grow(lv_obj_t * obj, uint8_t grow) lv_obj_mark_layout_as_dirty(lv_obj_get_parent(obj)); } - void lv_style_set_flex_flow(lv_style_t * style, lv_flex_flow_t value) { lv_style_value_t v = { @@ -161,7 +159,6 @@ void lv_style_set_flex_grow(lv_style_t * style, uint8_t value) lv_style_set_prop(style, LV_STYLE_FLEX_GROW, v); } - void lv_obj_set_style_flex_flow(lv_obj_t * obj, lv_flex_flow_t value, lv_style_selector_t selector) { lv_style_value_t v = { @@ -291,8 +288,12 @@ static void flex_update(lv_obj_t * cont, void * user_data) } children_repos(cont, &f, track_first_item, next_track_first_item, abs_x, abs_y, max_main_size, item_gap, &t); track_first_item = next_track_first_item; - lv_mem_buf_release(t.grow_dsc); + + if(t.grow_dsc) { + lv_mem_buf_release(t.grow_dsc); + } t.grow_dsc = NULL; + if(rtl && !f.row) { *cross_pos -= gap + track_gap; } @@ -370,7 +371,6 @@ static int32_t find_track_end(lv_obj_t * cont, flex_t * f, int32_t item_start_id t->track_fix_main_size += item_size + item_gap; } - t->track_cross_size = LV_MAX(get_cross_size(item), t->track_cross_size); t->item_cnt++; } @@ -444,7 +444,6 @@ static void children_repos(lv_obj_t * cont, flex_t * f, int32_t item_first_id, i } } - bool rtl = lv_obj_get_style_base_dir(cont, LV_PART_MAIN) == LV_BASE_DIR_RTL ? true : false; lv_coord_t main_pos = 0; @@ -511,7 +510,6 @@ static void children_repos(lv_obj_t * cont, flex_t * f, int32_t item_first_id, i if(f->row && rtl) main_pos -= area_get_main_size(&item->coords); - /*Handle percentage value of translate*/ lv_coord_t tr_x = lv_obj_get_style_translate_x(item, LV_PART_MAIN); lv_coord_t tr_y = lv_obj_get_style_translate_y(item, LV_PART_MAIN); diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/layouts/flex/lv_flex.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/layouts/flex/lv_flex.h similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/layouts/flex/lv_flex.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/layouts/flex/lv_flex.h diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/layouts/grid/Makefile b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/layouts/grid/Makefile similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/layouts/grid/Makefile rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/layouts/grid/Makefile diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/layouts/grid/lv_grid.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/layouts/grid/lv_grid.c similarity index 99% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/layouts/grid/lv_grid.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/layouts/grid/lv_grid.c index 74f8e95..7a6570c 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/layouts/grid/lv_grid.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/layouts/grid/lv_grid.c @@ -40,7 +40,6 @@ typedef struct { lv_coord_t grid_h; } _lv_grid_calc_t; - /********************** * GLOBAL PROTOTYPES **********************/ @@ -126,7 +125,6 @@ lv_style_prop_t LV_STYLE_GRID_CELL_Y_ALIGN; * GLOBAL FUNCTIONS **********************/ - void lv_grid_init(void) { LV_LAYOUT_GRID = lv_layout_register(grid_update, NULL); @@ -172,7 +170,6 @@ void lv_obj_set_grid_cell(lv_obj_t * obj, lv_grid_align_t x_align, uint8_t col_p lv_obj_mark_layout_as_dirty(lv_obj_get_parent(obj)); } - void lv_style_set_grid_row_dsc_array(lv_style_t * style, const lv_coord_t value[]) { lv_style_value_t v = { @@ -205,7 +202,6 @@ void lv_style_set_grid_column_align(lv_style_t * style, lv_grid_align_t value) lv_style_set_prop(style, LV_STYLE_GRID_COLUMN_ALIGN, v); } - void lv_style_set_grid_cell_column_pos(lv_style_t * style, lv_coord_t value) { lv_style_value_t v = { @@ -270,7 +266,6 @@ void lv_obj_set_style_grid_column_dsc_array(lv_obj_t * obj, const lv_coord_t val lv_obj_set_local_style_prop(obj, LV_STYLE_GRID_COLUMN_DSC_ARRAY, v, selector); } - void lv_obj_set_style_grid_row_align(lv_obj_t * obj, lv_grid_align_t value, lv_style_selector_t selector) { lv_style_value_t v = { @@ -287,7 +282,6 @@ void lv_obj_set_style_grid_column_align(lv_obj_t * obj, lv_grid_align_t value, l lv_obj_set_local_style_prop(obj, LV_STYLE_GRID_COLUMN_ALIGN, v, selector); } - void lv_obj_set_style_grid_cell_column_pos(lv_obj_t * obj, lv_coord_t value, lv_style_selector_t selector) { lv_style_value_t v = { @@ -336,7 +330,6 @@ void lv_obj_set_style_grid_cell_y_align(lv_obj_t * obj, lv_coord_t value, lv_sty lv_obj_set_local_style_prop(obj, LV_STYLE_GRID_CELL_Y_ALIGN, v, selector); } - /********************** * STATIC FUNCTIONS **********************/ @@ -548,7 +541,6 @@ static void calc_rows(lv_obj_t * cont, _lv_grid_calc_t * c) } } - lv_coord_t row_gap = lv_obj_get_style_pad_row(cont, LV_PART_MAIN); lv_coord_t cont_h = lv_obj_get_content_height(cont) - row_gap * (c->row_num - 1); lv_coord_t free_h = cont_h - grid_h; @@ -591,7 +583,6 @@ static void item_repos(lv_obj_t * item, _lv_grid_calc_t * c, item_repos_hint_t * lv_grid_align_t col_align = get_cell_col_align(item); lv_grid_align_t row_align = get_cell_row_align(item); - lv_coord_t col_x1 = c->x[col_pos]; lv_coord_t col_x2 = c->x[col_pos + col_span - 1] + c->w[col_pos + col_span - 1]; lv_coord_t col_w = col_x2 - col_x1; @@ -600,7 +591,6 @@ static void item_repos(lv_obj_t * item, _lv_grid_calc_t * c, item_repos_hint_t * lv_coord_t row_y2 = c->y[row_pos + row_span - 1] + c->h[row_pos + row_span - 1]; lv_coord_t row_h = row_y2 - row_y1; - /*If the item has RTL base dir switch start and end*/ if(lv_obj_get_style_base_dir(item, LV_PART_MAIN) == LV_BASE_DIR_RTL) { if(col_align == LV_GRID_ALIGN_START) col_align = LV_GRID_ALIGN_END; @@ -778,5 +768,4 @@ static uint32_t count_tracks(const lv_coord_t * templ) return i; } - #endif /*LV_USE_GRID*/ diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/layouts/grid/lv_grid.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/layouts/grid/lv_grid.h similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/layouts/grid/lv_grid.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/layouts/grid/lv_grid.h diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/layouts/lv_layouts.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/layouts/lv_layouts.h similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/layouts/lv_layouts.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/layouts/lv_layouts.h diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/Makefile b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/libs/Makefile similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/Makefile rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/libs/Makefile diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/bmp/Makefile b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/libs/bmp/Makefile similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/bmp/Makefile rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/libs/bmp/Makefile diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/bmp/lv_bmp.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/libs/bmp/lv_bmp.c similarity index 99% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/bmp/lv_bmp.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/libs/bmp/lv_bmp.c index f89a0a8..6039009 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/bmp/lv_bmp.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/libs/bmp/lv_bmp.c @@ -34,7 +34,6 @@ typedef struct { static lv_res_t decoder_info(lv_img_decoder_t * decoder, const void * src, lv_img_header_t * header); static lv_res_t decoder_open(lv_img_decoder_t * dec, lv_img_decoder_dsc_t * dsc); - static lv_res_t decoder_read_line(lv_img_decoder_t * decoder, lv_img_decoder_dsc_t * dsc, lv_coord_t x, lv_coord_t y, lv_coord_t len, uint8_t * buf); @@ -114,7 +113,6 @@ static lv_res_t decoder_info(lv_img_decoder_t * decoder, const void * src, lv_im return LV_RES_INV; /*If didn't succeeded earlier then it's an error*/ } - /** * Open a PNG image and return the decided image * @param src can be file name or pointer to a C array @@ -190,7 +188,6 @@ static lv_res_t decoder_open(lv_img_decoder_t * decoder, lv_img_decoder_dsc_t * return LV_RES_INV; /*If not returned earlier then it failed*/ } - static lv_res_t decoder_read_line(lv_img_decoder_t * decoder, lv_img_decoder_dsc_t * dsc, lv_coord_t x, lv_coord_t y, lv_coord_t len, uint8_t * buf) { @@ -242,7 +239,6 @@ static lv_res_t decoder_read_line(lv_img_decoder_t * decoder, lv_img_decoder_dsc return LV_RES_OK; } - /** * Free the allocated resources */ diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/bmp/lv_bmp.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/libs/bmp/lv_bmp.h similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/bmp/lv_bmp.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/libs/bmp/lv_bmp.h diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/ffmpeg/Makefile b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/libs/ffmpeg/Makefile similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/ffmpeg/Makefile rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/libs/ffmpeg/Makefile diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/ffmpeg/lv_ffmpeg.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/libs/ffmpeg/lv_ffmpeg.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/ffmpeg/lv_ffmpeg.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/libs/ffmpeg/lv_ffmpeg.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/ffmpeg/lv_ffmpeg.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/libs/ffmpeg/lv_ffmpeg.h similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/ffmpeg/lv_ffmpeg.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/libs/ffmpeg/lv_ffmpeg.h diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/freetype/Makefile b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/libs/freetype/Makefile similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/freetype/Makefile rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/libs/freetype/Makefile diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/freetype/arial.ttf b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/libs/freetype/arial.ttf similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/freetype/arial.ttf rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/libs/freetype/arial.ttf diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/freetype/lv_freetype.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/libs/freetype/lv_freetype.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/freetype/lv_freetype.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/libs/freetype/lv_freetype.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/freetype/lv_freetype.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/libs/freetype/lv_freetype.h similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/freetype/lv_freetype.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/libs/freetype/lv_freetype.h diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/fsdrv/Makefile b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/libs/fsdrv/Makefile similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/fsdrv/Makefile rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/libs/fsdrv/Makefile diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/fsdrv/lv_fs_fatfs.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/libs/fsdrv/lv_fs_fatfs.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/fsdrv/lv_fs_fatfs.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/libs/fsdrv/lv_fs_fatfs.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/libs/fsdrv/lv_fs_littlefs.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/libs/fsdrv/lv_fs_littlefs.c new file mode 100644 index 0000000..44261c3 --- /dev/null +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/libs/fsdrv/lv_fs_littlefs.c @@ -0,0 +1,332 @@ +/** + * @file lv_fs_littlefs.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "../../../lvgl.h" + +#if LV_USE_FS_LITTLEFS +#include "lfs.h" + +/********************* + * DEFINES + *********************/ + +#if LV_FS_LITTLEFS_LETTER == '\0' + #error "LV_FS_LITTLEFS_LETTER must be an upper case ASCII letter" +#endif + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +static void fs_init(void); + +static void * fs_open(lv_fs_drv_t * drv, const char * path, lv_fs_mode_t mode); +static lv_fs_res_t fs_close(lv_fs_drv_t * drv, void * file_p); + +static lv_fs_res_t fs_read(lv_fs_drv_t * drv, void * file_p, void * buf, uint32_t btr, uint32_t * br); +static lv_fs_res_t fs_write(lv_fs_drv_t * drv, void * file_p, const void * buf, uint32_t btw, uint32_t * bw); + +static lv_fs_res_t fs_seek(lv_fs_drv_t * drv, void * file_p, uint32_t pos, lv_fs_whence_t whence); +static lv_fs_res_t fs_tell(lv_fs_drv_t * drv, void * file_p, uint32_t * pos_p); + +static void * fs_dir_open(lv_fs_drv_t * drv, const char * path); +static lv_fs_res_t fs_dir_read(lv_fs_drv_t * drv, void * dir_p, char * fn); +static lv_fs_res_t fs_dir_close(lv_fs_drv_t * drv, void * dir_p); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_fs_littlefs_init(void) +{ + /*---------------------------------------------------- + * Initialize your storage device and File System + * -------------------------------------------------*/ + fs_init(); + + /*--------------------------------------------------- + * Register the file system interface in LVGL + *--------------------------------------------------*/ + + /*Add a simple drive to open images*/ + static lv_fs_drv_t fs_drv; /*A driver descriptor*/ + lv_fs_drv_init(&fs_drv); + + /*Set up fields...*/ + fs_drv.letter = LV_FS_LITTLEFS_LETTER; + fs_drv.cache_size = LV_FS_LITTLEFS_CACHE_SIZE; + + fs_drv.open_cb = fs_open; + fs_drv.close_cb = fs_close; + fs_drv.read_cb = fs_read; + fs_drv.write_cb = fs_write; + fs_drv.seek_cb = fs_seek; + fs_drv.tell_cb = fs_tell; + + fs_drv.dir_open_cb = fs_dir_open; + fs_drv.dir_close_cb = fs_dir_close; + fs_drv.dir_read_cb = fs_dir_read; + + /*#if LV_USE_USER_DATA*/ + fs_drv.user_data = NULL; + /*#endif*/ + + lv_fs_drv_register(&fs_drv); +} + +/** + * Convenience function to attach registered driver to lfs_t structure by driver-label + * @param label the label assigned to the driver when it was registered + * @param lfs_p the pointer to the lfs_t structure initialized by external code/library + * @return pointer to a driver descriptor or NULL on error + */ +lv_fs_drv_t * lv_fs_littlefs_set_driver(char label, void * lfs_p) +{ + lv_fs_drv_t * drv_p = lv_fs_get_drv(label); + if(drv_p != NULL) drv_p->user_data = (lfs_t *) lfs_p; + return drv_p; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +/*Initialize your Storage device and File system.*/ +static void fs_init(void) +{ + /* Initialize the internal flash or SD-card and LittleFS itself. + * Better to do it in your code to keep this library untouched for easy updating */ +} + +/** + * Open a file + * @param drv pointer to a driver where this function belongs + * @param path path to the file beginning with the driver letter (e.g. S:/folder/file.txt) + * @param mode read: FS_MODE_RD, write: FS_MODE_WR, both: FS_MODE_RD | FS_MODE_WR + * @return pointer to a file descriptor or NULL on error + */ +static void * fs_open(lv_fs_drv_t * drv, const char * path, lv_fs_mode_t mode) +{ + lfs_t * lfs_p = drv->user_data; + uint32_t flags = 0; + + flags = mode == LV_FS_MODE_RD ? LFS_O_RDONLY + : mode == LV_FS_MODE_WR ? LFS_O_WRONLY + : mode == (LV_FS_MODE_WR | LV_FS_MODE_RD) ? LFS_O_RDWR : 0; + + lfs_file_t * file_p = lv_mem_alloc(sizeof(lfs_file_t)); + if(file_p == NULL) return NULL; + + int result = lfs_file_open(lfs_p, file_p, path, flags); + + if(result != LFS_ERR_OK) { + lv_mem_free(file_p); + return NULL; + } + + return file_p; +} + +/** + * Close an opened file + * @param drv pointer to a driver where this function belongs + * @param file_p pointer to a file_t variable. (opened with fs_open) + * @return LV_FS_RES_OK: no error or any error from @lv_fs_res_t enum + */ +static lv_fs_res_t fs_close(lv_fs_drv_t * drv, void * file_p) +{ + lfs_t * lfs_p = drv->user_data; + + int result = lfs_file_close(lfs_p, file_p); + lv_mem_free(file_p); + /*lv_mem_free( lfs_p );*/ /*allocated and freed by outside-code*/ + + if(result != LFS_ERR_OK) return LV_FS_RES_UNKNOWN; + return LV_FS_RES_OK; +} + +/** + * Read data from an opened file + * @param drv pointer to a driver where this function belongs + * @param file_p pointer to a file_t variable. + * @param buf pointer to a memory block where to store the read data + * @param btr number of Bytes To Read + * @param br the real number of read bytes (Byte Read) + * @return LV_FS_RES_OK: no error or any error from @lv_fs_res_t enum + */ +static lv_fs_res_t fs_read(lv_fs_drv_t * drv, void * file_p, void * buf, uint32_t btr, uint32_t * br) +{ + lfs_t * lfs_p = drv->user_data; + + lfs_ssize_t result = lfs_file_read(lfs_p, file_p, buf, btr); + if(result < 0) return LV_FS_RES_UNKNOWN; + + *br = (uint32_t) result; + return LV_FS_RES_OK; +} + +/** + * Write into a file + * @param drv pointer to a driver where this function belongs + * @param file_p pointer to a file_t variable + * @param buf pointer to a buffer with the bytes to write + * @param btw Bytes To Write + * @param bw the number of real written bytes (Bytes Written). NULL if unused. + * @return LV_FS_RES_OK: no error or any error from @lv_fs_res_t enum + */ +static lv_fs_res_t fs_write(lv_fs_drv_t * drv, void * file_p, const void * buf, uint32_t btw, uint32_t * bw) +{ +#ifndef LFS_READONLY + lfs_t * lfs_p = drv->user_data; + + lfs_ssize_t result = lfs_file_write(lfs_p, file_p, buf, btw); + if(result < 0 || lfs_file_sync(lfs_p, file_p) < 0) return LV_FS_RES_UNKNOWN; + + *bw = (uint32_t) result; + return LV_FS_RES_OK; +#else + return LV_FS_RES_NOT_IMP; +#endif +} + +/** + * Set the read write pointer. Also expand the file size if necessary. + * @param drv pointer to a driver where this function belongs + * @param file_p pointer to a file_t variable. (opened with fs_open ) + * @param pos the new position of read write pointer + * @param whence tells from where to interpret the `pos`. See @lv_fs_whence_t + * @return LV_FS_RES_OK: no error or any error from @lv_fs_res_t enum + */ +static lv_fs_res_t fs_seek(lv_fs_drv_t * drv, void * file_p, uint32_t pos, lv_fs_whence_t whence) +{ + lfs_t * lfs_p = drv->user_data; + + int lfs_whence = whence == LV_FS_SEEK_SET ? LFS_SEEK_SET + : whence == LV_FS_SEEK_CUR ? LFS_SEEK_CUR + : whence == LV_FS_SEEK_END ? LFS_SEEK_END : 0; + + lfs_soff_t result = lfs_file_seek(lfs_p, file_p, pos, lfs_whence); + if(result < 0) return LV_FS_RES_UNKNOWN; + + /*pos = result;*/ /*not supported by lv_fs*/ + return LV_FS_RES_OK; +} + +/** + * Give the position of the read write pointer + * @param drv pointer to a driver where this function belongs + * @param file_p pointer to a file_t variable. + * @param pos_p pointer to where to store the result + * @return LV_FS_RES_OK: no error or any error from @lv_fs_res_t enum + */ +static lv_fs_res_t fs_tell(lv_fs_drv_t * drv, void * file_p, uint32_t * pos_p) +{ + lfs_t * lfs_p = drv->user_data; + + lfs_soff_t result = lfs_file_tell(lfs_p, file_p); + if(result < 0) return LV_FS_RES_UNKNOWN; + + *pos_p = (uint32_t) result; + return LV_FS_RES_OK; +} + +/** + * Initialize a 'lv_fs_dir_t' variable for directory reading + * @param drv pointer to a driver where this function belongs + * @param path path to a directory + * @return pointer to the directory read descriptor or NULL on error + */ +static void * fs_dir_open(lv_fs_drv_t * drv, const char * path) +{ + lfs_t * lfs_p = drv->user_data; + + lfs_dir_t * dir_p = lv_mem_alloc(sizeof(lfs_dir_t)); + if(dir_p == NULL) return NULL; + + int result = lfs_dir_open(lfs_p, dir_p, path); + if(result != LFS_ERR_OK) { + lv_mem_free(dir_p); + return NULL; + } + + return dir_p; +} + +/** + * Read the next filename form a directory. + * The name of the directories will begin with '/' + * @param drv pointer to a driver where this function belongs + * @param rddir_p pointer to an initialized 'lv_fs_dir_t' variable + * @param fn pointer to a buffer to store the filename + * @return LV_FS_RES_OK: no error or any error from @lv_fs_res_t enum + */ +static lv_fs_res_t fs_dir_read(lv_fs_drv_t * drv, void * rddir_p, char * fn) +{ + lfs_t * lfs_p = drv->user_data; + struct lfs_info info; + int result; + + info.name[0] = '\0'; + + do { + result = lfs_dir_read(lfs_p, rddir_p, &info); + if(result > 0) { + if(info.type == LFS_TYPE_DIR) { + fn[0] = '/'; + strcpy(&fn[1], info.name); + } + else strcpy(fn, info.name); + } + else if(result == 0) fn[0] = '\0'; /*dir-scan ended*/ + else return LV_FS_RES_UNKNOWN; + + } while(!strcmp(fn, "/.") || !strcmp(fn, "/..")); + + return LV_FS_RES_OK; +} + +/** + * Close the directory reading + * @param drv pointer to a driver where this function belongs + * @param rddir_p pointer to an initialized 'lv_fs_dir_t' variable + * @return LV_FS_RES_OK: no error or any error from @lv_fs_res_t enum + */ +static lv_fs_res_t fs_dir_close(lv_fs_drv_t * drv, void * rddir_p) +{ + lfs_t * lfs_p = drv->user_data; + + int result = lfs_dir_close(lfs_p, rddir_p); + lv_mem_free(rddir_p); + + if(result != LFS_ERR_OK) return LV_FS_RES_UNKNOWN; + return LV_FS_RES_OK; +} + +#else /*LV_USE_FS_LITTLEFS == 0*/ + +#if defined(LV_FS_LITTLEFS_LETTER) && LV_FS_LITTLEFS_LETTER != '\0' + #warning "LV_USE_FS_LITTLEFS is not enabled but LV_FS_LITTLEFS_LETTER is set" +#endif + +#endif /*LV_USE_FS_POSIX*/ diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/fsdrv/lv_fs_posix.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/libs/fsdrv/lv_fs_posix.c similarity index 98% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/fsdrv/lv_fs_posix.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/libs/fsdrv/lv_fs_posix.c index f988dae..86f404f 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/fsdrv/lv_fs_posix.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/libs/fsdrv/lv_fs_posix.c @@ -3,7 +3,6 @@ * */ - /********************* * INCLUDES *********************/ @@ -104,15 +103,15 @@ static void * fs_open(lv_fs_drv_t * drv, const char * path, lv_fs_mode_t mode) LV_UNUSED(drv); uint32_t flags = 0; - if(mode == LV_FS_MODE_WR) flags = O_WRONLY; + if(mode == LV_FS_MODE_WR) flags = O_WRONLY | O_CREAT; else if(mode == LV_FS_MODE_RD) flags = O_RDONLY; - else if(mode == (LV_FS_MODE_WR | LV_FS_MODE_RD)) flags = O_RDWR; + else if(mode == (LV_FS_MODE_WR | LV_FS_MODE_RD)) flags = O_RDWR | O_CREAT; /*Make the path relative to the current directory (the projects root folder)*/ char buf[256]; lv_snprintf(buf, sizeof(buf), LV_FS_POSIX_PATH "%s", path); - int f = open(buf, flags); + int f = open(buf, flags, 0666); if(f < 0) return NULL; return (void *)(lv_uintptr_t)f; diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/fsdrv/lv_fs_stdio.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/libs/fsdrv/lv_fs_stdio.c similarity index 99% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/fsdrv/lv_fs_stdio.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/libs/fsdrv/lv_fs_stdio.c index c2de688..5472e80 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/fsdrv/lv_fs_stdio.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/libs/fsdrv/lv_fs_stdio.c @@ -3,7 +3,6 @@ * */ - /********************* * INCLUDES *********************/ @@ -326,4 +325,3 @@ static lv_fs_res_t fs_dir_close(lv_fs_drv_t * drv, void * dir_p) #endif #endif /*LV_USE_FS_POSIX*/ - diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/fsdrv/lv_fs_win32.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/libs/fsdrv/lv_fs_win32.c similarity index 99% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/fsdrv/lv_fs_win32.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/libs/fsdrv/lv_fs_win32.c index 1a59aa4..5cd016f 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/fsdrv/lv_fs_win32.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/libs/fsdrv/lv_fs_win32.c @@ -3,7 +3,6 @@ * */ - /********************* * INCLUDES *********************/ diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/fsdrv/lv_fsdrv.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/libs/fsdrv/lv_fsdrv.h similarity index 85% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/fsdrv/lv_fsdrv.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/libs/fsdrv/lv_fsdrv.h index 285d598..b864ad6 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/fsdrv/lv_fsdrv.h +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/libs/fsdrv/lv_fsdrv.h @@ -31,6 +31,11 @@ extern "C" { void lv_fs_fatfs_init(void); #endif +#if LV_USE_FS_LITTLEFS != '\0' +void lv_fs_littlefs_init(void); +lv_fs_drv_t * lv_fs_littlefs_set_driver(char label, void * lfs_p); +#endif + #if LV_USE_FS_STDIO != '\0' void lv_fs_stdio_init(void); #endif diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/gif/Makefile b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/libs/gif/Makefile similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/gif/Makefile rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/libs/gif/Makefile diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/gif/gifdec.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/libs/gif/gifdec.c similarity index 96% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/gif/gifdec.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/libs/gif/gifdec.c index 68f5005..3ee9b71 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/gif/gifdec.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/libs/gif/gifdec.c @@ -160,6 +160,7 @@ static gd_GIF * gif_open(gd_GIF * gif_base) #endif } gif->anim_start = f_gif_seek(gif, 0, LV_FS_SEEK_CUR); + gif->loop_count = -1; goto ok; fail: f_gif_close(gif_base); @@ -239,6 +240,7 @@ read_application_ext(gd_GIF *gif) { char app_id[8]; char app_auth_code[3]; + uint16_t loop_count; /* Discard block size (always 0x0B). */ f_gif_seek(gif, 1, LV_FS_SEEK_CUR); @@ -249,7 +251,15 @@ read_application_ext(gd_GIF *gif) if (!strncmp(app_id, "NETSCAPE", sizeof(app_id))) { /* Discard block size (0x03) and constant byte (0x01). */ f_gif_seek(gif, 2, LV_FS_SEEK_CUR); - gif->loop_count = read_num(gif); + loop_count = read_num(gif); + if(gif->loop_count < 0) { + if(loop_count == 0) { + gif->loop_count = 0; + } + else{ + gif->loop_count = loop_count + 1; + } + } /* Skip block terminator. */ f_gif_seek(gif, 1, LV_FS_SEEK_CUR); } else if (gif->application) { @@ -568,9 +578,16 @@ gd_get_frame(gd_GIF *gif) dispose(gif); f_gif_read(gif, &sep, 1); while (sep != ',') { - if (sep == ';') - return 0; - if (sep == '!') + if (sep == ';') { + f_gif_seek(gif, gif->anim_start, LV_FS_SEEK_SET); + if(gif->loop_count == 1 || gif->loop_count < 0) { + return 0; + } + else if(gif->loop_count > 1) { + gif->loop_count--; + } + } + else if (sep == '!') read_ext(gif); else return -1; f_gif_read(gif, &sep, 1); @@ -598,6 +615,7 @@ gd_render_frame(gd_GIF *gif, uint8_t *buffer) void gd_rewind(gd_GIF *gif) { + gif->loop_count = -1; f_gif_seek(gif, gif->anim_start, LV_FS_SEEK_SET); } diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/gif/gifdec.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/libs/gif/gifdec.h similarity index 98% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/gif/gifdec.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/libs/gif/gifdec.h index 00f17c1..b68fab5 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/gif/gifdec.h +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/libs/gif/gifdec.h @@ -29,7 +29,7 @@ typedef struct gd_GIF { int32_t anim_start; uint16_t width, height; uint16_t depth; - uint16_t loop_count; + int32_t loop_count; gd_GCE gce; gd_Palette *palette; gd_Palette lct, gct; diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/gif/lv_gif.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/libs/gif/lv_gif.c similarity index 91% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/gif/lv_gif.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/libs/gif/lv_gif.c index 4cb2955..8a8046e 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/gif/lv_gif.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/libs/gif/lv_gif.c @@ -20,7 +20,6 @@ * TYPEDEFS **********************/ - /********************** * STATIC PROTOTYPES **********************/ @@ -99,6 +98,8 @@ void lv_gif_restart(lv_obj_t * obj) { lv_gif_t * gifobj = (lv_gif_t *) obj; gd_rewind(gifobj->gif); + lv_timer_resume(gifobj->timer); + lv_timer_reset(gifobj->timer); } /********************** @@ -111,6 +112,7 @@ static void lv_gif_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) lv_gif_t * gifobj = (lv_gif_t *) obj; + gifobj->gif = NULL; gifobj->timer = lv_timer_create(next_frame_task_cb, 10, obj); lv_timer_pause(gifobj->timer); } @@ -120,7 +122,8 @@ static void lv_gif_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj) LV_UNUSED(class_p); lv_gif_t * gifobj = (lv_gif_t *) obj; lv_img_cache_invalidate_src(&gifobj->imgdsc); - gd_close_gif(gifobj->gif); + if(gifobj->gif) + gd_close_gif(gifobj->gif); lv_timer_del(gifobj->timer); } @@ -136,14 +139,9 @@ static void next_frame_task_cb(lv_timer_t * t) int has_next = gd_get_frame(gifobj->gif); if(has_next == 0) { /*It was the last repeat*/ - if(gifobj->gif->loop_count == 1) { - lv_res_t res = lv_event_send(obj, LV_EVENT_READY, NULL); - if(res != LV_FS_RES_OK) return; - } - else { - if(gifobj->gif->loop_count > 1) gifobj->gif->loop_count--; - gd_rewind(gifobj->gif); - } + lv_res_t res = lv_event_send(obj, LV_EVENT_READY, NULL); + lv_timer_pause(t); + if(res != LV_FS_RES_OK) return; } gd_render_frame(gifobj->gif, (uint8_t *)gifobj->imgdsc.data); diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/gif/lv_gif.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/libs/gif/lv_gif.h similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/gif/lv_gif.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/libs/gif/lv_gif.h diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/lv_libs.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/libs/lv_libs.h similarity index 95% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/lv_libs.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/libs/lv_libs.h index 6782b1d..1fefe6c 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/lv_libs.h +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/libs/lv_libs.h @@ -22,6 +22,7 @@ extern "C" { #include "freetype/lv_freetype.h" #include "rlottie/lv_rlottie.h" #include "ffmpeg/lv_ffmpeg.h" +#include "tiny_ttf/lv_tiny_ttf.h" /********************* * DEFINES diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/png/Makefile b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/libs/png/Makefile similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/png/Makefile rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/libs/png/Makefile diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/png/lodepng.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/libs/png/lodepng.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/png/lodepng.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/libs/png/lodepng.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/png/lodepng.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/libs/png/lodepng.h similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/png/lodepng.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/libs/png/lodepng.h diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/png/lv_png.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/libs/png/lv_png.c similarity index 82% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/png/lv_png.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/libs/png/lv_png.c index d067ef5..75b196c 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/png/lv_png.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/libs/png/lv_png.c @@ -28,6 +28,7 @@ static lv_res_t decoder_info(struct _lv_img_decoder_t * decoder, const void * sr static lv_res_t decoder_open(lv_img_decoder_t * dec, lv_img_decoder_dsc_t * dsc); static void decoder_close(lv_img_decoder_t * dec, lv_img_decoder_dsc_t * dsc); static void convert_color_depth(uint8_t * img, uint32_t px_cnt); +static inline lv_color_t lv_color_make_rounding(uint8_t r, uint8_t g, uint8_t b); /********************** * STATIC VARIABLES @@ -103,20 +104,39 @@ static lv_res_t decoder_info(struct _lv_img_decoder_t * decoder, const void * sr else if(src_type == LV_IMG_SRC_VARIABLE) { const lv_img_dsc_t * img_dsc = src; const uint32_t data_size = img_dsc->data_size; + const uint32_t * size = ((uint32_t *)img_dsc->data) + 4; const uint8_t magic[] = {0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a}; if(data_size < sizeof(magic)) return LV_RES_INV; if(memcmp(magic, img_dsc->data, sizeof(magic))) return LV_RES_INV; header->always_zero = 0; - header->cf = img_dsc->header.cf; /*Save the color format*/ - header->w = img_dsc->header.w; /*Save the color width*/ - header->h = img_dsc->header.h; /*Save the color height*/ + + if(img_dsc->header.cf) { + header->cf = img_dsc->header.cf; /*Save the color format*/ + } + else { + header->cf = LV_IMG_CF_TRUE_COLOR_ALPHA; + } + + if(img_dsc->header.w) { + header->w = img_dsc->header.w; /*Save the image width*/ + } + else { + header->w = (lv_coord_t)((size[0] & 0xff000000) >> 24) + ((size[0] & 0x00ff0000) >> 8); + } + + if(img_dsc->header.h) { + header->h = img_dsc->header.h; /*Save the color height*/ + } + else { + header->h = (lv_coord_t)((size[1] & 0xff000000) >> 24) + ((size[1] & 0x00ff0000) >> 8); + } + return LV_RES_OK; } return LV_RES_INV; /*If didn't succeeded earlier then it's an error*/ } - /** * Open a PNG image and return the decided image * @param src can be file name or pointer to a C array @@ -142,13 +162,13 @@ static lv_res_t decoder_open(lv_img_decoder_t * decoder, lv_img_decoder_dsc_t * error = lodepng_load_file(&png_data, &png_data_size, fn); /*Load the file*/ if(error) { - LV_LOG_WARN("error %u: %s\n", error, lodepng_error_text(error)); + LV_LOG_WARN("error %" LV_PRIu32 ": %s\n", error, lodepng_error_text(error)); return LV_RES_INV; } /*Decode the PNG image*/ - uint32_t png_width; /*Will be the width of the decoded image*/ - uint32_t png_height; /*Will be the width of the decoded image*/ + unsigned png_width; /*Will be the width of the decoded image*/ + unsigned png_height; /*Will be the width of the decoded image*/ /*Decode the loaded image in ARGB8888 */ error = lodepng_decode32(&img_data, &png_width, &png_height, png_data, png_data_size); @@ -157,7 +177,7 @@ static lv_res_t decoder_open(lv_img_decoder_t * decoder, lv_img_decoder_dsc_t * if(img_data != NULL) { lv_mem_free(img_data); } - LV_LOG_WARN("error %u: %s\n", error, lodepng_error_text(error)); + LV_LOG_WARN("error %" LV_PRIu32 ": %s\n", error, lodepng_error_text(error)); return LV_RES_INV; } @@ -170,8 +190,8 @@ static lv_res_t decoder_open(lv_img_decoder_t * decoder, lv_img_decoder_dsc_t * /*If it's a PNG file in a C array...*/ else if(dsc->src_type == LV_IMG_SRC_VARIABLE) { const lv_img_dsc_t * img_dsc = dsc->src; - uint32_t png_width; /*No used, just required by he decoder*/ - uint32_t png_height; /*No used, just required by he decoder*/ + unsigned png_width; /*No used, just required by he decoder*/ + unsigned png_height; /*No used, just required by he decoder*/ /*Decode the image in ARGB8888 */ error = lodepng_decode32(&img_data, &png_width, &png_height, img_dsc->data, img_dsc->data_size); @@ -227,7 +247,7 @@ static void convert_color_depth(uint8_t * img, uint32_t px_cnt) lv_color_t c; uint32_t i; for(i = 0; i < px_cnt; i++) { - c = lv_color_make(img_argb[i].ch.blue, img_argb[i].ch.green, img_argb[i].ch.red); + c = lv_color_make_rounding(img_argb[i].ch.blue, img_argb[i].ch.green, img_argb[i].ch.red); img[i * 3 + 2] = img_argb[i].ch.alpha; img[i * 3 + 1] = c.full >> 8; img[i * 3 + 0] = c.full & 0xFF; @@ -237,7 +257,7 @@ static void convert_color_depth(uint8_t * img, uint32_t px_cnt) lv_color_t c; uint32_t i; for(i = 0; i < px_cnt; i++) { - c = lv_color_make(img_argb[i].ch.red, img_argb[i].ch.green, img_argb[i].ch.blue); + c = lv_color_make_rounding(img_argb[i].ch.red, img_argb[i].ch.green, img_argb[i].ch.blue); img[i * 2 + 1] = img_argb[i].ch.alpha; img[i * 2 + 0] = c.full; } @@ -253,6 +273,15 @@ static void convert_color_depth(uint8_t * img, uint32_t px_cnt) #endif } +static inline lv_color_t lv_color_make_rounding(uint8_t r, uint8_t g, uint8_t b) +{ +#if LV_COLOR_DEPTH == 16 + if(r <= 251) r += 4; + if(g <= 253) g += 2; + if(b <= 251) b += 4; +#endif + + return lv_color_make(r, g, b); +} + #endif /*LV_USE_PNG*/ - - diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/png/lv_png.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/libs/png/lv_png.h similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/png/lv_png.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/libs/png/lv_png.h diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/qrcode/Makefile b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/libs/qrcode/Makefile similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/qrcode/Makefile rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/libs/qrcode/Makefile diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/qrcode/lv_qrcode.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/libs/qrcode/lv_qrcode.c similarity index 99% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/qrcode/lv_qrcode.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/libs/qrcode/lv_qrcode.c index 079873e..3e7b53f 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/qrcode/lv_qrcode.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/libs/qrcode/lv_qrcode.c @@ -178,7 +178,6 @@ lv_res_t lv_qrcode_update(lv_obj_t * qrcode, const void * data, uint32_t data_le return LV_RES_OK; } - void lv_qrcode_delete(lv_obj_t * qrcode) { lv_obj_del(qrcode); diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/qrcode/lv_qrcode.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/libs/qrcode/lv_qrcode.h similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/qrcode/lv_qrcode.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/libs/qrcode/lv_qrcode.h diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/qrcode/qrcodegen.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/libs/qrcode/qrcodegen.c similarity index 94% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/qrcode/qrcodegen.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/libs/qrcode/qrcodegen.c index 37ee742..bd9f08b 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/qrcode/qrcodegen.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/libs/qrcode/qrcodegen.c @@ -21,11 +21,11 @@ * Software. */ -#include #include #include #include #include "qrcodegen.h" +#include "../../../misc/lv_assert.h" #ifndef QRCODEGEN_TEST #define testable static // Keep functions private @@ -127,12 +127,12 @@ static const int PENALTY_N4 = 10; // Public function - see documentation comment in header file. bool qrcodegen_encodeText(const char *text, uint8_t tempBuffer[], uint8_t qrcode[], enum qrcodegen_Ecc ecl, int minVersion, int maxVersion, enum qrcodegen_Mask mask, bool boostEcl) { - + size_t textLen = strlen(text); if (textLen == 0) return qrcodegen_encodeSegmentsAdvanced(NULL, 0, ecl, minVersion, maxVersion, mask, boostEcl, tempBuffer, qrcode); size_t bufLen = qrcodegen_BUFFER_LEN_FOR_VERSION(maxVersion); - + struct qrcodegen_Segment seg; if (qrcodegen_isNumeric(text)) { if (qrcodegen_calcSegmentBufferSize(qrcodegen_Mode_NUMERIC, textLen) > bufLen) @@ -155,7 +155,7 @@ bool qrcodegen_encodeText(const char *text, uint8_t tempBuffer[], uint8_t qrcode seg.data = tempBuffer; } return qrcodegen_encodeSegmentsAdvanced(&seg, 1, ecl, minVersion, maxVersion, mask, boostEcl, tempBuffer, qrcode); - + fail: qrcode[0] = 0; // Set size to invalid value for safety return false; @@ -165,7 +165,7 @@ fail: // Public function - see documentation comment in header file. bool qrcodegen_encodeBinary(uint8_t dataAndTemp[], size_t dataLen, uint8_t qrcode[], enum qrcodegen_Ecc ecl, int minVersion, int maxVersion, enum qrcodegen_Mask mask, bool boostEcl) { - + struct qrcodegen_Segment seg; seg.mode = qrcodegen_Mode_BYTE; seg.bitLength = calcSegmentBitLength(seg.mode, dataLen); @@ -182,7 +182,7 @@ bool qrcodegen_encodeBinary(uint8_t dataAndTemp[], size_t dataLen, uint8_t qrcod // Appends the given number of low-order bits of the given value to the given byte-based // bit buffer, increasing the bit length. Requires 0 <= numBits <= 16 and val < 2^numBits. testable void appendBitsToBuffer(unsigned int val, int numBits, uint8_t buffer[], int *bitLen) { - assert(0 <= numBits && numBits <= 16 && (unsigned long)val >> numBits == 0); + LV_ASSERT(0 <= numBits && numBits <= 16 && (unsigned long)val >> numBits == 0); for (int i = numBits - 1; i >= 0; i--, (*bitLen)++) buffer[*bitLen >> 3] |= ((val >> i) & 1) << (7 - (*bitLen & 7)); } @@ -202,10 +202,10 @@ bool qrcodegen_encodeSegments(const struct qrcodegen_Segment segs[], size_t len, // Public function - see documentation comment in header file. bool qrcodegen_encodeSegmentsAdvanced(const struct qrcodegen_Segment segs[], size_t len, enum qrcodegen_Ecc ecl, int minVersion, int maxVersion, int mask, bool boostEcl, uint8_t tempBuffer[], uint8_t qrcode[]) { - assert(segs != NULL || len == 0); - assert(qrcodegen_VERSION_MIN <= minVersion && minVersion <= maxVersion && maxVersion <= qrcodegen_VERSION_MAX); - assert(0 <= (int)ecl && (int)ecl <= 3 && -1 <= (int)mask && (int)mask <= 7); - + LV_ASSERT(segs != NULL || len == 0); + LV_ASSERT(qrcodegen_VERSION_MIN <= minVersion && minVersion <= maxVersion && maxVersion <= qrcodegen_VERSION_MAX); + LV_ASSERT(0 <= (int)ecl && (int)ecl <= 3 && -1 <= (int)mask && (int)mask <= 7); + // Find the minimal version number to use int version, dataUsedBits; for (version = minVersion; ; version++) { @@ -218,14 +218,14 @@ bool qrcodegen_encodeSegmentsAdvanced(const struct qrcodegen_Segment segs[], siz return false; } } - assert(dataUsedBits != -1); - + LV_ASSERT(dataUsedBits != -1); + // Increase the error correction level while the data still fits in the current version number for (int i = (int)qrcodegen_Ecc_MEDIUM; i <= (int)qrcodegen_Ecc_HIGH; i++) { // From low to high if (boostEcl && dataUsedBits <= getNumDataCodewords(version, (enum qrcodegen_Ecc)i) * 8) ecl = (enum qrcodegen_Ecc)i; } - + // Concatenate all segments to create the data bit string memset(qrcode, 0, qrcodegen_BUFFER_LEN_FOR_VERSION(version) * sizeof(qrcode[0])); int bitLen = 0; @@ -236,29 +236,29 @@ bool qrcodegen_encodeSegmentsAdvanced(const struct qrcodegen_Segment segs[], siz for (int j = 0; j < seg->bitLength; j++) appendBitsToBuffer((seg->data[j >> 3] >> (7 - (j & 7))) & 1, 1, qrcode, &bitLen); } - assert(bitLen == dataUsedBits); - + LV_ASSERT(bitLen == dataUsedBits); + // Add terminator and pad up to a byte if applicable int dataCapacityBits = getNumDataCodewords(version, ecl) * 8; - assert(bitLen <= dataCapacityBits); + LV_ASSERT(bitLen <= dataCapacityBits); int terminatorBits = dataCapacityBits - bitLen; if (terminatorBits > 4) terminatorBits = 4; appendBitsToBuffer(0, terminatorBits, qrcode, &bitLen); appendBitsToBuffer(0, (8 - bitLen % 8) % 8, qrcode, &bitLen); - assert(bitLen % 8 == 0); - + LV_ASSERT(bitLen % 8 == 0); + // Pad with alternating bytes until data capacity is reached for (uint8_t padByte = 0xEC; bitLen < dataCapacityBits; padByte ^= 0xEC ^ 0x11) appendBitsToBuffer(padByte, 8, qrcode, &bitLen); - + // Draw function and data codeword modules addEccAndInterleave(qrcode, version, ecl, tempBuffer); initializeFunctionModules(version, qrcode); drawCodewords(tempBuffer, getNumRawDataModules(version) / 8, qrcode); drawWhiteFunctionModules(qrcode, version); initializeFunctionModules(version, tempBuffer); - + // Handle masking if (mask == qrcodegen_Mask_AUTO) { // Automatically choose best mask long minPenalty = LONG_MAX; @@ -274,7 +274,7 @@ bool qrcodegen_encodeSegmentsAdvanced(const struct qrcodegen_Segment segs[], siz applyMask(tempBuffer, qrcode, msk); // Undoes the mask due to XOR } } - assert(0 <= (int)mask && (int)mask <= 7); + LV_ASSERT(0 <= (int)mask && (int)mask <= 7); applyMask(tempBuffer, qrcode, mask); drawFormatBits(ecl, mask, qrcode); return true; @@ -290,14 +290,14 @@ bool qrcodegen_encodeSegmentsAdvanced(const struct qrcodegen_Segment segs[], siz // be clobbered by this function. The final answer is stored in result[0 : rawCodewords]. testable void addEccAndInterleave(uint8_t data[], int version, enum qrcodegen_Ecc ecl, uint8_t result[]) { // Calculate parameter numbers - assert(0 <= (int)ecl && (int)ecl < 4 && qrcodegen_VERSION_MIN <= version && version <= qrcodegen_VERSION_MAX); + LV_ASSERT(0 <= (int)ecl && (int)ecl < 4 && qrcodegen_VERSION_MIN <= version && version <= qrcodegen_VERSION_MAX); int numBlocks = NUM_ERROR_CORRECTION_BLOCKS[(int)ecl][version]; int blockEccLen = ECC_CODEWORDS_PER_BLOCK [(int)ecl][version]; int rawCodewords = getNumRawDataModules(version) / 8; int dataLen = getNumDataCodewords(version, ecl); int numShortBlocks = numBlocks - rawCodewords % numBlocks; int shortBlockDataLen = rawCodewords / numBlocks - blockEccLen; - + // Split data into blocks, calculate ECC, and interleave // (not concatenate) the bytes into a single sequence uint8_t generator[qrcodegen_REED_SOLOMON_DEGREE_MAX]; @@ -323,7 +323,7 @@ testable void addEccAndInterleave(uint8_t data[], int version, enum qrcodegen_Ec // for the given version number and error correction level. The result is in the range [9, 2956]. testable int getNumDataCodewords(int version, enum qrcodegen_Ecc ecl) { int v = version, e = (int)ecl; - assert(0 <= e && e < 4); + LV_ASSERT(0 <= e && e < 4); return getNumRawDataModules(v) / 8 - ECC_CODEWORDS_PER_BLOCK [e][v] * NUM_ERROR_CORRECTION_BLOCKS[e][v]; @@ -334,7 +334,7 @@ testable int getNumDataCodewords(int version, enum qrcodegen_Ecc ecl) { // all function modules are excluded. This includes remainder bits, so it might not be a multiple of 8. // The result is in the range [208, 29648]. This could be implemented as a 40-entry lookup table. testable int getNumRawDataModules(int ver) { - assert(qrcodegen_VERSION_MIN <= ver && ver <= qrcodegen_VERSION_MAX); + LV_ASSERT(qrcodegen_VERSION_MIN <= ver && ver <= qrcodegen_VERSION_MAX); int result = (16 * ver + 128) * ver + 64; if (ver >= 2) { int numAlign = ver / 7 + 2; @@ -352,10 +352,10 @@ testable int getNumRawDataModules(int ver) { // Calculates the Reed-Solomon generator polynomial of the given degree, storing in result[0 : degree]. testable void calcReedSolomonGenerator(int degree, uint8_t result[]) { // Start with the monomial x^0 - assert(1 <= degree && degree <= qrcodegen_REED_SOLOMON_DEGREE_MAX); + LV_ASSERT(1 <= degree && degree <= qrcodegen_REED_SOLOMON_DEGREE_MAX); memset(result, 0, degree * sizeof(result[0])); result[degree - 1] = 1; - + // Compute the product polynomial (x - r^0) * (x - r^1) * (x - r^2) * ... * (x - r^{degree-1}), // drop the highest term, and store the rest of the coefficients in order of descending powers. // Note that r = 0x02, which is a generator element of this field GF(2^8/0x11D). @@ -376,9 +376,9 @@ testable void calcReedSolomonGenerator(int degree, uint8_t result[]) { // polynomials are in big endian and the generator has an implicit leading 1 term, storing the result in result[0 : degree]. testable void calcReedSolomonRemainder(const uint8_t data[], int dataLen, const uint8_t generator[], int degree, uint8_t result[]) { - + // Perform polynomial division - assert(1 <= degree && degree <= qrcodegen_REED_SOLOMON_DEGREE_MAX); + LV_ASSERT(1 <= degree && degree <= qrcodegen_REED_SOLOMON_DEGREE_MAX); memset(result, 0, degree * sizeof(result[0])); for (int i = 0; i < dataLen; i++) { uint8_t factor = data[i] ^ result[0]; @@ -415,16 +415,16 @@ testable void initializeFunctionModules(int version, uint8_t qrcode[]) { int qrsize = version * 4 + 17; memset(qrcode, 0, ((qrsize * qrsize + 7) / 8 + 1) * sizeof(qrcode[0])); qrcode[0] = (uint8_t)qrsize; - + // Fill horizontal and vertical timing patterns fillRectangle(6, 0, 1, qrsize, qrcode); fillRectangle(0, 6, qrsize, 1, qrcode); - + // Fill 3 finder patterns (all corners except bottom right) and format bits fillRectangle(0, 0, 9, 9, qrcode); fillRectangle(qrsize - 8, 0, 8, 9, qrcode); fillRectangle(0, qrsize - 8, 9, 8, qrcode); - + // Fill numerous alignment patterns uint8_t alignPatPos[7]; int numAlign = getAlignmentPatternPositions(version, alignPatPos); @@ -435,7 +435,7 @@ testable void initializeFunctionModules(int version, uint8_t qrcode[]) { fillRectangle(alignPatPos[i] - 2, alignPatPos[j] - 2, 5, 5, qrcode); } } - + // Fill version blocks if (version >= 7) { fillRectangle(qrsize - 11, 0, 3, 6, qrcode); @@ -454,7 +454,7 @@ static void drawWhiteFunctionModules(uint8_t qrcode[], int version) { setModule(qrcode, 6, i, false); setModule(qrcode, i, 6, false); } - + // Draw 3 finder patterns (all corners except bottom right; overwrites some timing modules) for (int dy = -4; dy <= 4; dy++) { for (int dx = -4; dx <= 4; dx++) { @@ -468,7 +468,7 @@ static void drawWhiteFunctionModules(uint8_t qrcode[], int version) { } } } - + // Draw numerous alignment patterns uint8_t alignPatPos[7]; int numAlign = getAlignmentPatternPositions(version, alignPatPos); @@ -482,7 +482,7 @@ static void drawWhiteFunctionModules(uint8_t qrcode[], int version) { } } } - + // Draw version blocks if (version >= 7) { // Calculate error correction code and pack bits @@ -490,8 +490,8 @@ static void drawWhiteFunctionModules(uint8_t qrcode[], int version) { for (int i = 0; i < 12; i++) rem = (rem << 1) ^ ((rem >> 11) * 0x1F25); long bits = (long)version << 12 | rem; // uint18 - assert(bits >> 18 == 0); - + LV_ASSERT(bits >> 18 == 0); + // Draw two copies for (int i = 0; i < 6; i++) { for (int j = 0; j < 3; j++) { @@ -510,15 +510,15 @@ static void drawWhiteFunctionModules(uint8_t qrcode[], int version) { // the format bits, unlike drawWhiteFunctionModules() which might skip black modules. static void drawFormatBits(enum qrcodegen_Ecc ecl, enum qrcodegen_Mask mask, uint8_t qrcode[]) { // Calculate error correction code and pack bits - assert(0 <= (int)mask && (int)mask <= 7); + LV_ASSERT(0 <= (int)mask && (int)mask <= 7); static const int table[] = {1, 0, 3, 2}; int data = table[(int)ecl] << 3 | (int)mask; // errCorrLvl is uint2, mask is uint3 int rem = data; for (int i = 0; i < 10; i++) rem = (rem << 1) ^ ((rem >> 9) * 0x537); int bits = (data << 10 | rem) ^ 0x5412; // uint15 - assert(bits >> 15 == 0); - + LV_ASSERT(bits >> 15 == 0); + // Draw first copy for (int i = 0; i <= 5; i++) setModule(qrcode, 8, i, getBit(bits, i)); @@ -527,7 +527,7 @@ static void drawFormatBits(enum qrcodegen_Ecc ecl, enum qrcodegen_Mask mask, uin setModule(qrcode, 7, 8, getBit(bits, 8)); for (int i = 9; i < 15; i++) setModule(qrcode, 14 - i, 8, getBit(bits, i)); - + // Draw second copy int qrsize = qrcodegen_getSize(qrcode); for (int i = 0; i < 8; i++) @@ -591,7 +591,7 @@ static void drawCodewords(const uint8_t data[], int dataLen, uint8_t qrcode[]) { } } } - assert(i == dataLen * 8); + LV_ASSERT(i == dataLen * 8); } @@ -601,7 +601,7 @@ static void drawCodewords(const uint8_t data[], int dataLen, uint8_t qrcode[]) { // the same mask value a second time will undo the mask. A final well-formed // QR Code needs exactly one (not zero, two, etc.) mask applied. static void applyMask(const uint8_t functionModules[], uint8_t qrcode[], enum qrcodegen_Mask mask) { - assert(0 <= (int)mask && (int)mask <= 7); // Disallows qrcodegen_Mask_AUTO + LV_ASSERT(0 <= (int)mask && (int)mask <= 7); // Disallows qrcodegen_Mask_AUTO int qrsize = qrcodegen_getSize(qrcode); for (int y = 0; y < qrsize; y++) { for (int x = 0; x < qrsize; x++) { @@ -617,7 +617,7 @@ static void applyMask(const uint8_t functionModules[], uint8_t qrcode[], enum qr case 5: invert = x * y % 2 + x * y % 3 == 0; break; case 6: invert = (x * y % 2 + x * y % 3) % 2 == 0; break; case 7: invert = ((x + y) % 2 + x * y % 3) % 2 == 0; break; - default: assert(false); return; + default: LV_ASSERT(false); return; } bool val = getModule(qrcode, x, y); setModule(qrcode, x, y, val ^ invert); @@ -631,7 +631,7 @@ static void applyMask(const uint8_t functionModules[], uint8_t qrcode[], enum qr static long getPenaltyScore(const uint8_t qrcode[]) { int qrsize = qrcodegen_getSize(qrcode); long result = 0; - + // Adjacent modules in row having same color, and finder-like patterns for (int y = 0; y < qrsize; y++) { unsigned char runHistory[7] = {0}; @@ -684,7 +684,7 @@ static long getPenaltyScore(const uint8_t qrcode[]) { if (hasFinderLikePattern(runHistory)) result += PENALTY_N3; } - + // 2*2 blocks of modules having same color for (int y = 0; y < qrsize - 1; y++) { for (int x = 0; x < qrsize - 1; x++) { @@ -695,7 +695,7 @@ static long getPenaltyScore(const uint8_t qrcode[]) { result += PENALTY_N2; } } - + // Balance of black and white modules int black = 0; for (int y = 0; y < qrsize; y++) { @@ -737,9 +737,9 @@ static bool hasFinderLikePattern(const unsigned char runHistory[7]) { // Public function - see documentation comment in header file. int qrcodegen_getSize(const uint8_t qrcode[]) { - assert(qrcode != NULL); + LV_ASSERT(qrcode != NULL); int result = qrcode[0]; - assert((qrcodegen_VERSION_MIN * 4 + 17) <= result + LV_ASSERT((qrcodegen_VERSION_MIN * 4 + 17) <= result && result <= (qrcodegen_VERSION_MAX * 4 + 17)); return result; } @@ -747,7 +747,7 @@ int qrcodegen_getSize(const uint8_t qrcode[]) { // Public function - see documentation comment in header file. bool qrcodegen_getModule(const uint8_t qrcode[], int x, int y) { - assert(qrcode != NULL); + LV_ASSERT(qrcode != NULL); int qrsize = qrcode[0]; return (0 <= x && x < qrsize && 0 <= y && y < qrsize) && getModule(qrcode, x, y); } @@ -756,7 +756,7 @@ bool qrcodegen_getModule(const uint8_t qrcode[], int x, int y) { // Gets the module at the given coordinates, which must be in bounds. testable bool getModule(const uint8_t qrcode[], int x, int y) { int qrsize = qrcode[0]; - assert(21 <= qrsize && qrsize <= 177 && 0 <= x && x < qrsize && 0 <= y && y < qrsize); + LV_ASSERT(21 <= qrsize && qrsize <= 177 && 0 <= x && x < qrsize && 0 <= y && y < qrsize); int index = y * qrsize + x; return getBit(qrcode[(index >> 3) + 1], index & 7); } @@ -765,7 +765,7 @@ testable bool getModule(const uint8_t qrcode[], int x, int y) { // Sets the module at the given coordinates, which must be in bounds. testable void setModule(uint8_t qrcode[], int x, int y, bool isBlack) { int qrsize = qrcode[0]; - assert(21 <= qrsize && qrsize <= 177 && 0 <= x && x < qrsize && 0 <= y && y < qrsize); + LV_ASSERT(21 <= qrsize && qrsize <= 177 && 0 <= x && x < qrsize && 0 <= y && y < qrsize); int index = y * qrsize + x; int bitIndex = index & 7; int byteIndex = (index >> 3) + 1; @@ -795,7 +795,7 @@ static bool getBit(int x, int i) { // Public function - see documentation comment in header file. bool qrcodegen_isAlphanumeric(const char *text) { - assert(text != NULL); + LV_ASSERT(text != NULL); for (; *text != '\0'; text++) { if (strchr(ALPHANUMERIC_CHARSET, *text) == NULL) return false; @@ -806,7 +806,7 @@ bool qrcodegen_isAlphanumeric(const char *text) { // Public function - see documentation comment in header file. bool qrcodegen_isNumeric(const char *text) { - assert(text != NULL); + LV_ASSERT(text != NULL); for (; *text != '\0'; text++) { if (*text < '0' || *text > '9') return false; @@ -820,7 +820,7 @@ size_t qrcodegen_calcSegmentBufferSize(enum qrcodegen_Mode mode, size_t numChars int temp = calcSegmentBitLength(mode, numChars); if (temp == -1) return SIZE_MAX; - assert(0 <= temp && temp <= INT16_MAX); + LV_ASSERT(0 <= temp && temp <= INT16_MAX); return ((size_t)temp + 7) / 8; } @@ -849,10 +849,10 @@ testable int calcSegmentBitLength(enum qrcodegen_Mode mode, size_t numChars) { else if (mode == qrcodegen_Mode_ECI && numChars == 0) result = 3 * 8; else { // Invalid argument - assert(false); + LV_ASSERT(false); return -1; } - assert(result >= 0); + LV_ASSERT(result >= 0); if ((unsigned int)result > (unsigned int)INT16_MAX) return -1; return (int)result; @@ -861,11 +861,11 @@ testable int calcSegmentBitLength(enum qrcodegen_Mode mode, size_t numChars) { // Public function - see documentation comment in header file. struct qrcodegen_Segment qrcodegen_makeBytes(const uint8_t data[], size_t len, uint8_t buf[]) { - assert(data != NULL || len == 0); + LV_ASSERT(data != NULL || len == 0); struct qrcodegen_Segment result; result.mode = qrcodegen_Mode_BYTE; result.bitLength = calcSegmentBitLength(result.mode, len); - assert(result.bitLength != -1); + LV_ASSERT(result.bitLength != -1); result.numChars = (int)len; if (len > 0) memcpy(buf, data, len * sizeof(buf[0])); @@ -876,22 +876,22 @@ struct qrcodegen_Segment qrcodegen_makeBytes(const uint8_t data[], size_t len, u // Public function - see documentation comment in header file. struct qrcodegen_Segment qrcodegen_makeNumeric(const char *digits, uint8_t buf[]) { - assert(digits != NULL); + LV_ASSERT(digits != NULL); struct qrcodegen_Segment result; size_t len = strlen(digits); result.mode = qrcodegen_Mode_NUMERIC; int bitLen = calcSegmentBitLength(result.mode, len); - assert(bitLen != -1); + LV_ASSERT(bitLen != -1); result.numChars = (int)len; if (bitLen > 0) memset(buf, 0, ((size_t)bitLen + 7) / 8 * sizeof(buf[0])); result.bitLength = 0; - + unsigned int accumData = 0; int accumCount = 0; for (; *digits != '\0'; digits++) { char c = *digits; - assert('0' <= c && c <= '9'); + LV_ASSERT('0' <= c && c <= '9'); accumData = accumData * 10 + (unsigned int)(c - '0'); accumCount++; if (accumCount == 3) { @@ -902,7 +902,7 @@ struct qrcodegen_Segment qrcodegen_makeNumeric(const char *digits, uint8_t buf[] } if (accumCount > 0) // 1 or 2 digits remaining appendBitsToBuffer(accumData, accumCount * 3 + 1, buf, &result.bitLength); - assert(result.bitLength == bitLen); + LV_ASSERT(result.bitLength == bitLen); result.data = buf; return result; } @@ -910,22 +910,22 @@ struct qrcodegen_Segment qrcodegen_makeNumeric(const char *digits, uint8_t buf[] // Public function - see documentation comment in header file. struct qrcodegen_Segment qrcodegen_makeAlphanumeric(const char *text, uint8_t buf[]) { - assert(text != NULL); + LV_ASSERT(text != NULL); struct qrcodegen_Segment result; size_t len = strlen(text); result.mode = qrcodegen_Mode_ALPHANUMERIC; int bitLen = calcSegmentBitLength(result.mode, len); - assert(bitLen != -1); + LV_ASSERT(bitLen != -1); result.numChars = (int)len; if (bitLen > 0) memset(buf, 0, ((size_t)bitLen + 7) / 8 * sizeof(buf[0])); result.bitLength = 0; - + unsigned int accumData = 0; int accumCount = 0; for (; *text != '\0'; text++) { const char *temp = strchr(ALPHANUMERIC_CHARSET, *text); - assert(temp != NULL); + LV_ASSERT(temp != NULL); accumData = accumData * 45 + (unsigned int)(temp - ALPHANUMERIC_CHARSET); accumCount++; if (accumCount == 2) { @@ -936,7 +936,7 @@ struct qrcodegen_Segment qrcodegen_makeAlphanumeric(const char *text, uint8_t bu } if (accumCount > 0) // 1 character remaining appendBitsToBuffer(accumData, 6, buf, &result.bitLength); - assert(result.bitLength == bitLen); + LV_ASSERT(result.bitLength == bitLen); result.data = buf; return result; } @@ -949,7 +949,7 @@ struct qrcodegen_Segment qrcodegen_makeEci(long assignVal, uint8_t buf[]) { result.numChars = 0; result.bitLength = 0; if (assignVal < 0) { - assert(false); + LV_ASSERT(false); } else if (assignVal < (1 << 7)) { memset(buf, 0, 1 * sizeof(buf[0])); appendBitsToBuffer(assignVal, 8, buf, &result.bitLength); @@ -963,7 +963,7 @@ struct qrcodegen_Segment qrcodegen_makeEci(long assignVal, uint8_t buf[]) { appendBitsToBuffer(assignVal >> 10, 11, buf, &result.bitLength); appendBitsToBuffer(assignVal & 0x3FF, 10, buf, &result.bitLength); } else { - assert(false); + LV_ASSERT(false); } result.data = buf; return result; @@ -974,22 +974,22 @@ struct qrcodegen_Segment qrcodegen_makeEci(long assignVal, uint8_t buf[]) { // Returns a non-negative number if successful. Otherwise returns -1 if a segment has too // many characters to fit its length field, or the total bits exceeds INT16_MAX. testable int getTotalBits(const struct qrcodegen_Segment segs[], size_t len, int version) { - assert(segs != NULL || len == 0); + LV_ASSERT(segs != NULL || len == 0); long result = 0; for (size_t i = 0; i < len; i++) { int numChars = segs[i].numChars; int bitLength = segs[i].bitLength; - assert(0 <= numChars && numChars <= INT16_MAX); - assert(0 <= bitLength && bitLength <= INT16_MAX); + LV_ASSERT(0 <= numChars && numChars <= INT16_MAX); + LV_ASSERT(0 <= bitLength && bitLength <= INT16_MAX); int ccbits = numCharCountBits(segs[i].mode, version); - assert(0 <= ccbits && ccbits <= 16); + LV_ASSERT(0 <= ccbits && ccbits <= 16); if (numChars >= (1L << ccbits)) return -1; // The segment's length doesn't fit the field's bit width result += 4L + ccbits + bitLength; if (result > INT16_MAX) return -1; // The sum might overflow an int type } - assert(0 <= result && result <= INT16_MAX); + LV_ASSERT(0 <= result && result <= INT16_MAX); return (int)result; } @@ -997,7 +997,7 @@ testable int getTotalBits(const struct qrcodegen_Segment segs[], size_t len, int // Returns the bit width of the character count field for a segment in the given mode // in a QR Code at the given version number. The result is in the range [0, 16]. static int numCharCountBits(enum qrcodegen_Mode mode, int version) { - assert(qrcodegen_VERSION_MIN <= version && version <= qrcodegen_VERSION_MAX); + LV_ASSERT(qrcodegen_VERSION_MIN <= version && version <= qrcodegen_VERSION_MAX); int i = (version + 7) / 17; switch (mode) { case qrcodegen_Mode_NUMERIC : { static const int temp[] = {10, 12, 14}; return temp[i]; } @@ -1005,7 +1005,7 @@ static int numCharCountBits(enum qrcodegen_Mode mode, int version) { case qrcodegen_Mode_BYTE : { static const int temp[] = { 8, 16, 16}; return temp[i]; } case qrcodegen_Mode_KANJI : { static const int temp[] = { 8, 10, 12}; return temp[i]; } case qrcodegen_Mode_ECI : return 0; - default: assert(false); return -1; // Dummy value + default: LV_ASSERT(false); return -1; // Dummy value } } diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/qrcode/qrcodegen.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/libs/qrcode/qrcodegen.h similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/qrcode/qrcodegen.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/libs/qrcode/qrcodegen.h diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/rlottie/Makefile b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/libs/rlottie/Makefile similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/rlottie/Makefile rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/libs/rlottie/Makefile diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/rlottie/lv_rlottie.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/libs/rlottie/lv_rlottie.c similarity index 99% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/rlottie/lv_rlottie.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/libs/rlottie/lv_rlottie.c index a264948..730bb70 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/rlottie/lv_rlottie.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/libs/rlottie/lv_rlottie.c @@ -150,7 +150,6 @@ static void lv_rlottie_constructor(const lv_obj_class_t * class_p, lv_obj_t * ob lv_obj_update_layout(obj); } - static void lv_rlottie_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj) { LV_UNUSED(class_p); diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/rlottie/lv_rlottie.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/libs/rlottie/lv_rlottie.h similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/rlottie/lv_rlottie.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/libs/rlottie/lv_rlottie.h diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/sjpg/Makefile b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/libs/sjpg/Makefile similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/sjpg/Makefile rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/libs/sjpg/Makefile diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/sjpg/lv_sjpg.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/libs/sjpg/lv_sjpg.c similarity index 99% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/sjpg/lv_sjpg.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/libs/sjpg/lv_sjpg.c index 5a12ea2..1ec6b2b 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/sjpg/lv_sjpg.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/libs/sjpg/lv_sjpg.c @@ -85,7 +85,6 @@ typedef struct { uint32_t raw_sjpg_data_next_read_pos; //Used for all types. } io_source_t; - typedef struct { uint8_t * sjpeg_data; uint32_t sjpeg_data_size; @@ -440,7 +439,6 @@ static lv_res_t decoder_open(lv_img_decoder_t * decoder, lv_img_decoder_dsc_t * JRESULT rc = jd_prepare(&jd_tmp, input_func, workb_temp, (size_t)TJPGD_WORKBUFF_SIZE, &io_source_temp); lv_mem_free(workb_temp); - if(rc == JDR_OK) { sjpeg->sjpeg_x_res = jd_tmp.width; sjpeg->sjpeg_y_res = jd_tmp.height; @@ -508,14 +506,12 @@ end: uint8_t buff[22]; memset(buff, 0, sizeof(buff)); - lv_fs_file_t lv_file; lv_fs_res_t res = lv_fs_open(&lv_file, fn, LV_FS_MODE_RD); if(res != LV_FS_RES_OK) { return 78; } - uint32_t rn; res = lv_fs_read(&lv_file, buff, 22, &rn); if(res != LV_FS_RES_OK || rn != 22) { @@ -647,7 +643,6 @@ end: lv_mem_free(workb_temp); - if(rc == JDR_OK) { sjpeg->sjpeg_x_res = jd_tmp.width; sjpeg->sjpeg_y_res = jd_tmp.height; @@ -787,7 +782,6 @@ static lv_res_t decoder_read_line(lv_img_decoder_t * decoder, lv_img_decoder_dsc #else #error Unsupported LV_COLOR_DEPTH - #endif // LV_COLOR_DEPTH return LV_RES_OK; } @@ -852,7 +846,6 @@ static lv_res_t decoder_read_line(lv_img_decoder_t * decoder, lv_img_decoder_dsc #else #error Unsupported LV_COLOR_DEPTH - #endif // LV_COLOR_DEPTH return LV_RES_OK; diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/sjpg/lv_sjpg.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/libs/sjpg/lv_sjpg.h similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/sjpg/lv_sjpg.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/libs/sjpg/lv_sjpg.h diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/sjpg/tjpgd.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/libs/sjpg/tjpgd.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/sjpg/tjpgd.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/libs/sjpg/tjpgd.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/sjpg/tjpgd.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/libs/sjpg/tjpgd.h similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/sjpg/tjpgd.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/libs/sjpg/tjpgd.h diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/sjpg/tjpgdcnf.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/libs/sjpg/tjpgdcnf.h similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/sjpg/tjpgdcnf.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/libs/sjpg/tjpgdcnf.h diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/libs/tiny_ttf/lv_tiny_ttf.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/libs/tiny_ttf/lv_tiny_ttf.c new file mode 100644 index 0000000..c275bfe --- /dev/null +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/libs/tiny_ttf/lv_tiny_ttf.c @@ -0,0 +1,284 @@ +#include "lv_tiny_ttf.h" + +#if LV_USE_TINY_TTF +#include +#include "../../../misc/lv_lru.h" + +#define STB_RECT_PACK_IMPLEMENTATION +#define STBRP_STATIC +#define STBTT_STATIC +#define STB_TRUETYPE_IMPLEMENTATION +#define STBTT_HEAP_FACTOR_SIZE_32 50 +#define STBTT_HEAP_FACTOR_SIZE_128 20 +#define STBTT_HEAP_FACTOR_SIZE_DEFAULT 10 +#define STBTT_malloc(x, u) ((void)(u), lv_mem_alloc(x)) +#define STBTT_free(x, u) ((void)(u), lv_mem_free(x)) +#define TTF_MALLOC(x) (lv_mem_alloc(x)) +#define TTF_FREE(x) (lv_mem_free(x)) + +#if LV_TINY_TTF_FILE_SUPPORT +/* a hydra stream that can be in memory or from a file*/ +typedef struct ttf_cb_stream { + lv_fs_file_t * file; + const void * data; + size_t size; + size_t position; +} ttf_cb_stream_t; + +static void ttf_cb_stream_read(ttf_cb_stream_t * stream, void * data, size_t to_read) +{ + if(stream->file != NULL) { + uint32_t br; + lv_fs_read(stream->file, data, to_read, &br); + } + else { + if(to_read + stream->position >= stream->size) { + to_read = stream->size - stream->position; + } + lv_memcpy(data, ((const unsigned char *)stream->data + stream->position), to_read); + stream->position += to_read; + } +} +static void ttf_cb_stream_seek(ttf_cb_stream_t * stream, size_t position) +{ + if(stream->file != NULL) { + lv_fs_seek(stream->file, position, LV_FS_SEEK_SET); + } + else { + if(position > stream->size) { + stream->position = stream->size; + } + else { + stream->position = position; + } + } +} + +/* for stream support */ +#define STBTT_STREAM_TYPE ttf_cb_stream_t * +#define STBTT_STREAM_SEEK(s, x) ttf_cb_stream_seek(s, x); +#define STBTT_STREAM_READ(s, x, y) ttf_cb_stream_read(s, x, y); +#endif /*LV_TINY_TTF_FILE_SUPPORT*/ + +#include "stb_rect_pack.h" +#include "stb_truetype_htcw.h" + +typedef struct ttf_font_desc { + lv_fs_file_t file; +#if LV_TINY_TTF_FILE_SUPPORT + ttf_cb_stream_t stream; +#else + const uint8_t * stream; +#endif + stbtt_fontinfo info; + float scale; + int ascent; + int descent; + lv_lru_t * bitmap_cache; +} ttf_font_desc_t; + +typedef struct ttf_bitmap_cache_key { + uint32_t unicode_letter; + lv_coord_t line_height; +} ttf_bitmap_cache_key_t; + +static bool ttf_get_glyph_dsc_cb(const lv_font_t * font, lv_font_glyph_dsc_t * dsc_out, uint32_t unicode_letter, + uint32_t unicode_letter_next) +{ + if(unicode_letter < 0x20 || + unicode_letter == 0xf8ff || /*LV_SYMBOL_DUMMY*/ + unicode_letter == 0x200c) { /*ZERO WIDTH NON-JOINER*/ + dsc_out->box_w = 0; + dsc_out->adv_w = 0; + dsc_out->box_h = 0; /*height of the bitmap in [px]*/ + dsc_out->ofs_x = 0; /*X offset of the bitmap in [pf]*/ + dsc_out->ofs_y = 0; /*Y offset of the bitmap in [pf]*/ + dsc_out->bpp = 0; + dsc_out->is_placeholder = false; + return true; + } + ttf_font_desc_t * dsc = (ttf_font_desc_t *)font->dsc; + int g1 = stbtt_FindGlyphIndex(&dsc->info, (int)unicode_letter); + if(g1 == 0) { + /* Glyph not found */ + return false; + } + int x1, y1, x2, y2; + + stbtt_GetGlyphBitmapBox(&dsc->info, g1, dsc->scale, dsc->scale, &x1, &y1, &x2, &y2); + int g2 = 0; + if(unicode_letter_next != 0) { + g2 = stbtt_FindGlyphIndex(&dsc->info, (int)unicode_letter_next); + } + int advw, lsb; + stbtt_GetGlyphHMetrics(&dsc->info, g1, &advw, &lsb); + int k = stbtt_GetGlyphKernAdvance(&dsc->info, g1, g2); + dsc_out->adv_w = (uint16_t)floor((((float)advw + (float)k) * dsc->scale) + + 0.5f); /*Horizontal space required by the glyph in [px]*/ + + dsc_out->adv_w = (uint16_t)floor((((float)advw + (float)k) * dsc->scale) + + 0.5f); /*Horizontal space required by the glyph in [px]*/ + dsc_out->box_w = (x2 - x1 + 1); /*width of the bitmap in [px]*/ + dsc_out->box_h = (y2 - y1 + 1); /*height of the bitmap in [px]*/ + dsc_out->ofs_x = x1; /*X offset of the bitmap in [pf]*/ + dsc_out->ofs_y = -y2; /*Y offset of the bitmap measured from the as line*/ + dsc_out->bpp = 8; /*Bits per pixel: 1/2/4/8*/ + dsc_out->is_placeholder = false; + return true; /*true: glyph found; false: glyph was not found*/ +} + +static const uint8_t * ttf_get_glyph_bitmap_cb(const lv_font_t * font, uint32_t unicode_letter) +{ + ttf_font_desc_t * dsc = (ttf_font_desc_t *)font->dsc; + const stbtt_fontinfo * info = (const stbtt_fontinfo *)&dsc->info; + int g1 = stbtt_FindGlyphIndex(info, (int)unicode_letter); + if(g1 == 0) { + /* Glyph not found */ + return NULL; + } + int x1, y1, x2, y2; + stbtt_GetGlyphBitmapBox(info, g1, dsc->scale, dsc->scale, &x1, &y1, &x2, &y2); + int w, h; + w = x2 - x1 + 1; + h = y2 - y1 + 1; + uint32_t stride = w; + /*Try to load from cache*/ + ttf_bitmap_cache_key_t cache_key; + lv_memset(&cache_key, 0, sizeof(cache_key)); /*Zero padding*/ + cache_key.unicode_letter = unicode_letter; + cache_key.line_height = font->line_height; + uint8_t * buffer = NULL; + lv_lru_get(dsc->bitmap_cache, &cache_key, sizeof(cache_key), (void **)&buffer); + if(buffer) { + return buffer; + } + LV_LOG_TRACE("cache miss for letter: %u", unicode_letter); + /*Prepare space in cache*/ + size_t szb = h * stride; + buffer = lv_mem_alloc(szb); + if(!buffer) { + LV_LOG_ERROR("failed to allocate cache value"); + return NULL; + } + lv_memset(buffer, 0, szb); + if(LV_LRU_OK != lv_lru_set(dsc->bitmap_cache, &cache_key, sizeof(cache_key), buffer, szb)) { + LV_LOG_ERROR("failed to add cache value"); + lv_mem_free(buffer); + return NULL; + } + /*Render into cache*/ + stbtt_MakeGlyphBitmap(info, buffer, w, h, stride, dsc->scale, dsc->scale, g1); + return buffer; +} + +static lv_font_t * lv_tiny_ttf_create(const char * path, const void * data, size_t data_size, lv_coord_t font_size, + size_t cache_size) +{ + if((path == NULL && data == NULL) || 0 >= font_size) { + LV_LOG_ERROR("tiny_ttf: invalid argument\n"); + return NULL; + } + ttf_font_desc_t * dsc = (ttf_font_desc_t *)TTF_MALLOC(sizeof(ttf_font_desc_t)); + if(dsc == NULL) { + LV_LOG_ERROR("tiny_ttf: out of memory\n"); + return NULL; + } +#if LV_TINY_TTF_FILE_SUPPORT + if(path != NULL) { + if(LV_FS_RES_OK != lv_fs_open(&dsc->file, path, LV_FS_MODE_RD)) { + LV_LOG_ERROR("tiny_ttf: unable to open %s\n", path); + goto err_after_dsc; + } + dsc->stream.file = &dsc->file; + } + else { + dsc->stream.file = NULL; + dsc->stream.data = (const uint8_t *)data; + dsc->stream.size = data_size; + dsc->stream.position = 0; + } + if(0 == stbtt_InitFont(&dsc->info, &dsc->stream, stbtt_GetFontOffsetForIndex(&dsc->stream, 0))) { + LV_LOG_ERROR("tiny_ttf: init failed\n"); + goto err_after_dsc; + } + +#else + dsc->stream = (const uint8_t *)data; + LV_UNUSED(data_size); + if(0 == stbtt_InitFont(&dsc->info, dsc->stream, stbtt_GetFontOffsetForIndex(dsc->stream, 0))) { + LV_LOG_ERROR("tiny_ttf: init failed\n"); + goto err_after_dsc; + } +#endif + + dsc->bitmap_cache = lv_lru_create(cache_size, font_size * font_size, lv_mem_free, lv_mem_free); + if(dsc->bitmap_cache == NULL) { + LV_LOG_ERROR("failed to create lru cache"); + goto err_after_dsc; + } + + lv_font_t * out_font = (lv_font_t *)TTF_MALLOC(sizeof(lv_font_t)); + if(out_font == NULL) { + LV_LOG_ERROR("tiny_ttf: out of memory\n"); + goto err_after_bitmap_cache; + } + lv_memset(out_font, 0, sizeof(lv_font_t)); + out_font->get_glyph_dsc = ttf_get_glyph_dsc_cb; + out_font->get_glyph_bitmap = ttf_get_glyph_bitmap_cb; + out_font->dsc = dsc; + lv_tiny_ttf_set_size(out_font, font_size); + return out_font; +err_after_bitmap_cache: + lv_lru_del(dsc->bitmap_cache); +err_after_dsc: + TTF_FREE(dsc); + return NULL; +} +#if LV_TINY_TTF_FILE_SUPPORT +lv_font_t * lv_tiny_ttf_create_file_ex(const char * path, lv_coord_t font_size, size_t cache_size) +{ + return lv_tiny_ttf_create(path, NULL, 0, font_size, cache_size); +} +lv_font_t * lv_tiny_ttf_create_file(const char * path, lv_coord_t font_size) +{ + return lv_tiny_ttf_create_file_ex(path, font_size, 4096); +} +#endif /*LV_TINY_TTF_FILE_SUPPORT*/ +lv_font_t * lv_tiny_ttf_create_data_ex(const void * data, size_t data_size, lv_coord_t font_size, size_t cache_size) +{ + return lv_tiny_ttf_create(NULL, data, data_size, font_size, cache_size); +} +lv_font_t * lv_tiny_ttf_create_data(const void * data, size_t data_size, lv_coord_t font_size) +{ + return lv_tiny_ttf_create_data_ex(data, data_size, font_size, 4096); +} +void lv_tiny_ttf_set_size(lv_font_t * font, lv_coord_t font_size) +{ + if(font_size <= 0) { + LV_LOG_ERROR("invalid font size: %"PRIx32, font_size); + return; + } + ttf_font_desc_t * dsc = (ttf_font_desc_t *)font->dsc; + dsc->scale = stbtt_ScaleForMappingEmToPixels(&dsc->info, font_size); + int line_gap = 0; + stbtt_GetFontVMetrics(&dsc->info, &dsc->ascent, &dsc->descent, &line_gap); + font->line_height = (lv_coord_t)(dsc->scale * (dsc->ascent - dsc->descent + line_gap)); + font->base_line = (lv_coord_t)(dsc->scale * (line_gap - dsc->descent)); +} +void lv_tiny_ttf_destroy(lv_font_t * font) +{ + if(font != NULL) { + if(font->dsc != NULL) { + ttf_font_desc_t * ttf = (ttf_font_desc_t *)font->dsc; +#if LV_TINY_TTF_FILE_SUPPORT + if(ttf->stream.file != NULL) { + lv_fs_close(&ttf->file); + } +#endif + lv_lru_del(ttf->bitmap_cache); + TTF_FREE(ttf); + } + TTF_FREE(font); + } +} +#endif /*LV_USE_TINY_TTF*/ diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/libs/tiny_ttf/lv_tiny_ttf.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/libs/tiny_ttf/lv_tiny_ttf.h new file mode 100644 index 0000000..fe0936b --- /dev/null +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/libs/tiny_ttf/lv_tiny_ttf.h @@ -0,0 +1,62 @@ +/** + * @file lv_tiny_ttf.h + * + */ + +#ifndef LV_TINY_TTF_H +#define LV_TINY_TTF_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../../lvgl.h" + +#if LV_USE_TINY_TTF + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +#if LV_TINY_TTF_FILE_SUPPORT +/* create a font from the specified file or path with the specified line height.*/ +lv_font_t * lv_tiny_ttf_create_file(const char * path, lv_coord_t font_size); + +/* create a font from the specified file or path with the specified line height with the specified cache size.*/ +lv_font_t * lv_tiny_ttf_create_file_ex(const char * path, lv_coord_t font_size, size_t cache_size); +#endif /*LV_TINY_TTF_FILE_SUPPORT*/ + +/* create a font from the specified data pointer with the specified line height.*/ +lv_font_t * lv_tiny_ttf_create_data(const void * data, size_t data_size, lv_coord_t font_size); + +/* create a font from the specified data pointer with the specified line height and the specified cache size.*/ +lv_font_t * lv_tiny_ttf_create_data_ex(const void * data, size_t data_size, lv_coord_t font_size, size_t cache_size); + +/* set the size of the font to a new font_size*/ +void lv_tiny_ttf_set_size(lv_font_t * font, lv_coord_t font_size); + +/* destroy a font previously created with lv_tiny_ttf_create_xxxx()*/ +void lv_tiny_ttf_destroy(lv_font_t * font); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_TINY_TTF*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_TINY_TTF_H*/ diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/libs/tiny_ttf/stb_rect_pack.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/libs/tiny_ttf/stb_rect_pack.h new file mode 100644 index 0000000..b265df9 --- /dev/null +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/libs/tiny_ttf/stb_rect_pack.h @@ -0,0 +1,633 @@ +// stb_rect_pack.h - v1.01 - public domain - rectangle packing +// Sean Barrett 2014 +// +// Useful for e.g. packing rectangular textures into an atlas. +// Does not do rotation. +// +// Before #including, +// +// #define STB_RECT_PACK_IMPLEMENTATION +// +// in the file that you want to have the implementation. +// +// Not necessarily the awesomest packing method, but better than +// the totally naive one in stb_truetype (which is primarily what +// this is meant to replace). +// +// Has only had a few tests run, may have issues. +// +// More docs to come. +// +// No memory allocations; uses qsort() and assert() from stdlib. +// Can override those by defining STBRP_SORT and STBRP_ASSERT. +// +// This library currently uses the Skyline Bottom-Left algorithm. +// +// Please note: better rectangle packers are welcome! Please +// implement them to the same API, but with a different init +// function. +// +// Credits +// +// Library +// Sean Barrett +// Minor features +// Martins Mozeiko +// github:IntellectualKitty +// +// Bugfixes / warning fixes +// Jeremy Jaussaud +// Fabian Giesen +// +// Version history: +// +// 1.01 (2021-07-11) always use large rect mode, expose STBRP__MAXVAL in public section +// 1.00 (2019-02-25) avoid small space waste; gracefully fail too-wide rectangles +// 0.99 (2019-02-07) warning fixes +// 0.11 (2017-03-03) return packing success/fail result +// 0.10 (2016-10-25) remove cast-away-const to avoid warnings +// 0.09 (2016-08-27) fix compiler warnings +// 0.08 (2015-09-13) really fix bug with empty rects (w=0 or h=0) +// 0.07 (2015-09-13) fix bug with empty rects (w=0 or h=0) +// 0.06 (2015-04-15) added STBRP_SORT to allow replacing qsort +// 0.05: added STBRP_ASSERT to allow replacing assert +// 0.04: fixed minor bug in STBRP_LARGE_RECTS support +// 0.01: initial release +// +// LICENSE +// +// See end of file for license information. + +////////////////////////////////////////////////////////////////////////////// +// +// INCLUDE SECTION +// + +#ifndef STB_INCLUDE_STB_RECT_PACK_H +#define STB_INCLUDE_STB_RECT_PACK_H + +#define STB_RECT_PACK_VERSION 1 + +#ifdef STBRP_STATIC + #define STBRP_DEF static +#else + #define STBRP_DEF extern +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/// @cond +/** + * Tells Doxygen to ignore a duplicate declaration + */ +typedef struct stbrp_context stbrp_context; +typedef struct stbrp_node stbrp_node; +typedef struct stbrp_rect stbrp_rect; +/// @endcond + +typedef int stbrp_coord; + +#define STBRP__MAXVAL 0x7fffffff +// Mostly for internal use, but this is the maximum supported coordinate value. + +#if defined(__GNUC__) || defined(__clang__) +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wunused-function" +#endif + +STBRP_DEF int stbrp_pack_rects(stbrp_context * context, stbrp_rect * rects, int num_rects); +// Assign packed locations to rectangles. The rectangles are of type +// 'stbrp_rect' defined below, stored in the array 'rects', and there +// are 'num_rects' many of them. +// +// Rectangles which are successfully packed have the 'was_packed' flag +// set to a non-zero value and 'x' and 'y' store the minimum location +// on each axis (i.e. bottom-left in cartesian coordinates, top-left +// if you imagine y increasing downwards). Rectangles which do not fit +// have the 'was_packed' flag set to 0. +// +// You should not try to access the 'rects' array from another thread +// while this function is running, as the function temporarily reorders +// the array while it executes. +// +// To pack into another rectangle, you need to call stbrp_init_target +// again. To continue packing into the same rectangle, you can call +// this function again. Calling this multiple times with multiple rect +// arrays will probably produce worse packing results than calling it +// a single time with the full rectangle array, but the option is +// available. +// +// The function returns 1 if all of the rectangles were successfully +// packed and 0 otherwise. + +struct stbrp_rect { + // reserved for your use: + int id; + + // input: + stbrp_coord w, h; + + // output: + stbrp_coord x, y; + int was_packed; // non-zero if valid packing + +}; // 16 bytes, nominally + +STBRP_DEF void stbrp_init_target(stbrp_context * context, int width, int height, stbrp_node * nodes, int num_nodes); +// Initialize a rectangle packer to: +// pack a rectangle that is 'width' by 'height' in dimensions +// using temporary storage provided by the array 'nodes', which is 'num_nodes' long +// +// You must call this function every time you start packing into a new target. +// +// There is no "shutdown" function. The 'nodes' memory must stay valid for +// the following stbrp_pack_rects() call (or calls), but can be freed after +// the call (or calls) finish. +// +// Note: to guarantee best results, either: +// 1. make sure 'num_nodes' >= 'width' +// or 2. call stbrp_allow_out_of_mem() defined below with 'allow_out_of_mem = 1' +// +// If you don't do either of the above things, widths will be quantized to multiples +// of small integers to guarantee the algorithm doesn't run out of temporary storage. +// +// If you do #2, then the non-quantized algorithm will be used, but the algorithm +// may run out of temporary storage and be unable to pack some rectangles. + +STBRP_DEF void stbrp_setup_allow_out_of_mem(stbrp_context * context, int allow_out_of_mem); +// Optionally call this function after init but before doing any packing to +// change the handling of the out-of-temp-memory scenario, described above. +// If you call init again, this will be reset to the default (false). + +STBRP_DEF void stbrp_setup_heuristic(stbrp_context * context, int heuristic); +// Optionally select which packing heuristic the library should use. Different +// heuristics will produce better/worse results for different data sets. +// If you call init again, this will be reset to the default. + +enum { + STBRP_HEURISTIC_Skyline_default = 0, + STBRP_HEURISTIC_Skyline_BL_sortHeight = STBRP_HEURISTIC_Skyline_default, + STBRP_HEURISTIC_Skyline_BF_sortHeight +}; + +////////////////////////////////////////////////////////////////////////////// +// +// the details of the following structures don't matter to you, but they must +// be visible so you can handle the memory allocations for them + +struct stbrp_node { + stbrp_coord x, y; + stbrp_node * next; +}; + +struct stbrp_context { + int width; + int height; + int align; + int init_mode; + int heuristic; + int num_nodes; + stbrp_node * active_head; + stbrp_node * free_head; + stbrp_node extra[2]; // we allocate two extra nodes so optimal user-node-count is 'width' not 'width+2' +}; + +#ifdef __cplusplus +} +#endif + +#endif + +////////////////////////////////////////////////////////////////////////////// +// +// IMPLEMENTATION SECTION +// + +#ifdef STB_RECT_PACK_IMPLEMENTATION +#ifndef STBRP_SORT + #include + #define STBRP_SORT qsort +#endif + +#ifndef STBRP_ASSERT + #include + #define STBRP_ASSERT assert +#endif + +#ifdef _MSC_VER + #define STBRP__NOTUSED(v) (void)(v) + #define STBRP__CDECL __cdecl +#else + #define STBRP__NOTUSED(v) (void)sizeof(v) + #define STBRP__CDECL +#endif + +enum { + STBRP__INIT_skyline = 1 +}; + +STBRP_DEF void stbrp_setup_heuristic(stbrp_context * context, int heuristic) +{ + switch(context->init_mode) { + case STBRP__INIT_skyline: + STBRP_ASSERT(heuristic == STBRP_HEURISTIC_Skyline_BL_sortHeight || heuristic == STBRP_HEURISTIC_Skyline_BF_sortHeight); + context->heuristic = heuristic; + break; + default: + STBRP_ASSERT(0); + } +} + +STBRP_DEF void stbrp_setup_allow_out_of_mem(stbrp_context * context, int allow_out_of_mem) +{ + if(allow_out_of_mem) + // if it's ok to run out of memory, then don't bother aligning them; + // this gives better packing, but may fail due to OOM (even though + // the rectangles easily fit). @TODO a smarter approach would be to only + // quantize once we've hit OOM, then we could get rid of this parameter. + context->align = 1; + else { + // if it's not ok to run out of memory, then quantize the widths + // so that num_nodes is always enough nodes. + // + // I.e. num_nodes * align >= width + // align >= width / num_nodes + // align = ceil(width/num_nodes) + + context->align = (context->width + context->num_nodes - 1) / context->num_nodes; + } +} + +STBRP_DEF void stbrp_init_target(stbrp_context * context, int width, int height, stbrp_node * nodes, int num_nodes) +{ + int i; + + for(i = 0; i < num_nodes - 1; ++i) + nodes[i].next = &nodes[i + 1]; + nodes[i].next = NULL; + context->init_mode = STBRP__INIT_skyline; + context->heuristic = STBRP_HEURISTIC_Skyline_default; + context->free_head = &nodes[0]; + context->active_head = &context->extra[0]; + context->width = width; + context->height = height; + context->num_nodes = num_nodes; + stbrp_setup_allow_out_of_mem(context, 0); + + // node 0 is the full width, node 1 is the sentinel (lets us not store width explicitly) + context->extra[0].x = 0; + context->extra[0].y = 0; + context->extra[0].next = &context->extra[1]; + context->extra[1].x = (stbrp_coord) width; + context->extra[1].y = (1 << 30); + context->extra[1].next = NULL; +} + +// find minimum y position if it starts at x1 +static int stbrp__skyline_find_min_y(stbrp_context * c, stbrp_node * first, int x0, int width, int * pwaste) +{ + stbrp_node * node = first; + int x1 = x0 + width; + int min_y, visited_width, waste_area; + + STBRP__NOTUSED(c); + + STBRP_ASSERT(first->x <= x0); + +#if 0 + // skip in case we're past the node + while(node->next->x <= x0) + ++node; +#else + STBRP_ASSERT(node->next->x > x0); // we ended up handling this in the caller for efficiency +#endif + + STBRP_ASSERT(node->x <= x0); + + min_y = 0; + waste_area = 0; + visited_width = 0; + while(node->x < x1) { + if(node->y > min_y) { + // raise min_y higher. + // we've accounted for all waste up to min_y, + // but we'll now add more waste for everything we've visited + waste_area += visited_width * (node->y - min_y); + min_y = node->y; + // the first time through, visited_width might be reduced + if(node->x < x0) + visited_width += node->next->x - x0; + else + visited_width += node->next->x - node->x; + } + else { + // add waste area + int under_width = node->next->x - node->x; + if(under_width + visited_width > width) + under_width = width - visited_width; + waste_area += under_width * (min_y - node->y); + visited_width += under_width; + } + node = node->next; + } + + *pwaste = waste_area; + return min_y; +} + +typedef struct { + int x, y; + stbrp_node ** prev_link; +} stbrp__findresult; + +static stbrp__findresult stbrp__skyline_find_best_pos(stbrp_context * c, int width, int height) +{ + int best_waste = (1 << 30), best_x, best_y = (1 << 30); + stbrp__findresult fr; + stbrp_node ** prev, * node, * tail, ** best = NULL; + + // align to multiple of c->align + width = (width + c->align - 1); + width -= width % c->align; + STBRP_ASSERT(width % c->align == 0); + + // if it can't possibly fit, bail immediately + if(width > c->width || height > c->height) { + fr.prev_link = NULL; + fr.x = fr.y = 0; + return fr; + } + + node = c->active_head; + prev = &c->active_head; + while(node->x + width <= c->width) { + int y, waste; + y = stbrp__skyline_find_min_y(c, node, node->x, width, &waste); + if(c->heuristic == STBRP_HEURISTIC_Skyline_BL_sortHeight) { // actually just want to test BL + // bottom left + if(y < best_y) { + best_y = y; + best = prev; + } + } + else { + // best-fit + if(y + height <= c->height) { + // can only use it if it first vertically + if(y < best_y || (y == best_y && waste < best_waste)) { + best_y = y; + best_waste = waste; + best = prev; + } + } + } + prev = &node->next; + node = node->next; + } + + best_x = (best == NULL) ? 0 : (*best)->x; + + // if doing best-fit (BF), we also have to try aligning right edge to each node position + // + // e.g, if fitting + // + // ____________________ + // |____________________| + // + // into + // + // | | + // | ____________| + // |____________| + // + // then right-aligned reduces waste, but bottom-left BL is always chooses left-aligned + // + // This makes BF take about 2x the time + + if(c->heuristic == STBRP_HEURISTIC_Skyline_BF_sortHeight) { + tail = c->active_head; + node = c->active_head; + prev = &c->active_head; + // find first node that's admissible + while(tail->x < width) + tail = tail->next; + while(tail) { + int xpos = tail->x - width; + int y, waste; + STBRP_ASSERT(xpos >= 0); + // find the left position that matches this + while(node->next->x <= xpos) { + prev = &node->next; + node = node->next; + } + STBRP_ASSERT(node->next->x > xpos && node->x <= xpos); + y = stbrp__skyline_find_min_y(c, node, xpos, width, &waste); + if(y + height <= c->height) { + if(y <= best_y) { + if(y < best_y || waste < best_waste || (waste == best_waste && xpos < best_x)) { + best_x = xpos; + STBRP_ASSERT(y <= best_y); + best_y = y; + best_waste = waste; + best = prev; + } + } + } + tail = tail->next; + } + } + + fr.prev_link = best; + fr.x = best_x; + fr.y = best_y; + return fr; +} + +static stbrp__findresult stbrp__skyline_pack_rectangle(stbrp_context * context, int width, int height) +{ + // find best position according to heuristic + stbrp__findresult res = stbrp__skyline_find_best_pos(context, width, height); + stbrp_node * node, * cur; + + // bail if: + // 1. it failed + // 2. the best node doesn't fit (we don't always check this) + // 3. we're out of memory + if(res.prev_link == NULL || res.y + height > context->height || context->free_head == NULL) { + res.prev_link = NULL; + return res; + } + + // on success, create new node + node = context->free_head; + node->x = (stbrp_coord) res.x; + node->y = (stbrp_coord)(res.y + height); + + context->free_head = node->next; + + // insert the new node into the right starting point, and + // let 'cur' point to the remaining nodes needing to be + // stiched back in + + cur = *res.prev_link; + if(cur->x < res.x) { + // preserve the existing one, so start testing with the next one + stbrp_node * next = cur->next; + cur->next = node; + cur = next; + } + else { + *res.prev_link = node; + } + + // from here, traverse cur and free the nodes, until we get to one + // that shouldn't be freed + while(cur->next && cur->next->x <= res.x + width) { + stbrp_node * next = cur->next; + // move the current node to the free list + cur->next = context->free_head; + context->free_head = cur; + cur = next; + } + + // stitch the list back in + node->next = cur; + + if(cur->x < res.x + width) + cur->x = (stbrp_coord)(res.x + width); + +#ifdef _DEBUG + cur = context->active_head; + while(cur->x < context->width) { + STBRP_ASSERT(cur->x < cur->next->x); + cur = cur->next; + } + STBRP_ASSERT(cur->next == NULL); + + { + int count = 0; + cur = context->active_head; + while(cur) { + cur = cur->next; + ++count; + } + cur = context->free_head; + while(cur) { + cur = cur->next; + ++count; + } + STBRP_ASSERT(count == context->num_nodes + 2); + } +#endif + + return res; +} + +static int STBRP__CDECL rect_height_compare(const void * a, const void * b) +{ + const stbrp_rect * p = (const stbrp_rect *) a; + const stbrp_rect * q = (const stbrp_rect *) b; + if(p->h > q->h) + return -1; + if(p->h < q->h) + return 1; + return (p->w > q->w) ? -1 : (p->w < q->w); +} + +static int STBRP__CDECL rect_original_order(const void * a, const void * b) +{ + const stbrp_rect * p = (const stbrp_rect *) a; + const stbrp_rect * q = (const stbrp_rect *) b; + return (p->was_packed < q->was_packed) ? -1 : (p->was_packed > q->was_packed); +} + +STBRP_DEF int stbrp_pack_rects(stbrp_context * context, stbrp_rect * rects, int num_rects) +{ + int i, all_rects_packed = 1; + + // we use the 'was_packed' field internally to allow sorting/unsorting + for(i = 0; i < num_rects; ++i) { + rects[i].was_packed = i; + } + + // sort according to heuristic + STBRP_SORT(rects, num_rects, sizeof(rects[0]), rect_height_compare); + + for(i = 0; i < num_rects; ++i) { + if(rects[i].w == 0 || rects[i].h == 0) { + rects[i].x = rects[i].y = 0; // empty rect needs no space + } + else { + stbrp__findresult fr = stbrp__skyline_pack_rectangle(context, rects[i].w, rects[i].h); + if(fr.prev_link) { + rects[i].x = (stbrp_coord) fr.x; + rects[i].y = (stbrp_coord) fr.y; + } + else { + rects[i].x = rects[i].y = STBRP__MAXVAL; + } + } + } + + // unsort + STBRP_SORT(rects, num_rects, sizeof(rects[0]), rect_original_order); + + // set was_packed flags and all_rects_packed status + for(i = 0; i < num_rects; ++i) { + rects[i].was_packed = !(rects[i].x == STBRP__MAXVAL && rects[i].y == STBRP__MAXVAL); + if(!rects[i].was_packed) + all_rects_packed = 0; + } + + // return the all_rects_packed status + return all_rects_packed; +} +#endif + +#if defined(__GNUC__) || defined(__clang__) + #pragma GCC diagnostic pop +#endif + +/* +------------------------------------------------------------------------------ +This software is available under 2 licenses -- choose whichever you prefer. +------------------------------------------------------------------------------ +ALTERNATIVE A - MIT License +Copyright (c) 2017 Sean Barrett +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +------------------------------------------------------------------------------ +ALTERNATIVE B - Public Domain (www.unlicense.org) +This is free and unencumbered software released into the public domain. +Anyone is free to copy, modify, publish, use, compile, sell, or distribute this +software, either in source code form or as a compiled binary, for any purpose, +commercial or non-commercial, and by any means. +In jurisdictions that recognize copyright laws, the author or authors of this +software dedicate any and all copyright interest in the software to the public +domain. We make this dedication for the benefit of the public at large and to +the detriment of our heirs and successors. We intend this dedication to be an +overt act of relinquishment in perpetuity of all present and future rights to +this software under copyright law. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +------------------------------------------------------------------------------ +*/ diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/libs/tiny_ttf/stb_truetype_htcw.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/libs/tiny_ttf/stb_truetype_htcw.h new file mode 100644 index 0000000..e91997b --- /dev/null +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/libs/tiny_ttf/stb_truetype_htcw.h @@ -0,0 +1,5558 @@ +// stb_truetype.h - v1.26htcw (fork to enable streaming and low memory environments) +// stb_truetype.h - v1.26 - public domain +// authored from 2009-2021 by Sean Barrett / RAD Game Tools +// +// ======================================================================= +// +// NO SECURITY GUARANTEE -- DO NOT USE THIS ON UNTRUSTED FONT FILES +// +// This library does no range checking of the offsets found in the file, +// meaning an attacker can use it to read arbitrary memory. +// +// ======================================================================= +// +// This library processes TrueType files: +// parse files +// extract glyph metrics +// extract glyph shapes +// render glyphs to one-channel bitmaps with antialiasing (box filter) +// render glyphs to one-channel SDF bitmaps (signed-distance field/function) +// +// Todo: +// non-MS cmaps +// crashproof on bad data +// hinting? (no longer patented) +// cleartype-style AA? +// optimize: use simple memory allocator for intermediates +// optimize: build edge-list directly from curves +// optimize: rasterize directly from curves? +// +// ADDITIONAL CONTRIBUTORS +// +// Mikko Mononen: compound shape support, more cmap formats +// Tor Andersson: kerning, subpixel rendering +// Dougall Johnson: OpenType / Type 2 font handling +// Daniel Ribeiro Maciel: basic GPOS-based kerning +// +// Misc other: +// Ryan Gordon +// Simon Glass +// github:IntellectualKitty +// Imanol Celaya +// Daniel Ribeiro Maciel +// +// Bug/warning reports/fixes: +// "Zer" on mollyrocket Fabian "ryg" Giesen github:NiLuJe +// Cass Everitt Martins Mozeiko github:aloucks +// stoiko (Haemimont Games) Cap Petschulat github:oyvindjam +// Brian Hook Omar Cornut github:vassvik +// Walter van Niftrik Ryan Griege +// David Gow Peter LaValle +// David Given Sergey Popov +// Ivan-Assen Ivanov Giumo X. Clanjor +// Anthony Pesch Higor Euripedes +// Johan Duparc Thomas Fields +// Hou Qiming Derek Vinyard +// Rob Loach Cort Stratton +// Kenney Phillis Jr. Brian Costabile +// Ken Voskuil (kaesve) +// +// VERSION HISTORY +// +// 1.26 (2021-08-28) fix broken rasterizer +// 1.25 (2021-07-11) many fixes +// 1.24 (2020-02-05) fix warning +// 1.23 (2020-02-02) query SVG data for glyphs; query whole kerning table (but only kern not GPOS) +// 1.22 (2019-08-11) minimize missing-glyph duplication; fix kerning if both 'GPOS' and 'kern' are defined +// 1.21 (2019-02-25) fix warning +// 1.20 (2019-02-07) PackFontRange skips missing codepoints; GetScaleFontVMetrics() +// 1.19 (2018-02-11) GPOS kerning, STBTT_fmod +// 1.18 (2018-01-29) add missing function +// 1.17 (2017-07-23) make more arguments const; doc fix +// 1.16 (2017-07-12) SDF support +// 1.15 (2017-03-03) make more arguments const +// 1.14 (2017-01-16) num-fonts-in-TTC function +// 1.13 (2017-01-02) support OpenType fonts, certain Apple fonts +// 1.12 (2016-10-25) suppress warnings about casting away const with -Wcast-qual +// 1.11 (2016-04-02) fix unused-variable warning +// 1.10 (2016-04-02) user-defined fabs(); rare memory leak; remove duplicate typedef +// 1.09 (2016-01-16) warning fix; avoid crash on outofmem; use allocation userdata properly +// 1.08 (2015-09-13) document stbtt_Rasterize(); fixes for vertical & horizontal edges +// 1.07 (2015-08-01) allow PackFontRanges to accept arrays of sparse codepoints; +// variant PackFontRanges to pack and render in separate phases; +// fix stbtt_GetFontOFfsetForIndex (never worked for non-0 input?); +// fixed an assert() bug in the new rasterizer +// replace assert() with STBTT_assert() in new rasterizer +// +// Full history can be found at the end of this file. +// +// LICENSE +// +// See end of file for license information. +// +// USAGE +// +// Include this file in whatever places need to refer to it. In ONE C/C++ +// file, write: +// #define STB_TRUETYPE_IMPLEMENTATION +// before the #include of this file. This expands out the actual +// implementation into that C/C++ file. +// +// To make the implementation private to the file that generates the implementation, +// #define STBTT_STATIC +// +// Simple 3D API (don't ship this, but it's fine for tools and quick start) +// stbtt_BakeFontBitmap() -- bake a font to a bitmap for use as texture +// stbtt_GetBakedQuad() -- compute quad to draw for a given char +// +// Improved 3D API (more shippable): +// #include "stb_rect_pack.h" -- optional, but you really want it +// stbtt_PackBegin() +// stbtt_PackSetOversampling() -- for improved quality on small fonts +// stbtt_PackFontRanges() -- pack and renders +// stbtt_PackEnd() +// stbtt_GetPackedQuad() +// +// "Load" a font file from a memory buffer (you have to keep the buffer loaded) +// stbtt_InitFont() +// stbtt_GetFontOffsetForIndex() -- indexing for TTC font collections +// stbtt_GetNumberOfFonts() -- number of fonts for TTC font collections +// +// Render a unicode codepoint to a bitmap +// stbtt_GetCodepointBitmap() -- allocates and returns a bitmap +// stbtt_MakeCodepointBitmap() -- renders into bitmap you provide +// stbtt_GetCodepointBitmapBox() -- how big the bitmap must be +// +// Character advance/positioning +// stbtt_GetCodepointHMetrics() +// stbtt_GetFontVMetrics() +// stbtt_GetFontVMetricsOS2() +// stbtt_GetCodepointKernAdvance() +// +// Starting with version 1.06, the rasterizer was replaced with a new, +// faster and generally-more-precise rasterizer. The new rasterizer more +// accurately measures pixel coverage for anti-aliasing, except in the case +// where multiple shapes overlap, in which case it overestimates the AA pixel +// coverage. Thus, anti-aliasing of intersecting shapes may look wrong. If +// this turns out to be a problem, you can re-enable the old rasterizer with +// #define STBTT_RASTERIZER_VERSION 1 +// which will incur about a 15% speed hit. +// +// ADDITIONAL DOCUMENTATION +// +// Immediately after this block comment are a series of sample programs. +// +// After the sample programs is the "header file" section. This section +// includes documentation for each API function. +// +// Some important concepts to understand to use this library: +// +// Codepoint +// Characters are defined by unicode codepoints, e.g. 65 is +// uppercase A, 231 is lowercase c with a cedilla, 0x7e30 is +// the hiragana for "ma". +// +// Glyph +// A visual character shape (every codepoint is rendered as +// some glyph) +// +// Glyph index +// A font-specific integer ID representing a glyph +// +// Baseline +// Glyph shapes are defined relative to a baseline, which is the +// bottom of uppercase characters. Characters extend both above +// and below the baseline. +// +// Current Point +// As you draw text to the screen, you keep track of a "current point" +// which is the origin of each character. The current point's vertical +// position is the baseline. Even "baked fonts" use this model. +// +// Vertical Font Metrics +// The vertical qualities of the font, used to vertically position +// and space the characters. See docs for stbtt_GetFontVMetrics. +// +// Font Size in Pixels or Points +// The preferred interface for specifying font sizes in stb_truetype +// is to specify how tall the font's vertical extent should be in pixels. +// If that sounds good enough, skip the next paragraph. +// +// Most font APIs instead use "points", which are a common typographic +// measurement for describing font size, defined as 72 points per inch. +// stb_truetype provides a point API for compatibility. However, true +// "per inch" conventions don't make much sense on computer displays +// since different monitors have different number of pixels per +// inch. For example, Windows traditionally uses a convention that +// there are 96 pixels per inch, thus making 'inch' measurements have +// nothing to do with inches, and thus effectively defining a point to +// be 1.333 pixels. Additionally, the TrueType font data provides +// an explicit scale factor to scale a given font's glyphs to points, +// but the author has observed that this scale factor is often wrong +// for non-commercial fonts, thus making fonts scaled in points +// according to the TrueType spec incoherently sized in practice. +// +// DETAILED USAGE: +// +// Scale: +// Select how high you want the font to be, in points or pixels. +// Call ScaleForPixelHeight or ScaleForMappingEmToPixels to compute +// a scale factor SF that will be used by all other functions. +// +// Baseline: +// You need to select a y-coordinate that is the baseline of where +// your text will appear. Call GetFontBoundingBox to get the baseline-relative +// bounding box for all characters. SF*-y0 will be the distance in pixels +// that the worst-case character could extend above the baseline, so if +// you want the top edge of characters to appear at the top of the +// screen where y=0, then you would set the baseline to SF*-y0. +// +// Current point: +// Set the current point where the first character will appear. The +// first character could extend left of the current point; this is font +// dependent. You can either choose a current point that is the leftmost +// point and hope, or add some padding, or check the bounding box or +// left-side-bearing of the first character to be displayed and set +// the current point based on that. +// +// Displaying a character: +// Compute the bounding box of the character. It will contain signed values +// relative to . I.e. if it returns x0,y0,x1,y1, +// then the character should be displayed in the rectangle from +// to = 32 && *text < 128) { + stbtt_aligned_quad q; + stbtt_GetBakedQuad(cdata, 512, 512, *text - 32, &x, &y, &q, 1);//1=opengl & d3d10+,0=d3d9 + glTexCoord2f(q.s0, q.t0); + glVertex2f(q.x0, q.y0); + glTexCoord2f(q.s1, q.t0); + glVertex2f(q.x1, q.y0); + glTexCoord2f(q.s1, q.t1); + glVertex2f(q.x1, q.y1); + glTexCoord2f(q.s0, q.t1); + glVertex2f(q.x0, q.y1); + } + ++text; + } + glEnd(); +} +#endif +// +// +////////////////////////////////////////////////////////////////////////////// +// +// Complete program (this compiles): get a single bitmap, print as ASCII art +// +#if 0 +#include +#define STB_TRUETYPE_IMPLEMENTATION // force following include to generate implementation +#include "stb_truetype.h" + +char ttf_buffer[1 << 25]; + +int main(int argc, char ** argv) +{ + stbtt_fontinfo font; + unsigned char * bitmap; + int w, h, i, j, c = (argc > 1 ? atoi(argv[1]) : 'a'), s = (argc > 2 ? atoi(argv[2]) : 20); + + fread(ttf_buffer, 1, 1 << 25, fopen(argc > 3 ? argv[3] : "c:/windows/fonts/arialbd.ttf", "rb")); + + stbtt_InitFont(&font, ttf_buffer, stbtt_GetFontOffsetForIndex(ttf_buffer, 0)); + bitmap = stbtt_GetCodepointBitmap(&font, 0, stbtt_ScaleForPixelHeight(&font, s), c, &w, &h, 0, 0); + + for(j = 0; j < h; ++j) { + for(i = 0; i < w; ++i) + putchar(" .:ioVM@"[bitmap[j * w + i] >> 5]); + putchar('\n'); + } + return 0; +} +#endif +// +// Output: +// +// .ii. +// @@@@@@. +// V@Mio@@o +// :i. V@V +// :oM@@M +// :@@@MM@M +// @@o o@M +// :@@. M@M +// @@@o@@@@ +// :M@@V:@@. +// +////////////////////////////////////////////////////////////////////////////// +// +// Complete program: print "Hello World!" banner, with bugs +// +#if 0 +char buffer[24 << 20]; +unsigned char screen[20][79]; + +int main(int arg, char ** argv) +{ + stbtt_fontinfo font; + int i, j, ascent, baseline, ch = 0; + float scale, xpos = 2; // leave a little padding in case the character extends left + char * text = "Heljo World!"; // intentionally misspelled to show 'lj' brokenness + + fread(buffer, 1, 1000000, fopen("c:/windows/fonts/arialbd.ttf", "rb")); + stbtt_InitFont(&font, buffer, 0); + + scale = stbtt_ScaleForPixelHeight(&font, 15); + stbtt_GetFontVMetrics(&font, &ascent, 0, 0); + baseline = (int)(ascent * scale); + + while(text[ch]) { + int advance, lsb, x0, y0, x1, y1; + float x_shift = xpos - (float)floor(xpos); + stbtt_GetCodepointHMetrics(&font, text[ch], &advance, &lsb); + stbtt_GetCodepointBitmapBoxSubpixel(&font, text[ch], scale, scale, x_shift, 0, &x0, &y0, &x1, &y1); + stbtt_MakeCodepointBitmapSubpixel(&font, &screen[baseline + y0][(int)xpos + x0], x1 - x0, y1 - y0, 79, scale, scale, + x_shift, 0, text[ch]); + // note that this stomps the old data, so where character boxes overlap (e.g. 'lj') it's wrong + // because this API is really for baking character bitmaps into textures. if you want to render + // a sequence of characters, you really need to render each bitmap to a temp buffer, then + // "alpha blend" that into the working buffer + xpos += (advance * scale); + if(text[ch + 1]) + xpos += scale * stbtt_GetCodepointKernAdvance(&font, text[ch], text[ch + 1]); + ++ch; + } + + for(j = 0; j < 20; ++j) { + for(i = 0; i < 78; ++i) + putchar(" .:ioVM@"[screen[j][i] >> 5]); + putchar('\n'); + } + + return 0; +} +#endif + +////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////// +//// +//// INTEGRATION WITH YOUR CODEBASE +//// +//// The following sections allow you to supply alternate definitions +//// of C library functions used by stb_truetype, e.g. if you don't +//// link with the C runtime library. + +#ifdef STB_TRUETYPE_IMPLEMENTATION +// #define your own (u)stbtt_int8/16/32 before including to override this +#ifndef stbtt_uint8 + typedef unsigned char stbtt_uint8; + typedef signed char stbtt_int8; + typedef unsigned short stbtt_uint16; + typedef signed short stbtt_int16; + typedef unsigned int stbtt_uint32; + typedef signed int stbtt_int32; +#endif + +typedef char stbtt__check_size32[sizeof(stbtt_int32) == 4 ? 1 : -1]; +typedef char stbtt__check_size16[sizeof(stbtt_int16) == 2 ? 1 : -1]; + +// define STBTT_STDIO_STREAM to stream from a FILE object +// instead of from memory. Or define STBTT_STREAM_TYPE, +// STBTT_STREAM_READ and STBTT_STREAM_SEEK to implement +// another streaming source +#ifdef STBTT_STDIO_STREAM + #include + #define STBTT_STREAM_TYPE FILE* + #define STBTT_STREAM_READ(s,x,y) fread(x,1,y,s); + #define STBTT_STREAM_SEEK(s,x) fseek(s,x,SEEK_SET); +#endif + +// heap factor sizes for various counts of objects +// adjust for your platform. Below is suitable for +// modern PC class machines. +#ifndef STBTT_HEAP_FACTOR_SIZE_32 + #define STBTT_HEAP_FACTOR_SIZE_32 2000 +#endif + +#ifndef STBTT_HEAP_FACTOR_SIZE_128 + #define STBTT_HEAP_FACTOR_SIZE_128 800 +#endif + +#ifndef STBTT_HEAP_FACTOR_SIZE_DEFAULT + #define STBTT_HEAP_FACTOR_SIZE_DEFAULT 100 +#endif + +// e.g. #define your own STBTT_ifloor/STBTT_iceil() to avoid math.h +#ifndef STBTT_ifloor + #include + #define STBTT_ifloor(x) ((int) floor(x)) + #define STBTT_iceil(x) ((int) ceil(x)) +#endif + +#ifndef STBTT_sqrt + #include + #define STBTT_sqrt(x) (float)sqrt(x) + #define STBTT_pow(x,y) pow(x,y) +#endif + +#ifndef STBTT_fmod + #include + #define STBTT_fmod(x,y) fmod(x,y) +#endif + +#ifndef STBTT_cos + #include + #define STBTT_cos(x) cos(x) + #define STBTT_acos(x) acos(x) +#endif + +#ifndef STBTT_fabs + #include + #define STBTT_fabs(x) (float)fabs(x) +#endif + +// #define your own functions "STBTT_malloc" / "STBTT_free" to avoid malloc.h +#ifndef STBTT_malloc + #include + #define STBTT_malloc(x,u) ((void)(u),malloc(x)) + #define STBTT_free(x,u) ((void)(u),free(x)) +#endif + +#ifndef STBTT_assert + #include + #define STBTT_assert(x) assert(x) +#endif + +#ifndef STBTT_strlen + #include + #define STBTT_strlen(x) strlen(x) +#endif + +#ifndef STBTT_memcpy + #include + #define STBTT_memcpy memcpy + #define STBTT_memset memset +#endif +#endif + +/////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////// +//// +//// INTERFACE +//// +//// + +#ifndef __STB_INCLUDE_STB_TRUETYPE_H__ +#define __STB_INCLUDE_STB_TRUETYPE_H__ + +#ifdef STBTT_STATIC + #define STBTT_DEF static +#else + #define STBTT_DEF extern +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +// private structure +typedef struct { +#ifdef STBTT_STREAM_TYPE + STBTT_STREAM_TYPE data; + stbtt_uint32 offset; +#else + unsigned char * data; +#endif + int cursor; + int size; +} stbtt__buf; + +#if defined(__GNUC__) || defined(__clang__) +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wunused-function" +#endif + +////////////////////////////////////////////////////////////////////////////// +// +// TEXTURE BAKING API +// +// If you use this API, you only have to call two functions ever. +// + +typedef struct { + unsigned short x0, y0, x1, y1; // coordinates of bbox in bitmap + float xoff, yoff, xadvance; +} stbtt_bakedchar; + +typedef struct { + float x0, y0, s0, t0; // top-left + float x1, y1, s1, t1; // bottom-right +} stbtt_aligned_quad; + +STBTT_DEF void stbtt_GetBakedQuad(const stbtt_bakedchar * chardata, int pw, int ph, // same data as above + int char_index, // character to display + float * xpos, float * ypos, // pointers to current position in screen pixel space + stbtt_aligned_quad * q, // output: quad to draw + int opengl_fillrule); // true if opengl fill rule; false if DX9 or earlier +// Call GetBakedQuad with char_index = 'character - first_char', and it +// creates the quad you need to draw and advances the current position. +// +// The coordinate system used assumes y increases downwards. +// +// Characters will extend both above and below the current position; +// see discussion of "BASELINE" above. +// +// It's inefficient; you might want to c&p it and optimize it. + +////////////////////////////////////////////////////////////////////////////// +// +// NEW TEXTURE BAKING API +// +// This provides options for packing multiple fonts into one atlas, not +// perfectly but better than nothing. + +typedef struct { + unsigned short x0, y0, x1, y1; // coordinates of bbox in bitmap + float xoff, yoff, xadvance; + float xoff2, yoff2; +} stbtt_packedchar; + +/// @cond +/** + * Tells Doxygen to ignore a duplicate declaration + */ +typedef struct stbtt_pack_context stbtt_pack_context; +typedef struct stbtt_fontinfo stbtt_fontinfo; +/// @endcond + +#ifndef STB_RECT_PACK_VERSION +/// @cond +/** + * Tells Doxygen to ignore a duplicate declaration + */ +typedef struct stbrp_rect stbrp_rect; +/// @endcond + +#endif +STBTT_DEF int stbtt_PackBegin(stbtt_pack_context * spc, unsigned char * pixels, int width, int height, + int stride_in_bytes, int padding, void * alloc_context); + +// Initializes a packing context stored in the passed-in stbtt_pack_context. +// Future calls using this context will pack characters into the bitmap passed +// in here: a 1-channel bitmap that is width * height. stride_in_bytes is +// the distance from one row to the next (or 0 to mean they are packed tightly +// together). "padding" is the amount of padding to leave between each +// character (normally you want '1' for bitmaps you'll use as textures with +// bilinear filtering). +// +// Returns 0 on failure, 1 on success. + +STBTT_DEF void stbtt_PackEnd(stbtt_pack_context * spc); +// Cleans up the packing context and frees all memory. + +#define STBTT_POINT_SIZE(x) (-(x)) + +typedef struct { + float font_size; + int first_unicode_codepoint_in_range; // if non-zero, then the chars are continuous, and this is the first codepoint + int * array_of_unicode_codepoints; // if non-zero, then this is an array of unicode codepoints + int num_chars; + stbtt_packedchar * chardata_for_range; // output + unsigned char h_oversample, v_oversample; // don't set these, they're used internally +} stbtt_pack_range; + +STBTT_DEF void stbtt_PackSetOversampling(stbtt_pack_context * spc, unsigned int h_oversample, + unsigned int v_oversample); +// Oversampling a font increases the quality by allowing higher-quality subpixel +// positioning, and is especially valuable at smaller text sizes. +// +// This function sets the amount of oversampling for all following calls to +// stbtt_PackFontRange(s) or stbtt_PackFontRangesGatherRects for a given +// pack context. The default (no oversampling) is achieved by h_oversample=1 +// and v_oversample=1. The total number of pixels required is +// h_oversample*v_oversample larger than the default; for example, 2x2 +// oversampling requires 4x the storage of 1x1. For best results, render +// oversampled textures with bilinear filtering. Look at the readme in +// stb/tests/oversample for information about oversampled fonts +// +// To use with PackFontRangesGather etc., you must set it before calls +// call to PackFontRangesGatherRects. + +STBTT_DEF void stbtt_PackSetSkipMissingCodepoints(stbtt_pack_context * spc, int skip); +// If skip != 0, this tells stb_truetype to skip any codepoints for which +// there is no corresponding glyph. If skip=0, which is the default, then +// codepoints without a glyph received the font's "missing character" glyph, +// typically an empty box by convention. + +STBTT_DEF void stbtt_GetPackedQuad(const stbtt_packedchar * chardata, int pw, int ph, // same data as above + int char_index, // character to display + float * xpos, float * ypos, // pointers to current position in screen pixel space + stbtt_aligned_quad * q, // output: quad to draw + int align_to_integer); + +STBTT_DEF int stbtt_PackFontRangesGatherRects(stbtt_pack_context * spc, const stbtt_fontinfo * info, + stbtt_pack_range * ranges, int num_ranges, stbrp_rect * rects); +STBTT_DEF void stbtt_PackFontRangesPackRects(stbtt_pack_context * spc, stbrp_rect * rects, int num_rects); +STBTT_DEF int stbtt_PackFontRangesRenderIntoRects(stbtt_pack_context * spc, const stbtt_fontinfo * info, + stbtt_pack_range * ranges, int num_ranges, stbrp_rect * rects); +// Calling these functions in sequence is roughly equivalent to calling +// stbtt_PackFontRanges(). If you more control over the packing of multiple +// fonts, or if you want to pack custom data into a font texture, take a look +// at the source to of stbtt_PackFontRanges() and create a custom version +// using these functions, e.g. call GatherRects multiple times, +// building up a single array of rects, then call PackRects once, +// then call RenderIntoRects repeatedly. This may result in a +// better packing than calling PackFontRanges multiple times +// (or it may not). + +// this is an opaque structure that you shouldn't mess with which holds +// all the context needed from PackBegin to PackEnd. +struct stbtt_pack_context { + void * user_allocator_context; + void * pack_info; + int width; + int height; + int stride_in_bytes; + int padding; + int skip_missing; + unsigned int h_oversample, v_oversample; + unsigned char * pixels; + void * nodes; +}; + +////////////////////////////////////////////////////////////////////////////// +// +// FONT LOADING +// +// +#ifdef STBTT_STREAM_TYPE +STBTT_DEF int stbtt_GetNumberOfFonts(STBTT_STREAM_TYPE data); +#else +STBTT_DEF int stbtt_GetNumberOfFonts(const unsigned char * data); +#endif +// This function will determine the number of fonts in a font file. TrueType +// collection (.ttc) files may contain multiple fonts, while TrueType font +// (.ttf) files only contain one font. The number of fonts can be used for +// indexing with the previous function where the index is between zero and one +// less than the total fonts. If an error occurs, -1 is returned. +#ifdef STBTT_STREAM_TYPE +STBTT_DEF int stbtt_GetFontOffsetForIndex(STBTT_STREAM_TYPE, int index); +#else +STBTT_DEF int stbtt_GetFontOffsetForIndex(const unsigned char * data, int index); +#endif + +// Each .ttf/.ttc file may have more than one font. Each font has a sequential +// index number starting from 0. Call this function to get the font offset for +// a given index; it returns -1 if the index is out of range. A regular .ttf +// file will only define one font and it always be at offset 0, so it will +// return '0' for index 0, and -1 for all other indices. + +// The following structure is defined publicly so you can declare one on +// the stack or as a global or etc, but you should treat it as opaque. +struct stbtt_fontinfo { + void * userdata; +#ifdef STBTT_STREAM_TYPE + STBTT_STREAM_TYPE data; +#else + unsigned char * data; // pointer to .ttf file +#endif + int fontstart; // offset of start of font + + int numGlyphs; // number of glyphs, needed for range checking + + int loca, head, glyf, hhea, hmtx, kern, gpos, svg; // table locations as offset from start of .ttf + int index_map; // a cmap mapping for our chosen character encoding + int indexToLocFormat; // format needed to map from glyph index to glyph + + stbtt__buf cff; // cff font data + stbtt__buf charstrings; // the charstring index + stbtt__buf gsubrs; // global charstring subroutines index + stbtt__buf subrs; // private charstring subroutines index + stbtt__buf fontdicts; // array of font dicts + stbtt__buf fdselect; // map from glyph to fontdict +}; +#ifdef STBTT_STREAM_TYPE +STBTT_DEF int stbtt_InitFont(stbtt_fontinfo * info, STBTT_STREAM_TYPE data, int offset); +#else +STBTT_DEF int stbtt_InitFont(stbtt_fontinfo * info, const unsigned char * data, int offset); +#endif +// Given an offset into the file that defines a font, this function builds +// the necessary cached info for the rest of the system. You must allocate +// the stbtt_fontinfo yourself, and stbtt_InitFont will fill it out. You don't +// need to do anything special to free it, because the contents are pure +// value data with no additional data structures. Returns 0 on failure. + +////////////////////////////////////////////////////////////////////////////// +// +// CHARACTER TO GLYPH-INDEX CONVERSIOn + +STBTT_DEF int stbtt_FindGlyphIndex(const stbtt_fontinfo * info, int unicode_codepoint); +// If you're going to perform multiple operations on the same character +// and you want a speed-up, call this function with the character you're +// going to process, then use glyph-based functions instead of the +// codepoint-based functions. +// Returns 0 if the character codepoint is not defined in the font. + +////////////////////////////////////////////////////////////////////////////// +// +// CHARACTER PROPERTIES +// + +STBTT_DEF float stbtt_ScaleForPixelHeight(const stbtt_fontinfo * info, float pixels); +// computes a scale factor to produce a font whose "height" is 'pixels' tall. +// Height is measured as the distance from the highest ascender to the lowest +// descender; in other words, it's equivalent to calling stbtt_GetFontVMetrics +// and computing: +// scale = pixels / (ascent - descent) +// so if you prefer to measure height by the ascent only, use a similar calculation. + +STBTT_DEF float stbtt_ScaleForMappingEmToPixels(const stbtt_fontinfo * info, float pixels); +// computes a scale factor to produce a font whose EM size is mapped to +// 'pixels' tall. This is probably what traditional APIs compute, but +// I'm not positive. + +STBTT_DEF void stbtt_GetFontVMetrics(const stbtt_fontinfo * info, int * ascent, int * descent, int * lineGap); +// ascent is the coordinate above the baseline the font extends; descent +// is the coordinate below the baseline the font extends (i.e. it is typically negative) +// lineGap is the spacing between one row's descent and the next row's ascent... +// so you should advance the vertical position by "*ascent - *descent + *lineGap" +// these are expressed in unscaled coordinates, so you must multiply by +// the scale factor for a given size + +STBTT_DEF int stbtt_GetFontVMetricsOS2(const stbtt_fontinfo * info, int * typoAscent, int * typoDescent, + int * typoLineGap); +// analogous to GetFontVMetrics, but returns the "typographic" values from the OS/2 +// table (specific to MS/Windows TTF files). +// +// Returns 1 on success (table present), 0 on failure. + +STBTT_DEF void stbtt_GetFontBoundingBox(const stbtt_fontinfo * info, int * x0, int * y0, int * x1, int * y1); +// the bounding box around all possible characters + +STBTT_DEF void stbtt_GetCodepointHMetrics(const stbtt_fontinfo * info, int codepoint, int * advanceWidth, + int * leftSideBearing); +// leftSideBearing is the offset from the current horizontal position to the left edge of the character +// advanceWidth is the offset from the current horizontal position to the next horizontal position +// these are expressed in unscaled coordinates + +STBTT_DEF int stbtt_GetCodepointKernAdvance(const stbtt_fontinfo * info, int ch1, int ch2); +// an additional amount to add to the 'advance' value between ch1 and ch2 + +STBTT_DEF int stbtt_GetCodepointBox(const stbtt_fontinfo * info, int codepoint, int * x0, int * y0, int * x1, int * y1); +// Gets the bounding box of the visible part of the glyph, in unscaled coordinates + +STBTT_DEF void stbtt_GetGlyphHMetrics(const stbtt_fontinfo * info, int glyph_index, int * advanceWidth, + int * leftSideBearing); +STBTT_DEF int stbtt_GetGlyphKernAdvance(const stbtt_fontinfo * info, int glyph1, int glyph2); +STBTT_DEF int stbtt_GetGlyphBox(const stbtt_fontinfo * info, int glyph_index, int * x0, int * y0, int * x1, int * y1); +// as above, but takes one or more glyph indices for greater efficiency + +typedef struct _stbtt_kerningentry { + int glyph1; // use stbtt_FindGlyphIndex + int glyph2; + int advance; +} stbtt_kerningentry; + +STBTT_DEF int stbtt_GetKerningTableLength(const stbtt_fontinfo * info); +STBTT_DEF int stbtt_GetKerningTable(const stbtt_fontinfo * info, stbtt_kerningentry * table, int table_length); +// Retrieves a complete list of all of the kerning pairs provided by the font +// stbtt_GetKerningTable never writes more than table_length entries and returns how many entries it did write. +// The table will be sorted by (a.glyph1 == b.glyph1)?(a.glyph2 < b.glyph2):(a.glyph1 < b.glyph1) + +////////////////////////////////////////////////////////////////////////////// +// +// GLYPH SHAPES (you probably don't need these, but they have to go before +// the bitmaps for C declaration-order reasons) +// + +#ifndef STBTT_vmove // you can predefine these to use different values (but why?) +enum { + STBTT_vmove = 1, + STBTT_vline, + STBTT_vcurve, + STBTT_vcubic +}; +#endif + +#ifndef stbtt_vertex // you can predefine this to use different values +// (we share this with other code at RAD) +#define stbtt_vertex_type short // can't use stbtt_int16 because that's not visible in the header file +typedef struct { + stbtt_vertex_type x, y, cx, cy, cx1, cy1; + unsigned char type, padding; +} stbtt_vertex; +#endif + +STBTT_DEF int stbtt_IsGlyphEmpty(const stbtt_fontinfo * info, int glyph_index); +// returns non-zero if nothing is drawn for this glyph + +STBTT_DEF int stbtt_GetCodepointShape(const stbtt_fontinfo * info, int unicode_codepoint, stbtt_vertex ** vertices); +STBTT_DEF int stbtt_GetGlyphShape(const stbtt_fontinfo * info, int glyph_index, stbtt_vertex ** vertices); +// returns # of vertices and fills *vertices with the pointer to them +// these are expressed in "unscaled" coordinates +// +// The shape is a series of contours. Each one starts with +// a STBTT_moveto, then consists of a series of mixed +// STBTT_lineto and STBTT_curveto segments. A lineto +// draws a line from previous endpoint to its x,y; a curveto +// draws a quadratic bezier from previous endpoint to +// its x,y, using cx,cy as the bezier control point. + +STBTT_DEF void stbtt_FreeShape(const stbtt_fontinfo * info, stbtt_vertex * vertices); +// frees the data allocated above + +STBTT_DEF stbtt_uint32 stbtt_FindSVGDoc(const stbtt_fontinfo * info, int gl); +STBTT_DEF int stbtt_GetCodepointSVG(const stbtt_fontinfo * info, int unicode_codepoint, stbtt_uint32 * svgOfs); +STBTT_DEF int stbtt_GetGlyphSVG(const stbtt_fontinfo * info, int gl, stbtt_uint32 * svgOfs); +// fills svg with the character's SVG data. +// returns data size or 0 if SVG not found. + +////////////////////////////////////////////////////////////////////////////// +// +// BITMAP RENDERING +// + +STBTT_DEF void stbtt_FreeBitmap(unsigned char * bitmap, void * userdata); +// frees the bitmap allocated below + +STBTT_DEF unsigned char * stbtt_GetCodepointBitmap(const stbtt_fontinfo * info, float scale_x, float scale_y, + int codepoint, int * width, int * height, int * xoff, int * yoff); +// allocates a large-enough single-channel 8bpp bitmap and renders the +// specified character/glyph at the specified scale into it, with +// antialiasing. 0 is no coverage (transparent), 255 is fully covered (opaque). +// *width & *height are filled out with the width & height of the bitmap, +// which is stored left-to-right, top-to-bottom. +// +// xoff/yoff are the offset it pixel space from the glyph origin to the top-left of the bitmap + +STBTT_DEF unsigned char * stbtt_GetCodepointBitmapSubpixel(const stbtt_fontinfo * info, float scale_x, float scale_y, + float shift_x, float shift_y, int codepoint, int * width, int * height, int * xoff, int * yoff); +// the same as stbtt_GetCodepoitnBitmap, but you can specify a subpixel +// shift for the character + +STBTT_DEF void stbtt_MakeCodepointBitmap(const stbtt_fontinfo * info, unsigned char * output, int out_w, int out_h, + int out_stride, float scale_x, float scale_y, int codepoint); +// the same as stbtt_GetCodepointBitmap, but you pass in storage for the bitmap +// in the form of 'output', with row spacing of 'out_stride' bytes. the bitmap +// is clipped to out_w/out_h bytes. Call stbtt_GetCodepointBitmapBox to get the +// width and height and positioning info for it first. + +STBTT_DEF void stbtt_MakeCodepointBitmapSubpixel(const stbtt_fontinfo * info, unsigned char * output, int out_w, + int out_h, int out_stride, float scale_x, float scale_y, float shift_x, float shift_y, int codepoint); +// same as stbtt_MakeCodepointBitmap, but you can specify a subpixel +// shift for the character + +STBTT_DEF void stbtt_MakeCodepointBitmapSubpixelPrefilter(const stbtt_fontinfo * info, unsigned char * output, + int out_w, int out_h, int out_stride, float scale_x, float scale_y, float shift_x, float shift_y, int oversample_x, + int oversample_y, float * sub_x, float * sub_y, int codepoint); +// same as stbtt_MakeCodepointBitmapSubpixel, but prefiltering +// is performed (see stbtt_PackSetOversampling) + +STBTT_DEF void stbtt_GetCodepointBitmapBox(const stbtt_fontinfo * font, int codepoint, float scale_x, float scale_y, + int * ix0, int * iy0, int * ix1, int * iy1); +// get the bbox of the bitmap centered around the glyph origin; so the +// bitmap width is ix1-ix0, height is iy1-iy0, and location to place +// the bitmap top left is (leftSideBearing*scale,iy0). +// (Note that the bitmap uses y-increases-down, but the shape uses +// y-increases-up, so CodepointBitmapBox and CodepointBox are inverted.) + +STBTT_DEF void stbtt_GetCodepointBitmapBoxSubpixel(const stbtt_fontinfo * font, int codepoint, float scale_x, + float scale_y, float shift_x, float shift_y, int * ix0, int * iy0, int * ix1, int * iy1); +// same as stbtt_GetCodepointBitmapBox, but you can specify a subpixel +// shift for the character + +// the following functions are equivalent to the above functions, but operate +// on glyph indices instead of Unicode codepoints (for efficiency) +STBTT_DEF unsigned char * stbtt_GetGlyphBitmap(const stbtt_fontinfo * info, float scale_x, float scale_y, int glyph, + int * width, int * height, int * xoff, int * yoff); +STBTT_DEF unsigned char * stbtt_GetGlyphBitmapSubpixel(const stbtt_fontinfo * info, float scale_x, float scale_y, + float shift_x, float shift_y, int glyph, int * width, int * height, int * xoff, int * yoff); +STBTT_DEF void stbtt_MakeGlyphBitmap(const stbtt_fontinfo * info, unsigned char * output, int out_w, int out_h, + int out_stride, float scale_x, float scale_y, int glyph); +STBTT_DEF void stbtt_MakeGlyphBitmapSubpixel(const stbtt_fontinfo * info, unsigned char * output, int out_w, int out_h, + int out_stride, float scale_x, float scale_y, float shift_x, float shift_y, int glyph); +STBTT_DEF void stbtt_MakeGlyphBitmapSubpixelPrefilter(const stbtt_fontinfo * info, unsigned char * output, int out_w, + int out_h, int out_stride, float scale_x, float scale_y, float shift_x, float shift_y, int oversample_x, + int oversample_y, float * sub_x, float * sub_y, int glyph); +STBTT_DEF void stbtt_GetGlyphBitmapBox(const stbtt_fontinfo * font, int glyph, float scale_x, float scale_y, int * ix0, + int * iy0, int * ix1, int * iy1); +STBTT_DEF void stbtt_GetGlyphBitmapBoxSubpixel(const stbtt_fontinfo * font, int glyph, float scale_x, float scale_y, + float shift_x, float shift_y, int * ix0, int * iy0, int * ix1, int * iy1); + +// @TODO: don't expose this structure +typedef struct { + int w, h, stride; + unsigned char * pixels; +} stbtt__bitmap; + +// rasterize a shape with quadratic beziers into a bitmap +STBTT_DEF void stbtt_Rasterize(stbtt__bitmap * result, // 1-channel bitmap to draw into + float flatness_in_pixels, // allowable error of curve in pixels + stbtt_vertex * vertices, // array of vertices defining shape + int num_verts, // number of vertices in above array + float scale_x, float scale_y, // scale applied to input vertices + float shift_x, float shift_y, // translation applied to input vertices + int x_off, int y_off, // another translation applied to input + int invert, // if non-zero, vertically flip shape + void * userdata); // context for to STBTT_MALLOC + +////////////////////////////////////////////////////////////////////////////// +// +// Signed Distance Function (or Field) rendering + +STBTT_DEF void stbtt_FreeSDF(unsigned char * bitmap, void * userdata); +// frees the SDF bitmap allocated below + +STBTT_DEF unsigned char * stbtt_GetGlyphSDF(const stbtt_fontinfo * info, float scale, int glyph, int padding, + unsigned char onedge_value, float pixel_dist_scale, int * width, int * height, int * xoff, int * yoff); +STBTT_DEF unsigned char * stbtt_GetCodepointSDF(const stbtt_fontinfo * info, float scale, int codepoint, int padding, + unsigned char onedge_value, float pixel_dist_scale, int * width, int * height, int * xoff, int * yoff); +// These functions compute a discretized SDF field for a single character, suitable for storing +// in a single-channel texture, sampling with bilinear filtering, and testing against +// larger than some threshold to produce scalable fonts. +// info -- the font +// scale -- controls the size of the resulting SDF bitmap, same as it would be creating a regular bitmap +// glyph/codepoint -- the character to generate the SDF for +// padding -- extra "pixels" around the character which are filled with the distance to the character (not 0), +// which allows effects like bit outlines +// onedge_value -- value 0-255 to test the SDF against to reconstruct the character (i.e. the isocontour of the character) +// pixel_dist_scale -- what value the SDF should increase by when moving one SDF "pixel" away from the edge (on the 0..255 scale) +// if positive, > onedge_value is inside; if negative, < onedge_value is inside +// width,height -- output height & width of the SDF bitmap (including padding) +// xoff,yoff -- output origin of the character +// return value -- a 2D array of bytes 0..255, width*height in size +// +// pixel_dist_scale & onedge_value are a scale & bias that allows you to make +// optimal use of the limited 0..255 for your application, trading off precision +// and special effects. SDF values outside the range 0..255 are clamped to 0..255. +// +// Example: +// scale = stbtt_ScaleForPixelHeight(22) +// padding = 5 +// onedge_value = 180 +// pixel_dist_scale = 180/5.0 = 36.0 +// +// This will create an SDF bitmap in which the character is about 22 pixels +// high but the whole bitmap is about 22+5+5=32 pixels high. To produce a filled +// shape, sample the SDF at each pixel and fill the pixel if the SDF value +// is greater than or equal to 180/255. (You'll actually want to antialias, +// which is beyond the scope of this example.) Additionally, you can compute +// offset outlines (e.g. to stroke the character border inside & outside, +// or only outside). For example, to fill outside the character up to 3 SDF +// pixels, you would compare against (180-36.0*3)/255 = 72/255. The above +// choice of variables maps a range from 5 pixels outside the shape to +// 2 pixels inside the shape to 0..255; this is intended primarily for apply +// outside effects only (the interior range is needed to allow proper +// antialiasing of the font at *smaller* sizes) +// +// The function computes the SDF analytically at each SDF pixel, not by e.g. +// building a higher-res bitmap and approximating it. In theory the quality +// should be as high as possible for an SDF of this size & representation, but +// unclear if this is true in practice (perhaps building a higher-res bitmap +// and computing from that can allow drop-out prevention). +// +// The algorithm has not been optimized at all, so expect it to be slow +// if computing lots of characters or very large sizes. + +////////////////////////////////////////////////////////////////////////////// +// +// Finding the right font... +// +// You should really just solve this offline, keep your own tables +// of what font is what, and don't try to get it out of the .ttf file. +// That's because getting it out of the .ttf file is really hard, because +// the names in the file can appear in many possible encodings, in many +// possible languages, and e.g. if you need a case-insensitive comparison, +// the details of that depend on the encoding & language in a complex way +// (actually underspecified in truetype, but also gigantic). +// +// But you can use the provided functions in two possible ways: +// stbtt_FindMatchingFont() will use *case-sensitive* comparisons on +// unicode-encoded names to try to find the font you want; +// you can run this before calling stbtt_InitFont() +// +// stbtt_GetFontNameString() lets you get any of the various strings +// from the file yourself and do your own comparisons on them. +// You have to have called stbtt_InitFont() first. + +#ifdef STBTT_STREAM_TYPE +STBTT_DEF int stbtt_FindMatchingFont(STBTT_STREAM_TYPE fontdata, const char * name, int flags); +#else +STBTT_DEF int stbtt_FindMatchingFont(const unsigned char * fontdata, const char * name, int flags); +#endif +// returns the offset (not index) of the font that matches, or -1 if none +// if you use STBTT_MACSTYLE_DONTCARE, use a font name like "Arial Bold". +// if you use any other flag, use a font name like "Arial"; this checks +// the 'macStyle' header field; i don't know if fonts set this consistently +#define STBTT_MACSTYLE_DONTCARE 0 +#define STBTT_MACSTYLE_BOLD 1 +#define STBTT_MACSTYLE_ITALIC 2 +#define STBTT_MACSTYLE_UNDERSCORE 4 +#define STBTT_MACSTYLE_NONE 8 // <= not same as 0, this makes us check the bitfield is 0 + +#ifdef STBTT_STREAM_TYPE +STBTT_DEF int stbtt_CompareUTF8toUTF16_bigendian(const char * s1, int len1, STBTT_STREAM_TYPE s2, stbtt_uint32 s2offs, + int len2); +#else +STBTT_DEF int stbtt_CompareUTF8toUTF16_bigendian(const char * s1, int len1, const char * s2, stbtt_uint32 s2offs, + int len2); +#endif +// returns 1/0 whether the first string interpreted as utf8 is identical to +// the second string interpreted as big-endian utf16... useful for strings from next func + +STBTT_DEF stbtt_uint32 stbtt_GetFontNameString(const stbtt_fontinfo * font, int * length, int platformID, + int encodingID, int languageID, int nameID); + +// returns the string (which may be big-endian double byte, e.g. for unicode) +// and puts the length in bytes in *length. +// +// some of the values for the IDs are below; for more see the truetype spec: +// http://developer.apple.com/textfonts/TTRefMan/RM06/Chap6name.html +// http://www.microsoft.com/typography/otspec/name.htm + +enum { // platformID + STBTT_PLATFORM_ID_UNICODE = 0, + STBTT_PLATFORM_ID_MAC = 1, + STBTT_PLATFORM_ID_ISO = 2, + STBTT_PLATFORM_ID_MICROSOFT = 3 +}; + +enum { // encodingID for STBTT_PLATFORM_ID_UNICODE + STBTT_UNICODE_EID_UNICODE_1_0 = 0, + STBTT_UNICODE_EID_UNICODE_1_1 = 1, + STBTT_UNICODE_EID_ISO_10646 = 2, + STBTT_UNICODE_EID_UNICODE_2_0_BMP = 3, + STBTT_UNICODE_EID_UNICODE_2_0_FULL = 4 +}; + +enum { // encodingID for STBTT_PLATFORM_ID_MICROSOFT + STBTT_MS_EID_SYMBOL = 0, + STBTT_MS_EID_UNICODE_BMP = 1, + STBTT_MS_EID_SHIFTJIS = 2, + STBTT_MS_EID_UNICODE_FULL = 10 +}; + +enum { // encodingID for STBTT_PLATFORM_ID_MAC; same as Script Manager codes + STBTT_MAC_EID_ROMAN = 0, STBTT_MAC_EID_ARABIC = 4, + STBTT_MAC_EID_JAPANESE = 1, STBTT_MAC_EID_HEBREW = 5, + STBTT_MAC_EID_CHINESE_TRAD = 2, STBTT_MAC_EID_GREEK = 6, + STBTT_MAC_EID_KOREAN = 3, STBTT_MAC_EID_RUSSIAN = 7 +}; + +enum { // languageID for STBTT_PLATFORM_ID_MICROSOFT; same as LCID... + // problematic because there are e.g. 16 english LCIDs and 16 arabic LCIDs + STBTT_MS_LANG_ENGLISH = 0x0409, STBTT_MS_LANG_ITALIAN = 0x0410, + STBTT_MS_LANG_CHINESE = 0x0804, STBTT_MS_LANG_JAPANESE = 0x0411, + STBTT_MS_LANG_DUTCH = 0x0413, STBTT_MS_LANG_KOREAN = 0x0412, + STBTT_MS_LANG_FRENCH = 0x040c, STBTT_MS_LANG_RUSSIAN = 0x0419, + STBTT_MS_LANG_GERMAN = 0x0407, STBTT_MS_LANG_SPANISH = 0x0409, + STBTT_MS_LANG_HEBREW = 0x040d, STBTT_MS_LANG_SWEDISH = 0x041D +}; + +enum { // languageID for STBTT_PLATFORM_ID_MAC + STBTT_MAC_LANG_ENGLISH = 0, STBTT_MAC_LANG_JAPANESE = 11, + STBTT_MAC_LANG_ARABIC = 12, STBTT_MAC_LANG_KOREAN = 23, + STBTT_MAC_LANG_DUTCH = 4, STBTT_MAC_LANG_RUSSIAN = 32, + STBTT_MAC_LANG_FRENCH = 1, STBTT_MAC_LANG_SPANISH = 6, + STBTT_MAC_LANG_GERMAN = 2, STBTT_MAC_LANG_SWEDISH = 5, + STBTT_MAC_LANG_HEBREW = 10, STBTT_MAC_LANG_CHINESE_SIMPLIFIED = 33, + STBTT_MAC_LANG_ITALIAN = 3, STBTT_MAC_LANG_CHINESE_TRAD = 19 +}; + +#ifdef __cplusplus +} +#endif + +#endif // __STB_INCLUDE_STB_TRUETYPE_H__ + +/////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////// +//// +//// IMPLEMENTATION +//// +//// + +#ifdef STB_TRUETYPE_IMPLEMENTATION + +#ifndef STBTT_MAX_OVERSAMPLE + #define STBTT_MAX_OVERSAMPLE 8 +#endif + +#if STBTT_MAX_OVERSAMPLE > 255 + #error "STBTT_MAX_OVERSAMPLE cannot be > 255" +#endif + +typedef int stbtt__test_oversample_pow2[(STBTT_MAX_OVERSAMPLE & (STBTT_MAX_OVERSAMPLE - 1)) == 0 ? 1 : -1]; + +#ifndef STBTT_RASTERIZER_VERSION + #define STBTT_RASTERIZER_VERSION 2 +#endif + +#ifdef _MSC_VER + #define STBTT__NOTUSED(v) (void)(v) +#else + #define STBTT__NOTUSED(v) (void)sizeof(v) +#endif + +////////////////////////////////////////////////////////////////////////// +// +// stbtt__buf helpers to parse data from file +// + +static stbtt_uint8 stbtt__buf_get8(stbtt__buf * b) +{ + if(b->cursor >= b->size) + return 0; +#ifdef STBTT_STREAM_TYPE + long pos = (long)(b->cursor + b->offset); + STBTT_STREAM_SEEK(b->data, pos); + stbtt_uint8 result; + STBTT_STREAM_READ(b->data, &result, 1); + ++b->cursor; + return result; +#else + return b->data[b->cursor++]; +#endif + +} + +static stbtt_uint8 stbtt__buf_peek8(stbtt__buf * b) +{ + if(b->cursor >= b->size) + return 0; +#ifdef STBTT_STREAM_TYPE + long pos = (long)(b->cursor + b->offset); + STBTT_STREAM_SEEK(b->data, pos); + stbtt_uint8 result; + STBTT_STREAM_READ(b->data, &result, 1); + return result; +#else + return b->data[b->cursor]; +#endif + +} + +static void stbtt__buf_seek(stbtt__buf * b, int o) +{ + STBTT_assert(!(o > b->size || o < 0)); + b->cursor = (o > b->size || o < 0) ? b->size : o; +} + +static void stbtt__buf_skip(stbtt__buf * b, int o) +{ + stbtt__buf_seek(b, b->cursor + o); +} + +static stbtt_uint32 stbtt__buf_get(stbtt__buf * b, int n) +{ + stbtt_uint32 v = 0; + int i; + STBTT_assert(n >= 1 && n <= 4); + for(i = 0; i < n; i++) + v = (v << 8) | stbtt__buf_get8(b); + return v; +} +#ifdef STBTT_STREAM_TYPE + static stbtt__buf stbtt__new_buf(STBTT_STREAM_TYPE s, size_t size) +#else + static stbtt__buf stbtt__new_buf(const void * p, size_t size) +#endif +{ + stbtt__buf r; + STBTT_assert(size < 0x40000000); +#ifdef STBTT_STREAM_TYPE + r.data = s; + r.offset = 0; +#else + r.data = (stbtt_uint8 *)p; +#endif + r.size = (int)size; + r.cursor = 0; + return r; +} + +#define stbtt__buf_get16(b) stbtt__buf_get((b), 2) +#define stbtt__buf_get32(b) stbtt__buf_get((b), 4) + +static stbtt__buf stbtt__buf_range(const stbtt__buf * b, int o, int s) +{ + stbtt__buf r = stbtt__new_buf(NULL, 0); + if(o < 0 || s < 0 || o > b->size || s > b->size - o) return r; +#ifdef STBTT_STREAM_TYPE + r.data = b->data; + r.offset = b->offset + o; +#else + r.data = b->data + o; +#endif + r.size = s; + return r; +} + +static stbtt__buf stbtt__cff_get_index(stbtt__buf * b) +{ + int count, start, offsize; + start = b->cursor; + count = stbtt__buf_get16(b); + if(count) { + offsize = stbtt__buf_get8(b); + STBTT_assert(offsize >= 1 && offsize <= 4); + stbtt__buf_skip(b, offsize * count); + stbtt__buf_skip(b, stbtt__buf_get(b, offsize) - 1); + } + return stbtt__buf_range(b, start, b->cursor - start); +} + +static stbtt_uint32 stbtt__cff_int(stbtt__buf * b) +{ + int b0 = stbtt__buf_get8(b); + if(b0 >= 32 && b0 <= 246) return b0 - 139; + else if(b0 >= 247 && b0 <= 250) return (b0 - 247) * 256 + stbtt__buf_get8(b) + 108; + else if(b0 >= 251 && b0 <= 254) return -(b0 - 251) * 256 - stbtt__buf_get8(b) - 108; + else if(b0 == 28) return stbtt__buf_get16(b); + else if(b0 == 29) return stbtt__buf_get32(b); + STBTT_assert(0); + return 0; +} + +static void stbtt__cff_skip_operand(stbtt__buf * b) +{ + int v, b0 = stbtt__buf_peek8(b); + STBTT_assert(b0 >= 28); + if(b0 == 30) { + stbtt__buf_skip(b, 1); + while(b->cursor < b->size) { + v = stbtt__buf_get8(b); + if((v & 0xF) == 0xF || (v >> 4) == 0xF) + break; + } + } + else { + stbtt__cff_int(b); + } +} + +static stbtt__buf stbtt__dict_get(stbtt__buf * b, int key) +{ + stbtt__buf_seek(b, 0); + while(b->cursor < b->size) { + int start = b->cursor, end, op; + while(stbtt__buf_peek8(b) >= 28) + stbtt__cff_skip_operand(b); + end = b->cursor; + op = stbtt__buf_get8(b); + if(op == 12) op = stbtt__buf_get8(b) | 0x100; + if(op == key) return stbtt__buf_range(b, start, end - start); + } + return stbtt__buf_range(b, 0, 0); +} + +static void stbtt__dict_get_ints(stbtt__buf * b, int key, int outcount, stbtt_uint32 * out) +{ + int i; + stbtt__buf operands = stbtt__dict_get(b, key); + for(i = 0; i < outcount && operands.cursor < operands.size; i++) + out[i] = stbtt__cff_int(&operands); +} + +static int stbtt__cff_index_count(stbtt__buf * b) +{ + stbtt__buf_seek(b, 0); + return stbtt__buf_get16(b); +} + +static stbtt__buf stbtt__cff_index_get(stbtt__buf b, int i) +{ + int count, offsize, start, end; + stbtt__buf_seek(&b, 0); + count = stbtt__buf_get16(&b); + offsize = stbtt__buf_get8(&b); + STBTT_assert(i >= 0 && i < count); + STBTT_assert(offsize >= 1 && offsize <= 4); + stbtt__buf_skip(&b, i * offsize); + start = stbtt__buf_get(&b, offsize); + end = stbtt__buf_get(&b, offsize); + return stbtt__buf_range(&b, 2 + (count + 1) * offsize + start, end - start); +} + +////////////////////////////////////////////////////////////////////////// +// +// accessors to parse data from file +// + +// on platforms that don't allow misaligned reads, if we want to allow +// truetype fonts that aren't padded to alignment, define ALLOW_UNALIGNED_TRUETYPE + +#ifdef STBTT_STREAM_TYPE +static stbtt_uint8 ttBYTE(STBTT_STREAM_TYPE s, stbtt_uint32 offset) +{ + STBTT_STREAM_SEEK(s, offset); + stbtt_uint8 r; + STBTT_STREAM_READ(s, &r, 1); + return r; +} +#define ttCHAR(s, offset) ((stbtt_int8)ttBYTE(s,offset)) +static stbtt_uint16 ttUSHORT(STBTT_STREAM_TYPE s, stbtt_uint32 offset) +{ + STBTT_STREAM_SEEK(s, offset); + stbtt_uint8 r[2]; + STBTT_STREAM_READ(s, &r, 2); + return r[0] * 256 + r[1]; +} +static stbtt_int16 ttSHORT(STBTT_STREAM_TYPE s, stbtt_uint32 offset) +{ + STBTT_STREAM_SEEK(s, offset); + stbtt_uint8 r[2]; + STBTT_STREAM_READ(s, &r, 2); + return r[0] * 256 + r[1]; +} +static stbtt_uint32 ttULONG(STBTT_STREAM_TYPE s, stbtt_uint32 offset) +{ + STBTT_STREAM_SEEK(s, offset); + stbtt_uint8 r[4]; + STBTT_STREAM_READ(s, &r, 4); + return (r[0] << 24) + (r[1] << 16) + (r[2] << 8) + r[3]; +} +static stbtt_int32 ttLONG(STBTT_STREAM_TYPE s, stbtt_uint32 offset) +{ + STBTT_STREAM_SEEK(s, offset); + stbtt_uint8 r[4]; + STBTT_STREAM_READ(s, &r, 4); + return (r[0] << 24) + (r[1] << 16) + (r[2] << 8) + r[3]; +} +#else +#define ttBYTE(p, offset) (* (stbtt_uint8 *) (p+offset)) +#define ttCHAR(p, offset) (* (stbtt_int8 *) (p+offset)) +static stbtt_uint16 ttUSHORT(const stbtt_uint8 * p, stbtt_uint32 offset) +{ + return p[offset + 0] * 256 + p[offset + 1]; +} +static stbtt_int16 ttSHORT(const stbtt_uint8 * p, stbtt_uint32 offset) +{ + return p[offset + 0] * 256 + p[offset + 1]; +} +static stbtt_uint32 ttULONG(const stbtt_uint8 * p, stbtt_uint32 offset) +{ + return (p[offset + 0] << 24) + (p[offset + 1] << 16) + (p[offset + 2] << 8) + p[offset + 3]; +} +static stbtt_int32 ttLONG(const stbtt_uint8 * p, stbtt_uint32 offset) +{ + return (p[offset + 0] << 24) + (p[offset + 1] << 16) + (p[offset + 2] << 8) + p[offset + 3]; +} +#endif +#define ttFixed(p, offset) ttLONG(p, offset) + +#define stbtt_tag4(p,c0,c1,c2,c3) ((p)[0] == (c0) && (p)[1] == (c1) && (p)[2] == (c2) && (p)[3] == (c3)) +#define stbtt_tag(p,str) stbtt_tag4(p,str[0],str[1],str[2],str[3]) +#ifdef STBTT_STREAM_TYPE + static int stbtt__isfont(STBTT_STREAM_TYPE stream, stbtt_uint32 offs) +#else + static int stbtt__isfont(stbtt_uint8 * font, stbtt_uint32 offs) +#endif +{ +#ifdef STBTT_STREAM_TYPE + stbtt_uint8 font[4]; + STBTT_STREAM_SEEK(stream, offs); + STBTT_STREAM_READ(stream, font, 4); +#else + font += offs; +#endif + // check the version number + if(stbtt_tag4(font, '1', 0, 0, 0)) return 1; // TrueType 1 + if(stbtt_tag(font, "typ1")) return 1; // TrueType with type 1 font -- we don't support this! + if(stbtt_tag(font, "OTTO")) return 1; // OpenType with CFF + if(stbtt_tag4(font, 0, 1, 0, 0)) return 1; // OpenType 1.0 + if(stbtt_tag(font, "true")) return 1; // Apple specification for TrueType fonts + return 0; +} + +// @OPTIMIZE: binary search +#ifdef STBTT_STREAM_TYPE + static stbtt_uint32 stbtt__find_table(STBTT_STREAM_TYPE data, stbtt_uint32 fontstart, const char * tag) +#else + static stbtt_uint32 stbtt__find_table(stbtt_uint8 * data, stbtt_uint32 fontstart, const char * tag) +#endif +{ + stbtt_int32 num_tables = ttUSHORT(data, fontstart + 4); + stbtt_uint32 tabledir = fontstart + 12; + stbtt_int32 i; + for(i = 0; i < num_tables; ++i) { + stbtt_uint32 loc = tabledir + 16 * i; +#ifdef STBTT_STREAM_TYPE + stbtt_uint8 buf[4]; + STBTT_STREAM_SEEK(data, loc + 0); + STBTT_STREAM_READ(data, buf, 4); + if(stbtt_tag(buf, tag)) + return ttULONG(data, loc + 8); +#else + if(stbtt_tag(data + loc + 0, tag)) + return ttULONG(data, loc + 8); +#endif + } + return 0; +} +#ifdef STBTT_STREAM_TYPE + static int stbtt_GetFontOffsetForIndex_internal(STBTT_STREAM_TYPE font_collection, int index) +#else + static int stbtt_GetFontOffsetForIndex_internal(unsigned char * font_collection, int index) +#endif +{ + // if it's just a font, there's only one valid index + if(stbtt__isfont(font_collection, 0)) + return index == 0 ? 0 : -1; + + // check if it's a TTC +#ifdef STBTT_STREAM_TYPE + stbtt_uint8 buf[4]; + STBTT_STREAM_SEEK(font_collection, 0); + STBTT_STREAM_READ(font_collection, buf, 4); + if(stbtt_tag(buf, "ttcf")) { +#else + if(stbtt_tag(font_collection, "ttcf")) { +#endif + // version 1? + if(ttULONG(font_collection, 4) == 0x00010000 || ttULONG(font_collection, 4) == 0x00020000) { + stbtt_int32 n = ttLONG(font_collection, 8); + if(index >= n) + return -1; + return ttULONG(font_collection, 12 + index * 4); + } + } + return -1; +} +#ifdef STBTT_STREAM_TYPE + static int stbtt_GetNumberOfFonts_internal(STBTT_STREAM_TYPE font_collection) +#else + static int stbtt_GetNumberOfFonts_internal(unsigned char * font_collection) +#endif +{ + // if it's just a font, there's only one valid font + if(stbtt__isfont(font_collection, 0)) + return 1; + + // check if it's a TTC +#ifdef STBTT_STREAM_TYPE + stbtt_uint8 buf[4]; + STBTT_STREAM_SEEK(font_collection, 0); + STBTT_STREAM_READ(font_collection, buf, 4); + if(stbtt_tag(buf, "ttcf")) { +#else + if(stbtt_tag(font_collection, "ttcf")) { +#endif + // version 1? + if(ttULONG(font_collection, 4) == 0x00010000 || ttULONG(font_collection, 4) == 0x00020000) { + return ttLONG(font_collection, 8); + } + } + return 0; +} + +static stbtt__buf stbtt__get_subrs(stbtt__buf cff, stbtt__buf fontdict) +{ + stbtt_uint32 subrsoff = 0, private_loc[2] = { 0, 0 }; + stbtt__buf pdict; + stbtt__dict_get_ints(&fontdict, 18, 2, private_loc); + if(!private_loc[1] || !private_loc[0]) return stbtt__new_buf(NULL, 0); + pdict = stbtt__buf_range(&cff, private_loc[1], private_loc[0]); + stbtt__dict_get_ints(&pdict, 19, 1, &subrsoff); + if(!subrsoff) return stbtt__new_buf(NULL, 0); + stbtt__buf_seek(&cff, private_loc[1] + subrsoff); + return stbtt__cff_get_index(&cff); +} + +// since most people won't use this, find this table the first time it's needed +static int stbtt__get_svg(stbtt_fontinfo * info) +{ + stbtt_uint32 t; + if(info->svg < 0) { + t = stbtt__find_table(info->data, info->fontstart, "SVG "); + if(t) { + stbtt_uint32 offset = ttULONG(info->data, t + 2); + info->svg = t + offset; + } + else { + info->svg = 0; + } + } + return info->svg; +} +#ifdef STBTT_STREAM_TYPE + static int stbtt_InitFont_internal(stbtt_fontinfo * info, STBTT_STREAM_TYPE data, int fontstart) +#else + static int stbtt_InitFont_internal(stbtt_fontinfo * info, unsigned char * data, int fontstart) +#endif +{ + stbtt_uint32 cmap, t; + stbtt_int32 i, numTables; + + info->data = data; + info->fontstart = fontstart; + info->cff = stbtt__new_buf(NULL, 0); + + cmap = stbtt__find_table(data, fontstart, "cmap"); // required + info->loca = stbtt__find_table(data, fontstart, "loca"); // required + info->head = stbtt__find_table(data, fontstart, "head"); // required + info->glyf = stbtt__find_table(data, fontstart, "glyf"); // required + info->hhea = stbtt__find_table(data, fontstart, "hhea"); // required + info->hmtx = stbtt__find_table(data, fontstart, "hmtx"); // required + info->kern = stbtt__find_table(data, fontstart, "kern"); // not required + info->gpos = stbtt__find_table(data, fontstart, "GPOS"); // not required + + if(!cmap || !info->head || !info->hhea || !info->hmtx) + return 0; + if(info->glyf) { + // required for truetype + if(!info->loca) return 0; + } + else { + // initialization for CFF / Type2 fonts (OTF) + stbtt__buf b, topdict, topdictidx; + stbtt_uint32 cstype = 2, charstrings = 0, fdarrayoff = 0, fdselectoff = 0; + stbtt_uint32 cff; + + cff = stbtt__find_table(data, fontstart, "CFF "); + if(!cff) return 0; + + info->fontdicts = stbtt__new_buf(NULL, 0); + info->fdselect = stbtt__new_buf(NULL, 0); + + // @TODO this should use size from table (not 512MB) + +#ifdef STBTT_STREAM_TYPE + info->cff = stbtt__new_buf(info->data, 512 * 1024 * 1024); + info->cff.offset = cff; +#else + info->cff = stbtt__new_buf(info->data + cff, 512 * 1024 * 1024); +#endif + b = info->cff; + + // read the header + stbtt__buf_skip(&b, 2); + stbtt__buf_seek(&b, stbtt__buf_get8(&b)); // hdrsize + + // @TODO the name INDEX could list multiple fonts, + // but we just use the first one. + stbtt__cff_get_index(&b); // name INDEX + topdictidx = stbtt__cff_get_index(&b); + topdict = stbtt__cff_index_get(topdictidx, 0); + stbtt__cff_get_index(&b); // string INDEX + info->gsubrs = stbtt__cff_get_index(&b); + + stbtt__dict_get_ints(&topdict, 17, 1, &charstrings); + stbtt__dict_get_ints(&topdict, 0x100 | 6, 1, &cstype); + stbtt__dict_get_ints(&topdict, 0x100 | 36, 1, &fdarrayoff); + stbtt__dict_get_ints(&topdict, 0x100 | 37, 1, &fdselectoff); + info->subrs = stbtt__get_subrs(b, topdict); + + // we only support Type 2 charstrings + if(cstype != 2) return 0; + if(charstrings == 0) return 0; + + if(fdarrayoff) { + // looks like a CID font + if(!fdselectoff) return 0; + stbtt__buf_seek(&b, fdarrayoff); + info->fontdicts = stbtt__cff_get_index(&b); + info->fdselect = stbtt__buf_range(&b, fdselectoff, b.size - fdselectoff); + } + + stbtt__buf_seek(&b, charstrings); + info->charstrings = stbtt__cff_get_index(&b); + } + + t = stbtt__find_table(data, fontstart, "maxp"); + if(t) + info->numGlyphs = ttUSHORT(data, t + 4); + else + info->numGlyphs = 0xffff; + + info->svg = -1; + + // find a cmap encoding table we understand *now* to avoid searching + // later. (todo: could make this installable) + // the same regardless of glyph. + numTables = ttUSHORT(data, cmap + 2); + info->index_map = 0; + for(i = 0; i < numTables; ++i) { + stbtt_uint32 encoding_record = cmap + 4 + 8 * i; + // find an encoding we understand: + switch(ttUSHORT(data, encoding_record)) { + case STBTT_PLATFORM_ID_MICROSOFT: + switch(ttUSHORT(data, encoding_record + 2)) { + case STBTT_MS_EID_UNICODE_BMP: + case STBTT_MS_EID_UNICODE_FULL: + // MS/Unicode + info->index_map = cmap + ttULONG(data, encoding_record + 4); + break; + } + break; + case STBTT_PLATFORM_ID_UNICODE: + // Mac/iOS has these + // all the encodingIDs are unicode, so we don't bother to check it + info->index_map = cmap + ttULONG(data, encoding_record + 4); + break; + } + } + if(info->index_map == 0) + return 0; + + info->indexToLocFormat = ttUSHORT(data, info->head + 50); + return 1; +} + +STBTT_DEF int stbtt_FindGlyphIndex(const stbtt_fontinfo * info, int unicode_codepoint) +{ +#ifdef STBTT_STREAM_TYPE + STBTT_STREAM_TYPE data = info->data; +#else + stbtt_uint8 * data = info->data; +#endif + stbtt_uint32 index_map = info->index_map; + + stbtt_uint16 format = ttUSHORT(data, index_map + 0); + if(format == 0) { // apple byte encoding + stbtt_int32 bytes = ttUSHORT(data, index_map + 2); + if(unicode_codepoint < bytes - 6) + return ttBYTE(data, index_map + 6 + unicode_codepoint); + return 0; + } + else if(format == 6) { + stbtt_uint32 first = ttUSHORT(data, index_map + 6); + stbtt_uint32 count = ttUSHORT(data, index_map + 8); + if((stbtt_uint32)unicode_codepoint >= first && (stbtt_uint32)unicode_codepoint < first + count) + return ttUSHORT(data, index_map + 10 + (unicode_codepoint - first) * 2); + return 0; + } + else if(format == 2) { + STBTT_assert(0); // @TODO: high-byte mapping for japanese/chinese/korean + return 0; + } + else if(format == 4) { // standard mapping for windows fonts: binary search collection of ranges + stbtt_uint16 segcount = ttUSHORT(data, index_map + 6) >> 1; + stbtt_uint16 searchRange = ttUSHORT(data, index_map + 8) >> 1; + stbtt_uint16 entrySelector = ttUSHORT(data, index_map + 10); + stbtt_uint16 rangeShift = ttUSHORT(data, index_map + 12) >> 1; + + // do a binary search of the segments + stbtt_uint32 endCount = index_map + 14; + stbtt_uint32 search = endCount; + + if(unicode_codepoint > 0xffff) + return 0; + + // they lie from endCount .. endCount + segCount + // but searchRange is the nearest power of two, so... + if(unicode_codepoint >= ttUSHORT(data, search + rangeShift * 2)) + search += rangeShift * 2; + + // now decrement to bias correctly to find smallest + search -= 2; + while(entrySelector) { + stbtt_uint16 end; + searchRange >>= 1; + end = ttUSHORT(data, search + searchRange * 2); + if(unicode_codepoint > end) + search += searchRange * 2; + --entrySelector; + } + search += 2; + + { + stbtt_uint16 offset, start, last; + stbtt_uint16 item = (stbtt_uint16)((search - endCount) >> 1); + + start = ttUSHORT(data, index_map + 14 + segcount * 2 + 2 + 2 * item); + last = ttUSHORT(data, endCount + 2 * item); + if(unicode_codepoint < start || unicode_codepoint > last) + return 0; + + offset = ttUSHORT(data, index_map + 14 + segcount * 6 + 2 + 2 * item); + if(offset == 0) + return (stbtt_uint16)(unicode_codepoint + ttSHORT(data, index_map + 14 + segcount * 4 + 2 + 2 * item)); + + return ttUSHORT(data, offset + (unicode_codepoint - start) * 2 + index_map + 14 + segcount * 6 + 2 + 2 * item); + } + } + else if(format == 12 || format == 13) { + stbtt_uint32 ngroups = ttULONG(data, index_map + 12); + stbtt_int32 low, high; + low = 0; + high = (stbtt_int32)ngroups; + // Binary search the right group. + while(low < high) { + stbtt_int32 mid = low + ((high - low) >> 1); // rounds down, so low <= mid < high + stbtt_uint32 start_char = ttULONG(data, index_map + 16 + mid * 12); + stbtt_uint32 end_char = ttULONG(data, index_map + 16 + mid * 12 + 4); + if((stbtt_uint32)unicode_codepoint < start_char) + high = mid; + else if((stbtt_uint32)unicode_codepoint > end_char) + low = mid + 1; + else { + stbtt_uint32 start_glyph = ttULONG(data, index_map + 16 + mid * 12 + 8); + if(format == 12) + return start_glyph + unicode_codepoint - start_char; + else // format == 13 + return start_glyph; + } + } + return 0; // not found + } + // @TODO + STBTT_assert(0); + return 0; +} + +STBTT_DEF int stbtt_GetCodepointShape(const stbtt_fontinfo * info, int unicode_codepoint, stbtt_vertex * *vertices) +{ + return stbtt_GetGlyphShape(info, stbtt_FindGlyphIndex(info, unicode_codepoint), vertices); +} + +static void stbtt_setvertex(stbtt_vertex * v, stbtt_uint8 type, stbtt_int32 x, stbtt_int32 y, stbtt_int32 cx, + stbtt_int32 cy) +{ + v->type = type; + v->x = (stbtt_int16)x; + v->y = (stbtt_int16)y; + v->cx = (stbtt_int16)cx; + v->cy = (stbtt_int16)cy; +} + +static int stbtt__GetGlyfOffset(const stbtt_fontinfo * info, int glyph_index) +{ + int g1, g2; + + STBTT_assert(!info->cff.size); + + if(glyph_index >= info->numGlyphs) return -1; // glyph index out of range + if(info->indexToLocFormat >= 2) return -1; // unknown index->glyph map format + + if(info->indexToLocFormat == 0) { + g1 = info->glyf + ttUSHORT(info->data, info->loca + glyph_index * 2) * 2; + g2 = info->glyf + ttUSHORT(info->data, info->loca + glyph_index * 2 + 2) * 2; + } + else { + g1 = info->glyf + ttULONG(info->data, info->loca + glyph_index * 4); + g2 = info->glyf + ttULONG(info->data, info->loca + glyph_index * 4 + 4); + } + + return g1 == g2 ? -1 : g1; // if length is 0, return -1 +} + +static int stbtt__GetGlyphInfoT2(const stbtt_fontinfo * info, int glyph_index, int * x0, int * y0, int * x1, int * y1); + +STBTT_DEF int stbtt_GetGlyphBox(const stbtt_fontinfo * info, int glyph_index, int * x0, int * y0, int * x1, int * y1) +{ + if(info->cff.size) { + stbtt__GetGlyphInfoT2(info, glyph_index, x0, y0, x1, y1); + } + else { + int g = stbtt__GetGlyfOffset(info, glyph_index); + if(g < 0) return 0; + + if(x0) *x0 = ttSHORT(info->data, g + 2); + if(y0) *y0 = ttSHORT(info->data, g + 4); + if(x1) *x1 = ttSHORT(info->data, g + 6); + if(y1) *y1 = ttSHORT(info->data, g + 8); + } + return 1; +} + +STBTT_DEF int stbtt_GetCodepointBox(const stbtt_fontinfo * info, int codepoint, int * x0, int * y0, int * x1, int * y1) +{ + return stbtt_GetGlyphBox(info, stbtt_FindGlyphIndex(info, codepoint), x0, y0, x1, y1); +} + +STBTT_DEF int stbtt_IsGlyphEmpty(const stbtt_fontinfo * info, int glyph_index) +{ + stbtt_int16 numberOfContours; + int g; + if(info->cff.size) + return stbtt__GetGlyphInfoT2(info, glyph_index, NULL, NULL, NULL, NULL) == 0; + g = stbtt__GetGlyfOffset(info, glyph_index); + if(g < 0) return 1; + numberOfContours = ttSHORT(info->data, g); + return numberOfContours == 0; +} + +static int stbtt__close_shape(stbtt_vertex * vertices, int num_vertices, int was_off, int start_off, + stbtt_int32 sx, stbtt_int32 sy, stbtt_int32 scx, stbtt_int32 scy, stbtt_int32 cx, stbtt_int32 cy) +{ + if(start_off) { + if(was_off) + stbtt_setvertex(&vertices[num_vertices++], STBTT_vcurve, (cx + scx) >> 1, (cy + scy) >> 1, cx, cy); + stbtt_setvertex(&vertices[num_vertices++], STBTT_vcurve, sx, sy, scx, scy); + } + else { + if(was_off) + stbtt_setvertex(&vertices[num_vertices++], STBTT_vcurve, sx, sy, cx, cy); + else + stbtt_setvertex(&vertices[num_vertices++], STBTT_vline, sx, sy, 0, 0); + } + return num_vertices; +} + +static int stbtt__GetGlyphShapeTT(const stbtt_fontinfo * info, int glyph_index, stbtt_vertex * *pvertices) +{ + stbtt_int16 numberOfContours; + stbtt_uint32 endPtsOfContours; +#ifdef STBTT_STREAM_TYPE + STBTT_STREAM_TYPE data = info->data; +#else + stbtt_uint8 * data = info->data; +#endif + stbtt_vertex * vertices = 0; + int num_vertices = 0; + int g = stbtt__GetGlyfOffset(info, glyph_index); + + *pvertices = NULL; + + if(g < 0) return 0; + + numberOfContours = ttSHORT(data, g); + + if(numberOfContours > 0) { + stbtt_uint8 flags = 0, flagcount; + stbtt_int32 ins, i, j = 0, m, n, next_move, was_off = 0, off, start_off = 0; + stbtt_int32 x, y, cx, cy, sx, sy, scx, scy; + stbtt_uint32 points; + endPtsOfContours = (g + 10); + ins = ttUSHORT(data, g + 10 + numberOfContours * 2); + points = g + 10 + numberOfContours * 2 + 2 + ins; + + n = 1 + ttUSHORT(data, endPtsOfContours + numberOfContours * 2 - 2); + + m = n + 2 * numberOfContours; // a loose bound on how many vertices we might need + vertices = (stbtt_vertex *)STBTT_malloc(m * sizeof(vertices[0]), info->userdata); + if(vertices == 0) + return 0; + + next_move = 0; + flagcount = 0; + + // in first pass, we load uninterpreted data into the allocated array + // above, shifted to the end of the array so we won't overwrite it when + // we create our final data starting from the front + + off = m - n; // starting offset for uninterpreted data, regardless of how m ends up being calculated + + // first load flags + + for(i = 0; i < n; ++i) { + if(flagcount == 0) { + flags = ttBYTE(data, points++); + if(flags & 8) + flagcount = ttBYTE(data, points++); + } + else + --flagcount; + vertices[off + i].type = flags; + } + + // now load x coordinates + x = 0; + for(i = 0; i < n; ++i) { + flags = vertices[off + i].type; + if(flags & 2) { + stbtt_int16 dx = ttBYTE(data, points++); + x += (flags & 16) ? dx : -dx; // ??? + } + else { + if(!(flags & 16)) { + x = x + (stbtt_int16)(ttBYTE(data, points) * 256 + ttBYTE(data, points + 1)); + points += 2; + } + } + vertices[off + i].x = (stbtt_int16)x; + } + + // now load y coordinates + y = 0; + for(i = 0; i < n; ++i) { + flags = vertices[off + i].type; + if(flags & 4) { + stbtt_int16 dy = ttBYTE(data, points++); + y += (flags & 32) ? dy : -dy; // ??? + } + else { + if(!(flags & 32)) { + y = y + (stbtt_int16)(ttBYTE(data, points) * 256 + ttBYTE(data, points + 1)); + points += 2; + } + } + vertices[off + i].y = (stbtt_int16)y; + } + + // now convert them to our format + num_vertices = 0; + sx = sy = cx = cy = scx = scy = 0; + for(i = 0; i < n; ++i) { + flags = vertices[off + i].type; + x = (stbtt_int16)vertices[off + i].x; + y = (stbtt_int16)vertices[off + i].y; + + if(next_move == i) { + if(i != 0) + num_vertices = stbtt__close_shape(vertices, num_vertices, was_off, start_off, sx, sy, scx, scy, cx, cy); + + // now start the new one + start_off = !(flags & 1); + if(start_off) { + // if we start off with an off-curve point, then when we need to find a point on the curve + // where we can start, and we need to save some state for when we wraparound. + scx = x; + scy = y; + if(!(vertices[off + i + 1].type & 1)) { + // next point is also a curve point, so interpolate an on-point curve + sx = (x + (stbtt_int32)vertices[off + i + 1].x) >> 1; + sy = (y + (stbtt_int32)vertices[off + i + 1].y) >> 1; + } + else { + // otherwise just use the next point as our start point + sx = (stbtt_int32)vertices[off + i + 1].x; + sy = (stbtt_int32)vertices[off + i + 1].y; + ++i; // we're using point i+1 as the starting point, so skip it + } + } + else { + sx = x; + sy = y; + } + stbtt_setvertex(&vertices[num_vertices++], STBTT_vmove, sx, sy, 0, 0); + was_off = 0; + next_move = 1 + ttUSHORT(data, endPtsOfContours + j * 2); + ++j; + } + else { + if(!(flags & 1)) { // if it's a curve + if(was_off) // two off-curve control points in a row means interpolate an on-curve midpoint + stbtt_setvertex(&vertices[num_vertices++], STBTT_vcurve, (cx + x) >> 1, (cy + y) >> 1, cx, cy); + cx = x; + cy = y; + was_off = 1; + } + else { + if(was_off) + stbtt_setvertex(&vertices[num_vertices++], STBTT_vcurve, x, y, cx, cy); + else + stbtt_setvertex(&vertices[num_vertices++], STBTT_vline, x, y, 0, 0); + was_off = 0; + } + } + } + num_vertices = stbtt__close_shape(vertices, num_vertices, was_off, start_off, sx, sy, scx, scy, cx, cy); + } + else if(numberOfContours < 0) { + // Compound shapes. + int more = 1; + stbtt_uint32 comp = g + 10; + num_vertices = 0; + vertices = 0; + while(more) { + stbtt_uint16 flags, gidx; + int comp_num_verts = 0, i; + stbtt_vertex * comp_verts = 0, * tmp = 0; + float mtx[6] = { 1, 0, 0, 1, 0, 0 }, m, n; + + flags = ttSHORT(data, comp); + comp += 2; + gidx = ttSHORT(data, comp); + comp += 2; + + if(flags & 2) { // XY values + if(flags & 1) { // shorts + mtx[4] = ttSHORT(data, comp); + comp += 2; + mtx[5] = ttSHORT(data, comp); + comp += 2; + } + else { + mtx[4] = ttCHAR(data, comp); + comp += 1; + mtx[5] = ttCHAR(data, comp); + comp += 1; + } + } + else { + // @TODO handle matching point + STBTT_assert(0); + } + if(flags & (1 << 3)) { // WE_HAVE_A_SCALE + mtx[0] = mtx[3] = ttSHORT(data, comp) / 16384.0f; + comp += 2; + mtx[1] = mtx[2] = 0; + } + else if(flags & (1 << 6)) { // WE_HAVE_AN_X_AND_YSCALE + mtx[0] = ttSHORT(data, comp) / 16384.0f; + comp += 2; + mtx[1] = mtx[2] = 0; + mtx[3] = ttSHORT(data, comp) / 16384.0f; + comp += 2; + } + else if(flags & (1 << 7)) { // WE_HAVE_A_TWO_BY_TWO + mtx[0] = ttSHORT(data, comp) / 16384.0f; + comp += 2; + mtx[1] = ttSHORT(data, comp) / 16384.0f; + comp += 2; + mtx[2] = ttSHORT(data, comp) / 16384.0f; + comp += 2; + mtx[3] = ttSHORT(data, comp) / 16384.0f; + comp += 2; + } + + // Find transformation scales. + m = (float)STBTT_sqrt(mtx[0] * mtx[0] + mtx[1] * mtx[1]); + n = (float)STBTT_sqrt(mtx[2] * mtx[2] + mtx[3] * mtx[3]); + + // Get indexed glyph. + comp_num_verts = stbtt_GetGlyphShape(info, gidx, &comp_verts); + if(comp_num_verts > 0) { + // Transform vertices. + for(i = 0; i < comp_num_verts; ++i) { + stbtt_vertex * v = &comp_verts[i]; + stbtt_vertex_type x, y; + x = v->x; + y = v->y; + v->x = (stbtt_vertex_type)(m * (mtx[0] * x + mtx[2] * y + mtx[4])); + v->y = (stbtt_vertex_type)(n * (mtx[1] * x + mtx[3] * y + mtx[5])); + x = v->cx; + y = v->cy; + v->cx = (stbtt_vertex_type)(m * (mtx[0] * x + mtx[2] * y + mtx[4])); + v->cy = (stbtt_vertex_type)(n * (mtx[1] * x + mtx[3] * y + mtx[5])); + } + // Append vertices. + tmp = (stbtt_vertex *)STBTT_malloc((num_vertices + comp_num_verts) * sizeof(stbtt_vertex), info->userdata); + if(!tmp) { + if(vertices) STBTT_free(vertices, info->userdata); + if(comp_verts) STBTT_free(comp_verts, info->userdata); + return 0; + } + if(num_vertices > 0 && vertices) STBTT_memcpy(tmp, vertices, num_vertices * sizeof(stbtt_vertex)); + STBTT_memcpy(tmp + num_vertices, comp_verts, comp_num_verts * sizeof(stbtt_vertex)); + if(vertices) STBTT_free(vertices, info->userdata); + vertices = tmp; + STBTT_free(comp_verts, info->userdata); + num_vertices += comp_num_verts; + } + // More components ? + more = flags & (1 << 5); + } + } + else { + // numberOfCounters == 0, do nothing + } + + *pvertices = vertices; + return num_vertices; +} + +typedef struct { + int bounds; + int started; + float first_x, first_y; + float x, y; + stbtt_int32 min_x, max_x, min_y, max_y; + + stbtt_vertex * pvertices; + int num_vertices; +} stbtt__csctx; + +#define STBTT__CSCTX_INIT(bounds) {bounds,0, 0,0, 0,0, 0,0,0,0, NULL, 0} + +static void stbtt__track_vertex(stbtt__csctx * c, stbtt_int32 x, stbtt_int32 y) +{ + if(x > c->max_x || !c->started) c->max_x = x; + if(y > c->max_y || !c->started) c->max_y = y; + if(x < c->min_x || !c->started) c->min_x = x; + if(y < c->min_y || !c->started) c->min_y = y; + c->started = 1; +} + +static void stbtt__csctx_v(stbtt__csctx * c, stbtt_uint8 type, stbtt_int32 x, stbtt_int32 y, stbtt_int32 cx, + stbtt_int32 cy, stbtt_int32 cx1, stbtt_int32 cy1) +{ + if(c->bounds) { + stbtt__track_vertex(c, x, y); + if(type == STBTT_vcubic) { + stbtt__track_vertex(c, cx, cy); + stbtt__track_vertex(c, cx1, cy1); + } + } + else { + stbtt_setvertex(&c->pvertices[c->num_vertices], type, x, y, cx, cy); + c->pvertices[c->num_vertices].cx1 = (stbtt_int16)cx1; + c->pvertices[c->num_vertices].cy1 = (stbtt_int16)cy1; + } + c->num_vertices++; +} + +static void stbtt__csctx_close_shape(stbtt__csctx * ctx) +{ + if(ctx->first_x != ctx->x || ctx->first_y != ctx->y) + stbtt__csctx_v(ctx, STBTT_vline, (int)ctx->first_x, (int)ctx->first_y, 0, 0, 0, 0); +} + +static void stbtt__csctx_rmove_to(stbtt__csctx * ctx, float dx, float dy) +{ + stbtt__csctx_close_shape(ctx); + ctx->first_x = ctx->x = ctx->x + dx; + ctx->first_y = ctx->y = ctx->y + dy; + stbtt__csctx_v(ctx, STBTT_vmove, (int)ctx->x, (int)ctx->y, 0, 0, 0, 0); +} + +static void stbtt__csctx_rline_to(stbtt__csctx * ctx, float dx, float dy) +{ + ctx->x += dx; + ctx->y += dy; + stbtt__csctx_v(ctx, STBTT_vline, (int)ctx->x, (int)ctx->y, 0, 0, 0, 0); +} + +static void stbtt__csctx_rccurve_to(stbtt__csctx * ctx, float dx1, float dy1, float dx2, float dy2, float dx3, + float dy3) +{ + float cx1 = ctx->x + dx1; + float cy1 = ctx->y + dy1; + float cx2 = cx1 + dx2; + float cy2 = cy1 + dy2; + ctx->x = cx2 + dx3; + ctx->y = cy2 + dy3; + stbtt__csctx_v(ctx, STBTT_vcubic, (int)ctx->x, (int)ctx->y, (int)cx1, (int)cy1, (int)cx2, (int)cy2); +} + +static stbtt__buf stbtt__get_subr(stbtt__buf idx, int n) +{ + int count = stbtt__cff_index_count(&idx); + int bias = 107; + if(count >= 33900) + bias = 32768; + else if(count >= 1240) + bias = 1131; + n += bias; + if(n < 0 || n >= count) + return stbtt__new_buf(NULL, 0); + return stbtt__cff_index_get(idx, n); +} + +static stbtt__buf stbtt__cid_get_glyph_subrs(const stbtt_fontinfo * info, int glyph_index) +{ + stbtt__buf fdselect = info->fdselect; + int nranges, start, end, v, fmt, fdselector = -1, i; + + stbtt__buf_seek(&fdselect, 0); + fmt = stbtt__buf_get8(&fdselect); + if(fmt == 0) { + // untested + stbtt__buf_skip(&fdselect, glyph_index); + fdselector = stbtt__buf_get8(&fdselect); + } + else if(fmt == 3) { + nranges = stbtt__buf_get16(&fdselect); + start = stbtt__buf_get16(&fdselect); + for(i = 0; i < nranges; i++) { + v = stbtt__buf_get8(&fdselect); + end = stbtt__buf_get16(&fdselect); + if(glyph_index >= start && glyph_index < end) { + fdselector = v; + break; + } + start = end; + } + } + if(fdselector == -1) stbtt__new_buf(NULL, 0); + return stbtt__get_subrs(info->cff, stbtt__cff_index_get(info->fontdicts, fdselector)); +} + +static int stbtt__run_charstring(const stbtt_fontinfo * info, int glyph_index, stbtt__csctx * c) +{ + int in_header = 1, maskbits = 0, subr_stack_height = 0, sp = 0, v, i, b0; + int has_subrs = 0, clear_stack; + float s[48]; + stbtt__buf subr_stack[10], subrs = info->subrs, b; + float f; + +#define STBTT__CSERR(s) (0) + + // this currently ignores the initial width value, which isn't needed if we have hmtx + b = stbtt__cff_index_get(info->charstrings, glyph_index); + while(b.cursor < b.size) { + i = 0; + clear_stack = 1; + b0 = stbtt__buf_get8(&b); + switch(b0) { + // @TODO implement hinting + case 0x13: // hintmask + case 0x14: // cntrmask + if(in_header) + maskbits += (sp / 2); // implicit "vstem" + in_header = 0; + stbtt__buf_skip(&b, (maskbits + 7) / 8); + break; + + case 0x01: // hstem + case 0x03: // vstem + case 0x12: // hstemhm + case 0x17: // vstemhm + maskbits += (sp / 2); + break; + + case 0x15: // rmoveto + in_header = 0; + if(sp < 2) return STBTT__CSERR("rmoveto stack"); + stbtt__csctx_rmove_to(c, s[sp - 2], s[sp - 1]); + break; + case 0x04: // vmoveto + in_header = 0; + if(sp < 1) return STBTT__CSERR("vmoveto stack"); + stbtt__csctx_rmove_to(c, 0, s[sp - 1]); + break; + case 0x16: // hmoveto + in_header = 0; + if(sp < 1) return STBTT__CSERR("hmoveto stack"); + stbtt__csctx_rmove_to(c, s[sp - 1], 0); + break; + + case 0x05: // rlineto + if(sp < 2) return STBTT__CSERR("rlineto stack"); + for(; i + 1 < sp; i += 2) + stbtt__csctx_rline_to(c, s[i], s[i + 1]); + break; + + // hlineto/vlineto and vhcurveto/hvcurveto alternate horizontal and vertical + // starting from a different place. + + case 0x07: // vlineto + if(sp < 1) return STBTT__CSERR("vlineto stack"); + goto vlineto; + case 0x06: // hlineto + if(sp < 1) return STBTT__CSERR("hlineto stack"); + for(;;) { + if(i >= sp) break; + stbtt__csctx_rline_to(c, s[i], 0); + i++; +vlineto: + if(i >= sp) break; + stbtt__csctx_rline_to(c, 0, s[i]); + i++; + } + break; + + case 0x1F: // hvcurveto + if(sp < 4) return STBTT__CSERR("hvcurveto stack"); + goto hvcurveto; + case 0x1E: // vhcurveto + if(sp < 4) return STBTT__CSERR("vhcurveto stack"); + for(;;) { + if(i + 3 >= sp) break; + stbtt__csctx_rccurve_to(c, 0, s[i], s[i + 1], s[i + 2], s[i + 3], (sp - i == 5) ? s[i + 4] : 0.0f); + i += 4; +hvcurveto: + if(i + 3 >= sp) break; + stbtt__csctx_rccurve_to(c, s[i], 0, s[i + 1], s[i + 2], (sp - i == 5) ? s[i + 4] : 0.0f, s[i + 3]); + i += 4; + } + break; + + case 0x08: // rrcurveto + if(sp < 6) return STBTT__CSERR("rcurveline stack"); + for(; i + 5 < sp; i += 6) + stbtt__csctx_rccurve_to(c, s[i], s[i + 1], s[i + 2], s[i + 3], s[i + 4], s[i + 5]); + break; + + case 0x18: // rcurveline + if(sp < 8) return STBTT__CSERR("rcurveline stack"); + for(; i + 5 < sp - 2; i += 6) + stbtt__csctx_rccurve_to(c, s[i], s[i + 1], s[i + 2], s[i + 3], s[i + 4], s[i + 5]); + if(i + 1 >= sp) return STBTT__CSERR("rcurveline stack"); + stbtt__csctx_rline_to(c, s[i], s[i + 1]); + break; + + case 0x19: // rlinecurve + if(sp < 8) return STBTT__CSERR("rlinecurve stack"); + for(; i + 1 < sp - 6; i += 2) + stbtt__csctx_rline_to(c, s[i], s[i + 1]); + if(i + 5 >= sp) return STBTT__CSERR("rlinecurve stack"); + stbtt__csctx_rccurve_to(c, s[i], s[i + 1], s[i + 2], s[i + 3], s[i + 4], s[i + 5]); + break; + + case 0x1A: // vvcurveto + case 0x1B: // hhcurveto + if(sp < 4) return STBTT__CSERR("(vv|hh)curveto stack"); + f = 0.0; + if(sp & 1) { + f = s[i]; + i++; + } + for(; i + 3 < sp; i += 4) { + if(b0 == 0x1B) + stbtt__csctx_rccurve_to(c, s[i], f, s[i + 1], s[i + 2], s[i + 3], 0.0); + else + stbtt__csctx_rccurve_to(c, f, s[i], s[i + 1], s[i + 2], 0.0, s[i + 3]); + f = 0.0; + } + break; + + case 0x0A: // callsubr + if(!has_subrs) { + if(info->fdselect.size) + subrs = stbtt__cid_get_glyph_subrs(info, glyph_index); + has_subrs = 1; + } + // FALLTHROUGH + case 0x1D: // callgsubr + if(sp < 1) return STBTT__CSERR("call(g|)subr stack"); + v = (int)s[--sp]; + if(subr_stack_height >= 10) return STBTT__CSERR("recursion limit"); + subr_stack[subr_stack_height++] = b; + b = stbtt__get_subr(b0 == 0x0A ? subrs : info->gsubrs, v); + if(b.size == 0) return STBTT__CSERR("subr not found"); + b.cursor = 0; + clear_stack = 0; + break; + + case 0x0B: // return + if(subr_stack_height <= 0) return STBTT__CSERR("return outside subr"); + b = subr_stack[--subr_stack_height]; + clear_stack = 0; + break; + + case 0x0E: // endchar + stbtt__csctx_close_shape(c); + return 1; + + case 0x0C: { // two-byte escape + float dx1, dx2, dx3, dx4, dx5, dx6, dy1, dy2, dy3, dy4, dy5, dy6; + float dx, dy; + int b1 = stbtt__buf_get8(&b); + switch(b1) { + // @TODO These "flex" implementations ignore the flex-depth and resolution, + // and always draw beziers. + case 0x22: // hflex + if(sp < 7) return STBTT__CSERR("hflex stack"); + dx1 = s[0]; + dx2 = s[1]; + dy2 = s[2]; + dx3 = s[3]; + dx4 = s[4]; + dx5 = s[5]; + dx6 = s[6]; + stbtt__csctx_rccurve_to(c, dx1, 0, dx2, dy2, dx3, 0); + stbtt__csctx_rccurve_to(c, dx4, 0, dx5, -dy2, dx6, 0); + break; + + case 0x23: // flex + if(sp < 13) return STBTT__CSERR("flex stack"); + dx1 = s[0]; + dy1 = s[1]; + dx2 = s[2]; + dy2 = s[3]; + dx3 = s[4]; + dy3 = s[5]; + dx4 = s[6]; + dy4 = s[7]; + dx5 = s[8]; + dy5 = s[9]; + dx6 = s[10]; + dy6 = s[11]; + //fd is s[12] + stbtt__csctx_rccurve_to(c, dx1, dy1, dx2, dy2, dx3, dy3); + stbtt__csctx_rccurve_to(c, dx4, dy4, dx5, dy5, dx6, dy6); + break; + + case 0x24: // hflex1 + if(sp < 9) return STBTT__CSERR("hflex1 stack"); + dx1 = s[0]; + dy1 = s[1]; + dx2 = s[2]; + dy2 = s[3]; + dx3 = s[4]; + dx4 = s[5]; + dx5 = s[6]; + dy5 = s[7]; + dx6 = s[8]; + stbtt__csctx_rccurve_to(c, dx1, dy1, dx2, dy2, dx3, 0); + stbtt__csctx_rccurve_to(c, dx4, 0, dx5, dy5, dx6, -(dy1 + dy2 + dy5)); + break; + + case 0x25: // flex1 + if(sp < 11) return STBTT__CSERR("flex1 stack"); + dx1 = s[0]; + dy1 = s[1]; + dx2 = s[2]; + dy2 = s[3]; + dx3 = s[4]; + dy3 = s[5]; + dx4 = s[6]; + dy4 = s[7]; + dx5 = s[8]; + dy5 = s[9]; + dx6 = dy6 = s[10]; + dx = dx1 + dx2 + dx3 + dx4 + dx5; + dy = dy1 + dy2 + dy3 + dy4 + dy5; + if(STBTT_fabs(dx) > STBTT_fabs(dy)) + dy6 = -dy; + else + dx6 = -dx; + stbtt__csctx_rccurve_to(c, dx1, dy1, dx2, dy2, dx3, dy3); + stbtt__csctx_rccurve_to(c, dx4, dy4, dx5, dy5, dx6, dy6); + break; + + default: + return STBTT__CSERR("unimplemented"); + } + } + break; + + default: + if(b0 != 255 && b0 != 28 && b0 < 32) + return STBTT__CSERR("reserved operator"); + + // push immediate + if(b0 == 255) { + f = (float)(stbtt_int32)stbtt__buf_get32(&b) / 0x10000; + } + else { + stbtt__buf_skip(&b, -1); + f = (float)(stbtt_int16)stbtt__cff_int(&b); + } + if(sp >= 48) return STBTT__CSERR("push stack overflow"); + s[sp++] = f; + clear_stack = 0; + break; + } + if(clear_stack) sp = 0; + } + return STBTT__CSERR("no endchar"); + +#undef STBTT__CSERR +} + +static int stbtt__GetGlyphShapeT2(const stbtt_fontinfo * info, int glyph_index, stbtt_vertex * *pvertices) +{ + // runs the charstring twice, once to count and once to output (to avoid realloc) + stbtt__csctx count_ctx = STBTT__CSCTX_INIT(1); + stbtt__csctx output_ctx = STBTT__CSCTX_INIT(0); + if(stbtt__run_charstring(info, glyph_index, &count_ctx)) { + *pvertices = (stbtt_vertex *)STBTT_malloc(count_ctx.num_vertices * sizeof(stbtt_vertex), info->userdata); + output_ctx.pvertices = *pvertices; + if(stbtt__run_charstring(info, glyph_index, &output_ctx)) { + STBTT_assert(output_ctx.num_vertices == count_ctx.num_vertices); + return output_ctx.num_vertices; + } + } + *pvertices = NULL; + return 0; +} + +static int stbtt__GetGlyphInfoT2(const stbtt_fontinfo * info, int glyph_index, int * x0, int * y0, int * x1, int * y1) +{ + stbtt__csctx c = STBTT__CSCTX_INIT(1); + int r = stbtt__run_charstring(info, glyph_index, &c); + if(x0) *x0 = r ? c.min_x : 0; + if(y0) *y0 = r ? c.min_y : 0; + if(x1) *x1 = r ? c.max_x : 0; + if(y1) *y1 = r ? c.max_y : 0; + return r ? c.num_vertices : 0; +} + +STBTT_DEF int stbtt_GetGlyphShape(const stbtt_fontinfo * info, int glyph_index, stbtt_vertex * *pvertices) +{ + if(!info->cff.size) + return stbtt__GetGlyphShapeTT(info, glyph_index, pvertices); + else + return stbtt__GetGlyphShapeT2(info, glyph_index, pvertices); +} + +STBTT_DEF void stbtt_GetGlyphHMetrics(const stbtt_fontinfo * info, int glyph_index, int * advanceWidth, + int * leftSideBearing) +{ + stbtt_uint16 numOfLongHorMetrics = ttUSHORT(info->data, info->hhea + 34); + if(glyph_index < numOfLongHorMetrics) { + if(advanceWidth) *advanceWidth = ttSHORT(info->data, info->hmtx + 4 * glyph_index); + if(leftSideBearing) *leftSideBearing = ttSHORT(info->data, info->hmtx + 4 * glyph_index + 2); + } + else { + if(advanceWidth) *advanceWidth = ttSHORT(info->data, info->hmtx + 4 * (numOfLongHorMetrics - 1)); + if(leftSideBearing) *leftSideBearing = ttSHORT(info->data, + info->hmtx + 4 * numOfLongHorMetrics + 2 * (glyph_index - numOfLongHorMetrics)); + } +} + +STBTT_DEF int stbtt_GetKerningTableLength(const stbtt_fontinfo * info) +{ + // we only look at the first table. it must be 'horizontal' and format 0. + if(!info->kern) + return 0; + if(ttUSHORT(info->data, 2 + info->kern) < 1) // number of tables, need at least 1 + return 0; + if(ttUSHORT(info->data, 8 + info->kern) != 1) // horizontal flag must be set in format + return 0; + + return ttUSHORT(info->data, 10 + info->kern); +} + +STBTT_DEF int stbtt_GetKerningTable(const stbtt_fontinfo * info, stbtt_kerningentry * table, int table_length) +{ + int k, length; + + // we only look at the first table. it must be 'horizontal' and format 0. + if(!info->kern) + return 0; + if(ttUSHORT(info->data, 2 + info->kern) < 1) // number of tables, need at least 1 + return 0; + if(ttUSHORT(info->data, 8 + info->kern) != 1) // horizontal flag must be set in format + return 0; + + length = ttUSHORT(info->data, 10 + info->kern); + if(table_length < length) + length = table_length; + + for(k = 0; k < length; k++) { + table[k].glyph1 = ttUSHORT(info->data, 18 + (k * 6) + info->kern); + table[k].glyph2 = ttUSHORT(info->data, 20 + (k * 6) + info->kern); + table[k].advance = ttSHORT(info->data, 22 + (k * 6) + info->kern); + } + + return length; +} + +static int stbtt__GetGlyphKernInfoAdvance(const stbtt_fontinfo * info, int glyph1, int glyph2) +{ + stbtt_uint32 needle, straw; + int l, r, m; + + // we only look at the first table. it must be 'horizontal' and format 0. + if(!info->kern) + return 0; + if(ttUSHORT(info->data, info->kern + 2) < 1) // number of tables, need at least 1 + return 0; + if(ttUSHORT(info->data, info->kern + 8) != 1) // horizontal flag must be set in format + return 0; + + l = 0; + r = ttUSHORT(info->data, info->kern + 10) - 1; + needle = glyph1 << 16 | glyph2; + while(l <= r) { + m = (l + r) >> 1; + straw = ttULONG(info->data, info->kern + 18 + (m * 6)); // note: unaligned read + if(needle < straw) + r = m - 1; + else if(needle > straw) + l = m + 1; + else + return ttSHORT(info->data, info->kern + 22 + (m * 6)); + } + return 0; +} +#ifdef STBTT_STREAM_TYPE + static stbtt_int32 stbtt__GetCoverageIndex(STBTT_STREAM_TYPE data, stbtt_uint32 coverageTable, int glyph) +#else + static stbtt_int32 stbtt__GetCoverageIndex(const stbtt_uint8 * data, stbtt_uint32 coverageTable, int glyph) +#endif +{ + stbtt_uint16 coverageFormat = ttUSHORT(data, coverageTable); + switch(coverageFormat) { + case 1: { + stbtt_uint16 glyphCount = ttUSHORT(data, coverageTable + 2); + + // Binary search. + stbtt_int32 l = 0, r = glyphCount - 1, m; + int straw, needle = glyph; + while(l <= r) { + stbtt_uint32 glyphArray = coverageTable + 4; + stbtt_uint16 glyphID; + m = (l + r) >> 1; + glyphID = ttUSHORT(data, glyphArray + 2 * m); + straw = glyphID; + if(needle < straw) + r = m - 1; + else if(needle > straw) + l = m + 1; + else { + return m; + } + } + break; + } + + case 2: { + stbtt_uint16 rangeCount = ttUSHORT(data, coverageTable + 2); + stbtt_uint32 rangeArray = coverageTable + 4; + + // Binary search. + stbtt_int32 l = 0, r = rangeCount - 1, m; + int strawStart, strawEnd, needle = glyph; + while(l <= r) { + stbtt_uint32 rangeRecord; + m = (l + r) >> 1; + rangeRecord = rangeArray + 6 * m; + strawStart = ttUSHORT(data, rangeRecord); + strawEnd = ttUSHORT(data, rangeRecord + 2); + if(needle < strawStart) + r = m - 1; + else if(needle > strawEnd) + l = m + 1; + else { + stbtt_uint16 startCoverageIndex = ttUSHORT(data, rangeRecord + 4); + return startCoverageIndex + glyph - strawStart; + } + } + break; + } + + default: + return -1; // unsupported + } + + return -1; +} +#ifdef STBTT_STREAM_TYPE + static stbtt_int32 stbtt__GetGlyphClass(STBTT_STREAM_TYPE data, stbtt_uint32 classDefTable, int glyph) +#else + static stbtt_int32 stbtt__GetGlyphClass(const stbtt_uint8 * data, stbtt_uint32 classDefTable, int glyph) +#endif +{ + stbtt_uint16 classDefFormat = ttUSHORT(data, classDefTable); + switch(classDefFormat) { + case 1: { + stbtt_uint16 startGlyphID = ttUSHORT(data, classDefTable + 2); + stbtt_uint16 glyphCount = ttUSHORT(data, classDefTable + 4); + stbtt_uint32 classDef1ValueArray = classDefTable + 6; + + if(glyph >= startGlyphID && glyph < startGlyphID + glyphCount) + return (stbtt_int32)ttUSHORT(data, classDef1ValueArray + 2 * (glyph - startGlyphID)); + break; + } + + case 2: { + stbtt_uint16 classRangeCount = ttUSHORT(data, classDefTable + 2); + stbtt_uint32 classRangeRecords = classDefTable + 4; + + // Binary search. + stbtt_int32 l = 0, r = classRangeCount - 1, m; + int strawStart, strawEnd, needle = glyph; + while(l <= r) { + stbtt_uint32 classRangeRecord; + m = (l + r) >> 1; + classRangeRecord = classRangeRecords + 6 * m; + strawStart = ttUSHORT(data, classRangeRecord); + strawEnd = ttUSHORT(data, classRangeRecord + 2); + if(needle < strawStart) + r = m - 1; + else if(needle > strawEnd) + l = m + 1; + else + return (stbtt_int32)ttUSHORT(data, classRangeRecord + 4); + } + break; + } + + default: + return -1; // Unsupported definition type, return an error. + } + + // "All glyphs not assigned to a class fall into class 0". (OpenType spec) + return 0; +} + +// Define to STBTT_assert(x) if you want to break on unimplemented formats. +#define STBTT_GPOS_TODO_assert(x) + +static stbtt_int32 stbtt__GetGlyphGPOSInfoAdvance(const stbtt_fontinfo * info, int glyph1, int glyph2) +{ + stbtt_uint16 lookupListOffset; + stbtt_uint32 lookupList; + stbtt_uint16 lookupCount; +#ifdef STBTT_STREAM_TYPE + STBTT_STREAM_TYPE data = info->data; +#else + const stbtt_uint8 * data = info->data; +#endif + stbtt_int32 i, sti; + + if(!info->gpos) return 0; + + if(ttUSHORT(data, 0 + info->gpos) != 1) return 0; // Major version 1 + if(ttUSHORT(data, 2 + info->gpos) != 0) return 0; // Minor version 0 + + lookupListOffset = ttUSHORT(data, 8 + info->gpos); + lookupList = lookupListOffset; + lookupCount = ttUSHORT(data, lookupList); + + for(i = 0; i < lookupCount; ++i) { + stbtt_uint16 lookupOffset = ttUSHORT(data, lookupList + 2 + 2 * i); + stbtt_uint32 lookupTable = lookupList + lookupOffset; + + stbtt_uint16 lookupType = ttUSHORT(data, lookupTable); + stbtt_uint16 subTableCount = ttUSHORT(data, lookupTable + 4); + stbtt_uint32 subTableOffsets = lookupTable + 6; + if(lookupType != 2) // Pair Adjustment Positioning Subtable + continue; + + for(sti = 0; sti < subTableCount; sti++) { + stbtt_uint16 subtableOffset = ttUSHORT(data, subTableOffsets + 2 * sti); + stbtt_uint32 table = lookupTable + subtableOffset; + stbtt_uint16 posFormat = ttUSHORT(data, table); + stbtt_uint16 coverageOffset = ttUSHORT(data, table + 2); + stbtt_int32 coverageIndex = stbtt__GetCoverageIndex(data, table + coverageOffset, glyph1); + if(coverageIndex == -1) continue; + + switch(posFormat) { + case 1: { + stbtt_int32 l, r, m; + int straw, needle; + stbtt_uint16 valueFormat1 = ttUSHORT(data, table + 4); + stbtt_uint16 valueFormat2 = ttUSHORT(data, table + 6); + if(valueFormat1 == 4 && valueFormat2 == 0) { // Support more formats? + stbtt_int32 valueRecordPairSizeInBytes = 2; + stbtt_uint16 pairSetCount = ttUSHORT(data, table + 8); + stbtt_uint16 pairPosOffset = ttUSHORT(data, table + 10 + 2 * coverageIndex); + stbtt_uint32 pairValueTable = table + pairPosOffset; + stbtt_uint16 pairValueCount = ttUSHORT(data, pairValueTable); + stbtt_uint32 pairValueArray = pairValueTable + 2; + + if(coverageIndex >= pairSetCount) return 0; + + needle = glyph2; + r = pairValueCount - 1; + l = 0; + + // Binary search. + while(l <= r) { + stbtt_uint16 secondGlyph; + stbtt_uint32 pairValue; + m = (l + r) >> 1; + pairValue = pairValueArray + (2 + valueRecordPairSizeInBytes) * m; + secondGlyph = ttUSHORT(data, pairValue); + straw = secondGlyph; + if(needle < straw) + r = m - 1; + else if(needle > straw) + l = m + 1; + else { + stbtt_int16 xAdvance = ttSHORT(data, pairValue + 2); + return xAdvance; + } + } + } + else + return 0; + break; + } + + case 2: { + stbtt_uint16 valueFormat1 = ttUSHORT(data, table + 4); + stbtt_uint16 valueFormat2 = ttUSHORT(data, table + 6); + if(valueFormat1 == 4 && valueFormat2 == 0) { // Support more formats? + stbtt_uint16 classDef1Offset = ttUSHORT(data, table + 8); + stbtt_uint16 classDef2Offset = ttUSHORT(data, table + 10); + int glyph1class = stbtt__GetGlyphClass(data, table + classDef1Offset, glyph1); + int glyph2class = stbtt__GetGlyphClass(data, table + classDef2Offset, glyph2); + + stbtt_uint16 class1Count = ttUSHORT(data, table + 12); + stbtt_uint16 class2Count = ttUSHORT(data, table + 14); + stbtt_uint32 class1Records, class2Records; + stbtt_int16 xAdvance; + + if(glyph1class < 0 || glyph1class >= class1Count) return 0; // malformed + if(glyph2class < 0 || glyph2class >= class2Count) return 0; // malformed + + class1Records = table + 16; + class2Records = class1Records + 2 * (glyph1class * class2Count); + xAdvance = ttSHORT(data, class2Records + 2 * glyph2class); + return xAdvance; + } + else + return 0; + break; + } + + default: + return 0; // Unsupported position format + } + } + } + + return 0; +} + +STBTT_DEF int stbtt_GetGlyphKernAdvance(const stbtt_fontinfo * info, int g1, int g2) +{ + int xAdvance = 0; + + if(info->gpos) + xAdvance += stbtt__GetGlyphGPOSInfoAdvance(info, g1, g2); + else if(info->kern) + xAdvance += stbtt__GetGlyphKernInfoAdvance(info, g1, g2); + + return xAdvance; +} + +STBTT_DEF int stbtt_GetCodepointKernAdvance(const stbtt_fontinfo * info, int ch1, int ch2) +{ + if(!info->kern && !info->gpos) // if no kerning table, don't waste time looking up both codepoint->glyphs + return 0; + return stbtt_GetGlyphKernAdvance(info, stbtt_FindGlyphIndex(info, ch1), stbtt_FindGlyphIndex(info, ch2)); +} + +STBTT_DEF void stbtt_GetCodepointHMetrics(const stbtt_fontinfo * info, int codepoint, int * advanceWidth, + int * leftSideBearing) +{ + stbtt_GetGlyphHMetrics(info, stbtt_FindGlyphIndex(info, codepoint), advanceWidth, leftSideBearing); +} + +STBTT_DEF void stbtt_GetFontVMetrics(const stbtt_fontinfo * info, int * ascent, int * descent, int * lineGap) +{ + if(ascent) *ascent = ttSHORT(info->data, info->hhea + 4); + if(descent) *descent = ttSHORT(info->data, info->hhea + 6); + if(lineGap) *lineGap = ttSHORT(info->data, info->hhea + 8); +} + +STBTT_DEF int stbtt_GetFontVMetricsOS2(const stbtt_fontinfo * info, int * typoAscent, int * typoDescent, + int * typoLineGap) +{ + int tab = stbtt__find_table(info->data, info->fontstart, "OS/2"); + if(!tab) + return 0; + if(typoAscent) *typoAscent = ttSHORT(info->data, tab + 68); + if(typoDescent) *typoDescent = ttSHORT(info->data, tab + 70); + if(typoLineGap) *typoLineGap = ttSHORT(info->data, tab + 72); + return 1; +} + +STBTT_DEF void stbtt_GetFontBoundingBox(const stbtt_fontinfo * info, int * x0, int * y0, int * x1, int * y1) +{ + *x0 = ttSHORT(info->data, info->head + 36); + *y0 = ttSHORT(info->data, info->head + 38); + *x1 = ttSHORT(info->data, info->head + 40); + *y1 = ttSHORT(info->data, info->head + 42); +} + +STBTT_DEF float stbtt_ScaleForPixelHeight(const stbtt_fontinfo * info, float height) +{ + int fheight = ttSHORT(info->data, info->hhea + 4) - ttSHORT(info->data, info->hhea + 6); + return (float)height / fheight; +} + +STBTT_DEF float stbtt_ScaleForMappingEmToPixels(const stbtt_fontinfo * info, float pixels) +{ + int unitsPerEm = ttUSHORT(info->data, info->head + 18); + return pixels / unitsPerEm; +} + +STBTT_DEF void stbtt_FreeShape(const stbtt_fontinfo * info, stbtt_vertex * v) +{ + STBTT_free(v, info->userdata); +} + +STBTT_DEF stbtt_uint32 stbtt_FindSVGDoc(const stbtt_fontinfo * info, int gl) +{ + int i; + stbtt_uint32 svg_doc_list = stbtt__get_svg((stbtt_fontinfo *)info); + + int numEntries = ttUSHORT(info->data, svg_doc_list); + stbtt_uint32 svg_docs = svg_doc_list + 2; + + for(i = 0; i < numEntries; i++) { + stbtt_uint32 svg_doc = svg_docs + (12 * i); + if((gl >= ttUSHORT(info->data, svg_doc)) && (gl <= ttUSHORT(info->data, svg_doc + 2))) + return svg_doc; + } + return 0; +} + +STBTT_DEF int stbtt_GetGlyphSVG(const stbtt_fontinfo * info, int gl, stbtt_uint32 * svgOfs) +{ + stbtt_uint32 svg_doc; + + if(info->svg == 0) + return 0; + + svg_doc = stbtt_FindSVGDoc(info, gl); + if(svg_doc != 0) { + *svgOfs = info->svg + ttULONG(info->data, svg_doc + 4); + return ttULONG(info->data, svg_doc + 8); + } + else { + return 0; + } +} + +STBTT_DEF int stbtt_GetCodepointSVG(const stbtt_fontinfo * info, int unicode_codepoint, stbtt_uint32 * svgOfs) +{ + return stbtt_GetGlyphSVG(info, stbtt_FindGlyphIndex(info, unicode_codepoint), svgOfs); +} + +////////////////////////////////////////////////////////////////////////////// +// +// antialiasing software rasterizer +// + +STBTT_DEF void stbtt_GetGlyphBitmapBoxSubpixel(const stbtt_fontinfo * font, int glyph, float scale_x, float scale_y, + float shift_x, float shift_y, int * ix0, int * iy0, int * ix1, int * iy1) +{ + int x0 = 0, y0 = 0, x1, y1; // =0 suppresses compiler warning + if(!stbtt_GetGlyphBox(font, glyph, &x0, &y0, &x1, &y1)) { + // e.g. space character + if(ix0) *ix0 = 0; + if(iy0) *iy0 = 0; + if(ix1) *ix1 = 0; + if(iy1) *iy1 = 0; + } + else { + // move to integral bboxes (treating pixels as little squares, what pixels get touched)? + if(ix0) *ix0 = STBTT_ifloor(x0 * scale_x + shift_x); + if(iy0) *iy0 = STBTT_ifloor(-y1 * scale_y + shift_y); + if(ix1) *ix1 = STBTT_iceil(x1 * scale_x + shift_x); + if(iy1) *iy1 = STBTT_iceil(-y0 * scale_y + shift_y); + } +} + +STBTT_DEF void stbtt_GetGlyphBitmapBox(const stbtt_fontinfo * font, int glyph, float scale_x, float scale_y, int * ix0, + int * iy0, int * ix1, int * iy1) +{ + stbtt_GetGlyphBitmapBoxSubpixel(font, glyph, scale_x, scale_y, 0.0f, 0.0f, ix0, iy0, ix1, iy1); +} + +STBTT_DEF void stbtt_GetCodepointBitmapBoxSubpixel(const stbtt_fontinfo * font, int codepoint, float scale_x, + float scale_y, float shift_x, float shift_y, int * ix0, int * iy0, int * ix1, int * iy1) +{ + stbtt_GetGlyphBitmapBoxSubpixel(font, stbtt_FindGlyphIndex(font, codepoint), scale_x, scale_y, shift_x, shift_y, ix0, + iy0, ix1, iy1); +} + +STBTT_DEF void stbtt_GetCodepointBitmapBox(const stbtt_fontinfo * font, int codepoint, float scale_x, float scale_y, + int * ix0, int * iy0, int * ix1, int * iy1) +{ + stbtt_GetCodepointBitmapBoxSubpixel(font, codepoint, scale_x, scale_y, 0.0f, 0.0f, ix0, iy0, ix1, iy1); +} + +////////////////////////////////////////////////////////////////////////////// +// +// Rasterizer + +typedef struct stbtt__hheap_chunk { + struct stbtt__hheap_chunk * next; +} stbtt__hheap_chunk; + +typedef struct stbtt__hheap { + struct stbtt__hheap_chunk * head; + void * first_free; + int num_remaining_in_head_chunk; +} stbtt__hheap; + +static void * stbtt__hheap_alloc(stbtt__hheap * hh, size_t size, void * userdata) +{ + if(hh->first_free) { + void * p = hh->first_free; + hh->first_free = *(void **)p; + return p; + } + else { + if(hh->num_remaining_in_head_chunk == 0) { + int count = (size < 32 ? STBTT_HEAP_FACTOR_SIZE_32 : size < 128 ? STBTT_HEAP_FACTOR_SIZE_128 : + STBTT_HEAP_FACTOR_SIZE_DEFAULT); + stbtt__hheap_chunk * c = (stbtt__hheap_chunk *)STBTT_malloc(sizeof(stbtt__hheap_chunk) + size * count, userdata); + if(c == NULL) + return NULL; + c->next = hh->head; + hh->head = c; + hh->num_remaining_in_head_chunk = count; + } + --hh->num_remaining_in_head_chunk; + return (char *)(hh->head) + sizeof(stbtt__hheap_chunk) + size * hh->num_remaining_in_head_chunk; + } +} + +static void stbtt__hheap_free(stbtt__hheap * hh, void * p) +{ + *(void **)p = hh->first_free; + hh->first_free = p; +} + +static void stbtt__hheap_cleanup(stbtt__hheap * hh, void * userdata) +{ + stbtt__hheap_chunk * c = hh->head; + while(c) { + stbtt__hheap_chunk * n = c->next; + STBTT_free(c, userdata); + c = n; + } +} + +typedef struct stbtt__edge { + float x0, y0, x1, y1; + int invert; +} stbtt__edge; + +typedef struct stbtt__active_edge { + struct stbtt__active_edge * next; +#if STBTT_RASTERIZER_VERSION==1 + int x, dx; + float ey; + int direction; +#elif STBTT_RASTERIZER_VERSION==2 + float fx, fdx, fdy; + float direction; + float sy; + float ey; +#else +#error "Unrecognized value of STBTT_RASTERIZER_VERSION" +#endif +} stbtt__active_edge; + +#if STBTT_RASTERIZER_VERSION == 1 +#define STBTT_FIXSHIFT 10 +#define STBTT_FIX (1 << STBTT_FIXSHIFT) +#define STBTT_FIXMASK (STBTT_FIX-1) + +static stbtt__active_edge * stbtt__new_active(stbtt__hheap * hh, stbtt__edge * e, int off_x, float start_point, + void * userdata) +{ + stbtt__active_edge * z = (stbtt__active_edge *)stbtt__hheap_alloc(hh, sizeof(*z), userdata); + float dxdy = (e->x1 - e->x0) / (e->y1 - e->y0); + STBTT_assert(z != NULL); + if(!z) return z; + + // round dx down to avoid overshooting + if(dxdy < 0) + z->dx = -STBTT_ifloor(STBTT_FIX * -dxdy); + else + z->dx = STBTT_ifloor(STBTT_FIX * dxdy); + + z->x = STBTT_ifloor(STBTT_FIX * e->x0 + z->dx * (start_point - + e->y0)); // use z->dx so when we offset later it's by the same amount + z->x -= off_x * STBTT_FIX; + + z->ey = e->y1; + z->next = 0; + z->direction = e->invert ? 1 : -1; + return z; +} +#elif STBTT_RASTERIZER_VERSION == 2 +static stbtt__active_edge * stbtt__new_active(stbtt__hheap * hh, stbtt__edge * e, int off_x, float start_point, + void * userdata) +{ + stbtt__active_edge * z = (stbtt__active_edge *)stbtt__hheap_alloc(hh, sizeof(*z), userdata); + float dxdy = (e->x1 - e->x0) / (e->y1 - e->y0); + STBTT_assert(z != NULL); + //STBTT_assert(e->y0 <= start_point); + if(!z) return z; + z->fdx = dxdy; + z->fdy = dxdy != 0.0f ? (1.0f / dxdy) : 0.0f; + z->fx = e->x0 + dxdy * (start_point - e->y0); + z->fx -= off_x; + z->direction = e->invert ? 1.0f : -1.0f; + z->sy = e->y0; + z->ey = e->y1; + z->next = 0; + return z; +} +#else +#error "Unrecognized value of STBTT_RASTERIZER_VERSION" +#endif + +#if STBTT_RASTERIZER_VERSION == 1 +// note: this routine clips fills that extend off the edges... ideally this +// wouldn't happen, but it could happen if the truetype glyph bounding boxes +// are wrong, or if the user supplies a too-small bitmap +static void stbtt__fill_active_edges(unsigned char * scanline, int len, stbtt__active_edge * e, int max_weight) +{ + // non-zero winding fill + int x0 = 0, w = 0; + + while(e) { + if(w == 0) { + // if we're currently at zero, we need to record the edge start point + x0 = e->x; + w += e->direction; + } + else { + int x1 = e->x; + w += e->direction; + // if we went to zero, we need to draw + if(w == 0) { + int i = x0 >> STBTT_FIXSHIFT; + int j = x1 >> STBTT_FIXSHIFT; + + if(i < len && j >= 0) { + if(i == j) { + // x0,x1 are the same pixel, so compute combined coverage + scanline[i] = scanline[i] + (stbtt_uint8)((x1 - x0) * max_weight >> STBTT_FIXSHIFT); + } + else { + if(i >= 0) // add antialiasing for x0 + scanline[i] = scanline[i] + (stbtt_uint8)(((STBTT_FIX - (x0 & STBTT_FIXMASK)) * max_weight) >> STBTT_FIXSHIFT); + else + i = -1; // clip + + if(j < len) // add antialiasing for x1 + scanline[j] = scanline[j] + (stbtt_uint8)(((x1 & STBTT_FIXMASK) * max_weight) >> STBTT_FIXSHIFT); + else + j = len; // clip + + for(++i; i < j; ++i) // fill pixels between x0 and x1 + scanline[i] = scanline[i] + (stbtt_uint8)max_weight; + } + } + } + } + + e = e->next; + } +} + +static void stbtt__rasterize_sorted_edges(stbtt__bitmap * result, stbtt__edge * e, int n, int vsubsample, int off_x, + int off_y, void * userdata) +{ + stbtt__hheap hh = { 0, 0, 0 }; + stbtt__active_edge * active = NULL; + int y, j = 0; + int max_weight = (255 / vsubsample); // weight per vertical scanline + int s; // vertical subsample index + unsigned char scanline_data[512], * scanline; + + if(result->w > 512) + scanline = (unsigned char *)STBTT_malloc(result->w, userdata); + else + scanline = scanline_data; + + y = off_y * vsubsample; + e[n].y0 = (off_y + result->h) * (float)vsubsample + 1; + + while(j < result->h) { + STBTT_memset(scanline, 0, result->w); + for(s = 0; s < vsubsample; ++s) { + // find center of pixel for this scanline + float scan_y = y + 0.5f; + stbtt__active_edge ** step = &active; + + // update all active edges; + // remove all active edges that terminate before the center of this scanline + while(*step) { + stbtt__active_edge * z = *step; + if(z->ey <= scan_y) { + *step = z->next; // delete from list + STBTT_assert(z->direction); + z->direction = 0; + stbtt__hheap_free(&hh, z); + } + else { + z->x += z->dx; // advance to position for current scanline + step = &((*step)->next); // advance through list + } + } + + // resort the list if needed + for(;;) { + int changed = 0; + step = &active; + while(*step && (*step)->next) { + if((*step)->x > (*step)->next->x) { + stbtt__active_edge * t = *step; + stbtt__active_edge * q = t->next; + + t->next = q->next; + q->next = t; + *step = q; + changed = 1; + } + step = &(*step)->next; + } + if(!changed) break; + } + + // insert all edges that start before the center of this scanline -- omit ones that also end on this scanline + while(e->y0 <= scan_y) { + if(e->y1 > scan_y) { + stbtt__active_edge * z = stbtt__new_active(&hh, e, off_x, scan_y, userdata); + if(z != NULL) { + // find insertion point + if(active == NULL) + active = z; + else if(z->x < active->x) { + // insert at front + z->next = active; + active = z; + } + else { + // find thing to insert AFTER + stbtt__active_edge * p = active; + while(p->next && p->next->x < z->x) + p = p->next; + // at this point, p->next->x is NOT < z->x + z->next = p->next; + p->next = z; + } + } + } + ++e; + } + + // now process all active edges in XOR fashion + if(active) + stbtt__fill_active_edges(scanline, result->w, active, max_weight); + + ++y; + } + STBTT_memcpy(result->pixels + j * result->stride, scanline, result->w); + ++j; + } + + stbtt__hheap_cleanup(&hh, userdata); + + if(scanline != scanline_data) + STBTT_free(scanline, userdata); +} + +#elif STBTT_RASTERIZER_VERSION == 2 + +// the edge passed in here does not cross the vertical line at x or the vertical line at x+1 +// (i.e. it has already been clipped to those) +static void stbtt__handle_clipped_edge(float * scanline, int x, stbtt__active_edge * e, float x0, float y0, float x1, + float y1) +{ + if(y0 == y1) return; + STBTT_assert(y0 < y1); + STBTT_assert(e->sy <= e->ey); + if(y0 > e->ey) return; + if(y1 < e->sy) return; + if(y0 < e->sy) { + x0 += (x1 - x0) * (e->sy - y0) / (y1 - y0); + y0 = e->sy; + } + if(y1 > e->ey) { + x1 += (x1 - x0) * (e->ey - y1) / (y1 - y0); + y1 = e->ey; + } + + if(x0 == x) + STBTT_assert(x1 <= x + 1); + else if(x0 == x + 1) + STBTT_assert(x1 >= x); + else if(x0 <= x) + STBTT_assert(x1 <= x); + else if(x0 >= x + 1) + STBTT_assert(x1 >= x + 1); + else + STBTT_assert(x1 >= x && x1 <= x + 1); + + if(x0 <= x && x1 <= x) + scanline[x] += e->direction * (y1 - y0); + else if(x0 >= x + 1 && x1 >= x + 1) { + /*Nothing to do*/; + } + else { + STBTT_assert(x0 >= x && x0 <= x + 1 && x1 >= x && x1 <= x + 1); + scanline[x] += e->direction * (y1 - y0) * (1 - ((x0 - x) + (x1 - x)) / 2); // coverage = 1 - average x position + } +} + +static float stbtt__sized_trapezoid_area(float height, float top_width, float bottom_width) +{ + STBTT_assert(top_width >= 0); + STBTT_assert(bottom_width >= 0); + return (top_width + bottom_width) / 2.0f * height; +} + +static float stbtt__position_trapezoid_area(float height, float tx0, float tx1, float bx0, float bx1) +{ + return stbtt__sized_trapezoid_area(height, tx1 - tx0, bx1 - bx0); +} + +static float stbtt__sized_triangle_area(float height, float width) +{ + return height * width / 2; +} + +static void stbtt__fill_active_edges_new(float * scanline, float * scanline_fill, int len, stbtt__active_edge * e, + float y_top) +{ + float y_bottom = y_top + 1; + + while(e) { + // brute force every pixel + + // compute intersection points with top & bottom + STBTT_assert(e->ey >= y_top); + + if(e->fdx == 0) { + float x0 = e->fx; + if(x0 < len) { + if(x0 >= 0) { + stbtt__handle_clipped_edge(scanline, (int)x0, e, x0, y_top, x0, y_bottom); + stbtt__handle_clipped_edge(scanline_fill - 1, (int)x0 + 1, e, x0, y_top, x0, y_bottom); + } + else { + stbtt__handle_clipped_edge(scanline_fill - 1, 0, e, x0, y_top, x0, y_bottom); + } + } + } + else { + float x0 = e->fx; + float dx = e->fdx; + float xb = x0 + dx; + float x_top, x_bottom; + float sy0, sy1; + float dy = e->fdy; + STBTT_assert(e->sy <= y_bottom && e->ey >= y_top); + + // compute endpoints of line segment clipped to this scanline (if the + // line segment starts on this scanline. x0 is the intersection of the + // line with y_top, but that may be off the line segment. + if(e->sy > y_top) { + x_top = x0 + dx * (e->sy - y_top); + sy0 = e->sy; + } + else { + x_top = x0; + sy0 = y_top; + } + if(e->ey < y_bottom) { + x_bottom = x0 + dx * (e->ey - y_top); + sy1 = e->ey; + } + else { + x_bottom = xb; + sy1 = y_bottom; + } + + if(x_top >= 0 && x_bottom >= 0 && x_top < len && x_bottom < len) { + // from here on, we don't have to range check x values + + if((int)x_top == (int)x_bottom) { + float height; + // simple case, only spans one pixel + int x = (int)x_top; + height = (sy1 - sy0) * e->direction; + STBTT_assert(x >= 0 && x < len); + scanline[x] += stbtt__position_trapezoid_area(height, x_top, x + 1.0f, x_bottom, x + 1.0f); + scanline_fill[x] += height; // everything right of this pixel is filled + } + else { + int x, x1, x2; + float y_crossing, y_final, step, sign, area; + // covers 2+ pixels + if(x_top > x_bottom) { + // flip scanline vertically; signed area is the same + float t; + sy0 = y_bottom - (sy0 - y_top); + sy1 = y_bottom - (sy1 - y_top); + t = sy0, sy0 = sy1, sy1 = t; + t = x_bottom, x_bottom = x_top, x_top = t; + dx = -dx; + dy = -dy; + t = x0, x0 = xb, xb = t; + } + STBTT_assert(dy >= 0); + STBTT_assert(dx >= 0); + + x1 = (int)x_top; + x2 = (int)x_bottom; + // compute intersection with y axis at x1+1 + y_crossing = y_top + dy * (x1 + 1 - x0); + + // compute intersection with y axis at x2 + y_final = y_top + dy * (x2 - x0); + + // x1 x_top x2 x_bottom + // y_top +------|-----+------------+------------+--------|---+------------+ + // | | | | | | + // | | | | | | + // sy0 | Txxxxx|............|............|............|............| + // y_crossing | *xxxxx.......|............|............|............| + // | | xxxxx..|............|............|............| + // | | /- xx*xxxx........|............|............| + // | | dy < | xxxxxx..|............|............| + // y_final | | \- | xx*xxx.........|............| + // sy1 | | | | xxxxxB...|............| + // | | | | | | + // | | | | | | + // y_bottom +------------+------------+------------+------------+------------+ + // + // goal is to measure the area covered by '.' in each pixel + + // if x2 is right at the right edge of x1, y_crossing can blow up, github #1057 + // @TODO: maybe test against sy1 rather than y_bottom? + if(y_crossing > y_bottom) + y_crossing = y_bottom; + + sign = e->direction; + + // area of the rectangle covered from sy0..y_crossing + area = sign * (y_crossing - sy0); + + // area of the triangle (x_top,sy0), (x1+1,sy0), (x1+1,y_crossing) + scanline[x1] += stbtt__sized_triangle_area(area, x1 + 1 - x_top); + + // check if final y_crossing is blown up; no test case for this + if(y_final > y_bottom) { + y_final = y_bottom; + dy = (y_final - y_crossing) / (x2 - (x1 + 1)); // if denom=0, y_final = y_crossing, so y_final <= y_bottom + } + + // in second pixel, area covered by line segment found in first pixel + // is always a rectangle 1 wide * the height of that line segment; this + // is exactly what the variable 'area' stores. it also gets a contribution + // from the line segment within it. the THIRD pixel will get the first + // pixel's rectangle contribution, the second pixel's rectangle contribution, + // and its own contribution. the 'own contribution' is the same in every pixel except + // the leftmost and rightmost, a trapezoid that slides down in each pixel. + // the second pixel's contribution to the third pixel will be the + // rectangle 1 wide times the height change in the second pixel, which is dy. + + step = sign * dy * 1; // dy is dy/dx, change in y for every 1 change in x, + // which multiplied by 1-pixel-width is how much pixel area changes for each step in x + // so the area advances by 'step' every time + + for(x = x1 + 1; x < x2; ++x) { + scanline[x] += area + step / 2; // area of trapezoid is 1*step/2 + area += step; + } + STBTT_assert(STBTT_fabs(area) <= 1.01f); // accumulated error from area += step unless we round step down + STBTT_assert(sy1 > y_final - 0.01f); + + // area covered in the last pixel is the rectangle from all the pixels to the left, + // plus the trapezoid filled by the line segment in this pixel all the way to the right edge + scanline[x2] += area + sign * stbtt__position_trapezoid_area(sy1 - y_final, (float)x2, x2 + 1.0f, x_bottom, x2 + 1.0f); + + // the rest of the line is filled based on the total height of the line segment in this pixel + scanline_fill[x2] += sign * (sy1 - sy0); + } + } + else { + // if edge goes outside of box we're drawing, we require + // clipping logic. since this does not match the intended use + // of this library, we use a different, very slow brute + // force implementation + // note though that this does happen some of the time because + // x_top and x_bottom can be extrapolated at the top & bottom of + // the shape and actually lie outside the bounding box + int x; + for(x = 0; x < len; ++x) { + // cases: + // + // there can be up to two intersections with the pixel. any intersection + // with left or right edges can be handled by splitting into two (or three) + // regions. intersections with top & bottom do not necessitate case-wise logic. + // + // the old way of doing this found the intersections with the left & right edges, + // then used some simple logic to produce up to three segments in sorted order + // from top-to-bottom. however, this had a problem: if an x edge was epsilon + // across the x border, then the corresponding y position might not be distinct + // from the other y segment, and it might ignored as an empty segment. to avoid + // that, we need to explicitly produce segments based on x positions. + + // rename variables to clearly-defined pairs + float y0 = y_top; + float x1 = (float)(x); + float x2 = (float)(x + 1); + float x3 = xb; + float y3 = y_bottom; + + // x = e->x + e->dx * (y-y_top) + // (y-y_top) = (x - e->x) / e->dx + // y = (x - e->x) / e->dx + y_top + float y1 = (x - x0) / dx + y_top; + float y2 = (x + 1 - x0) / dx + y_top; + + if(x0 < x1 && x3 > x2) { // three segments descending down-right + stbtt__handle_clipped_edge(scanline, x, e, x0, y0, x1, y1); + stbtt__handle_clipped_edge(scanline, x, e, x1, y1, x2, y2); + stbtt__handle_clipped_edge(scanline, x, e, x2, y2, x3, y3); + } + else if(x3 < x1 && x0 > x2) { // three segments descending down-left + stbtt__handle_clipped_edge(scanline, x, e, x0, y0, x2, y2); + stbtt__handle_clipped_edge(scanline, x, e, x2, y2, x1, y1); + stbtt__handle_clipped_edge(scanline, x, e, x1, y1, x3, y3); + } + else if(x0 < x1 && x3 > x1) { // two segments across x, down-right + stbtt__handle_clipped_edge(scanline, x, e, x0, y0, x1, y1); + stbtt__handle_clipped_edge(scanline, x, e, x1, y1, x3, y3); + } + else if(x3 < x1 && x0 > x1) { // two segments across x, down-left + stbtt__handle_clipped_edge(scanline, x, e, x0, y0, x1, y1); + stbtt__handle_clipped_edge(scanline, x, e, x1, y1, x3, y3); + } + else if(x0 < x2 && x3 > x2) { // two segments across x+1, down-right + stbtt__handle_clipped_edge(scanline, x, e, x0, y0, x2, y2); + stbtt__handle_clipped_edge(scanline, x, e, x2, y2, x3, y3); + } + else if(x3 < x2 && x0 > x2) { // two segments across x+1, down-left + stbtt__handle_clipped_edge(scanline, x, e, x0, y0, x2, y2); + stbtt__handle_clipped_edge(scanline, x, e, x2, y2, x3, y3); + } + else { // one segment + stbtt__handle_clipped_edge(scanline, x, e, x0, y0, x3, y3); + } + } + } + } + e = e->next; + } +} + +// directly AA rasterize edges w/o supersampling +static void stbtt__rasterize_sorted_edges(stbtt__bitmap * result, stbtt__edge * e, int n, int vsubsample, int off_x, + int off_y, void * userdata) +{ + stbtt__hheap hh = { 0, 0, 0 }; + stbtt__active_edge * active = NULL; + int y, j = 0, i; + float scanline_data[129], * scanline, * scanline2; + + STBTT__NOTUSED(vsubsample); + + if(result->w > 64) + scanline = (float *)STBTT_malloc((result->w * 2 + 1) * sizeof(float), userdata); + else + scanline = scanline_data; + + scanline2 = scanline + result->w; + + y = off_y; + e[n].y0 = (float)(off_y + result->h) + 1; + + while(j < result->h) { + // find center of pixel for this scanline + float scan_y_top = y + 0.0f; + float scan_y_bottom = y + 1.0f; + stbtt__active_edge ** step = &active; + + STBTT_memset(scanline, 0, result->w * sizeof(scanline[0])); + STBTT_memset(scanline2, 0, (result->w + 1) * sizeof(scanline[0])); + + // update all active edges; + // remove all active edges that terminate before the top of this scanline + while(*step) { + stbtt__active_edge * z = *step; + if(z->ey <= scan_y_top) { + *step = z->next; // delete from list + STBTT_assert(z->direction); + z->direction = 0; + stbtt__hheap_free(&hh, z); + } + else { + step = &((*step)->next); // advance through list + } + } + + // insert all edges that start before the bottom of this scanline + while(e->y0 <= scan_y_bottom) { + if(e->y0 != e->y1) { + stbtt__active_edge * z = stbtt__new_active(&hh, e, off_x, scan_y_top, userdata); + if(z != NULL) { + if(j == 0 && off_y != 0) { + if(z->ey < scan_y_top) { + // this can happen due to subpixel positioning and some kind of fp rounding error i think + z->ey = scan_y_top; + } + } + STBTT_assert(z->ey >= scan_y_top); // if we get really unlucky a tiny bit of an edge can be out of bounds + // insert at front + z->next = active; + active = z; + } + } + ++e; + } + + // now process all active edges + if(active) + stbtt__fill_active_edges_new(scanline, scanline2 + 1, result->w, active, scan_y_top); + + { + float sum = 0; + for(i = 0; i < result->w; ++i) { + float k; + int m; + sum += scanline2[i]; + k = scanline[i] + sum; + k = (float)STBTT_fabs(k) * 255 + 0.5f; + m = (int)k; + if(m > 255) m = 255; + result->pixels[j * result->stride + i] = (unsigned char)m; + } + } + // advance all the edges + step = &active; + while(*step) { + stbtt__active_edge * z = *step; + z->fx += z->fdx; // advance to position for current scanline + step = &((*step)->next); // advance through list + } + + ++y; + ++j; + } + + stbtt__hheap_cleanup(&hh, userdata); + + if(scanline != scanline_data) + STBTT_free(scanline, userdata); +} +#else +#error "Unrecognized value of STBTT_RASTERIZER_VERSION" +#endif + +#define STBTT__COMPARE(a,b) ((a)->y0 < (b)->y0) + +static void stbtt__sort_edges_ins_sort(stbtt__edge * p, int n) +{ + int i, j; + for(i = 1; i < n; ++i) { + stbtt__edge t = p[i], * a = &t; + j = i; + while(j > 0) { + stbtt__edge * b = &p[j - 1]; + int c = STBTT__COMPARE(a, b); + if(!c) break; + p[j] = p[j - 1]; + --j; + } + if(i != j) + p[j] = t; + } +} + +static void stbtt__sort_edges_quicksort(stbtt__edge * p, int n) +{ + /* threshold for transitioning to insertion sort */ + while(n > 12) { + stbtt__edge t; + int c01, c12, c, m, i, j; + + /* compute median of three */ + m = n >> 1; + c01 = STBTT__COMPARE(&p[0], &p[m]); + c12 = STBTT__COMPARE(&p[m], &p[n - 1]); + /* if 0 >= mid >= end, or 0 < mid < end, then use mid */ + if(c01 != c12) { + /* otherwise, we'll need to swap something else to middle */ + int z; + c = STBTT__COMPARE(&p[0], &p[n - 1]); + /* 0>mid && midn => n; 0 0 */ + /* 0n: 0>n => 0; 0 n */ + z = (c == c12) ? 0 : n - 1; + t = p[z]; + p[z] = p[m]; + p[m] = t; + } + /* now p[m] is the median-of-three */ + /* swap it to the beginning so it won't move around */ + t = p[0]; + p[0] = p[m]; + p[m] = t; + + /* partition loop */ + i = 1; + j = n - 1; + for(;;) { + /* handling of equality is crucial here */ + /* for sentinels & efficiency with duplicates */ + for(;; ++i) { + if(!STBTT__COMPARE(&p[i], &p[0])) break; + } + for(;; --j) { + if(!STBTT__COMPARE(&p[0], &p[j])) break; + } + /* make sure we haven't crossed */ + if(i >= j) break; + t = p[i]; + p[i] = p[j]; + p[j] = t; + + ++i; + --j; + } + /* recurse on smaller side, iterate on larger */ + if(j < (n - i)) { + stbtt__sort_edges_quicksort(p, j); + p = p + i; + n = n - i; + } + else { + stbtt__sort_edges_quicksort(p + i, n - i); + n = j; + } + } +} + +static void stbtt__sort_edges(stbtt__edge * p, int n) +{ + stbtt__sort_edges_quicksort(p, n); + stbtt__sort_edges_ins_sort(p, n); +} + +typedef struct { + float x, y; +} stbtt__point; + +static void stbtt__rasterize(stbtt__bitmap * result, stbtt__point * pts, int * wcount, int windings, float scale_x, + float scale_y, float shift_x, float shift_y, int off_x, int off_y, int invert, void * userdata) +{ + float y_scale_inv = invert ? -scale_y : scale_y; + stbtt__edge * e; + int n, i, j, k, m; +#if STBTT_RASTERIZER_VERSION == 1 + int vsubsample = result->h < 8 ? 15 : 5; +#elif STBTT_RASTERIZER_VERSION == 2 + int vsubsample = 1; +#else +#error "Unrecognized value of STBTT_RASTERIZER_VERSION" +#endif + // vsubsample should divide 255 evenly; otherwise we won't reach full opacity + + // now we have to blow out the windings into explicit edge lists + n = 0; + for(i = 0; i < windings; ++i) + n += wcount[i]; + + e = (stbtt__edge *)STBTT_malloc(sizeof(*e) * (n + 1), userdata); // add an extra one as a sentinel + if(e == 0) return; + n = 0; + + m = 0; + for(i = 0; i < windings; ++i) { + stbtt__point * p = pts + m; + m += wcount[i]; + j = wcount[i] - 1; + for(k = 0; k < wcount[i]; j = k++) { + int a = k, b = j; + // skip the edge if horizontal + if(p[j].y == p[k].y) + continue; + // add edge from j to k to the list + e[n].invert = 0; + if(invert ? p[j].y > p[k].y : p[j].y < p[k].y) { + e[n].invert = 1; + a = j, b = k; + } + e[n].x0 = p[a].x * scale_x + shift_x; + e[n].y0 = (p[a].y * y_scale_inv + shift_y) * vsubsample; + e[n].x1 = p[b].x * scale_x + shift_x; + e[n].y1 = (p[b].y * y_scale_inv + shift_y) * vsubsample; + ++n; + } + } + + // now sort the edges by their highest point (should snap to integer, and then by x) + //STBTT_sort(e, n, sizeof(e[0]), stbtt__edge_compare); + stbtt__sort_edges(e, n); + + // now, traverse the scanlines and find the intersections on each scanline, use xor winding rule + stbtt__rasterize_sorted_edges(result, e, n, vsubsample, off_x, off_y, userdata); + + STBTT_free(e, userdata); +} + +static void stbtt__add_point(stbtt__point * points, int n, float x, float y) +{ + if(!points) return; // during first pass, it's unallocated + points[n].x = x; + points[n].y = y; +} + +// tessellate until threshold p is happy... @TODO warped to compensate for non-linear stretching +static int stbtt__tesselate_curve(stbtt__point * points, int * num_points, float x0, float y0, float x1, float y1, + float x2, float y2, float objspace_flatness_squared, int n) +{ + // midpoint + float mx = (x0 + 2 * x1 + x2) / 4; + float my = (y0 + 2 * y1 + y2) / 4; + // versus directly drawn line + float dx = (x0 + x2) / 2 - mx; + float dy = (y0 + y2) / 2 - my; + if(n > 16) // 65536 segments on one curve better be enough! + return 1; + if(dx * dx + dy * dy > objspace_flatness_squared) { // half-pixel error allowed... need to be smaller if AA + stbtt__tesselate_curve(points, num_points, x0, y0, (x0 + x1) / 2.0f, (y0 + y1) / 2.0f, mx, my, + objspace_flatness_squared, n + 1); + stbtt__tesselate_curve(points, num_points, mx, my, (x1 + x2) / 2.0f, (y1 + y2) / 2.0f, x2, y2, + objspace_flatness_squared, n + 1); + } + else { + stbtt__add_point(points, *num_points, x2, y2); + *num_points = *num_points + 1; + } + return 1; +} + +static void stbtt__tesselate_cubic(stbtt__point * points, int * num_points, float x0, float y0, float x1, float y1, + float x2, float y2, float x3, float y3, float objspace_flatness_squared, int n) +{ + // @TODO this "flatness" calculation is just made-up nonsense that seems to work well enough + float dx0 = x1 - x0; + float dy0 = y1 - y0; + float dx1 = x2 - x1; + float dy1 = y2 - y1; + float dx2 = x3 - x2; + float dy2 = y3 - y2; + float dx = x3 - x0; + float dy = y3 - y0; + float longlen = (float)(STBTT_sqrt(dx0 * dx0 + dy0 * dy0) + STBTT_sqrt(dx1 * dx1 + dy1 * dy1) + STBTT_sqrt( + dx2 * dx2 + dy2 * dy2)); + float shortlen = (float)STBTT_sqrt(dx * dx + dy * dy); + float flatness_squared = longlen * longlen - shortlen * shortlen; + + if(n > 16) // 65536 segments on one curve better be enough! + return; + + if(flatness_squared > objspace_flatness_squared) { + float x01 = (x0 + x1) / 2; + float y01 = (y0 + y1) / 2; + float x12 = (x1 + x2) / 2; + float y12 = (y1 + y2) / 2; + float x23 = (x2 + x3) / 2; + float y23 = (y2 + y3) / 2; + + float xa = (x01 + x12) / 2; + float ya = (y01 + y12) / 2; + float xb = (x12 + x23) / 2; + float yb = (y12 + y23) / 2; + + float mx = (xa + xb) / 2; + float my = (ya + yb) / 2; + + stbtt__tesselate_cubic(points, num_points, x0, y0, x01, y01, xa, ya, mx, my, objspace_flatness_squared, n + 1); + stbtt__tesselate_cubic(points, num_points, mx, my, xb, yb, x23, y23, x3, y3, objspace_flatness_squared, n + 1); + } + else { + stbtt__add_point(points, *num_points, x3, y3); + *num_points = *num_points + 1; + } +} + +// returns number of contours +static stbtt__point * stbtt_FlattenCurves(stbtt_vertex * vertices, int num_verts, float objspace_flatness, + int ** contour_lengths, int * num_contours, void * userdata) +{ + stbtt__point * points = 0; + int num_points = 0; + + float objspace_flatness_squared = objspace_flatness * objspace_flatness; + int i, n = 0, start = 0, pass; + + // count how many "moves" there are to get the contour count + for(i = 0; i < num_verts; ++i) + if(vertices[i].type == STBTT_vmove) + ++n; + + *num_contours = n; + if(n == 0) return 0; + + *contour_lengths = (int *)STBTT_malloc(sizeof(**contour_lengths) * n, userdata); + + if(*contour_lengths == 0) { + *num_contours = 0; + return 0; + } + + // make two passes through the points so we don't need to realloc + for(pass = 0; pass < 2; ++pass) { + float x = 0, y = 0; + if(pass == 1) { + points = (stbtt__point *)STBTT_malloc(num_points * sizeof(points[0]), userdata); + if(points == NULL) goto error; + } + num_points = 0; + n = -1; + for(i = 0; i < num_verts; ++i) { + switch(vertices[i].type) { + case STBTT_vmove: + // start the next contour + if(n >= 0) + (*contour_lengths)[n] = num_points - start; + ++n; + start = num_points; + + x = vertices[i].x, y = vertices[i].y; + stbtt__add_point(points, num_points++, x, y); + break; + case STBTT_vline: + x = vertices[i].x, y = vertices[i].y; + stbtt__add_point(points, num_points++, x, y); + break; + case STBTT_vcurve: + stbtt__tesselate_curve(points, &num_points, x, y, + vertices[i].cx, vertices[i].cy, + vertices[i].x, vertices[i].y, + objspace_flatness_squared, 0); + x = vertices[i].x, y = vertices[i].y; + break; + case STBTT_vcubic: + stbtt__tesselate_cubic(points, &num_points, x, y, + vertices[i].cx, vertices[i].cy, + vertices[i].cx1, vertices[i].cy1, + vertices[i].x, vertices[i].y, + objspace_flatness_squared, 0); + x = vertices[i].x, y = vertices[i].y; + break; + } + } + (*contour_lengths)[n] = num_points - start; + } + + return points; +error: + STBTT_free(points, userdata); + STBTT_free(*contour_lengths, userdata); + *contour_lengths = 0; + *num_contours = 0; + return NULL; +} + +STBTT_DEF void stbtt_Rasterize(stbtt__bitmap * result, float flatness_in_pixels, stbtt_vertex * vertices, int num_verts, + float scale_x, float scale_y, float shift_x, float shift_y, int x_off, int y_off, int invert, void * userdata) +{ + float scale = scale_x > scale_y ? scale_y : scale_x; + int winding_count = 0; + int * winding_lengths = NULL; + stbtt__point * windings = stbtt_FlattenCurves(vertices, num_verts, flatness_in_pixels / scale, &winding_lengths, + &winding_count, userdata); + if(windings) { + stbtt__rasterize(result, windings, winding_lengths, winding_count, scale_x, scale_y, shift_x, shift_y, x_off, y_off, + invert, userdata); + STBTT_free(winding_lengths, userdata); + STBTT_free(windings, userdata); + } +} + +STBTT_DEF void stbtt_FreeBitmap(unsigned char * bitmap, void * userdata) +{ + STBTT_free(bitmap, userdata); +} + +STBTT_DEF unsigned char * stbtt_GetGlyphBitmapSubpixel(const stbtt_fontinfo * info, float scale_x, float scale_y, + float shift_x, float shift_y, int glyph, int * width, int * height, int * xoff, int * yoff) +{ + int ix0, iy0, ix1, iy1; + stbtt__bitmap gbm; + stbtt_vertex * vertices; + int num_verts = stbtt_GetGlyphShape(info, glyph, &vertices); + + if(scale_x == 0) scale_x = scale_y; + if(scale_y == 0) { + if(scale_x == 0) { + STBTT_free(vertices, info->userdata); + return NULL; + } + scale_y = scale_x; + } + + stbtt_GetGlyphBitmapBoxSubpixel(info, glyph, scale_x, scale_y, shift_x, shift_y, &ix0, &iy0, &ix1, &iy1); + + // now we get the size + gbm.w = (ix1 - ix0); + gbm.h = (iy1 - iy0); + gbm.pixels = NULL; // in case we error + + if(width) *width = gbm.w; + if(height) *height = gbm.h; + if(xoff) *xoff = ix0; + if(yoff) *yoff = iy0; + + if(gbm.w && gbm.h) { + gbm.pixels = (unsigned char *)STBTT_malloc(gbm.w * gbm.h, info->userdata); + if(gbm.pixels) { + gbm.stride = gbm.w; + + stbtt_Rasterize(&gbm, 0.35f, vertices, num_verts, scale_x, scale_y, shift_x, shift_y, ix0, iy0, 1, info->userdata); + } + } + STBTT_free(vertices, info->userdata); + return gbm.pixels; +} + +STBTT_DEF unsigned char * stbtt_GetGlyphBitmap(const stbtt_fontinfo * info, float scale_x, float scale_y, int glyph, + int * width, int * height, int * xoff, int * yoff) +{ + return stbtt_GetGlyphBitmapSubpixel(info, scale_x, scale_y, 0.0f, 0.0f, glyph, width, height, xoff, yoff); +} + +STBTT_DEF void stbtt_MakeGlyphBitmapSubpixel(const stbtt_fontinfo * info, unsigned char * output, int out_w, int out_h, + int out_stride, float scale_x, float scale_y, float shift_x, float shift_y, int glyph) +{ + int ix0, iy0; + stbtt_vertex * vertices; + int num_verts = stbtt_GetGlyphShape(info, glyph, &vertices); + stbtt__bitmap gbm; + + stbtt_GetGlyphBitmapBoxSubpixel(info, glyph, scale_x, scale_y, shift_x, shift_y, &ix0, &iy0, 0, 0); + gbm.pixels = output; + gbm.w = out_w; + gbm.h = out_h; + gbm.stride = out_stride; + + if(gbm.w && gbm.h) + stbtt_Rasterize(&gbm, 0.35f, vertices, num_verts, scale_x, scale_y, shift_x, shift_y, ix0, iy0, 1, info->userdata); + + STBTT_free(vertices, info->userdata); +} + +STBTT_DEF void stbtt_MakeGlyphBitmap(const stbtt_fontinfo * info, unsigned char * output, int out_w, int out_h, + int out_stride, float scale_x, float scale_y, int glyph) +{ + stbtt_MakeGlyphBitmapSubpixel(info, output, out_w, out_h, out_stride, scale_x, scale_y, 0.0f, 0.0f, glyph); +} + +STBTT_DEF unsigned char * stbtt_GetCodepointBitmapSubpixel(const stbtt_fontinfo * info, float scale_x, float scale_y, + float shift_x, float shift_y, int codepoint, int * width, int * height, int * xoff, int * yoff) +{ + return stbtt_GetGlyphBitmapSubpixel(info, scale_x, scale_y, shift_x, shift_y, stbtt_FindGlyphIndex(info, codepoint), + width, height, xoff, yoff); +} + +STBTT_DEF void stbtt_MakeCodepointBitmapSubpixelPrefilter(const stbtt_fontinfo * info, unsigned char * output, + int out_w, int out_h, int out_stride, float scale_x, float scale_y, float shift_x, float shift_y, int oversample_x, + int oversample_y, float * sub_x, float * sub_y, int codepoint) +{ + stbtt_MakeGlyphBitmapSubpixelPrefilter(info, output, out_w, out_h, out_stride, scale_x, scale_y, shift_x, shift_y, + oversample_x, oversample_y, sub_x, sub_y, stbtt_FindGlyphIndex(info, codepoint)); +} + +STBTT_DEF void stbtt_MakeCodepointBitmapSubpixel(const stbtt_fontinfo * info, unsigned char * output, int out_w, + int out_h, int out_stride, float scale_x, float scale_y, float shift_x, float shift_y, int codepoint) +{ + stbtt_MakeGlyphBitmapSubpixel(info, output, out_w, out_h, out_stride, scale_x, scale_y, shift_x, shift_y, + stbtt_FindGlyphIndex(info, codepoint)); +} + +STBTT_DEF unsigned char * stbtt_GetCodepointBitmap(const stbtt_fontinfo * info, float scale_x, float scale_y, + int codepoint, int * width, int * height, int * xoff, int * yoff) +{ + return stbtt_GetCodepointBitmapSubpixel(info, scale_x, scale_y, 0.0f, 0.0f, codepoint, width, height, xoff, yoff); +} + +STBTT_DEF void stbtt_MakeCodepointBitmap(const stbtt_fontinfo * info, unsigned char * output, int out_w, int out_h, + int out_stride, float scale_x, float scale_y, int codepoint) +{ + stbtt_MakeCodepointBitmapSubpixel(info, output, out_w, out_h, out_stride, scale_x, scale_y, 0.0f, 0.0f, codepoint); +} + +////////////////////////////////////////////////////////////////////////////// +// +// bitmap baking +// +// This is SUPER-CRAPPY packing to keep source code small +#ifdef STBTT_STREAM_TYPE +static int stbtt_BakeFontBitmap_internal(STBTT_STREAM_TYPE data, + int offset, // font location (use offset=0 for plain .ttf) + float pixel_height, // height of font in pixels + unsigned char * pixels, int pw, int ph, // bitmap to be filled in + int first_char, int num_chars, // characters to bake + stbtt_bakedchar * chardata) +#else +static int stbtt_BakeFontBitmap_internal(unsigned char * data, + int offset, // font location (use offset=0 for plain .ttf) + float pixel_height, // height of font in pixels + unsigned char * pixels, int pw, int ph, // bitmap to be filled in + int first_char, int num_chars, // characters to bake + stbtt_bakedchar * chardata) +#endif +{ + float scale; + int x, y, bottom_y, i; + stbtt_fontinfo f; + f.userdata = NULL; + if(!stbtt_InitFont(&f, data, offset)) + return -1; + STBTT_memset(pixels, 0, pw * ph); // background of 0 around pixels + x = y = 1; + bottom_y = 1; + + scale = stbtt_ScaleForPixelHeight(&f, pixel_height); + + for(i = 0; i < num_chars; ++i) { + int advance, lsb, x0, y0, x1, y1, gw, gh; + int g = stbtt_FindGlyphIndex(&f, first_char + i); + stbtt_GetGlyphHMetrics(&f, g, &advance, &lsb); + stbtt_GetGlyphBitmapBox(&f, g, scale, scale, &x0, &y0, &x1, &y1); + gw = x1 - x0; + gh = y1 - y0; + if(x + gw + 1 >= pw) + y = bottom_y, x = 1; // advance to next row + if(y + gh + 1 >= ph) // check if it fits vertically AFTER potentially moving to next row + return -i; + STBTT_assert(x + gw < pw); + STBTT_assert(y + gh < ph); + stbtt_MakeGlyphBitmap(&f, pixels + x + y * pw, gw, gh, pw, scale, scale, g); + chardata[i].x0 = (stbtt_int16)x; + chardata[i].y0 = (stbtt_int16)y; + chardata[i].x1 = (stbtt_int16)(x + gw); + chardata[i].y1 = (stbtt_int16)(y + gh); + chardata[i].xadvance = scale * advance; + chardata[i].xoff = (float)x0; + chardata[i].yoff = (float)y0; + x = x + gw + 1; + if(y + gh + 1 > bottom_y) + bottom_y = y + gh + 1; + } + return bottom_y; +} + +STBTT_DEF void stbtt_GetBakedQuad(const stbtt_bakedchar * chardata, int pw, int ph, int char_index, float * xpos, + float * ypos, stbtt_aligned_quad * q, int opengl_fillrule) +{ + float d3d_bias = opengl_fillrule ? 0 : -0.5f; + float ipw = 1.0f / pw, iph = 1.0f / ph; + const stbtt_bakedchar * b = chardata + char_index; + int round_x = STBTT_ifloor((*xpos + b->xoff) + 0.5f); + int round_y = STBTT_ifloor((*ypos + b->yoff) + 0.5f); + + q->x0 = round_x + d3d_bias; + q->y0 = round_y + d3d_bias; + q->x1 = round_x + b->x1 - b->x0 + d3d_bias; + q->y1 = round_y + b->y1 - b->y0 + d3d_bias; + + q->s0 = b->x0 * ipw; + q->t0 = b->y0 * iph; + q->s1 = b->x1 * ipw; + q->t1 = b->y1 * iph; + + *xpos += b->xadvance; +} + +////////////////////////////////////////////////////////////////////////////// +// +// rectangle packing replacement routines if you don't have stb_rect_pack.h +// + +#ifndef STB_RECT_PACK_VERSION + +typedef int stbrp_coord; + +//////////////////////////////////////////////////////////////////////////////////// +// // +// // +// COMPILER WARNING ?!?!? // +// // +// // +// if you get a compile warning due to these symbols being defined more than // +// once, move #include "stb_rect_pack.h" before #include "stb_truetype.h" // +// // +//////////////////////////////////////////////////////////////////////////////////// + +typedef struct { + int width, height; + int x, y, bottom_y; +} stbrp_context; + +typedef struct { + unsigned char x; +} stbrp_node; + +struct stbrp_rect { + stbrp_coord x, y; + int id, w, h, was_packed; +}; + +static void stbrp_init_target(stbrp_context * con, int pw, int ph, stbrp_node * nodes, int num_nodes) +{ + con->width = pw; + con->height = ph; + con->x = 0; + con->y = 0; + con->bottom_y = 0; + STBTT__NOTUSED(nodes); + STBTT__NOTUSED(num_nodes); +} + +static void stbrp_pack_rects(stbrp_context * con, stbrp_rect * rects, int num_rects) +{ + int i; + for(i = 0; i < num_rects; ++i) { + if(con->x + rects[i].w > con->width) { + con->x = 0; + con->y = con->bottom_y; + } + if(con->y + rects[i].h > con->height) + break; + rects[i].x = con->x; + rects[i].y = con->y; + rects[i].was_packed = 1; + con->x += rects[i].w; + if(con->y + rects[i].h > con->bottom_y) + con->bottom_y = con->y + rects[i].h; + } + for(; i < num_rects; ++i) + rects[i].was_packed = 0; +} +#endif + +////////////////////////////////////////////////////////////////////////////// +// +// bitmap baking +// +// This is SUPER-AWESOME (tm Ryan Gordon) packing using stb_rect_pack.h. If +// stb_rect_pack.h isn't available, it uses the BakeFontBitmap strategy. + +STBTT_DEF int stbtt_PackBegin(stbtt_pack_context * spc, unsigned char * pixels, int pw, int ph, int stride_in_bytes, + int padding, void * alloc_context) +{ + stbrp_context * context = (stbrp_context *)STBTT_malloc(sizeof(*context), alloc_context); + int num_nodes = pw - padding; + stbrp_node * nodes = (stbrp_node *)STBTT_malloc(sizeof(*nodes) * num_nodes, alloc_context); + + if(context == NULL || nodes == NULL) { + if(context != NULL) STBTT_free(context, alloc_context); + if(nodes != NULL) STBTT_free(nodes, alloc_context); + return 0; + } + + spc->user_allocator_context = alloc_context; + spc->width = pw; + spc->height = ph; + spc->pixels = pixels; + spc->pack_info = context; + spc->nodes = nodes; + spc->padding = padding; + spc->stride_in_bytes = stride_in_bytes != 0 ? stride_in_bytes : pw; + spc->h_oversample = 1; + spc->v_oversample = 1; + spc->skip_missing = 0; + + stbrp_init_target(context, pw - padding, ph - padding, nodes, num_nodes); + + if(pixels) + STBTT_memset(pixels, 0, pw * ph); // background of 0 around pixels + + return 1; +} + +STBTT_DEF void stbtt_PackEnd(stbtt_pack_context * spc) +{ + STBTT_free(spc->nodes, spc->user_allocator_context); + STBTT_free(spc->pack_info, spc->user_allocator_context); +} + +STBTT_DEF void stbtt_PackSetOversampling(stbtt_pack_context * spc, unsigned int h_oversample, unsigned int v_oversample) +{ + STBTT_assert(h_oversample <= STBTT_MAX_OVERSAMPLE); + STBTT_assert(v_oversample <= STBTT_MAX_OVERSAMPLE); + if(h_oversample <= STBTT_MAX_OVERSAMPLE) + spc->h_oversample = h_oversample; + if(v_oversample <= STBTT_MAX_OVERSAMPLE) + spc->v_oversample = v_oversample; +} + +STBTT_DEF void stbtt_PackSetSkipMissingCodepoints(stbtt_pack_context * spc, int skip) +{ + spc->skip_missing = skip; +} + +#define STBTT__OVER_MASK (STBTT_MAX_OVERSAMPLE-1) + +static void stbtt__h_prefilter(unsigned char * pixels, int w, int h, int stride_in_bytes, unsigned int kernel_width) +{ + unsigned char buffer[STBTT_MAX_OVERSAMPLE]; + int safe_w = w - kernel_width; + int j; + STBTT_memset(buffer, 0, STBTT_MAX_OVERSAMPLE); // suppress bogus warning from VS2013 -analyze + for(j = 0; j < h; ++j) { + int i; + unsigned int total; + STBTT_memset(buffer, 0, kernel_width); + + total = 0; + + // make kernel_width a constant in common cases so compiler can optimize out the divide + switch(kernel_width) { + case 2: + for(i = 0; i <= safe_w; ++i) { + total += pixels[i] - buffer[i & STBTT__OVER_MASK]; + buffer[(i + kernel_width) & STBTT__OVER_MASK] = pixels[i]; + pixels[i] = (unsigned char)(total / 2); + } + break; + case 3: + for(i = 0; i <= safe_w; ++i) { + total += pixels[i] - buffer[i & STBTT__OVER_MASK]; + buffer[(i + kernel_width) & STBTT__OVER_MASK] = pixels[i]; + pixels[i] = (unsigned char)(total / 3); + } + break; + case 4: + for(i = 0; i <= safe_w; ++i) { + total += pixels[i] - buffer[i & STBTT__OVER_MASK]; + buffer[(i + kernel_width) & STBTT__OVER_MASK] = pixels[i]; + pixels[i] = (unsigned char)(total / 4); + } + break; + case 5: + for(i = 0; i <= safe_w; ++i) { + total += pixels[i] - buffer[i & STBTT__OVER_MASK]; + buffer[(i + kernel_width) & STBTT__OVER_MASK] = pixels[i]; + pixels[i] = (unsigned char)(total / 5); + } + break; + default: + for(i = 0; i <= safe_w; ++i) { + total += pixels[i] - buffer[i & STBTT__OVER_MASK]; + buffer[(i + kernel_width) & STBTT__OVER_MASK] = pixels[i]; + pixels[i] = (unsigned char)(total / kernel_width); + } + break; + } + + for(; i < w; ++i) { + STBTT_assert(pixels[i] == 0); + total -= buffer[i & STBTT__OVER_MASK]; + pixels[i] = (unsigned char)(total / kernel_width); + } + + pixels += stride_in_bytes; + } +} + +static void stbtt__v_prefilter(unsigned char * pixels, int w, int h, int stride_in_bytes, unsigned int kernel_width) +{ + unsigned char buffer[STBTT_MAX_OVERSAMPLE]; + int safe_h = h - kernel_width; + int j; + STBTT_memset(buffer, 0, STBTT_MAX_OVERSAMPLE); // suppress bogus warning from VS2013 -analyze + for(j = 0; j < w; ++j) { + int i; + unsigned int total; + STBTT_memset(buffer, 0, kernel_width); + + total = 0; + + // make kernel_width a constant in common cases so compiler can optimize out the divide + switch(kernel_width) { + case 2: + for(i = 0; i <= safe_h; ++i) { + total += pixels[i * stride_in_bytes] - buffer[i & STBTT__OVER_MASK]; + buffer[(i + kernel_width) & STBTT__OVER_MASK] = pixels[i * stride_in_bytes]; + pixels[i * stride_in_bytes] = (unsigned char)(total / 2); + } + break; + case 3: + for(i = 0; i <= safe_h; ++i) { + total += pixels[i * stride_in_bytes] - buffer[i & STBTT__OVER_MASK]; + buffer[(i + kernel_width) & STBTT__OVER_MASK] = pixels[i * stride_in_bytes]; + pixels[i * stride_in_bytes] = (unsigned char)(total / 3); + } + break; + case 4: + for(i = 0; i <= safe_h; ++i) { + total += pixels[i * stride_in_bytes] - buffer[i & STBTT__OVER_MASK]; + buffer[(i + kernel_width) & STBTT__OVER_MASK] = pixels[i * stride_in_bytes]; + pixels[i * stride_in_bytes] = (unsigned char)(total / 4); + } + break; + case 5: + for(i = 0; i <= safe_h; ++i) { + total += pixels[i * stride_in_bytes] - buffer[i & STBTT__OVER_MASK]; + buffer[(i + kernel_width) & STBTT__OVER_MASK] = pixels[i * stride_in_bytes]; + pixels[i * stride_in_bytes] = (unsigned char)(total / 5); + } + break; + default: + for(i = 0; i <= safe_h; ++i) { + total += pixels[i * stride_in_bytes] - buffer[i & STBTT__OVER_MASK]; + buffer[(i + kernel_width) & STBTT__OVER_MASK] = pixels[i * stride_in_bytes]; + pixels[i * stride_in_bytes] = (unsigned char)(total / kernel_width); + } + break; + } + + for(; i < h; ++i) { + STBTT_assert(pixels[i * stride_in_bytes] == 0); + total -= buffer[i & STBTT__OVER_MASK]; + pixels[i * stride_in_bytes] = (unsigned char)(total / kernel_width); + } + + pixels += 1; + } +} + +static float stbtt__oversample_shift(int oversample) +{ + if(!oversample) + return 0.0f; + + // The prefilter is a box filter of width "oversample", + // which shifts phase by (oversample - 1)/2 pixels in + // oversampled space. We want to shift in the opposite + // direction to counter this. + return (float) - (oversample - 1) / (2.0f * (float)oversample); +} + +// rects array must be big enough to accommodate all characters in the given ranges +STBTT_DEF int stbtt_PackFontRangesGatherRects(stbtt_pack_context * spc, const stbtt_fontinfo * info, + stbtt_pack_range * ranges, int num_ranges, stbrp_rect * rects) +{ + int i, j, k; + int missing_glyph_added = 0; + + k = 0; + for(i = 0; i < num_ranges; ++i) { + float fh = ranges[i].font_size; + float scale = fh > 0 ? stbtt_ScaleForPixelHeight(info, fh) : stbtt_ScaleForMappingEmToPixels(info, -fh); + ranges[i].h_oversample = (unsigned char)spc->h_oversample; + ranges[i].v_oversample = (unsigned char)spc->v_oversample; + for(j = 0; j < ranges[i].num_chars; ++j) { + int x0, y0, x1, y1; + int codepoint = ranges[i].array_of_unicode_codepoints == NULL ? ranges[i].first_unicode_codepoint_in_range + j : + ranges[i].array_of_unicode_codepoints[j]; + int glyph = stbtt_FindGlyphIndex(info, codepoint); + if(glyph == 0 && (spc->skip_missing || missing_glyph_added)) { + rects[k].w = rects[k].h = 0; + } + else { + stbtt_GetGlyphBitmapBoxSubpixel(info, glyph, + scale * spc->h_oversample, + scale * spc->v_oversample, + 0, 0, + &x0, &y0, &x1, &y1); + rects[k].w = (stbrp_coord)(x1 - x0 + spc->padding + spc->h_oversample - 1); + rects[k].h = (stbrp_coord)(y1 - y0 + spc->padding + spc->v_oversample - 1); + if(glyph == 0) + missing_glyph_added = 1; + } + ++k; + } + } + + return k; +} + +STBTT_DEF void stbtt_MakeGlyphBitmapSubpixelPrefilter(const stbtt_fontinfo * info, unsigned char * output, int out_w, + int out_h, int out_stride, float scale_x, float scale_y, float shift_x, float shift_y, int prefilter_x, int prefilter_y, + float * sub_x, float * sub_y, int glyph) +{ + stbtt_MakeGlyphBitmapSubpixel(info, + output, + out_w - (prefilter_x - 1), + out_h - (prefilter_y - 1), + out_stride, + scale_x, + scale_y, + shift_x, + shift_y, + glyph); + + if(prefilter_x > 1) + stbtt__h_prefilter(output, out_w, out_h, out_stride, prefilter_x); + + if(prefilter_y > 1) + stbtt__v_prefilter(output, out_w, out_h, out_stride, prefilter_y); + + *sub_x = stbtt__oversample_shift(prefilter_x); + *sub_y = stbtt__oversample_shift(prefilter_y); +} + +// rects array must be big enough to accommodate all characters in the given ranges +STBTT_DEF int stbtt_PackFontRangesRenderIntoRects(stbtt_pack_context * spc, const stbtt_fontinfo * info, + stbtt_pack_range * ranges, int num_ranges, stbrp_rect * rects) +{ + int i, j, k, missing_glyph = -1, return_value = 1; + + // save current values + int old_h_over = spc->h_oversample; + int old_v_over = spc->v_oversample; + + k = 0; + for(i = 0; i < num_ranges; ++i) { + float fh = ranges[i].font_size; + float scale = fh > 0 ? stbtt_ScaleForPixelHeight(info, fh) : stbtt_ScaleForMappingEmToPixels(info, -fh); + float recip_h, recip_v, sub_x, sub_y; + spc->h_oversample = ranges[i].h_oversample; + spc->v_oversample = ranges[i].v_oversample; + recip_h = 1.0f / spc->h_oversample; + recip_v = 1.0f / spc->v_oversample; + sub_x = stbtt__oversample_shift(spc->h_oversample); + sub_y = stbtt__oversample_shift(spc->v_oversample); + for(j = 0; j < ranges[i].num_chars; ++j) { + stbrp_rect * r = &rects[k]; + if(r->was_packed && r->w != 0 && r->h != 0) { + stbtt_packedchar * bc = &ranges[i].chardata_for_range[j]; + int advance, lsb, x0, y0, x1, y1; + int codepoint = ranges[i].array_of_unicode_codepoints == NULL ? ranges[i].first_unicode_codepoint_in_range + j : + ranges[i].array_of_unicode_codepoints[j]; + int glyph = stbtt_FindGlyphIndex(info, codepoint); + stbrp_coord pad = (stbrp_coord)spc->padding; + + // pad on left and top + r->x += pad; + r->y += pad; + r->w -= pad; + r->h -= pad; + stbtt_GetGlyphHMetrics(info, glyph, &advance, &lsb); + stbtt_GetGlyphBitmapBox(info, glyph, + scale * spc->h_oversample, + scale * spc->v_oversample, + &x0, &y0, &x1, &y1); + stbtt_MakeGlyphBitmapSubpixel(info, + spc->pixels + r->x + r->y * spc->stride_in_bytes, + r->w - spc->h_oversample + 1, + r->h - spc->v_oversample + 1, + spc->stride_in_bytes, + scale * spc->h_oversample, + scale * spc->v_oversample, + 0, 0, + glyph); + + if(spc->h_oversample > 1) + stbtt__h_prefilter(spc->pixels + r->x + r->y * spc->stride_in_bytes, + r->w, r->h, spc->stride_in_bytes, + spc->h_oversample); + + if(spc->v_oversample > 1) + stbtt__v_prefilter(spc->pixels + r->x + r->y * spc->stride_in_bytes, + r->w, r->h, spc->stride_in_bytes, + spc->v_oversample); + + bc->x0 = (stbtt_int16)r->x; + bc->y0 = (stbtt_int16)r->y; + bc->x1 = (stbtt_int16)(r->x + r->w); + bc->y1 = (stbtt_int16)(r->y + r->h); + bc->xadvance = scale * advance; + bc->xoff = (float)x0 * recip_h + sub_x; + bc->yoff = (float)y0 * recip_v + sub_y; + bc->xoff2 = (x0 + r->w) * recip_h + sub_x; + bc->yoff2 = (y0 + r->h) * recip_v + sub_y; + + if(glyph == 0) + missing_glyph = j; + } + else if(spc->skip_missing) { + return_value = 0; + } + else if(r->was_packed && r->w == 0 && r->h == 0 && missing_glyph >= 0) { + ranges[i].chardata_for_range[j] = ranges[i].chardata_for_range[missing_glyph]; + } + else { + return_value = 0; // if any fail, report failure + } + + ++k; + } + } + + // restore original values + spc->h_oversample = old_h_over; + spc->v_oversample = old_v_over; + + return return_value; +} + +#ifdef STBTT_STREAM_TYPE +STBTT_DEF int stbtt_PackFontRanges(stbtt_pack_context * spc, STBTT_STREAM_TYPE fontdata, int font_index, + stbtt_pack_range * ranges, int num_ranges); +#else +STBTT_DEF int stbtt_PackFontRanges(stbtt_pack_context * spc, const unsigned char * fontdata, int font_index, + stbtt_pack_range * ranges, int num_ranges); +#endif + +STBTT_DEF void stbtt_PackFontRangesPackRects(stbtt_pack_context * spc, stbrp_rect * rects, int num_rects) +{ + stbrp_pack_rects((stbrp_context *)spc->pack_info, rects, num_rects); +} +#ifdef STBTT_STREAM_TYPE +STBTT_DEF int stbtt_PackFontRanges(stbtt_pack_context * spc, STBTT_STREAM_TYPE fontdata, int font_index, + stbtt_pack_range * ranges, int num_ranges) +#else +STBTT_DEF int stbtt_PackFontRanges(stbtt_pack_context * spc, const unsigned char * fontdata, int font_index, + stbtt_pack_range * ranges, int num_ranges) +#endif +{ + stbtt_fontinfo info; + int i, j, n, return_value = 1; + //stbrp_context *context = (stbrp_context *) spc->pack_info; + stbrp_rect * rects; + + // flag all characters as NOT packed + for(i = 0; i < num_ranges; ++i) + for(j = 0; j < ranges[i].num_chars; ++j) + ranges[i].chardata_for_range[j].x0 = + ranges[i].chardata_for_range[j].y0 = + ranges[i].chardata_for_range[j].x1 = + ranges[i].chardata_for_range[j].y1 = 0; + + n = 0; + for(i = 0; i < num_ranges; ++i) + n += ranges[i].num_chars; + + rects = (stbrp_rect *)STBTT_malloc(sizeof(*rects) * n, spc->user_allocator_context); + if(rects == NULL) + return 0; + + info.userdata = spc->user_allocator_context; + stbtt_InitFont(&info, fontdata, stbtt_GetFontOffsetForIndex(fontdata, font_index)); + + n = stbtt_PackFontRangesGatherRects(spc, &info, ranges, num_ranges, rects); + + stbtt_PackFontRangesPackRects(spc, rects, n); + + return_value = stbtt_PackFontRangesRenderIntoRects(spc, &info, ranges, num_ranges, rects); + + STBTT_free(rects, spc->user_allocator_context); + return return_value; +} + +#ifdef STBTT_STREAM_TYPE +STBTT_DEF int stbtt_PackFontRange(stbtt_pack_context * spc, STBTT_STREAM_TYPE fontdata, int font_index, float font_size, + int first_unicode_codepoint_in_range, int num_chars_in_range, stbtt_packedchar * chardata_for_range); +#else +STBTT_DEF int stbtt_PackFontRange(stbtt_pack_context * spc, const unsigned char * fontdata, int font_index, + float font_size, + int first_unicode_codepoint_in_range, int num_chars_in_range, stbtt_packedchar * chardata_for_range); +#endif + +#ifdef STBTT_STREAM_TYPE +STBTT_DEF int stbtt_PackFontRange(stbtt_pack_context * spc, STBTT_STREAM_TYPE fontdata, int font_index, float font_size, + int first_unicode_codepoint_in_range, int num_chars_in_range, stbtt_packedchar * chardata_for_range) +#else +STBTT_DEF int stbtt_PackFontRange(stbtt_pack_context * spc, const unsigned char * fontdata, int font_index, + float font_size, + int first_unicode_codepoint_in_range, int num_chars_in_range, stbtt_packedchar * chardata_for_range) +#endif +{ + stbtt_pack_range range; + range.first_unicode_codepoint_in_range = first_unicode_codepoint_in_range; + range.array_of_unicode_codepoints = NULL; + range.num_chars = num_chars_in_range; + range.chardata_for_range = chardata_for_range; + range.font_size = font_size; + return stbtt_PackFontRanges(spc, fontdata, font_index, &range, 1); +} + +#ifdef STBTT_STREAM_TYPE +STBTT_DEF void stbtt_GetScaledFontVMetrics(STBTT_STREAM_TYPE fontdata, int index, float size, float * ascent, + float * descent, float * lineGap); +#else +STBTT_DEF void stbtt_GetScaledFontVMetrics(const unsigned char * fontdata, int index, float size, float * ascent, + float * descent, float * lineGap); +#endif + +#ifdef STBTT_STREAM_TYPE +STBTT_DEF void stbtt_GetScaledFontVMetrics(STBTT_STREAM_TYPE fontdata, int index, float size, float * ascent, + float * descent, float * lineGap) +#else +STBTT_DEF void stbtt_GetScaledFontVMetrics(const unsigned char * fontdata, int index, float size, float * ascent, + float * descent, float * lineGap) +#endif +{ + int i_ascent, i_descent, i_lineGap; + float scale; + stbtt_fontinfo info; + stbtt_InitFont(&info, fontdata, stbtt_GetFontOffsetForIndex(fontdata, index)); + scale = size > 0 ? stbtt_ScaleForPixelHeight(&info, size) : stbtt_ScaleForMappingEmToPixels(&info, -size); + stbtt_GetFontVMetrics(&info, &i_ascent, &i_descent, &i_lineGap); + *ascent = (float)i_ascent * scale; + *descent = (float)i_descent * scale; + *lineGap = (float)i_lineGap * scale; +} + +STBTT_DEF void stbtt_GetPackedQuad(const stbtt_packedchar * chardata, int pw, int ph, int char_index, float * xpos, + float * ypos, stbtt_aligned_quad * q, int align_to_integer) +{ + float ipw = 1.0f / pw, iph = 1.0f / ph; + const stbtt_packedchar * b = chardata + char_index; + + if(align_to_integer) { + float x = (float)STBTT_ifloor((*xpos + b->xoff) + 0.5f); + float y = (float)STBTT_ifloor((*ypos + b->yoff) + 0.5f); + q->x0 = x; + q->y0 = y; + q->x1 = x + b->xoff2 - b->xoff; + q->y1 = y + b->yoff2 - b->yoff; + } + else { + q->x0 = *xpos + b->xoff; + q->y0 = *ypos + b->yoff; + q->x1 = *xpos + b->xoff2; + q->y1 = *ypos + b->yoff2; + } + + q->s0 = b->x0 * ipw; + q->t0 = b->y0 * iph; + q->s1 = b->x1 * ipw; + q->t1 = b->y1 * iph; + + *xpos += b->xadvance; +} + +////////////////////////////////////////////////////////////////////////////// +// +// sdf computation +// + +#define STBTT_min(a,b) ((a) < (b) ? (a) : (b)) +#define STBTT_max(a,b) ((a) < (b) ? (b) : (a)) + +static int stbtt__ray_intersect_bezier(float orig[2], float ray[2], float q0[2], float q1[2], float q2[2], + float hits[2][2]) +{ + float q0perp = q0[1] * ray[0] - q0[0] * ray[1]; + float q1perp = q1[1] * ray[0] - q1[0] * ray[1]; + float q2perp = q2[1] * ray[0] - q2[0] * ray[1]; + float roperp = orig[1] * ray[0] - orig[0] * ray[1]; + + float a = q0perp - 2 * q1perp + q2perp; + float b = q1perp - q0perp; + float c = q0perp - roperp; + + float s0 = 0., s1 = 0.; + int num_s = 0; + + if(a != 0.0f) { + float discr = b * b - a * c; + if(discr > 0.0f) { + float rcpna = -1 / a; + float d = (float)STBTT_sqrt(discr); + s0 = (b + d) * rcpna; + s1 = (b - d) * rcpna; + if(s0 >= 0.0f && s0 <= 1.0f) + num_s = 1; + if(d > 0.0f && s1 >= 0.0f && s1 <= 1.0f) { + if(num_s == 0) s0 = s1; + ++num_s; + } + } + } + else { + // 2*b*s + c = 0 + // s = -c / (2*b) + s0 = c / (-2 * b); + if(s0 >= 0.0f && s0 <= 1.0f) + num_s = 1; + } + + if(num_s == 0) + return 0; + else { + float rcp_len2 = 1 / (ray[0] * ray[0] + ray[1] * ray[1]); + float rayn_x = ray[0] * rcp_len2, rayn_y = ray[1] * rcp_len2; + + float q0d = q0[0] * rayn_x + q0[1] * rayn_y; + float q1d = q1[0] * rayn_x + q1[1] * rayn_y; + float q2d = q2[0] * rayn_x + q2[1] * rayn_y; + float rod = orig[0] * rayn_x + orig[1] * rayn_y; + + float q10d = q1d - q0d; + float q20d = q2d - q0d; + float q0rd = q0d - rod; + + hits[0][0] = q0rd + s0 * (2.0f - 2.0f * s0) * q10d + s0 * s0 * q20d; + hits[0][1] = a * s0 + b; + + if(num_s > 1) { + hits[1][0] = q0rd + s1 * (2.0f - 2.0f * s1) * q10d + s1 * s1 * q20d; + hits[1][1] = a * s1 + b; + return 2; + } + else { + return 1; + } + } +} + +static int equal(float * a, float * b) +{ + return (a[0] == b[0] && a[1] == b[1]); +} + +static int stbtt__compute_crossings_x(float x, float y, int nverts, stbtt_vertex * verts) +{ + int i; + float orig[2], ray[2] = { 1, 0 }; + float y_frac; + int winding = 0; + + // make sure y never passes through a vertex of the shape + y_frac = (float)STBTT_fmod(y, 1.0f); + if(y_frac < 0.01f) + y += 0.01f; + else if(y_frac > 0.99f) + y -= 0.01f; + + orig[0] = x; + orig[1] = y; + + // test a ray from (-infinity,y) to (x,y) + for(i = 0; i < nverts; ++i) { + if(verts[i].type == STBTT_vline) { + int x0 = (int)verts[i - 1].x, y0 = (int)verts[i - 1].y; + int x1 = (int)verts[i].x, y1 = (int)verts[i].y; + if(y > STBTT_min(y0, y1) && y < STBTT_max(y0, y1) && x > STBTT_min(x0, x1)) { + float x_inter = (y - y0) / (y1 - y0) * (x1 - x0) + x0; + if(x_inter < x) + winding += (y0 < y1) ? 1 : -1; + } + } + if(verts[i].type == STBTT_vcurve) { + int x0 = (int)verts[i - 1].x, y0 = (int)verts[i - 1].y; + int x1 = (int)verts[i].cx, y1 = (int)verts[i].cy; + int x2 = (int)verts[i].x, y2 = (int)verts[i].y; + int ax = STBTT_min(x0, STBTT_min(x1, x2)), ay = STBTT_min(y0, STBTT_min(y1, y2)); + int by = STBTT_max(y0, STBTT_max(y1, y2)); + if(y > ay && y < by && x > ax) { + float q0[2], q1[2], q2[2]; + float hits[2][2]; + q0[0] = (float)x0; + q0[1] = (float)y0; + q1[0] = (float)x1; + q1[1] = (float)y1; + q2[0] = (float)x2; + q2[1] = (float)y2; + if(equal(q0, q1) || equal(q1, q2)) { + x0 = (int)verts[i - 1].x; + y0 = (int)verts[i - 1].y; + x1 = (int)verts[i].x; + y1 = (int)verts[i].y; + if(y > STBTT_min(y0, y1) && y < STBTT_max(y0, y1) && x > STBTT_min(x0, x1)) { + float x_inter = (y - y0) / (y1 - y0) * (x1 - x0) + x0; + if(x_inter < x) + winding += (y0 < y1) ? 1 : -1; + } + } + else { + int num_hits = stbtt__ray_intersect_bezier(orig, ray, q0, q1, q2, hits); + if(num_hits >= 1) + if(hits[0][0] < 0) + winding += (hits[0][1] < 0 ? -1 : 1); + if(num_hits >= 2) + if(hits[1][0] < 0) + winding += (hits[1][1] < 0 ? -1 : 1); + } + } + } + } + return winding; +} + +static float stbtt__cuberoot(float x) +{ + if(x < 0) + return -(float)STBTT_pow(-x, 1.0f / 3.0f); + else + return (float)STBTT_pow(x, 1.0f / 3.0f); +} + +// x^3 + a*x^2 + b*x + c = 0 +static int stbtt__solve_cubic(float a, float b, float c, float * r) +{ + float s = -a / 3; + float p = b - a * a / 3; + float q = a * (2 * a * a - 9 * b) / 27 + c; + float p3 = p * p * p; + float d = q * q + 4 * p3 / 27; + if(d >= 0) { + float z = (float)STBTT_sqrt(d); + float u = (-q + z) / 2; + float v = (-q - z) / 2; + u = stbtt__cuberoot(u); + v = stbtt__cuberoot(v); + r[0] = s + u + v; + return 1; + } + else { + float u = (float)STBTT_sqrt(-p / 3); + float v = (float)STBTT_acos(-STBTT_sqrt(-27 / p3) * q / 2) / 3; // p3 must be negative, since d is negative + float m = (float)STBTT_cos(v); + float n = (float)STBTT_cos(v - 3.141592f / 2) * 1.732050808f; + r[0] = s + u * 2 * m; + r[1] = s - u * (m + n); + r[2] = s - u * (m - n); + + //STBTT_assert( STBTT_fabs(((r[0]+a)*r[0]+b)*r[0]+c) < 0.05f); // these asserts may not be safe at all scales, though they're in bezier t parameter units so maybe? + //STBTT_assert( STBTT_fabs(((r[1]+a)*r[1]+b)*r[1]+c) < 0.05f); + //STBTT_assert( STBTT_fabs(((r[2]+a)*r[2]+b)*r[2]+c) < 0.05f); + return 3; + } +} + +STBTT_DEF unsigned char * stbtt_GetGlyphSDF(const stbtt_fontinfo * info, float scale, int glyph, int padding, + unsigned char onedge_value, float pixel_dist_scale, int * width, int * height, int * xoff, int * yoff) +{ + float scale_x = scale, scale_y = scale; + int ix0, iy0, ix1, iy1; + int w, h; + unsigned char * data; + + if(scale == 0) return NULL; + + stbtt_GetGlyphBitmapBoxSubpixel(info, glyph, scale, scale, 0.0f, 0.0f, &ix0, &iy0, &ix1, &iy1); + + // if empty, return NULL + if(ix0 == ix1 || iy0 == iy1) + return NULL; + + ix0 -= padding; + iy0 -= padding; + ix1 += padding; + iy1 += padding; + + w = (ix1 - ix0); + h = (iy1 - iy0); + + if(width) *width = w; + if(height) *height = h; + if(xoff) *xoff = ix0; + if(yoff) *yoff = iy0; + + // invert for y-downwards bitmaps + scale_y = -scale_y; + + { + int x, y, i, j; + float * precompute; + stbtt_vertex * verts; + int num_verts = stbtt_GetGlyphShape(info, glyph, &verts); + data = (unsigned char *)STBTT_malloc(w * h, info->userdata); + precompute = (float *)STBTT_malloc(num_verts * sizeof(float), info->userdata); + + for(i = 0, j = num_verts - 1; i < num_verts; j = i++) { + if(verts[i].type == STBTT_vline) { + float x0 = verts[i].x * scale_x, y0 = verts[i].y * scale_y; + float x1 = verts[j].x * scale_x, y1 = verts[j].y * scale_y; + float dist = (float)STBTT_sqrt((x1 - x0) * (x1 - x0) + (y1 - y0) * (y1 - y0)); + precompute[i] = (dist == 0) ? 0.0f : 1.0f / dist; + } + else if(verts[i].type == STBTT_vcurve) { + float x2 = verts[j].x * scale_x, y2 = verts[j].y * scale_y; + float x1 = verts[i].cx * scale_x, y1 = verts[i].cy * scale_y; + float x0 = verts[i].x * scale_x, y0 = verts[i].y * scale_y; + float bx = x0 - 2 * x1 + x2, by = y0 - 2 * y1 + y2; + float len2 = bx * bx + by * by; + if(len2 != 0.0f) + precompute[i] = 1.0f / (bx * bx + by * by); + else + precompute[i] = 0.0f; + } + else + precompute[i] = 0.0f; + } + + for(y = iy0; y < iy1; ++y) { + for(x = ix0; x < ix1; ++x) { + float val; + float min_dist = 999999.0f; + float sx = (float)x + 0.5f; + float sy = (float)y + 0.5f; + float x_gspace = (sx / scale_x); + float y_gspace = (sy / scale_y); + + int winding = stbtt__compute_crossings_x(x_gspace, y_gspace, num_verts, + verts); // @OPTIMIZE: this could just be a rasterization, but needs to be line vs. non-tesselated curves so a new path + + for(i = 0; i < num_verts; ++i) { + float x0 = verts[i].x * scale_x, y0 = verts[i].y * scale_y; + + if(verts[i].type == STBTT_vline && precompute[i] != 0.0f) { + float x1 = verts[i - 1].x * scale_x, y1 = verts[i - 1].y * scale_y; + + float dist, dist2 = (x0 - sx) * (x0 - sx) + (y0 - sy) * (y0 - sy); + if(dist2 < min_dist * min_dist) + min_dist = (float)STBTT_sqrt(dist2); + + // coarse culling against bbox + //if (sx > STBTT_min(x0,x1)-min_dist && sx < STBTT_max(x0,x1)+min_dist && + // sy > STBTT_min(y0,y1)-min_dist && sy < STBTT_max(y0,y1)+min_dist) + dist = (float)STBTT_fabs((x1 - x0) * (y0 - sy) - (y1 - y0) * (x0 - sx)) * precompute[i]; + STBTT_assert(i != 0); + if(dist < min_dist) { + // check position along line + // x' = x0 + t*(x1-x0), y' = y0 + t*(y1-y0) + // minimize (x'-sx)*(x'-sx)+(y'-sy)*(y'-sy) + float dx = x1 - x0, dy = y1 - y0; + float px = x0 - sx, py = y0 - sy; + // minimize (px+t*dx)^2 + (py+t*dy)^2 = px*px + 2*px*dx*t + t^2*dx*dx + py*py + 2*py*dy*t + t^2*dy*dy + // derivative: 2*px*dx + 2*py*dy + (2*dx*dx+2*dy*dy)*t, set to 0 and solve + float t = -(px * dx + py * dy) / (dx * dx + dy * dy); + if(t >= 0.0f && t <= 1.0f) + min_dist = dist; + } + } + else if(verts[i].type == STBTT_vcurve) { + float x2 = verts[i - 1].x * scale_x, y2 = verts[i - 1].y * scale_y; + float x1 = verts[i].cx * scale_x, y1 = verts[i].cy * scale_y; + float box_x0 = STBTT_min(STBTT_min(x0, x1), x2); + float box_y0 = STBTT_min(STBTT_min(y0, y1), y2); + float box_x1 = STBTT_max(STBTT_max(x0, x1), x2); + float box_y1 = STBTT_max(STBTT_max(y0, y1), y2); + // coarse culling against bbox to avoid computing cubic unnecessarily + if(sx > box_x0 - min_dist && sx < box_x1 + min_dist && sy > box_y0 - min_dist && sy < box_y1 + min_dist) { + int num = 0; + float ax = x1 - x0, ay = y1 - y0; + float bx = x0 - 2 * x1 + x2, by = y0 - 2 * y1 + y2; + float mx = x0 - sx, my = y0 - sy; + float res[3] = { 0.f, 0.f, 0.f }; + float px, py, t, it, dist2; + float a_inv = precompute[i]; + if(a_inv == 0.0f) { // if a_inv is 0, it's 2nd degree so use quadratic formula + float a = 3 * (ax * bx + ay * by); + float b = 2 * (ax * ax + ay * ay) + (mx * bx + my * by); + float c = mx * ax + my * ay; + if(a == 0.0f) { // if a is 0, it's linear + if(b != 0.0f) { + res[num++] = -c / b; + } + } + else { + float discriminant = b * b - 4 * a * c; + if(discriminant < 0) + num = 0; + else { + float root = (float)STBTT_sqrt(discriminant); + res[0] = (-b - root) / (2 * a); + res[1] = (-b + root) / (2 * a); + num = 2; // don't bother distinguishing 1-solution case, as code below will still work + } + } + } + else { + float b = 3 * (ax * bx + ay * by) * a_inv; // could precompute this as it doesn't depend on sample point + float c = (2 * (ax * ax + ay * ay) + (mx * bx + my * by)) * a_inv; + float d = (mx * ax + my * ay) * a_inv; + num = stbtt__solve_cubic(b, c, d, res); + } + dist2 = (x0 - sx) * (x0 - sx) + (y0 - sy) * (y0 - sy); + if(dist2 < min_dist * min_dist) + min_dist = (float)STBTT_sqrt(dist2); + + if(num >= 1 && res[0] >= 0.0f && res[0] <= 1.0f) { + t = res[0], it = 1.0f - t; + px = it * it * x0 + 2 * t * it * x1 + t * t * x2; + py = it * it * y0 + 2 * t * it * y1 + t * t * y2; + dist2 = (px - sx) * (px - sx) + (py - sy) * (py - sy); + if(dist2 < min_dist * min_dist) + min_dist = (float)STBTT_sqrt(dist2); + } + if(num >= 2 && res[1] >= 0.0f && res[1] <= 1.0f) { + t = res[1], it = 1.0f - t; + px = it * it * x0 + 2 * t * it * x1 + t * t * x2; + py = it * it * y0 + 2 * t * it * y1 + t * t * y2; + dist2 = (px - sx) * (px - sx) + (py - sy) * (py - sy); + if(dist2 < min_dist * min_dist) + min_dist = (float)STBTT_sqrt(dist2); + } + if(num >= 3 && res[2] >= 0.0f && res[2] <= 1.0f) { + t = res[2], it = 1.0f - t; + px = it * it * x0 + 2 * t * it * x1 + t * t * x2; + py = it * it * y0 + 2 * t * it * y1 + t * t * y2; + dist2 = (px - sx) * (px - sx) + (py - sy) * (py - sy); + if(dist2 < min_dist * min_dist) + min_dist = (float)STBTT_sqrt(dist2); + } + } + } + } + if(winding == 0) + min_dist = -min_dist; // if outside the shape, value is negative + val = onedge_value + pixel_dist_scale * min_dist; + if(val < 0) + val = 0; + else if(val > 255) + val = 255; + data[(y - iy0) * w + (x - ix0)] = (unsigned char)val; + } + } + STBTT_free(precompute, info->userdata); + STBTT_free(verts, info->userdata); + } + return data; +} + +STBTT_DEF unsigned char * stbtt_GetCodepointSDF(const stbtt_fontinfo * info, float scale, int codepoint, int padding, + unsigned char onedge_value, float pixel_dist_scale, int * width, int * height, int * xoff, int * yoff) +{ + return stbtt_GetGlyphSDF(info, scale, stbtt_FindGlyphIndex(info, codepoint), padding, onedge_value, pixel_dist_scale, + width, height, xoff, yoff); +} + +STBTT_DEF void stbtt_FreeSDF(unsigned char * bitmap, void * userdata) +{ + STBTT_free(bitmap, userdata); +} + +////////////////////////////////////////////////////////////////////////////// +// +// font name matching -- recommended not to use this +// + +// check if a utf8 string contains a prefix which is the utf16 string; if so return length of matching utf8 string +#ifdef STBTT_STREAM_TYPE +static stbtt_int32 stbtt__CompareUTF8toUTF16_bigendian_prefix(stbtt_uint8 * s1, stbtt_int32 len1, STBTT_STREAM_TYPE s2, + stbtt_uint32 s2offs, stbtt_int32 len2) +#else +static stbtt_int32 stbtt__CompareUTF8toUTF16_bigendian_prefix(stbtt_uint8 * s1, stbtt_int32 len1, stbtt_uint8 * s2, + stbtt_uint32 s2offs, stbtt_int32 len2) +#endif +{ + stbtt_int32 i = 0; + + // convert utf16 to utf8 and compare the results while converting + while(len2) { + stbtt_uint16 ch = ttUSHORT(s2, s2offs); + if(ch < 0x80) { + if(i >= len1) return -1; + if(s1[i++] != ch) return -1; + } + else if(ch < 0x800) { + if(i + 1 >= len1) return -1; + if(s1[i++] != 0xc0 + (ch >> 6)) return -1; + if(s1[i++] != 0x80 + (ch & 0x3f)) return -1; + } + else if(ch >= 0xd800 && ch < 0xdc00) { + stbtt_uint32 c; + stbtt_uint16 ch2 = ttUSHORT(s2, s2offs + 2); + if(i + 3 >= len1) return -1; + c = ((ch - 0xd800) << 10) + (ch2 - 0xdc00) + 0x10000; + if(s1[i++] != 0xf0 + (c >> 18)) return -1; + if(s1[i++] != 0x80 + ((c >> 12) & 0x3f)) return -1; + if(s1[i++] != 0x80 + ((c >> 6) & 0x3f)) return -1; + if(s1[i++] != 0x80 + ((c) & 0x3f)) return -1; + s2offs += 2; // plus another 2 below + len2 -= 2; + } + else if(ch >= 0xdc00 && ch < 0xe000) { + return -1; + } + else { + if(i + 2 >= len1) return -1; + if(s1[i++] != 0xe0 + (ch >> 12)) return -1; + if(s1[i++] != 0x80 + ((ch >> 6) & 0x3f)) return -1; + if(s1[i++] != 0x80 + ((ch) & 0x3f)) return -1; + } + s2offs += 2; + len2 -= 2; + } + return i; +} +#ifdef STBTT_STREAM_TYPE +static int stbtt_CompareUTF8toUTF16_bigendian_internal(char * s1, int len1, STBTT_STREAM_TYPE s2, stbtt_uint32 s2offs, + int len2) +{ + return len1 == stbtt__CompareUTF8toUTF16_bigendian_prefix((stbtt_uint8 *)s1, len1, s2, s2offs, len2); +} +#else +static int stbtt_CompareUTF8toUTF16_bigendian_internal(char * s1, int len1, char * s2, stbtt_uint32 s2offs, int len2) +{ + return len1 == stbtt__CompareUTF8toUTF16_bigendian_prefix((stbtt_uint8 *)s1, len1, (stbtt_uint8 *)s2, s2offs, len2); +} +#endif +// returns results in whatever encoding you request... but note that 2-byte encodings +// will be BIG-ENDIAN... use stbtt_CompareUTF8toUTF16_bigendian() to compare +STBTT_DEF stbtt_uint32 stbtt_GetFontNameString(const stbtt_fontinfo * font, int * length, int platformID, + int encodingID, int languageID, int nameID) +{ + stbtt_int32 i, count, stringOffset; + stbtt_uint32 offset = font->fontstart; + stbtt_uint32 nm = stbtt__find_table(font->data, offset, "name"); + if(!nm) return 0; + + count = ttUSHORT(font->data, nm + 2); + stringOffset = nm + ttUSHORT(font->data, nm + 4); + for(i = 0; i < count; ++i) { + stbtt_uint32 loc = nm + 6 + 12 * i; + if(platformID == ttUSHORT(font->data, loc + 0) && encodingID == ttUSHORT(font->data, loc + 2) + && languageID == ttUSHORT(font->data, loc + 4) && nameID == ttUSHORT(font->data, loc + 6)) { + *length = ttUSHORT(font->data, loc + 8); + return stringOffset + ttUSHORT(font->data, loc + 10); + } + } + return 0; +} +#ifdef STBTT_STREAM_TYPE +static int stbtt__matchpair(STBTT_STREAM_TYPE fc, stbtt_uint32 nm, stbtt_uint8 * name, stbtt_int32 nlen, + stbtt_int32 target_id, stbtt_int32 next_id) +#else +static int stbtt__matchpair(stbtt_uint8 * fc, stbtt_uint32 nm, stbtt_uint8 * name, stbtt_int32 nlen, + stbtt_int32 target_id, stbtt_int32 next_id) +#endif +{ + stbtt_int32 i; + stbtt_int32 count = ttUSHORT(fc, nm + 2); + stbtt_int32 stringOffset = nm + ttUSHORT(fc, nm + 4); + + for(i = 0; i < count; ++i) { + stbtt_uint32 loc = nm + 6 + 12 * i; + stbtt_int32 id = ttUSHORT(fc, loc + 6); + if(id == target_id) { + // find the encoding + stbtt_int32 platform = ttUSHORT(fc, loc + 0), encoding = ttUSHORT(fc, loc + 2), language = ttUSHORT(fc, loc + 4); + + // is this a Unicode encoding? + if(platform == 0 || (platform == 3 && encoding == 1) || (platform == 3 && encoding == 10)) { + stbtt_int32 slen = ttUSHORT(fc, loc + 8); + stbtt_int32 off = ttUSHORT(fc, loc + 10); + + // check if there's a prefix match + stbtt_int32 matchlen = stbtt__CompareUTF8toUTF16_bigendian_prefix(name, nlen, fc, stringOffset + off, slen); + if(matchlen >= 0) { + // check for target_id+1 immediately following, with same encoding & language + if(i + 1 < count && ttUSHORT(fc, loc + 12 + 6) == next_id && ttUSHORT(fc, loc + 12) == platform && + ttUSHORT(fc, loc + 12 + 2) == encoding && ttUSHORT(fc, loc + 12 + 4) == language) { + slen = ttUSHORT(fc, loc + 12 + 8); + off = ttUSHORT(fc, loc + 12 + 10); + if(slen == 0) { + if(matchlen == nlen) + return 1; + } + else if(matchlen < nlen && name[matchlen] == ' ') { + ++matchlen; +#ifdef STBTT_STREAM_TYPE + if(stbtt_CompareUTF8toUTF16_bigendian_internal((char *)(name + matchlen), nlen - matchlen, fc, stringOffset + off, + slen)) +#else + if(stbtt_CompareUTF8toUTF16_bigendian_internal((char *)(name + matchlen), nlen - matchlen, (char *)fc, + stringOffset + off, slen)) +#endif + return 1; + } + } + else { + // if nothing immediately following + if(matchlen == nlen) + return 1; + } + } + } + + // @TODO handle other encodings + } + } + return 0; +} +#ifdef STBTT_STREAM_TYPE + static int stbtt__matches(STBTT_STREAM_TYPE fc, stbtt_uint32 offset, stbtt_uint8 * name, stbtt_int32 flags) +#else + static int stbtt__matches(stbtt_uint8 * fc, stbtt_uint32 offset, stbtt_uint8 * name, stbtt_int32 flags) +#endif + +{ + stbtt_int32 nlen = (stbtt_int32)STBTT_strlen((char *)name); + stbtt_uint32 nm, hd; + if(!stbtt__isfont(fc, offset)) return 0; + + // check italics/bold/underline flags in macStyle... + if(flags) { + hd = stbtt__find_table(fc, offset, "head"); + if((ttUSHORT(fc, hd + 44) & 7) != (flags & 7)) return 0; + } + + nm = stbtt__find_table(fc, offset, "name"); + if(!nm) return 0; + + if(flags) { + if(name == NULL) return 1; + // if we checked the macStyle flags, then just check the family and ignore the subfamily + if(stbtt__matchpair(fc, nm, name, nlen, 16, -1)) return 1; + if(stbtt__matchpair(fc, nm, name, nlen, 1, -1)) return 1; + if(stbtt__matchpair(fc, nm, name, nlen, 3, -1)) return 1; + } + else { + if(name == NULL) return 1; + if(stbtt__matchpair(fc, nm, name, nlen, 16, 17)) return 1; + if(stbtt__matchpair(fc, nm, name, nlen, 1, 2)) return 1; + if(stbtt__matchpair(fc, nm, name, nlen, 3, -1)) return 1; + } + + return 0; +} +#ifdef STBTT_STREAM_TYPE + static int stbtt_FindMatchingFont_internal(STBTT_STREAM_TYPE font_collection, char * name_utf8, stbtt_int32 flags) +#else + static int stbtt_FindMatchingFont_internal(unsigned char * font_collection, char * name_utf8, stbtt_int32 flags) +#endif +{ + stbtt_int32 i; + for(i = 0;; ++i) { + stbtt_int32 off = stbtt_GetFontOffsetForIndex(font_collection, i); + if(off < 0) return off; +#ifdef STBTT_STREAM_TYPE + if(stbtt__matches(font_collection, off, (stbtt_uint8 *)name_utf8, flags)) +#else + if(stbtt__matches((stbtt_uint8 *)font_collection, off, (stbtt_uint8 *)name_utf8, flags)) +#endif + return off; + } +} + +#if defined(__GNUC__) || defined(__clang__) + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wcast-qual" +#endif + +#ifdef STBTT_STREAM_TYPE +STBTT_DEF int stbtt_BakeFontBitmap(STBTT_STREAM_TYPE data, int offset, + float pixel_height, unsigned char * pixels, int pw, int ph, + int first_char, int num_chars, stbtt_bakedchar * chardata); +#else +STBTT_DEF int stbtt_BakeFontBitmap(const unsigned char * data, int offset, + float pixel_height, unsigned char * pixels, int pw, int ph, + int first_char, int num_chars, stbtt_bakedchar * chardata); +#endif + +#ifdef STBTT_STREAM_TYPE +STBTT_DEF int stbtt_BakeFontBitmap(STBTT_STREAM_TYPE data, int offset, + float pixel_height, unsigned char * pixels, int pw, int ph, + int first_char, int num_chars, stbtt_bakedchar * chardata) +#else +STBTT_DEF int stbtt_BakeFontBitmap(const unsigned char * data, int offset, + float pixel_height, unsigned char * pixels, int pw, int ph, + int first_char, int num_chars, stbtt_bakedchar * chardata) +#endif +{ +#ifdef STBTT_STREAM_TYPE + return stbtt_BakeFontBitmap_internal(data, offset, pixel_height, pixels, pw, ph, first_char, num_chars, chardata); +#else + return stbtt_BakeFontBitmap_internal((unsigned char *)data, offset, pixel_height, pixels, pw, ph, first_char, num_chars, + chardata); +#endif +} +#ifdef STBTT_STREAM_TYPE +STBTT_DEF int stbtt_GetFontOffsetForIndex(STBTT_STREAM_TYPE data, int index) +{ + return stbtt_GetFontOffsetForIndex_internal(data, index); +} +#else +STBTT_DEF int stbtt_GetFontOffsetForIndex(const unsigned char * data, int index) +{ + return stbtt_GetFontOffsetForIndex_internal((unsigned char *)data, index); +} +#endif +#ifdef STBTT_STREAM_TYPE +STBTT_DEF int stbtt_GetNumberOfFonts(STBTT_STREAM_TYPE data) +{ + return stbtt_GetNumberOfFonts_internal(data); +} +#else +STBTT_DEF int stbtt_GetNumberOfFonts(const unsigned char * data) +{ + return stbtt_GetNumberOfFonts_internal((unsigned char *)data); +} +#endif +#ifdef STBTT_STREAM_TYPE +STBTT_DEF int stbtt_InitFont(stbtt_fontinfo * info, STBTT_STREAM_TYPE data, int offset) +{ + return stbtt_InitFont_internal(info, data, offset); +} +#else +STBTT_DEF int stbtt_InitFont(stbtt_fontinfo * info, const unsigned char * data, int offset) +{ + return stbtt_InitFont_internal(info, (unsigned char *)data, offset); +} +#endif +#ifdef STBTT_STREAM_TYPE +STBTT_DEF int stbtt_FindMatchingFont(STBTT_STREAM_TYPE fontdata, const char * name, int flags) +{ + return stbtt_FindMatchingFont_internal(fontdata, (char *)name, flags); +} +#else +STBTT_DEF int stbtt_FindMatchingFont(const unsigned char * fontdata, const char * name, int flags) +{ + return stbtt_FindMatchingFont_internal((unsigned char *)fontdata, (char *)name, flags); +} +#endif +#ifdef STBTT_STREAM_TYPE +STBTT_DEF int stbtt_CompareUTF8toUTF16_bigendian(const char * s1, int len1, STBTT_STREAM_TYPE s2, stbtt_uint32 s2offs, + int len2) +{ + return stbtt_CompareUTF8toUTF16_bigendian_internal((char *)s1, len1, s2, s2offs, len2); +} +#else +STBTT_DEF int stbtt_CompareUTF8toUTF16_bigendian(const char * s1, int len1, const char * s2, stbtt_uint32 s2offs, + int len2) +{ + return stbtt_CompareUTF8toUTF16_bigendian_internal((char *)s1, len1, (char *)s2, s2offs, len2); +} +#endif + +#if defined(__GNUC__) || defined(__clang__) + #pragma GCC diagnostic pop + #pragma GCC diagnostic pop +#endif + +#endif // STB_TRUETYPE_IMPLEMENTATION + +// FULL VERSION HISTORY +// +// 1.25 (2021-07-11) many fixes +// 1.24 (2020-02-05) fix warning +// 1.23 (2020-02-02) query SVG data for glyphs; query whole kerning table (but only kern not GPOS) +// 1.22 (2019-08-11) minimize missing-glyph duplication; fix kerning if both 'GPOS' and 'kern' are defined +// 1.21 (2019-02-25) fix warning +// 1.20 (2019-02-07) PackFontRange skips missing codepoints; GetScaleFontVMetrics() +// 1.19 (2018-02-11) OpenType GPOS kerning (horizontal only), STBTT_fmod +// 1.18 (2018-01-29) add missing function +// 1.17 (2017-07-23) make more arguments const; doc fix +// 1.16 (2017-07-12) SDF support +// 1.15 (2017-03-03) make more arguments const +// 1.14 (2017-01-16) num-fonts-in-TTC function +// 1.13 (2017-01-02) support OpenType fonts, certain Apple fonts +// 1.12 (2016-10-25) suppress warnings about casting away const with -Wcast-qual +// 1.11 (2016-04-02) fix unused-variable warning +// 1.10 (2016-04-02) allow user-defined fabs() replacement +// fix memory leak if fontsize=0.0 +// fix warning from duplicate typedef +// 1.09 (2016-01-16) warning fix; avoid crash on outofmem; use alloc userdata for PackFontRanges +// 1.08 (2015-09-13) document stbtt_Rasterize(); fixes for vertical & horizontal edges +// 1.07 (2015-08-01) allow PackFontRanges to accept arrays of sparse codepoints; +// allow PackFontRanges to pack and render in separate phases; +// fix stbtt_GetFontOFfsetForIndex (never worked for non-0 input?); +// fixed an assert() bug in the new rasterizer +// replace assert() with STBTT_assert() in new rasterizer +// 1.06 (2015-07-14) performance improvements (~35% faster on x86 and x64 on test machine) +// also more precise AA rasterizer, except if shapes overlap +// remove need for STBTT_sort +// 1.05 (2015-04-15) fix misplaced definitions for STBTT_STATIC +// 1.04 (2015-04-15) typo in example +// 1.03 (2015-04-12) STBTT_STATIC, fix memory leak in new packing, various fixes +// 1.02 (2014-12-10) fix various warnings & compile issues w/ stb_rect_pack, C++ +// 1.01 (2014-12-08) fix subpixel position when oversampling to exactly match +// non-oversampled; STBTT_POINT_SIZE for packed case only +// 1.00 (2014-12-06) add new PackBegin etc. API, w/ support for oversampling +// 0.99 (2014-09-18) fix multiple bugs with subpixel rendering (ryg) +// 0.9 (2014-08-07) support certain mac/iOS fonts without an MS platformID +// 0.8b (2014-07-07) fix a warning +// 0.8 (2014-05-25) fix a few more warnings +// 0.7 (2013-09-25) bugfix: subpixel glyph bug fixed in 0.5 had come back +// 0.6c (2012-07-24) improve documentation +// 0.6b (2012-07-20) fix a few more warnings +// 0.6 (2012-07-17) fix warnings; added stbtt_ScaleForMappingEmToPixels, +// stbtt_GetFontBoundingBox, stbtt_IsGlyphEmpty +// 0.5 (2011-12-09) bugfixes: +// subpixel glyph renderer computed wrong bounding box +// first vertex of shape can be off-curve (FreeSans) +// 0.4b (2011-12-03) fixed an error in the font baking example +// 0.4 (2011-12-01) kerning, subpixel rendering (tor) +// bugfixes for: +// codepoint-to-glyph conversion using table fmt=12 +// codepoint-to-glyph conversion using table fmt=4 +// stbtt_GetBakedQuad with non-square texture (Zer) +// updated Hello World! sample to use kerning and subpixel +// fixed some warnings +// 0.3 (2009-06-24) cmap fmt=12, compound shapes (MM) +// userdata, malloc-from-userdata, non-zero fill (stb) +// 0.2 (2009-03-11) Fix unsigned/signed char warnings +// 0.1 (2009-03-09) First public release +// + +/* +------------------------------------------------------------------------------ +This software is available under 2 licenses -- choose whichever you prefer. +------------------------------------------------------------------------------ +ALTERNATIVE A - MIT License +Copyright (c) 2017 Sean Barrett +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +------------------------------------------------------------------------------ +ALTERNATIVE B - Public Domain (www.unlicense.org) +This is free and unencumbered software released into the public domain. +Anyone is free to copy, modify, publish, use, compile, sell, or distribute this +software, either in source code form or as a compiled binary, for any purpose, +commercial or non-commercial, and by any means. +In jurisdictions that recognize copyright laws, the author or authors of this +software dedicate any and all copyright interest in the software to the public +domain. We make this dedication for the benefit of the public at large and to +the detriment of our heirs and successors. We intend this dedication to be an +overt act of relinquishment in perpetuity of all present and future rights to +this software under copyright law. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +------------------------------------------------------------------------------ +*/ diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/lv_extra.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/lv_extra.c similarity index 95% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/lv_extra.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/lv_extra.c index 0b50002..3808337 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/lv_extra.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/lv_extra.c @@ -50,6 +50,10 @@ void lv_extra_init(void) lv_fs_fatfs_init(); #endif +#if LV_USE_FS_LITTLEFS != '\0' + lv_fs_littlefs_init(); +#endif + #if LV_USE_FS_STDIO != '\0' lv_fs_stdio_init(); #endif diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/lv_extra.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/lv_extra.h similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/lv_extra.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/lv_extra.h diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/lv_extra.mk b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/lv_extra.mk similarity index 83% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/lv_extra.mk rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/lv_extra.mk index 1afcc7b..8d418ad 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/lv_extra.mk +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/lv_extra.mk @@ -1 +1 @@ -CSRCS += $(shell find -L $(LVGL_DIR)/$(LVGL_DIR_NAME)/src/extra -name \*.c) +CSRCS += $(shell find -L $(LVGL_DIR)/$(LVGL_DIR_NAME)/src/extra -name "*.c") diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/others/Makefile b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/others/Makefile similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/others/Makefile rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/others/Makefile diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/others/fragment/Makefile b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/others/fragment/Makefile similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/others/fragment/Makefile rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/others/fragment/Makefile diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/others/fragment/README.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/others/fragment/README.md similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/others/fragment/README.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/others/fragment/README.md diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/others/fragment/lv_fragment.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/others/fragment/lv_fragment.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/others/fragment/lv_fragment.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/others/fragment/lv_fragment.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/others/fragment/lv_fragment.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/others/fragment/lv_fragment.h similarity index 99% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/others/fragment/lv_fragment.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/others/fragment/lv_fragment.h index da30b39..dd8d5b4 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/others/fragment/lv_fragment.h +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/others/fragment/lv_fragment.h @@ -266,7 +266,6 @@ lv_fragment_t * lv_fragment_manager_find_by_container(lv_fragment_manager_t * ma */ lv_fragment_t * lv_fragment_manager_get_parent_fragment(lv_fragment_manager_t * manager); - /** * Create a fragment instance. * @@ -325,7 +324,6 @@ void lv_fragment_del_obj(lv_fragment_t * fragment); */ void lv_fragment_recreate_obj(lv_fragment_t * fragment); - /********************** * MACROS **********************/ diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/others/fragment/lv_fragment_manager.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/others/fragment/lv_fragment_manager.c similarity index 99% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/others/fragment/lv_fragment_manager.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/others/fragment/lv_fragment_manager.c index ade7215..25c604b 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/others/fragment/lv_fragment_manager.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/others/fragment/lv_fragment_manager.c @@ -36,7 +36,6 @@ struct _lv_fragment_manager_t { lv_ll_t stack; }; - /********************** * STATIC PROTOTYPES **********************/ @@ -258,7 +257,6 @@ static void item_del_fragment(lv_fragment_managed_states_t * item) item->instance = NULL; } - static lv_fragment_managed_states_t * fragment_attach(lv_fragment_manager_t * manager, lv_fragment_t * fragment, lv_obj_t * const * container) { diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/others/gridnav/Makefile b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/others/gridnav/Makefile similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/others/gridnav/Makefile rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/others/gridnav/Makefile diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/others/gridnav/lv_gridnav.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/others/gridnav/lv_gridnav.c similarity index 99% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/others/gridnav/lv_gridnav.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/others/gridnav/lv_gridnav.c index 4eec637..505a977 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/others/gridnav/lv_gridnav.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/others/gridnav/lv_gridnav.c @@ -217,6 +217,7 @@ static void gridnav_event_cb(lv_event_t * e) if(dsc->focused_obj == NULL) dsc->focused_obj = find_first_focusable(obj); if(dsc->focused_obj) { lv_obj_add_state(dsc->focused_obj, LV_STATE_FOCUSED | LV_STATE_FOCUS_KEY); + lv_obj_clear_state(dsc->focused_obj, LV_STATE_PRESSED); /*Be sure the focuses obj is not stuck in pressed state*/ lv_obj_scroll_to_view(dsc->focused_obj, LV_ANIM_OFF); } } diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/others/gridnav/lv_gridnav.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/others/gridnav/lv_gridnav.h similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/others/gridnav/lv_gridnav.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/others/gridnav/lv_gridnav.h diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/others/ime/Makefile b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/others/ime/Makefile similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/others/ime/Makefile rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/others/ime/Makefile diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/others/ime/lv_ime_pinyin.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/others/ime/lv_ime_pinyin.c similarity index 99% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/others/ime/lv_ime_pinyin.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/others/ime/lv_ime_pinyin.c index b1661e4..06f09ff 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/others/ime/lv_ime_pinyin.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/others/ime/lv_ime_pinyin.c @@ -398,7 +398,6 @@ lv_pinyin_dict_t lv_ime_pinyin_def_dict[] = { }; #endif - /********************** * MACROS **********************/ @@ -414,7 +413,6 @@ lv_obj_t * lv_ime_pinyin_create(lv_obj_t * parent) return obj; } - /*===================== * Setter functions *====================*/ @@ -562,6 +560,8 @@ static void lv_ime_pinyin_constructor(const lv_obj_class_t * class_p, lv_obj_t * lv_memset_00(pinyin_ime->py_num, sizeof(pinyin_ime->py_num)); lv_memset_00(pinyin_ime->py_pos, sizeof(pinyin_ime->py_pos)); + lv_obj_add_flag(obj, LV_OBJ_FLAG_HIDDEN); + lv_obj_set_size(obj, LV_PCT(100), LV_PCT(55)); lv_obj_align(obj, LV_ALIGN_BOTTOM_MID, 0, 0); @@ -576,6 +576,7 @@ static void lv_ime_pinyin_constructor(const lv_obj_class_t * class_p, lv_obj_t * lv_obj_add_flag(pinyin_ime->cand_panel, LV_OBJ_FLAG_HIDDEN); lv_btnmatrix_set_one_checked(pinyin_ime->cand_panel, true); + lv_obj_clear_flag(pinyin_ime->cand_panel, LV_OBJ_FLAG_CLICK_FOCUSABLE); /* Set cand_panel style*/ // Default style @@ -613,7 +614,6 @@ static void lv_ime_pinyin_constructor(const lv_obj_class_t * class_p, lv_obj_t * #endif } - static void lv_ime_pinyin_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj) { LV_UNUSED(class_p); @@ -627,7 +627,6 @@ static void lv_ime_pinyin_destructor(const lv_obj_class_t * class_p, lv_obj_t * lv_obj_del(pinyin_ime->cand_panel); } - static void lv_ime_pinyin_kb_event(lv_event_t * e) { lv_event_code_t code = lv_event_get_code(e); @@ -755,7 +754,6 @@ static void lv_ime_pinyin_kb_event(lv_event_t * e) } } - static void lv_ime_pinyin_cand_panel_event(lv_event_t * e) { lv_event_code_t code = lv_event_get_code(e); @@ -787,7 +785,6 @@ static void lv_ime_pinyin_cand_panel_event(lv_event_t * e) } } - static void pinyin_input_proc(lv_obj_t * obj) { lv_ime_pinyin_t * pinyin_ime = (lv_ime_pinyin_t *)obj; @@ -853,7 +850,6 @@ static void pinyin_page_proc(lv_obj_t * obj, uint16_t dir) } } - static void lv_ime_pinyin_style_change_event(lv_event_t * e) { lv_event_code_t code = lv_event_get_code(e); @@ -867,7 +863,6 @@ static void lv_ime_pinyin_style_change_event(lv_event_t * e) } } - static void init_pinyin_dict(lv_obj_t * obj, lv_pinyin_dict_t * dict) { lv_ime_pinyin_t * pinyin_ime = (lv_ime_pinyin_t *)obj; @@ -902,7 +897,6 @@ static void init_pinyin_dict(lv_obj_t * obj, lv_pinyin_dict_t * dict) } } - static char * pinyin_search_matching(lv_obj_t * obj, char * py_str, uint16_t * cand_num) { lv_ime_pinyin_t * pinyin_ime = (lv_ime_pinyin_t *)obj; @@ -944,7 +938,6 @@ static void pinyin_ime_clear_data(lv_obj_t * obj) { lv_ime_pinyin_t * pinyin_ime = (lv_ime_pinyin_t *)obj; - #if LV_IME_PINYIN_USE_K9_MODE if(pinyin_ime->mode == LV_IME_PINYIN_MODE_K9) { pinyin_ime->k9_input_str_len = 0; @@ -964,7 +957,6 @@ static void pinyin_ime_clear_data(lv_obj_t * obj) lv_obj_add_flag(pinyin_ime->cand_panel, LV_OBJ_FLAG_HIDDEN); } - #if LV_IME_PINYIN_USE_K9_MODE static void pinyin_k9_init_data(lv_obj_t * obj) { @@ -1054,7 +1046,6 @@ static void pinyin_k9_get_legal_py(lv_obj_t * obj, char * k9_input, const char * } } - /*true: visible; false: not visible*/ static bool pinyin_k9_is_valid_py(lv_obj_t * obj, char * py_str) { @@ -1092,7 +1083,6 @@ static bool pinyin_k9_is_valid_py(lv_obj_t * obj, char * py_str) return false; } - static void pinyin_k9_fill_cand(lv_obj_t * obj) { static uint16_t len = 0; @@ -1131,7 +1121,6 @@ static void pinyin_k9_fill_cand(lv_obj_t * obj) lv_textarea_add_text(ta, pinyin_ime->input_char); } - static void pinyin_k9_cand_page_proc(lv_obj_t * obj, uint16_t dir) { lv_ime_pinyin_t * pinyin_ime = (lv_ime_pinyin_t *)obj; @@ -1195,4 +1184,3 @@ static void pinyin_k9_cand_page_proc(lv_obj_t * obj, uint16_t dir) #endif /*LV_IME_PINYIN_USE_K9_MODE*/ #endif /*LV_USE_IME_PINYIN*/ - diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/others/ime/lv_ime_pinyin.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/others/ime/lv_ime_pinyin.h similarity index 99% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/others/ime/lv_ime_pinyin.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/others/ime/lv_ime_pinyin.h index 3ff7bb9..001a27a 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/others/ime/lv_ime_pinyin.h +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/others/ime/lv_ime_pinyin.h @@ -98,7 +98,6 @@ void lv_ime_pinyin_set_dict(lv_obj_t * obj, lv_pinyin_dict_t * dict); */ void lv_ime_pinyin_set_mode(lv_obj_t * obj, lv_ime_pinyin_mode_t mode); - /*===================== * Getter functions *====================*/ @@ -110,7 +109,6 @@ void lv_ime_pinyin_set_mode(lv_obj_t * obj, lv_ime_pinyin_mode_t mode); */ lv_obj_t * lv_ime_pinyin_get_kb(lv_obj_t * obj); - /** * Set the dictionary of Pinyin input method. * @param obj pointer to a Pinyin input method object @@ -118,7 +116,6 @@ lv_obj_t * lv_ime_pinyin_get_kb(lv_obj_t * obj); */ lv_obj_t * lv_ime_pinyin_get_cand_panel(lv_obj_t * obj); - /** * Set the dictionary of Pinyin input method. * @param obj pointer to a Pinyin input method object @@ -141,5 +138,3 @@ lv_pinyin_dict_t * lv_ime_pinyin_get_dict(lv_obj_t * obj); #endif #endif /*LV_USE_IME_PINYIN*/ - - diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/others/imgfont/Makefile b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/others/imgfont/Makefile similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/others/imgfont/Makefile rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/others/imgfont/Makefile diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/others/imgfont/lv_imgfont.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/others/imgfont/lv_imgfont.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/others/imgfont/lv_imgfont.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/others/imgfont/lv_imgfont.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/others/imgfont/lv_imgfont.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/others/imgfont/lv_imgfont.h similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/others/imgfont/lv_imgfont.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/others/imgfont/lv_imgfont.h diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/others/lv_others.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/others/lv_others.h similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/others/lv_others.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/others/lv_others.h diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/others/monkey/Makefile b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/others/monkey/Makefile similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/others/monkey/Makefile rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/others/monkey/Makefile diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/others/monkey/lv_monkey.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/others/monkey/lv_monkey.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/others/monkey/lv_monkey.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/others/monkey/lv_monkey.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/others/monkey/lv_monkey.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/others/monkey/lv_monkey.h similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/others/monkey/lv_monkey.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/others/monkey/lv_monkey.h diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/others/msg/Makefile b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/others/msg/Makefile similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/others/msg/Makefile rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/others/msg/Makefile diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/others/msg/lv_msg.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/others/msg/lv_msg.c similarity index 88% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/others/msg/lv_msg.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/others/msg/lv_msg.c index 8fd434d..d54279c 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/others/msg/lv_msg.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/others/msg/lv_msg.c @@ -94,6 +94,25 @@ void lv_msg_unsubscribe(void * s) lv_mem_free(s); } +uint32_t lv_msg_unsubscribe_obj(uint32_t msg_id, lv_obj_t * obj) +{ + uint32_t cnt = 0; + sub_dsc_t * s = _lv_ll_get_head(&subs_ll); + while(s) { + sub_dsc_t * s_next = _lv_ll_get_next(&subs_ll, s); + if(s->callback == obj_notify_cb && + (s->msg_id == LV_MSG_ID_ANY || s->msg_id == msg_id) && + (obj == NULL || s->_priv_data == obj)) { + lv_msg_unsubscribe(s); + cnt++; + } + + s = s_next; + } + + return cnt; +} + void lv_msg_send(uint32_t msg_id, const void * payload) { lv_msg_t m; @@ -129,8 +148,6 @@ lv_msg_t * lv_event_get_msg(lv_event_t * e) } } - - /********************** * STATIC FUNCTIONS **********************/ diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/others/msg/lv_msg.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/others/msg/lv_msg.h similarity index 90% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/others/msg/lv_msg.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/others/msg/lv_msg.h index 96f08aa..0ac2f77 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/others/msg/lv_msg.h +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/others/msg/lv_msg.h @@ -19,6 +19,8 @@ extern "C" { /********************* * DEFINES *********************/ +#define LV_MSG_ID_ANY UINT32_MAX +LV_EXPORT_CONST_INT(LV_MSG_ID_ANY); /********************** * TYPEDEFS @@ -70,6 +72,14 @@ void * lv_msg_subsribe_obj(uint32_t msg_id, lv_obj_t * obj, void * user_data); */ void lv_msg_unsubscribe(void * s); +/** + * Unsubscribe an object from a message ID + * @param msg_id the message ID to unsubcribe from or `LV_MSG_ID_ANY` for any message ID + * @param obj the object to unsubscribe or NULL for any object + * @return number of unsubscriptions + */ +uint32_t lv_msg_unsubscribe_obj(uint32_t msg_id, lv_obj_t * obj); + /** * Send a message with a given ID and payload * @param msg_id ID of the message to send diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/others/snapshot/Makefile b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/others/snapshot/Makefile similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/others/snapshot/Makefile rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/others/snapshot/Makefile diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/others/snapshot/lv_snapshot.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/others/snapshot/lv_snapshot.c similarity index 87% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/others/snapshot/lv_snapshot.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/others/snapshot/lv_snapshot.c index 1b22751..c668d01 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/others/snapshot/lv_snapshot.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/others/snapshot/lv_snapshot.c @@ -73,15 +73,15 @@ uint32_t lv_snapshot_buf_size_needed(lv_obj_t * obj, lv_img_cf_t cf) /** Take snapshot for object with its children, save image info to provided buffer. * - * @param obj The object to generate snapshot. - * @param cf color format for generated image. - * @param dsc image descriptor to store the image result. - * @param buf the buffer to store image data. - * @param buff_size provided buffer size in bytes. + * @param obj The object to generate snapshot. + * @param cf color format for generated image. + * @param dsc image descriptor to store the image result. + * @param buf the buffer to store image data. + * @param buf_size provided buffer size in bytes. * * @return LV_RES_OK on success, LV_RES_INV on error. */ -lv_res_t lv_snapshot_take_to_buf(lv_obj_t * obj, lv_img_cf_t cf, lv_img_dsc_t * dsc, void * buf, uint32_t buff_size) +lv_res_t lv_snapshot_take_to_buf(lv_obj_t * obj, lv_img_cf_t cf, lv_img_dsc_t * dsc, void * buf, uint32_t buf_size) { LV_ASSERT_NULL(obj); LV_ASSERT_NULL(dsc); @@ -99,8 +99,8 @@ lv_res_t lv_snapshot_take_to_buf(lv_obj_t * obj, lv_img_cf_t cf, lv_img_dsc_t * return LV_RES_INV; } - if(lv_snapshot_buf_size_needed(obj, cf) > buff_size) - return LV_RES_INV; + uint32_t buf_size_needed = lv_snapshot_buf_size_needed(obj, cf); + if(buf_size_needed == 0 || buf_size < buf_size_needed) return LV_RES_INV; /*Width and height determine snapshot image size.*/ lv_coord_t w = lv_obj_get_width(obj); @@ -113,7 +113,7 @@ lv_res_t lv_snapshot_take_to_buf(lv_obj_t * obj, lv_img_cf_t cf, lv_img_dsc_t * lv_obj_get_coords(obj, &snapshot_area); lv_area_increase(&snapshot_area, ext_size, ext_size); - lv_memset(buf, 0x00, buff_size); + lv_memset(buf, 0x00, buf_size); lv_memset_00(dsc, sizeof(lv_img_dsc_t)); lv_disp_t * obj_disp = lv_obj_get_disp(obj); @@ -148,6 +148,7 @@ lv_res_t lv_snapshot_take_to_buf(lv_obj_t * obj, lv_img_cf_t cf, lv_img_dsc_t * lv_mem_free(draw_ctx); dsc->data = buf; + dsc->data_size = buf_size_needed; dsc->header.w = w; dsc->header.h = h; dsc->header.cf = cf; @@ -164,9 +165,9 @@ lv_res_t lv_snapshot_take_to_buf(lv_obj_t * obj, lv_img_cf_t cf, lv_img_dsc_t * lv_img_dsc_t * lv_snapshot_take(lv_obj_t * obj, lv_img_cf_t cf) { LV_ASSERT_NULL(obj); - uint32_t buff_size = lv_snapshot_buf_size_needed(obj, cf); + uint32_t buf_size = lv_snapshot_buf_size_needed(obj, cf); - void * buf = lv_mem_alloc(buff_size); + void * buf = lv_mem_alloc(buf_size); LV_ASSERT_MALLOC(buf); if(buf == NULL) { return NULL; @@ -179,7 +180,7 @@ lv_img_dsc_t * lv_snapshot_take(lv_obj_t * obj, lv_img_cf_t cf) return NULL; } - if(lv_snapshot_take_to_buf(obj, cf, dsc, buf, buff_size) == LV_RES_INV) { + if(lv_snapshot_take_to_buf(obj, cf, dsc, buf, buf_size) == LV_RES_INV) { lv_mem_free(buf); lv_mem_free(dsc); return NULL; diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/others/snapshot/lv_snapshot.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/others/snapshot/lv_snapshot.h similarity index 84% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/others/snapshot/lv_snapshot.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/others/snapshot/lv_snapshot.h index 6451926..bde9cc2 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/others/snapshot/lv_snapshot.h +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/others/snapshot/lv_snapshot.h @@ -61,16 +61,15 @@ uint32_t lv_snapshot_buf_size_needed(lv_obj_t * obj, lv_img_cf_t cf); /** Take snapshot for object with its children, save image info to provided buffer. * - * @param obj The object to generate snapshot. - * @param cf color format for generated image. - * @param dsc image descriptor to store the image result. - * @param buff the buffer to store image data. - * @param buff_size provided buffer size in bytes. + * @param obj The object to generate snapshot. + * @param cf color format for generated image. + * @param dsc image descriptor to store the image result. + * @param buf the buffer to store image data. + * @param buf_size provided buffer size in bytes. * * @return LV_RES_OK on success, LV_RES_INV on error. */ -lv_res_t lv_snapshot_take_to_buf(lv_obj_t * obj, lv_img_cf_t cf, lv_img_dsc_t * dsc, void * buf, uint32_t buff_size); - +lv_res_t lv_snapshot_take_to_buf(lv_obj_t * obj, lv_img_cf_t cf, lv_img_dsc_t * dsc, void * buf, uint32_t buf_size); /********************** * MACROS diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/themes/Makefile b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/themes/Makefile similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/themes/Makefile rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/themes/Makefile diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/themes/basic/Makefile b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/themes/basic/Makefile similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/themes/basic/Makefile rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/themes/basic/Makefile diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/themes/basic/lv_theme_basic.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/themes/basic/lv_theme_basic.c similarity index 99% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/themes/basic/lv_theme_basic.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/themes/basic/lv_theme_basic.c index d342455..aed24bc 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/themes/basic/lv_theme_basic.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/themes/basic/lv_theme_basic.c @@ -43,7 +43,6 @@ typedef struct { #endif } my_theme_styles_t; - /********************** * STATIC PROTOTYPES **********************/ @@ -77,7 +76,6 @@ static void style_init(void) lv_style_set_bg_color(&styles->scr, COLOR_SCR); lv_style_set_text_color(&styles->scr, COLOR_DIM); - style_init_reset(&styles->transp); lv_style_set_bg_opa(&styles->transp, LV_OPA_TRANSP); @@ -130,7 +128,6 @@ static void style_init(void) #endif } - /********************** * GLOBAL FUNCTIONS **********************/ @@ -169,7 +166,6 @@ lv_theme_t * lv_theme_basic_init(lv_disp_t * disp) return (lv_theme_t *)&theme; } - static void theme_apply(lv_theme_t * th, lv_obj_t * obj) { LV_UNUSED(th); diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/themes/basic/lv_theme_basic.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/themes/basic/lv_theme_basic.h similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/themes/basic/lv_theme_basic.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/themes/basic/lv_theme_basic.h diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/themes/default/Makefile b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/themes/default/Makefile similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/themes/default/Makefile rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/themes/default/Makefile diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/themes/default/lv_theme_default.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/themes/default/lv_theme_default.c similarity index 99% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/themes/default/lv_theme_default.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/themes/default/lv_theme_default.c index 47392b0..5ca532e 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/themes/default/lv_theme_default.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/themes/default/lv_theme_default.c @@ -179,7 +179,6 @@ static lv_color_t color_card; static lv_color_t color_grey; static bool inited = false; - /********************** * MACROS **********************/ @@ -188,7 +187,6 @@ static bool inited = false; * STATIC FUNCTIONS **********************/ - static lv_color_t dark_color_filter_cb(const lv_color_filter_dsc_t * f, lv_color_t c, lv_opa_t opa) { LV_UNUSED(f); @@ -628,7 +626,6 @@ static void style_init(void) lv_style_set_transform_width(&styles->list_item_grow, PAD_DEF); #endif - #if LV_USE_LED style_init_reset(&styles->led); lv_style_set_bg_opa(&styles->led, LV_OPA_COVER); @@ -694,7 +691,6 @@ bool lv_theme_default_is_inited(void) return LV_GC_ROOT(_lv_theme_default_styles) == NULL ? false : true; } - static void theme_apply(lv_theme_t * th, lv_obj_t * obj) { LV_UNUSED(th); @@ -739,7 +735,6 @@ static void theme_apply(lv_theme_t * th, lv_obj_t * obj) } #endif - #if LV_USE_CALENDAR if(lv_obj_check_type(lv_obj_get_parent(obj), &lv_calendar_class)) { /*No style*/ @@ -978,7 +973,6 @@ static void theme_apply(lv_theme_t * th, lv_obj_t * obj) } #endif - #if LV_USE_SPINNER else if(lv_obj_check_type(obj, &lv_spinner_class)) { lv_obj_add_style(obj, &styles->arc_indic, 0); diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/themes/default/lv_theme_default.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/themes/default/lv_theme_default.h similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/themes/default/lv_theme_default.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/themes/default/lv_theme_default.h diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/themes/lv_themes.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/themes/lv_themes.h similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/themes/lv_themes.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/themes/lv_themes.h diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/themes/mono/Makefile b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/themes/mono/Makefile similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/themes/mono/Makefile rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/themes/mono/Makefile diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/themes/mono/lv_theme_mono.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/themes/mono/lv_theme_mono.c similarity index 99% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/themes/mono/lv_theme_mono.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/themes/mono/lv_theme_mono.c index b249e76..a3bd1a4 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/themes/mono/lv_theme_mono.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/themes/mono/lv_theme_mono.c @@ -52,7 +52,6 @@ typedef struct { #endif } my_theme_styles_t; - /********************** * STATIC PROTOTYPES **********************/ @@ -159,7 +158,6 @@ static void style_init(bool dark_bg, const lv_font_t * font) #endif } - /********************** * GLOBAL FUNCTIONS **********************/ @@ -196,7 +194,6 @@ lv_theme_t * lv_theme_mono_init(lv_disp_t * disp, bool dark_bg, const lv_font_t return (lv_theme_t *)&theme; } - static void theme_apply(lv_theme_t * th, lv_obj_t * obj) { LV_UNUSED(th); diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/themes/mono/lv_theme_mono.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/themes/mono/lv_theme_mono.h similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/themes/mono/lv_theme_mono.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/themes/mono/lv_theme_mono.h diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/Makefile b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/widgets/Makefile similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/Makefile rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/widgets/Makefile diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/animimg/Makefile b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/widgets/animimg/Makefile similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/animimg/Makefile rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/widgets/animimg/Makefile diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/animimg/lv_animimg.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/widgets/animimg/lv_animimg.c similarity index 97% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/animimg/lv_animimg.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/widgets/animimg/lv_animimg.c index 135a8a4..072d02e 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/animimg/lv_animimg.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/widgets/animimg/lv_animimg.c @@ -64,7 +64,7 @@ lv_obj_t * lv_animimg_create(lv_obj_t * parent) return obj; } -void lv_animimg_set_src(lv_obj_t * obj, lv_img_dsc_t * dsc[], uint8_t num) +void lv_animimg_set_src(lv_obj_t * obj, const void * dsc[], uint8_t num) { LV_ASSERT_OBJ(obj, MY_CLASS); lv_animimg_t * animimg = (lv_animimg_t *)obj; diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/animimg/lv_animimg.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/widgets/animimg/lv_animimg.h similarity index 95% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/animimg/lv_animimg.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/widgets/animimg/lv_animimg.h index 6329494..fe039bb 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/animimg/lv_animimg.h +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/widgets/animimg/lv_animimg.h @@ -37,11 +37,10 @@ typedef struct { lv_img_t img; lv_anim_t anim; /*picture sequence */ - lv_img_dsc_t ** dsc; + const void ** dsc; int8_t pic_count; } lv_animimg_t; - /*Image parts*/ enum { LV_ANIM_IMG_PART_MAIN, @@ -69,7 +68,7 @@ lv_obj_t * lv_animimg_create(lv_obj_t * parent); * @param dsc pointer to a series images * @param num images' number */ -void lv_animimg_set_src(lv_obj_t * img, lv_img_dsc_t * dsc[], uint8_t num); +void lv_animimg_set_src(lv_obj_t * img, const void * dsc[], uint8_t num); /** * Startup the image animation. diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/calendar/Makefile b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/widgets/calendar/Makefile similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/calendar/Makefile rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/widgets/calendar/Makefile diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/calendar/lv_calendar.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/widgets/calendar/lv_calendar.c similarity index 99% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/calendar/lv_calendar.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/widgets/calendar/lv_calendar.c index b806d25..16d33c8 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/calendar/lv_calendar.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/widgets/calendar/lv_calendar.c @@ -232,7 +232,6 @@ lv_res_t lv_calendar_get_pressed_date(const lv_obj_t * obj, lv_calendar_date_t * return LV_RES_OK; } - /********************** * STATIC FUNCTIONS **********************/ diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/calendar/lv_calendar.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/widgets/calendar/lv_calendar.h similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/calendar/lv_calendar.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/widgets/calendar/lv_calendar.h diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/calendar/lv_calendar_header_arrow.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/widgets/calendar/lv_calendar_header_arrow.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/calendar/lv_calendar_header_arrow.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/widgets/calendar/lv_calendar_header_arrow.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/calendar/lv_calendar_header_arrow.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/widgets/calendar/lv_calendar_header_arrow.h similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/calendar/lv_calendar_header_arrow.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/widgets/calendar/lv_calendar_header_arrow.h diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/calendar/lv_calendar_header_dropdown.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/widgets/calendar/lv_calendar_header_dropdown.c similarity index 70% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/calendar/lv_calendar_header_dropdown.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/widgets/calendar/lv_calendar_header_dropdown.c index 5e8f90d..95167f3 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/calendar/lv_calendar_header_dropdown.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/widgets/calendar/lv_calendar_header_dropdown.c @@ -66,6 +66,45 @@ lv_obj_t * lv_calendar_header_dropdown_create(lv_obj_t * parent) return obj; } +void lv_calendar_header_dropdown_set_year_list(lv_obj_t * parent, const char * years_list) +{ + bool child_found = false; + uint32_t idx = 0; + lv_obj_t * child = NULL; + + const uint32_t calendar_child_count = lv_obj_get_child_cnt(parent); + + /* Search for the header dropdown */ + for(idx = 0; idx < calendar_child_count; idx++) { + child = lv_obj_get_child(parent, idx); + if(lv_obj_check_type(child, &lv_calendar_header_dropdown_class)) { + child_found = true; + break; + } + } + + if(!child_found) return; + + child_found = false; + const uint32_t header_child_count = lv_obj_get_child_cnt(child); + + /* Search for the year dropdown */ + for(idx = 0; idx < header_child_count; idx++) { + child = lv_obj_get_child(child, idx); + if(lv_obj_check_type(child, &lv_dropdown_class)) { + child_found = true; + break; + } + } + + if(!child_found) return; + + lv_dropdown_clear_options(child); + lv_dropdown_set_options(child, years_list); + + lv_obj_invalidate(parent); +} + /********************** * STATIC FUNCTIONS **********************/ @@ -120,7 +159,14 @@ static void year_event_cb(lv_event_t * e) const lv_calendar_date_t * d; d = lv_calendar_get_showed_date(calendar); lv_calendar_date_t newd = *d; - newd.year = 2023 - sel; + + /* Get the first year on the options list + * NOTE: Assumes the first 4 digits in the option list are numbers */ + const char * year_p = lv_dropdown_get_options(dropdown); + const uint32_t year = (year_p[0] - '0') * 1000 + (year_p[1] - '0') * 100 + (year_p[2] - '0') * 10 + + (year_p[3] - '0'); + + newd.year = year - sel; lv_calendar_set_showed_date(calendar, newd.year, newd.month); } @@ -132,7 +178,14 @@ static void value_changed_event_cb(lv_event_t * e) const lv_calendar_date_t * cur_date = lv_calendar_get_showed_date(calendar); lv_obj_t * year_dd = lv_obj_get_child(header, 0); - lv_dropdown_set_selected(year_dd, 2023 - cur_date->year); + + /* Get the first year on the options list + * NOTE: Assumes the first 4 digits in the option list are numbers */ + const char * year_p = lv_dropdown_get_options(year_dd); + const uint32_t year = (year_p[0] - '0') * 1000 + (year_p[1] - '0') * 100 + (year_p[2] - '0') * 10 + + (year_p[3] - '0'); + + lv_dropdown_set_selected(year_dd, year - cur_date->year); lv_obj_t * month_dd = lv_obj_get_child(header, 1); lv_dropdown_set_selected(month_dd, cur_date->month - 1); diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/calendar/lv_calendar_header_dropdown.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/widgets/calendar/lv_calendar_header_dropdown.h similarity index 65% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/calendar/lv_calendar_header_dropdown.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/widgets/calendar/lv_calendar_header_dropdown.h index fca2197..e673a31 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/calendar/lv_calendar_header_dropdown.h +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/widgets/calendar/lv_calendar_header_dropdown.h @@ -36,6 +36,15 @@ extern const lv_obj_class_t lv_calendar_header_dropdown_class; */ lv_obj_t * lv_calendar_header_dropdown_create(lv_obj_t * parent); +/** + * Sets a custom calendar year list + * @param parent pointer to a calendar object + * @param years_list pointer to an const char array with the years list, see lv_dropdown set_options for more information. + * E.g. `const char * years = "2023\n2022\n2021\n2020\n2019" + * Only the pointer will be saved so this variable can't be local which will be destroyed later. + */ +void lv_calendar_header_dropdown_set_year_list(lv_obj_t * parent, const char * years_list); + /********************** * MACROS **********************/ diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/chart/Makefile b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/widgets/chart/Makefile similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/chart/Makefile rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/widgets/chart/Makefile diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/chart/lv_chart.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/widgets/chart/lv_chart.c similarity index 97% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/chart/lv_chart.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/widgets/chart/lv_chart.c index c5afb8b..19c74a9 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/chart/lv_chart.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/widgets/chart/lv_chart.c @@ -181,7 +181,6 @@ void lv_chart_set_div_line_count(lv_obj_t * obj, uint8_t hdiv, uint8_t vdiv) lv_obj_invalidate(obj); } - void lv_chart_set_zoom_x(lv_obj_t * obj, uint16_t zoom_x) { LV_ASSERT_OBJ(obj, MY_CLASS); @@ -261,10 +260,10 @@ uint16_t lv_chart_get_point_count(const lv_obj_t * obj) uint16_t lv_chart_get_x_start_point(const lv_obj_t * obj, lv_chart_series_t * ser) { - LV_UNUSED(obj); LV_ASSERT_NULL(ser); + lv_chart_t * chart = (lv_chart_t *)obj; - return ser->start_point; + return chart->update_mode == LV_CHART_UPDATE_MODE_SHIFT ? ser->start_point : 0; } void lv_chart_get_point_pos_by_id(lv_obj_t * obj, lv_chart_series_t * ser, uint16_t id, lv_point_t * p_out) @@ -292,28 +291,34 @@ void lv_chart_get_point_pos_by_id(lv_obj_t * obj, lv_chart_series_t * ser, uint1 } else if(chart->type == LV_CHART_TYPE_BAR) { uint32_t ser_cnt = _lv_ll_get_len(&chart->series_ll); - int32_t ser_gap = ((int32_t)lv_obj_get_style_pad_column(obj, - LV_PART_ITEMS) * chart->zoom_x) >> 8; /*Gap between the column on the ~same X*/ - int32_t block_gap = ((int32_t)lv_obj_get_style_pad_column(obj, - LV_PART_MAIN) * chart->zoom_x) >> 8; /*Gap between the column on ~adjacent X*/ - lv_coord_t block_w = (w - ((chart->point_cnt - 1) * block_gap)) / chart->point_cnt; - lv_coord_t col_w = block_w / ser_cnt; + /*Gap between the column on the X tick*/ + int32_t ser_gap = ((int32_t)lv_obj_get_style_pad_column(obj, LV_PART_ITEMS) * chart->zoom_x) >> 8; - p_out->x = (int32_t)((int32_t)w * id) / chart->point_cnt; + /*Gap between the columns on adjacent X ticks*/ + int32_t block_gap = ((int32_t)lv_obj_get_style_pad_column(obj, LV_PART_MAIN) * chart->zoom_x) >> 8; + + lv_coord_t block_w = (w - ((chart->point_cnt - 1) * block_gap)) / chart->point_cnt; lv_chart_series_t * ser_i = NULL; + uint32_t ser_idx = 0; _LV_LL_READ_BACK(&chart->series_ll, ser_i) { if(ser_i == ser) break; - p_out->x += col_w; + ser_idx++; } - p_out->x += (col_w - ser_gap) / 2; + p_out->x = (int32_t)((int32_t)(w + block_gap) * id) / chart->point_cnt; + p_out->x += block_w * ser_idx / ser_cnt; + + lv_coord_t col_w = (block_w - (ser_gap * (ser_cnt - 1))) / ser_cnt; + p_out->x += col_w / 2; } lv_coord_t border_width = lv_obj_get_style_border_width(obj, LV_PART_MAIN); p_out->x += lv_obj_get_style_pad_left(obj, LV_PART_MAIN) + border_width; p_out->x -= lv_obj_get_scroll_left(obj); + uint32_t start_point = lv_chart_get_x_start_point(obj, ser); + id = ((int32_t)start_point + id) % chart->point_cnt; int32_t temp_y = 0; temp_y = (int32_t)((int32_t)ser->y_points[id] - chart->ymin[ser->y_axis_sec]) * h; temp_y = temp_y / (chart->ymax[ser->y_axis_sec] - chart->ymin[ser->y_axis_sec]); @@ -343,6 +348,7 @@ lv_chart_series_t * lv_chart_add_series(lv_obj_t * obj, lv_color_t color, lv_cha lv_chart_series_t * ser = _lv_ll_ins_head(&chart->series_ll); LV_ASSERT_MALLOC(ser); if(ser == NULL) return NULL; + lv_memset_00(ser, sizeof(lv_chart_series_t)); lv_coord_t def = LV_CHART_POINT_NONE; @@ -360,9 +366,6 @@ lv_chart_series_t * lv_chart_add_series(lv_obj_t * obj, lv_color_t color, lv_cha return NULL; } - ser->start_point = 0; - ser->y_ext_buf_assigned = false; - ser->hidden = 0; ser->x_axis_sec = axis & LV_CHART_AXIS_SECONDARY_X ? 1 : 0; ser->y_axis_sec = axis & LV_CHART_AXIS_SECONDARY_Y ? 1 : 0; @@ -383,6 +386,7 @@ void lv_chart_remove_series(lv_obj_t * obj, lv_chart_series_t * series) lv_chart_t * chart = (lv_chart_t *)obj; if(!series->y_ext_buf_assigned && series->y_points) lv_mem_free(series->y_points); + if(!series->x_ext_buf_assigned && series->x_points) lv_mem_free(series->x_points); _lv_ll_remove(&chart->series_ll, series); lv_mem_free(series); @@ -399,7 +403,6 @@ void lv_chart_hide_series(lv_obj_t * chart, lv_chart_series_t * series, bool hid lv_chart_refresh(chart); } - void lv_chart_set_series_color(lv_obj_t * chart, lv_chart_series_t * series, lv_color_t color) { LV_ASSERT_OBJ(chart, MY_CLASS); @@ -476,7 +479,6 @@ void lv_chart_set_cursor_pos(lv_obj_t * chart, lv_chart_cursor_t * cursor, lv_po lv_chart_refresh(chart); } - /** * Set the coordinate of the cursor with respect * to the origin of series area of the chart. @@ -514,7 +516,6 @@ lv_point_t lv_chart_get_cursor_point(lv_obj_t * chart, lv_chart_cursor_t * curso * Set/Get value(s) *====================*/ - void lv_chart_set_all_value(lv_obj_t * obj, lv_chart_series_t * ser, lv_coord_t value) { LV_ASSERT_OBJ(obj, MY_CLASS); @@ -678,6 +679,7 @@ static void lv_chart_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj) ser = _lv_ll_get_head(&chart->series_ll); if(!ser->y_ext_buf_assigned) lv_mem_free(ser->y_points); + if(!ser->x_ext_buf_assigned && ser->x_points) lv_mem_free(ser->x_points); _lv_ll_remove(&chart->series_ll, ser); lv_mem_free(ser); @@ -913,7 +915,7 @@ static void draw_series_line(lv_obj_t * obj, lv_draw_ctx_t * draw_ctx) line_dsc_default.color = ser->color; point_dsc_default.bg_color = ser->color; - lv_coord_t start_point = chart->update_mode == LV_CHART_UPDATE_MODE_SHIFT ? ser->start_point : 0; + lv_coord_t start_point = lv_chart_get_x_start_point(obj, ser); p1.x = x_ofs; p2.x = x_ofs; @@ -1075,7 +1077,7 @@ static void draw_series_scatter(lv_obj_t * obj, lv_draw_ctx_t * draw_ctx) line_dsc_default.color = ser->color; point_dsc_default.bg_color = ser->color; - lv_coord_t start_point = chart->update_mode == LV_CHART_UPDATE_MODE_SHIFT ? ser->start_point : 0; + lv_coord_t start_point = lv_chart_get_x_start_point(obj, ser); p1.x = x_ofs; p2.x = x_ofs; @@ -1229,7 +1231,8 @@ static void draw_series_bar(lv_obj_t * obj, lv_draw_ctx_t * draw_ctx) /*Draw the current point of all data line*/ _LV_LL_READ_BACK(&chart->series_ll, ser) { if(ser->hidden) continue; - lv_coord_t start_point = chart->update_mode == LV_CHART_UPDATE_MODE_SHIFT ? ser->start_point : 0; + + lv_coord_t start_point = lv_chart_get_x_start_point(obj, ser); col_a.x1 = x_act; col_a.x2 = col_a.x1 + col_w - 1; @@ -1382,8 +1385,10 @@ static void draw_y_ticks(lv_obj_t * obj, lv_draw_ctx_t * draw_ctx, lv_chart_axis lv_chart_tick_dsc_t * t = get_tick_gsc(obj, axis); - if(t->major_cnt <= 1) return; if(!t->label_en && !t->major_len && !t->minor_len) return; + if(t->major_cnt <= 1) return; + uint32_t total_tick_num = (t->major_cnt - 1) * (t->minor_cnt); + if(total_tick_num == 0) return; uint8_t sec_axis = axis == LV_CHART_AXIS_PRIMARY_Y ? 0 : 1; @@ -1433,7 +1438,6 @@ static void draw_y_ticks(lv_obj_t * obj, lv_draw_ctx_t * draw_ctx, lv_chart_axis part_draw_dsc.line_dsc = &line_dsc; part_draw_dsc.label_dsc = &label_dsc; - uint32_t total_tick_num = (t->major_cnt - 1) * (t->minor_cnt); for(i = 0; i <= total_tick_num; i++) { /*draw a line at moving y position*/ p2.y = p1.y = y_ofs + (int32_t)((int32_t)(h - line_dsc.width) * i) / total_tick_num; @@ -1514,6 +1518,8 @@ static void draw_x_ticks(lv_obj_t * obj, lv_draw_ctx_t * draw_ctx, lv_chart_axis lv_chart_tick_dsc_t * t = get_tick_gsc(obj, axis); if(t->major_cnt <= 1) return; if(!t->label_en && !t->major_len && !t->minor_len) return; + uint32_t total_tick_num = (t->major_cnt - 1) * (t->minor_cnt); + if(total_tick_num == 0) return; uint32_t i; lv_point_t p1; @@ -1571,7 +1577,6 @@ static void draw_x_ticks(lv_obj_t * obj, lv_draw_ctx_t * draw_ctx, lv_chart_axis } p1.y = y_ofs; - uint32_t total_tick_num = (t->major_cnt - 1) * t->minor_cnt; for(i = 0; i <= total_tick_num; i++) { /*one extra loop - it may not exist in the list, empty label*/ bool major = false; if(i % t->minor_cnt == 0) major = true; @@ -1797,5 +1802,4 @@ lv_chart_tick_dsc_t * get_tick_gsc(lv_obj_t * obj, lv_chart_axis_t axis) } } - #endif diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/chart/lv_chart.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/widgets/chart/lv_chart.h similarity index 99% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/chart/lv_chart.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/widgets/chart/lv_chart.h index 394c0e7..ed311ab 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/chart/lv_chart.h +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/widgets/chart/lv_chart.h @@ -98,7 +98,6 @@ typedef struct { uint32_t label_en : 1; } lv_chart_tick_dsc_t; - typedef struct { lv_obj_t obj; lv_ll_t series_ll; /**< Linked list for the series (stores lv_chart_series_t)*/ @@ -315,8 +314,6 @@ void lv_chart_set_x_start_point(lv_obj_t * obj, lv_chart_series_t * ser, uint16_ */ lv_chart_series_t * lv_chart_get_series_next(const lv_obj_t * chart, const lv_chart_series_t * ser); - - /*===================== * Cursor *====================*/ diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/colorwheel/Makefile b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/widgets/colorwheel/Makefile similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/colorwheel/Makefile rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/widgets/colorwheel/Makefile diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/colorwheel/lv_colorwheel.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/widgets/colorwheel/lv_colorwheel.c similarity index 99% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/colorwheel/lv_colorwheel.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/widgets/colorwheel/lv_colorwheel.c index daf112e..d0e157d 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/colorwheel/lv_colorwheel.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/widgets/colorwheel/lv_colorwheel.c @@ -160,7 +160,6 @@ void lv_colorwheel_set_mode_fixed(lv_obj_t * obj, bool fixed) * Getter functions *====================*/ - /** * Get the current selected hsv of a color wheel. * @param colorwheel pointer to color wheel object @@ -536,8 +535,6 @@ static void lv_colorwheel_event(const lv_obj_class_t * class_p, lv_event_t * e) } } - - static void next_color_mode(lv_obj_t * obj) { lv_colorwheel_t * colorwheel = (lv_colorwheel_t *)obj; diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/colorwheel/lv_colorwheel.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/widgets/colorwheel/lv_colorwheel.h similarity index 99% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/colorwheel/lv_colorwheel.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/widgets/colorwheel/lv_colorwheel.h index e9c9d92..4494bc5 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/colorwheel/lv_colorwheel.h +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/widgets/colorwheel/lv_colorwheel.h @@ -32,7 +32,6 @@ enum { }; typedef uint8_t lv_colorwheel_mode_t; - /*Data of color picker*/ typedef struct { lv_obj_t obj; @@ -139,4 +138,3 @@ bool lv_colorwheel_get_color_mode_fixed(lv_obj_t * obj); #endif #endif /*LV_COLORWHEEL_H*/ - diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/imgbtn/Makefile b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/widgets/imgbtn/Makefile similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/imgbtn/Makefile rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/widgets/imgbtn/Makefile diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/imgbtn/lv_imgbtn.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/widgets/imgbtn/lv_imgbtn.c similarity index 97% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/imgbtn/lv_imgbtn.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/widgets/imgbtn/lv_imgbtn.c index 00c3011..6ef5d6a 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/imgbtn/lv_imgbtn.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/widgets/imgbtn/lv_imgbtn.c @@ -112,7 +112,6 @@ void lv_imgbtn_set_state(lv_obj_t * obj, lv_imgbtn_state_t state) * Getter functions *====================*/ - /** * Get the left image in a given state * @param obj pointer to an image button object @@ -156,7 +155,6 @@ const void * lv_imgbtn_get_src_right(lv_obj_t * obj, lv_imgbtn_state_t state) return imgbtn->img_src_right[state]; } - /********************** * STATIC FUNCTIONS **********************/ @@ -173,7 +171,6 @@ static void lv_imgbtn_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj imgbtn->act_cf = LV_IMG_CF_UNKNOWN; } - static void lv_imgbtn_event(const lv_obj_class_t * class_p, lv_event_t * e) { LV_UNUSED(class_p); @@ -205,6 +202,15 @@ static void lv_imgbtn_event(const lv_obj_class_t * class_p, lv_event_t * e) p->x = LV_MAX(p->x, header.w); } } + /*Sent when the widget is checked due to LV_OBJ_FLAG_CHECKABLE */ + else if(code == LV_EVENT_VALUE_CHANGED) { + if(lv_obj_has_state(obj, LV_STATE_CHECKED)) { + lv_imgbtn_set_state(obj, LV_IMGBTN_STATE_CHECKED_RELEASED); + } + else { + lv_imgbtn_set_state(obj, LV_IMGBTN_STATE_RELEASED); + } + } } static void draw_main(lv_event_t * e) @@ -266,7 +272,6 @@ static void draw_main(lv_event_t * e) clip_area_center.y1 = coords.y1; clip_area_center.y2 = coords.y2; - bool comm_res; comm_res = _lv_area_intersect(&clip_area_center, &clip_area_center, draw_ctx->clip_area); if(comm_res) { diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/imgbtn/lv_imgbtn.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/widgets/imgbtn/lv_imgbtn.h similarity index 99% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/imgbtn/lv_imgbtn.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/widgets/imgbtn/lv_imgbtn.h index 597faea..9258a90 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/imgbtn/lv_imgbtn.h +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/widgets/imgbtn/lv_imgbtn.h @@ -77,7 +77,6 @@ lv_obj_t * lv_imgbtn_create(lv_obj_t * parent); void lv_imgbtn_set_src(lv_obj_t * imgbtn, lv_imgbtn_state_t state, const void * src_left, const void * src_mid, const void * src_right); - /** * Use this function instead of `lv_obj_add/clear_state` to set a state manually * @param imgbtn pointer to an image button object @@ -113,7 +112,6 @@ const void * lv_imgbtn_get_src_middle(lv_obj_t * imgbtn, lv_imgbtn_state_t state */ const void * lv_imgbtn_get_src_right(lv_obj_t * imgbtn, lv_imgbtn_state_t state); - /*===================== * Other functions *====================*/ diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/keyboard/Makefile b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/widgets/keyboard/Makefile similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/keyboard/Makefile rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/widgets/keyboard/Makefile diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/keyboard/lv_keyboard.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/widgets/keyboard/lv_keyboard.c similarity index 99% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/keyboard/lv_keyboard.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/widgets/keyboard/lv_keyboard.c index 8e052e3..cbb5e1c 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/keyboard/lv_keyboard.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/widgets/keyboard/lv_keyboard.c @@ -73,7 +73,7 @@ static const lv_btnmatrix_ctrl_t default_kb_ctrl_uc_map[] = { }; static const char * const default_kb_map_spec[] = {"1", "2", "3", "4", "5", "6", "7", "8", "9", "0", LV_SYMBOL_BACKSPACE, "\n", - "abc", "+", "-", "/", "*", "=", "%", "!", "?", "#", "<", ">", "\n", + "abc", "+", "&", "/", "*", "=", "%", "!", "?", "#", "<", ">", "\n", "\\", "@", "$", "(", ")", "{", "}", "[", "]", ";", "\"", "'", "\n", LV_SYMBOL_KEYBOARD, LV_SYMBOL_LEFT, " ", LV_SYMBOL_RIGHT, LV_SYMBOL_OK, "" }; diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/keyboard/lv_keyboard.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/widgets/keyboard/lv_keyboard.h similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/keyboard/lv_keyboard.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/widgets/keyboard/lv_keyboard.h diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/led/Makefile b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/widgets/led/Makefile similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/led/Makefile rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/widgets/led/Makefile diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/led/lv_led.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/widgets/led/lv_led.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/led/lv_led.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/widgets/led/lv_led.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/led/lv_led.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/widgets/led/lv_led.h similarity index 99% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/led/lv_led.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/widgets/led/lv_led.h index 368bcd2..4ad1ee3 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/led/lv_led.h +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/widgets/led/lv_led.h @@ -17,7 +17,6 @@ extern "C" { #if LV_USE_LED - /********************* * DEFINES *********************/ @@ -112,5 +111,4 @@ uint8_t lv_led_get_brightness(const lv_obj_t * obj); } /*extern "C"*/ #endif - #endif /*LV_LED_H*/ diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/list/Makefile b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/widgets/list/Makefile similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/list/Makefile rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/widgets/list/Makefile diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/list/lv_list.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/widgets/list/lv_list.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/list/lv_list.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/widgets/list/lv_list.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/list/lv_list.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/widgets/list/lv_list.h similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/list/lv_list.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/widgets/list/lv_list.h diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/lv_widgets.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/widgets/lv_widgets.h similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/lv_widgets.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/widgets/lv_widgets.h diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/menu/Makefile b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/widgets/menu/Makefile similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/menu/Makefile rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/widgets/menu/Makefile diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/menu/lv_menu.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/widgets/menu/lv_menu.c similarity index 99% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/menu/lv_menu.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/widgets/menu/lv_menu.c index 78577e7..f8dfd41 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/menu/lv_menu.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/widgets/menu/lv_menu.c @@ -195,6 +195,11 @@ void lv_menu_set_page(lv_obj_t * obj, lv_obj_t * page) lv_menu_t * menu = (lv_menu_t *)obj; + /* Guard against setting the same page again */ + if(menu->main_page == page) { + return; + } + /* Hide previous page */ if(menu->main_page != NULL) { lv_obj_set_parent(menu->main_page, menu->storage); diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/menu/lv_menu.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/widgets/menu/lv_menu.h similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/menu/lv_menu.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/widgets/menu/lv_menu.h diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/meter/Makefile b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/widgets/meter/Makefile similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/meter/Makefile rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/widgets/meter/Makefile diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/meter/lv_meter.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/widgets/meter/lv_meter.c similarity index 97% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/meter/lv_meter.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/widgets/meter/lv_meter.c index 1e651b5..470764e 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/meter/lv_meter.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/widgets/meter/lv_meter.c @@ -336,7 +336,7 @@ static void draw_arcs(lv_obj_t * obj, lv_draw_ctx_t * draw_ctx, const lv_area_t scale_center.x = scale_area->x1 + r_out; scale_center.y = scale_area->y1 + r_out; - lv_opa_t opa_main = lv_obj_get_style_opa(obj, LV_PART_MAIN); + lv_opa_t opa_main = lv_obj_get_style_opa_recursive(obj, LV_PART_MAIN); lv_meter_indicator_t * indic; lv_obj_draw_part_dsc_t part_draw_dsc; @@ -360,6 +360,8 @@ static void draw_arcs(lv_obj_t * obj, lv_draw_ctx_t * draw_ctx, const lv_area_t int32_t end_angle = lv_map(indic->end_value, scale->min, scale->max, scale->rotation, scale->rotation + scale->angle_range); + arc_dsc.start_angle = start_angle; + arc_dsc.end_angle = end_angle; part_draw_dsc.radius = r_out + indic->type_data.arc.r_mod; part_draw_dsc.sub_part_ptr = indic; part_draw_dsc.p1 = &scale_center; @@ -511,7 +513,8 @@ static void draw_ticks_and_labels(lv_obj_t * obj, lv_draw_ctx_t * draw_ctx, cons lv_event_send(obj, LV_EVENT_DRAW_PART_BEGIN, &part_draw_dsc); lv_point_t label_size; - lv_txt_get_size(&label_size, part_draw_dsc.text, label_dsc.font, label_dsc.letter_space, label_dsc.line_space, + lv_txt_get_size(&label_size, part_draw_dsc.text, label_dsc_tmp.font, label_dsc_tmp.letter_space, + label_dsc_tmp.line_space, LV_COORD_MAX, LV_TEXT_FLAG_NONE); lv_area_t label_cord; @@ -546,7 +549,6 @@ static void draw_ticks_and_labels(lv_obj_t * obj, lv_draw_ctx_t * draw_ctx, cons } } - static void draw_needles(lv_obj_t * obj, lv_draw_ctx_t * draw_ctx, const lv_area_t * scale_area) { lv_meter_t * meter = (lv_meter_t *)obj; @@ -563,12 +565,13 @@ static void draw_needles(lv_obj_t * obj, lv_draw_ctx_t * draw_ctx, const lv_area lv_draw_img_dsc_t img_dsc; lv_draw_img_dsc_init(&img_dsc); lv_obj_init_draw_img_dsc(obj, LV_PART_ITEMS, &img_dsc); - lv_opa_t opa_main = lv_obj_get_style_opa(obj, LV_PART_MAIN); + lv_opa_t opa_main = lv_obj_get_style_opa_recursive(obj, LV_PART_MAIN); lv_obj_draw_part_dsc_t part_draw_dsc; lv_obj_draw_dsc_init(&part_draw_dsc, draw_ctx); part_draw_dsc.class_p = MY_CLASS; part_draw_dsc.p1 = &scale_center; + part_draw_dsc.part = LV_PART_INDICATOR; lv_meter_indicator_t * indic; _LV_LL_READ_BACK(&meter->indicator_ll, indic) { @@ -585,12 +588,12 @@ static void draw_needles(lv_obj_t * obj, lv_draw_ctx_t * draw_ctx, const lv_area line_dsc.width = indic->type_data.needle_line.width; line_dsc.opa = indic->opa > LV_OPA_MAX ? opa_main : (opa_main * indic->opa) >> 8; - part_draw_dsc.id = LV_METER_DRAW_PART_NEEDLE_LINE; + part_draw_dsc.type = LV_METER_DRAW_PART_NEEDLE_LINE; part_draw_dsc.line_dsc = &line_dsc; part_draw_dsc.p2 = &p_end; - + part_draw_dsc.p1 = &scale_center; lv_event_send(obj, LV_EVENT_DRAW_PART_BEGIN, &part_draw_dsc); - lv_draw_line(draw_ctx, &line_dsc, &scale_center, &p_end); + lv_draw_line(draw_ctx, &line_dsc, part_draw_dsc.p1, &p_end); lv_event_send(obj, LV_EVENT_DRAW_PART_END, &part_draw_dsc); } else if(indic->type == LV_METER_INDICATOR_TYPE_NEEDLE_IMG) { @@ -612,7 +615,7 @@ static void draw_needles(lv_obj_t * obj, lv_draw_ctx_t * draw_ctx, const lv_area if(angle > 3600) angle -= 3600; img_dsc.angle = angle; - part_draw_dsc.id = LV_METER_DRAW_PART_NEEDLE_IMG; + part_draw_dsc.type = LV_METER_DRAW_PART_NEEDLE_IMG; part_draw_dsc.img_dsc = &img_dsc; lv_event_send(obj, LV_EVENT_DRAW_PART_BEGIN, &part_draw_dsc); @@ -647,7 +650,6 @@ static void inv_arc(lv_obj_t * obj, lv_meter_indicator_t * indic, int32_t old_va lv_obj_invalidate_area(obj, &a); } - static void inv_line(lv_obj_t * obj, lv_meter_indicator_t * indic, int32_t value) { lv_area_t scale_area; diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/meter/lv_meter.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/widgets/meter/lv_meter.h similarity index 99% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/meter/lv_meter.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/widgets/meter/lv_meter.h index 24c1dae..1679ae8 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/meter/lv_meter.h +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/widgets/meter/lv_meter.h @@ -42,7 +42,6 @@ typedef struct { uint16_t tick_major_width; int16_t label_gap; - int16_t label_color; int32_t min; int32_t max; @@ -212,7 +211,6 @@ lv_meter_indicator_t * lv_meter_add_needle_img(lv_obj_t * obj, lv_meter_scale_t lv_meter_indicator_t * lv_meter_add_arc(lv_obj_t * obj, lv_meter_scale_t * scale, uint16_t width, lv_color_t color, int16_t r_mod); - /** * Add a scale line indicator the scale. It will modify the ticks. * @param obj pointer to a meter object @@ -247,7 +245,7 @@ void lv_meter_set_indicator_value(lv_obj_t * obj, lv_meter_indicator_t * indic, void lv_meter_set_indicator_start_value(lv_obj_t * obj, lv_meter_indicator_t * indic, int32_t value); /** - * Set the start value of the indicator. + * Set the end value of the indicator. * @param obj pointer to a meter object * @param indic pointer to an indicator * @param value the new value diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/msgbox/Makefile b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/widgets/msgbox/Makefile similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/msgbox/Makefile rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/widgets/msgbox/Makefile diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/msgbox/lv_msgbox.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/widgets/msgbox/lv_msgbox.c similarity index 98% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/msgbox/lv_msgbox.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/widgets/msgbox/lv_msgbox.c index 8db5df7..757b362 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/msgbox/lv_msgbox.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/widgets/msgbox/lv_msgbox.c @@ -106,6 +106,9 @@ lv_obj_t * lv_msgbox_create(lv_obj_t * parent, const char * title, const char * } mbox->content = lv_obj_class_create_obj(&lv_msgbox_content_class, obj); + LV_ASSERT_MALLOC(mbox->content); + if(mbox->content == NULL) return NULL; + lv_obj_class_init_obj(mbox->content); bool has_txt = txt && strlen(txt) > 0; if(has_txt) { @@ -135,7 +138,6 @@ lv_obj_t * lv_msgbox_create(lv_obj_t * parent, const char * title, const char * return obj; } - lv_obj_t * lv_msgbox_get_title(lv_obj_t * obj) { LV_ASSERT_OBJ(obj, MY_CLASS); diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/msgbox/lv_msgbox.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/widgets/msgbox/lv_msgbox.h similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/msgbox/lv_msgbox.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/widgets/msgbox/lv_msgbox.h diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/span/Makefile b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/widgets/span/Makefile similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/span/Makefile rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/widgets/span/Makefile diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/span/lv_span.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/widgets/span/lv_span.c similarity index 99% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/span/lv_span.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/widgets/span/lv_span.c index 96f0447..6f970c5 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/span/lv_span.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/widgets/span/lv_span.c @@ -779,7 +779,7 @@ static void lv_draw_span(lv_obj_t * obj, lv_draw_ctx_t * draw_ctx) lv_coord_t max_width = lv_area_get_width(&coords); lv_coord_t indent = convert_indent_pct(obj, max_width); lv_coord_t max_w = max_width - indent; /* first line need minus indent */ - lv_opa_t obj_opa = lv_obj_get_style_opa(obj, LV_PART_MAIN); + lv_opa_t obj_opa = lv_obj_get_style_opa_recursive(obj, LV_PART_MAIN); /* coords of draw span-txt */ lv_point_t txt_pos; diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/span/lv_span.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/widgets/span/lv_span.h similarity index 99% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/span/lv_span.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/widgets/span/lv_span.h index f00d04d..3709b72 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/span/lv_span.h +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/widgets/span/lv_span.h @@ -221,7 +221,6 @@ uint32_t lv_spangroup_get_expand_width(lv_obj_t * obj, uint32_t max_width); */ lv_coord_t lv_spangroup_get_expand_height(lv_obj_t * obj, lv_coord_t width); - /*===================== * Other functions *====================*/ diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/spinbox/Makefile b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/widgets/spinbox/Makefile similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/spinbox/Makefile rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/widgets/spinbox/Makefile diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/spinbox/lv_spinbox.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/widgets/spinbox/lv_spinbox.c similarity index 99% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/spinbox/lv_spinbox.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/widgets/spinbox/lv_spinbox.c index 3469105..37db45c 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/spinbox/lv_spinbox.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/widgets/spinbox/lv_spinbox.c @@ -434,9 +434,6 @@ static void lv_spinbox_event(const lv_obj_class_t * class_p, lv_event_t * e) else if(c == LV_KEY_DOWN) { lv_spinbox_decrement(obj); } - else { - lv_textarea_add_char(obj, c); - } } } diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/spinbox/lv_spinbox.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/widgets/spinbox/lv_spinbox.h similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/spinbox/lv_spinbox.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/widgets/spinbox/lv_spinbox.h diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/spinner/Makefile b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/widgets/spinner/Makefile similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/spinner/Makefile rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/widgets/spinner/Makefile diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/spinner/lv_spinner.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/widgets/spinner/lv_spinner.c similarity index 99% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/spinner/lv_spinner.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/widgets/spinner/lv_spinner.c index 6fc6d74..d0ccabd 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/spinner/lv_spinner.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/widgets/spinner/lv_spinner.c @@ -58,7 +58,6 @@ lv_obj_t * lv_spinner_create(lv_obj_t * parent, uint32_t time, uint32_t arc_leng return obj; } - /********************** * STATIC FUNCTIONS **********************/ @@ -89,13 +88,11 @@ static void lv_spinner_constructor(const lv_obj_class_t * class_p, lv_obj_t * ob lv_arc_set_rotation(obj, 270); } - static void arc_anim_start_angle(void * obj, int32_t v) { lv_arc_set_start_angle(obj, (uint16_t) v); } - static void arc_anim_end_angle(void * obj, int32_t v) { lv_arc_set_end_angle(obj, (uint16_t) v); diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/spinner/lv_spinner.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/widgets/spinner/lv_spinner.h similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/spinner/lv_spinner.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/widgets/spinner/lv_spinner.h diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/tabview/Makefile b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/widgets/tabview/Makefile similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/tabview/Makefile rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/widgets/tabview/Makefile diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/tabview/lv_tabview.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/widgets/tabview/lv_tabview.c old mode 100644 new mode 100755 similarity index 96% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/tabview/lv_tabview.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/widgets/tabview/lv_tabview.c index 81addc6..3423517 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/tabview/lv_tabview.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/widgets/tabview/lv_tabview.c @@ -77,8 +77,8 @@ lv_obj_t * lv_tabview_add_tab(lv_obj_t * obj, const char * name) lv_obj_t * btns = lv_tabview_get_tab_btns(obj); - char ** old_map = tabview->map; - char ** new_map; + const char ** old_map = (const char **)tabview->map; + const char ** new_map; /*top or bottom dir*/ if(tabview->tab_pos & LV_DIR_VER) { @@ -129,15 +129,17 @@ void lv_tabview_rename_tab(lv_obj_t * obj, uint32_t id, const char * new_name) if(id >= tabview->tab_cnt) return; if(tabview->tab_pos & LV_DIR_HOR) id *= 2; - lv_mem_free(tabview->map[id]); + lv_mem_free((void *)tabview->map[id]); tabview->map[id] = lv_mem_alloc(strlen(new_name) + 1); - strcpy(tabview->map[id], new_name); + strcpy((void *)tabview->map[id], new_name); lv_obj_invalidate(obj); } void lv_tabview_set_act(lv_obj_t * obj, uint32_t id, lv_anim_enable_t anim_en) { LV_ASSERT_OBJ(obj, MY_CLASS); + if(obj->being_deleted) return; + lv_tabview_t * tabview = (lv_tabview_t *)obj; if(id >= tabview->tab_cnt) { @@ -271,18 +273,17 @@ static void lv_tabview_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj uint32_t i; if(tabview->tab_pos & LV_DIR_VER) { for(i = 0; i < tabview->tab_cnt; i++) { - lv_mem_free(tabview->map[i]); + lv_mem_free((void *)tabview->map[i]); tabview->map[i] = NULL; } } if(tabview->tab_pos & LV_DIR_HOR) { for(i = 0; i < tabview->tab_cnt; i++) { - lv_mem_free(tabview->map[i * 2]); + lv_mem_free((void *)tabview->map[i * 2]); tabview->map[i * 2] = NULL; } } - lv_mem_free(tabview->map); tabview->map = NULL; } @@ -301,14 +302,13 @@ static void lv_tabview_event(const lv_obj_class_t * class_p, lv_event_t * e) } } - static void btns_value_changed_event_cb(lv_event_t * e) { lv_obj_t * btns = lv_event_get_target(e); lv_obj_t * tv = lv_obj_get_parent(btns); uint32_t id = lv_btnmatrix_get_selected_btn(btns); - lv_tabview_set_act(tv, id, LV_ANIM_ON); + lv_tabview_set_act(tv, id, LV_ANIM_OFF); } static void cont_scroll_end_event_cb(lv_event_t * e) diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/tabview/lv_tabview.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/widgets/tabview/lv_tabview.h similarity index 98% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/tabview/lv_tabview.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/widgets/tabview/lv_tabview.h index 388c654..ee7d7ce 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/tabview/lv_tabview.h +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/widgets/tabview/lv_tabview.h @@ -27,7 +27,7 @@ extern "C" { typedef struct { lv_obj_t obj; - char ** map; + const char ** map; uint16_t tab_cnt; uint16_t tab_cur; lv_dir_t tab_pos; diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/tileview/Makefile b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/widgets/tileview/Makefile similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/tileview/Makefile rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/widgets/tileview/Makefile diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/tileview/lv_tileview.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/widgets/tileview/lv_tileview.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/tileview/lv_tileview.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/widgets/tileview/lv_tileview.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/tileview/lv_tileview.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/widgets/tileview/lv_tileview.h similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/tileview/lv_tileview.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/widgets/tileview/lv_tileview.h diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/win/Makefile b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/widgets/win/Makefile similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/win/Makefile rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/widgets/win/Makefile diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/win/lv_win.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/widgets/win/lv_win.c similarity index 99% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/win/lv_win.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/widgets/win/lv_win.c index 92c3b8b..6b6a40b 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/win/lv_win.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/widgets/win/lv_win.c @@ -9,7 +9,6 @@ #include "lv_win.h" #if LV_USE_WIN - /********************* * DEFINES *********************/ @@ -107,4 +106,3 @@ static void lv_win_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) } #endif - diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/win/lv_win.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/widgets/win/lv_win.h similarity index 99% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/win/lv_win.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/widgets/win/lv_win.h index 4342b31..31e0e37 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/win/lv_win.h +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/extra/widgets/win/lv_win.h @@ -34,7 +34,6 @@ extern const lv_obj_class_t lv_win_class; lv_obj_t * lv_win_create(lv_obj_t * parent, lv_coord_t header_height); - lv_obj_t * lv_win_add_title(lv_obj_t * win, const char * txt); lv_obj_t * lv_win_add_btn(lv_obj_t * win, const void * icon, lv_coord_t btn_w); diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/font/Makefile b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/font/Makefile similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/font/Makefile rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/font/Makefile diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/font/korean.ttf b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/font/korean.ttf similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/font/korean.ttf rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/font/korean.ttf diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/font/lv_font.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/font/lv_font.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/font/lv_font.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/font/lv_font.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/font/lv_font.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/font/lv_font.h similarity index 99% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/font/lv_font.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/font/lv_font.h index e3b670c..3003924 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/font/lv_font.h +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/font/lv_font.h @@ -70,7 +70,7 @@ typedef struct _lv_font_t { /*Pointer to the font in a font pack (must have the same line height)*/ lv_coord_t line_height; /**< The real line height where any text fits*/ - lv_coord_t base_line; /**< Base line measured from the top of the line_height*/ + lv_coord_t base_line; /**< Base line measured from the bottom of the line_height*/ uint8_t subpx : 2; /**< An element of `lv_font_subpx_t`*/ int8_t underline_position; /**< Distance between the top of the underline and base line (< 0 means below the base line)*/ diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/font/lv_font.mk b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/font/lv_font.mk similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/font/lv_font.mk rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/font/lv_font.mk diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/font/lv_font_dejavu_16_persian_hebrew.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/font/lv_font_dejavu_16_persian_hebrew.c similarity index 99% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/font/lv_font_dejavu_16_persian_hebrew.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/font/lv_font_dejavu_16_persian_hebrew.c index fce6b0c..7233db2 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/font/lv_font_dejavu_16_persian_hebrew.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/font/lv_font_dejavu_16_persian_hebrew.c @@ -5864,7 +5864,6 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { }; - /*--------------------- * GLYPH DESCRIPTION *--------------------*/ @@ -6556,8 +6555,6 @@ static const lv_font_fmt_txt_cmap_t cmaps[] = { } }; - - /*-------------------- * ALL CUSTOM DATA *--------------------*/ @@ -6583,7 +6580,6 @@ static lv_font_fmt_txt_dsc_t font_dsc = { #endif }; - /*----------------- * PUBLIC FONT *----------------*/ @@ -6608,7 +6604,4 @@ lv_font_t lv_font_dejavu_16_persian_hebrew = { .dsc = &font_dsc /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */ }; - - #endif /*#if LV_FONT_DEJAVU_16_PERSIAN_HEBREW*/ - diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/font/lv_font_fmt_txt.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/font/lv_font_fmt_txt.c similarity index 99% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/font/lv_font_fmt_txt.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/font/lv_font_fmt_txt.c index 7a36f01..78beaff 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/font/lv_font_fmt_txt.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/font/lv_font_fmt_txt.c @@ -148,10 +148,10 @@ const uint8_t * lv_font_get_bitmap_fmt_txt(const lv_font_t * font, uint32_t unic bool lv_font_get_glyph_dsc_fmt_txt(const lv_font_t * font, lv_font_glyph_dsc_t * dsc_out, uint32_t unicode_letter, uint32_t unicode_letter_next) { - bool is_tab = false; - if(unicode_letter == '\t') { + /*It fixes a strange compiler optimization issue: https://github.com/lvgl/lvgl/issues/4370*/ + bool is_tab = unicode_letter == '\t'; + if(is_tab) { unicode_letter = ' '; - is_tab = true; } lv_font_fmt_txt_dsc_t * fdsc = (lv_font_fmt_txt_dsc_t *)font->dsc; uint32_t gid = get_glyph_dsc_id(font, unicode_letter); diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/font/lv_font_fmt_txt.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/font/lv_font_fmt_txt.h similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/font/lv_font_fmt_txt.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/font/lv_font_fmt_txt.h diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/font/lv_font_loader.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/font/lv_font_loader.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/font/lv_font_loader.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/font/lv_font_loader.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/font/lv_font_loader.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/font/lv_font_loader.h similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/font/lv_font_loader.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/font/lv_font_loader.h diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_10.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/font/lv_font_montserrat_10.c similarity index 99% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_10.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/font/lv_font_montserrat_10.c index 485d9f6..a3bc763 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_10.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/font/lv_font_montserrat_10.c @@ -973,7 +973,6 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, 0x0 }; - /*--------------------- * GLYPH DESCRIPTION *--------------------*/ @@ -1170,7 +1169,6 @@ static const lv_font_fmt_txt_cmap_t cmaps[] = { * KERNING *----------------*/ - /*Map glyph_ids to kern left classes*/ static const uint8_t kern_left_class_mapping[] = { 0, 0, 1, 2, 0, 3, 4, 5, @@ -1597,7 +1595,6 @@ static const int8_t kern_class_values[] = { 0, 0, 0, 0, 0 }; - /*Collect the kern class' data in one place*/ static const lv_font_fmt_txt_kern_classes_t kern_classes = { .class_pair_values = kern_class_values, @@ -1632,7 +1629,6 @@ static lv_font_fmt_txt_dsc_t font_dsc = { #endif }; - /*----------------- * PUBLIC FONT *----------------*/ @@ -1657,7 +1653,4 @@ lv_font_t lv_font_montserrat_10 = { .dsc = &font_dsc /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */ }; - - #endif /*#if LV_FONT_MONTSERRAT_10*/ - diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_12.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/font/lv_font_montserrat_12.c similarity index 99% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_12.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/font/lv_font_montserrat_12.c index e84d00c..a220fe2 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_12.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/font/lv_font_montserrat_12.c @@ -1234,7 +1234,6 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0x0, 0x0, 0x0 }; - /*--------------------- * GLYPH DESCRIPTION *--------------------*/ @@ -1431,7 +1430,6 @@ static const lv_font_fmt_txt_cmap_t cmaps[] = { * KERNING *----------------*/ - /*Map glyph_ids to kern left classes*/ static const uint8_t kern_left_class_mapping[] = { 0, 0, 1, 2, 0, 3, 4, 5, @@ -1858,7 +1856,6 @@ static const int8_t kern_class_values[] = { 0, 0, 0, 0, 0 }; - /*Collect the kern class' data in one place*/ static const lv_font_fmt_txt_kern_classes_t kern_classes = { .class_pair_values = kern_class_values, @@ -1893,7 +1890,6 @@ static lv_font_fmt_txt_dsc_t font_dsc = { #endif }; - /*----------------- * PUBLIC FONT *----------------*/ @@ -1918,7 +1914,4 @@ lv_font_t lv_font_montserrat_12 = { .dsc = &font_dsc /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */ }; - - #endif /*#if LV_FONT_MONTSERRAT_12*/ - diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_12_subpx.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/font/lv_font_montserrat_12_subpx.c similarity index 99% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_12_subpx.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/font/lv_font_montserrat_12_subpx.c index 1ffd7ed..8cf2135 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_12_subpx.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/font/lv_font_montserrat_12_subpx.c @@ -3175,7 +3175,6 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0x0, 0x0, 0x0, 0x0, 0x0 }; - /*--------------------- * GLYPH DESCRIPTION *--------------------*/ @@ -3372,7 +3371,6 @@ static const lv_font_fmt_txt_cmap_t cmaps[] = { * KERNING *----------------*/ - /*Map glyph_ids to kern left classes*/ static const uint8_t kern_left_class_mapping[] = { 0, 0, 1, 2, 0, 3, 4, 5, @@ -3799,7 +3797,6 @@ static const int8_t kern_class_values[] = { 0, 0, 0, 0, 0 }; - /*Collect the kern class' data in one place*/ static const lv_font_fmt_txt_kern_classes_t kern_classes = { .class_pair_values = kern_class_values, @@ -3834,7 +3831,6 @@ static lv_font_fmt_txt_dsc_t font_dsc = { #endif }; - /*----------------- * PUBLIC FONT *----------------*/ @@ -3859,7 +3855,4 @@ lv_font_t lv_font_montserrat_12_subpx = { .dsc = &font_dsc /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */ }; - - #endif /*#if LV_FONT_MONTSERRAT_12_SUBPX*/ - diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_14.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/font/lv_font_montserrat_14.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_14.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/font/lv_font_montserrat_14.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_16.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/font/lv_font_montserrat_16.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_16.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/font/lv_font_montserrat_16.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_18.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/font/lv_font_montserrat_18.c similarity index 99% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_18.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/font/lv_font_montserrat_18.c index c2e5d1d..402385b 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_18.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/font/lv_font_montserrat_18.c @@ -2179,7 +2179,6 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0x0, 0x0 }; - /*--------------------- * GLYPH DESCRIPTION *--------------------*/ @@ -2376,7 +2375,6 @@ static const lv_font_fmt_txt_cmap_t cmaps[] = { * KERNING *----------------*/ - /*Map glyph_ids to kern left classes*/ static const uint8_t kern_left_class_mapping[] = { 0, 0, 1, 2, 0, 3, 4, 5, @@ -2803,7 +2801,6 @@ static const int8_t kern_class_values[] = { 0, 0, 0, 0, 0 }; - /*Collect the kern class' data in one place*/ static const lv_font_fmt_txt_kern_classes_t kern_classes = { .class_pair_values = kern_class_values, @@ -2838,7 +2835,6 @@ static lv_font_fmt_txt_dsc_t font_dsc = { #endif }; - /*----------------- * PUBLIC FONT *----------------*/ @@ -2863,7 +2859,4 @@ lv_font_t lv_font_montserrat_18 = { .dsc = &font_dsc /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */ }; - - #endif /*#if LV_FONT_MONTSERRAT_18*/ - diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_20.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/font/lv_font_montserrat_20.c similarity index 99% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_20.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/font/lv_font_montserrat_20.c index bf11639..1b608c2 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_20.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/font/lv_font_montserrat_20.c @@ -2536,7 +2536,6 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0x0 }; - /*--------------------- * GLYPH DESCRIPTION *--------------------*/ @@ -2733,7 +2732,6 @@ static const lv_font_fmt_txt_cmap_t cmaps[] = { * KERNING *----------------*/ - /*Map glyph_ids to kern left classes*/ static const uint8_t kern_left_class_mapping[] = { 0, 0, 1, 2, 0, 3, 4, 5, @@ -3160,7 +3158,6 @@ static const int8_t kern_class_values[] = { 0, 0, 0, 0, 0 }; - /*Collect the kern class' data in one place*/ static const lv_font_fmt_txt_kern_classes_t kern_classes = { .class_pair_values = kern_class_values, @@ -3195,7 +3192,6 @@ static lv_font_fmt_txt_dsc_t font_dsc = { #endif }; - /*----------------- * PUBLIC FONT *----------------*/ @@ -3220,7 +3216,4 @@ lv_font_t lv_font_montserrat_20 = { .dsc = &font_dsc /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */ }; - - #endif /*#if LV_FONT_MONTSERRAT_20*/ - diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_22.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/font/lv_font_montserrat_22.c similarity index 99% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_22.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/font/lv_font_montserrat_22.c index d96a666..72e467f 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_22.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/font/lv_font_montserrat_22.c @@ -2965,7 +2965,6 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0x0 }; - /*--------------------- * GLYPH DESCRIPTION *--------------------*/ @@ -3162,7 +3161,6 @@ static const lv_font_fmt_txt_cmap_t cmaps[] = { * KERNING *----------------*/ - /*Map glyph_ids to kern left classes*/ static const uint8_t kern_left_class_mapping[] = { 0, 0, 1, 2, 0, 3, 4, 5, @@ -3589,7 +3587,6 @@ static const int8_t kern_class_values[] = { 0, 0, 0, 0, 0 }; - /*Collect the kern class' data in one place*/ static const lv_font_fmt_txt_kern_classes_t kern_classes = { .class_pair_values = kern_class_values, @@ -3624,7 +3621,6 @@ static lv_font_fmt_txt_dsc_t font_dsc = { #endif }; - /*----------------- * PUBLIC FONT *----------------*/ @@ -3649,7 +3645,4 @@ lv_font_t lv_font_montserrat_22 = { .dsc = &font_dsc /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */ }; - - #endif /*#if LV_FONT_MONTSERRAT_22*/ - diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_24.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/font/lv_font_montserrat_24.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_24.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/font/lv_font_montserrat_24.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_26.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/font/lv_font_montserrat_26.c similarity index 99% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_26.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/font/lv_font_montserrat_26.c index 416d840..fdd9245 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_26.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/font/lv_font_montserrat_26.c @@ -3911,7 +3911,6 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0x0, 0x0, 0x0 }; - /*--------------------- * GLYPH DESCRIPTION *--------------------*/ @@ -4108,7 +4107,6 @@ static const lv_font_fmt_txt_cmap_t cmaps[] = { * KERNING *----------------*/ - /*Map glyph_ids to kern left classes*/ static const uint8_t kern_left_class_mapping[] = { 0, 0, 1, 2, 0, 3, 4, 5, @@ -4535,7 +4533,6 @@ static const int8_t kern_class_values[] = { 0, 0, 0, 0, 0 }; - /*Collect the kern class' data in one place*/ static const lv_font_fmt_txt_kern_classes_t kern_classes = { .class_pair_values = kern_class_values, @@ -4570,7 +4567,6 @@ static lv_font_fmt_txt_dsc_t font_dsc = { #endif }; - /*----------------- * PUBLIC FONT *----------------*/ @@ -4595,7 +4591,4 @@ lv_font_t lv_font_montserrat_26 = { .dsc = &font_dsc /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */ }; - - #endif /*#if LV_FONT_MONTSERRAT_26*/ - diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_28.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/font/lv_font_montserrat_28.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_28.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/font/lv_font_montserrat_28.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_28_compressed.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/font/lv_font_montserrat_28_compressed.c similarity index 99% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_28_compressed.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/font/lv_font_montserrat_28_compressed.c index 4612584..e870315 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_28_compressed.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/font/lv_font_montserrat_28_compressed.c @@ -2590,7 +2590,6 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0xff, 0x3a, 0xba, 0x40, 0x3f, 0xf9, 0x0 }; - /*--------------------- * GLYPH DESCRIPTION *--------------------*/ @@ -2787,7 +2786,6 @@ static const lv_font_fmt_txt_cmap_t cmaps[] = { * KERNING *----------------*/ - /*Map glyph_ids to kern left classes*/ static const uint8_t kern_left_class_mapping[] = { 0, 0, 1, 2, 0, 3, 4, 5, @@ -3214,7 +3212,6 @@ static const int8_t kern_class_values[] = { 0, 0, 0, 0, 0 }; - /*Collect the kern class' data in one place*/ static const lv_font_fmt_txt_kern_classes_t kern_classes = { .class_pair_values = kern_class_values, @@ -3249,7 +3246,6 @@ static lv_font_fmt_txt_dsc_t font_dsc = { #endif }; - /*----------------- * PUBLIC FONT *----------------*/ @@ -3274,7 +3270,4 @@ lv_font_t lv_font_montserrat_28_compressed = { .dsc = &font_dsc /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */ }; - - #endif /*#if LV_FONT_MONTSERRAT_28_COMPRESSED*/ - diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_30.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/font/lv_font_montserrat_30.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_30.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/font/lv_font_montserrat_30.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_32.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/font/lv_font_montserrat_32.c similarity index 99% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_32.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/font/lv_font_montserrat_32.c index f4dad0c..bd3d31a 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_32.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/font/lv_font_montserrat_32.c @@ -5531,7 +5531,6 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0x0, 0x0, 0x0 }; - /*--------------------- * GLYPH DESCRIPTION *--------------------*/ @@ -5728,7 +5727,6 @@ static const lv_font_fmt_txt_cmap_t cmaps[] = { * KERNING *----------------*/ - /*Map glyph_ids to kern left classes*/ static const uint8_t kern_left_class_mapping[] = { 0, 0, 1, 2, 0, 3, 4, 5, @@ -6155,7 +6153,6 @@ static const int8_t kern_class_values[] = { 0, 0, 0, 0, 0 }; - /*Collect the kern class' data in one place*/ static const lv_font_fmt_txt_kern_classes_t kern_classes = { .class_pair_values = kern_class_values, @@ -6190,7 +6187,6 @@ static lv_font_fmt_txt_dsc_t font_dsc = { #endif }; - /*----------------- * PUBLIC FONT *----------------*/ @@ -6215,7 +6211,4 @@ lv_font_t lv_font_montserrat_32 = { .dsc = &font_dsc /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */ }; - - #endif /*#if LV_FONT_MONTSERRAT_32*/ - diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_34.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/font/lv_font_montserrat_34.c similarity index 99% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_34.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/font/lv_font_montserrat_34.c index 064bb0a..143be23 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_34.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/font/lv_font_montserrat_34.c @@ -6330,7 +6330,6 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0x0 }; - /*--------------------- * GLYPH DESCRIPTION *--------------------*/ @@ -6527,7 +6526,6 @@ static const lv_font_fmt_txt_cmap_t cmaps[] = { * KERNING *----------------*/ - /*Map glyph_ids to kern left classes*/ static const uint8_t kern_left_class_mapping[] = { 0, 0, 1, 2, 0, 3, 4, 5, @@ -6954,7 +6952,6 @@ static const int8_t kern_class_values[] = { 0, 0, 0, 0, 0 }; - /*Collect the kern class' data in one place*/ static const lv_font_fmt_txt_kern_classes_t kern_classes = { .class_pair_values = kern_class_values, @@ -6989,7 +6986,6 @@ static lv_font_fmt_txt_dsc_t font_dsc = { #endif }; - /*----------------- * PUBLIC FONT *----------------*/ @@ -7014,7 +7010,4 @@ lv_font_t lv_font_montserrat_34 = { .dsc = &font_dsc /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */ }; - - #endif /*#if LV_FONT_MONTSERRAT_34*/ - diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_36.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/font/lv_font_montserrat_36.c similarity index 99% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_36.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/font/lv_font_montserrat_36.c index e5b2b68..60ed905 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_36.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/font/lv_font_montserrat_36.c @@ -6974,7 +6974,6 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0x0, 0x0 }; - /*--------------------- * GLYPH DESCRIPTION *--------------------*/ @@ -7171,7 +7170,6 @@ static const lv_font_fmt_txt_cmap_t cmaps[] = { * KERNING *----------------*/ - /*Map glyph_ids to kern left classes*/ static const uint8_t kern_left_class_mapping[] = { 0, 0, 1, 2, 0, 3, 4, 5, @@ -7598,7 +7596,6 @@ static const int8_t kern_class_values[] = { 0, 0, 0, 0, 0 }; - /*Collect the kern class' data in one place*/ static const lv_font_fmt_txt_kern_classes_t kern_classes = { .class_pair_values = kern_class_values, @@ -7633,7 +7630,6 @@ static lv_font_fmt_txt_dsc_t font_dsc = { #endif }; - /*----------------- * PUBLIC FONT *----------------*/ @@ -7658,7 +7654,4 @@ lv_font_t lv_font_montserrat_36 = { .dsc = &font_dsc /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */ }; - - #endif /*#if LV_FONT_MONTSERRAT_36*/ - diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_38.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/font/lv_font_montserrat_38.c similarity index 99% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_38.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/font/lv_font_montserrat_38.c index 883eae5..7882ee5 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_38.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/font/lv_font_montserrat_38.c @@ -7719,7 +7719,6 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 }; - /*--------------------- * GLYPH DESCRIPTION *--------------------*/ @@ -7916,7 +7915,6 @@ static const lv_font_fmt_txt_cmap_t cmaps[] = { * KERNING *----------------*/ - /*Map glyph_ids to kern left classes*/ static const uint8_t kern_left_class_mapping[] = { 0, 0, 1, 2, 0, 3, 4, 5, @@ -8343,7 +8341,6 @@ static const int8_t kern_class_values[] = { 0, 0, 0, 0, 0 }; - /*Collect the kern class' data in one place*/ static const lv_font_fmt_txt_kern_classes_t kern_classes = { .class_pair_values = kern_class_values, @@ -8378,7 +8375,6 @@ static lv_font_fmt_txt_dsc_t font_dsc = { #endif }; - /*----------------- * PUBLIC FONT *----------------*/ @@ -8403,7 +8399,4 @@ lv_font_t lv_font_montserrat_38 = { .dsc = &font_dsc /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */ }; - - #endif /*#if LV_FONT_MONTSERRAT_38*/ - diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_40.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/font/lv_font_montserrat_40.c similarity index 99% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_40.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/font/lv_font_montserrat_40.c index 0769235..5afb1d2 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_40.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/font/lv_font_montserrat_40.c @@ -8567,7 +8567,6 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0x0, 0x0, 0x0, 0x0, 0x0 }; - /*--------------------- * GLYPH DESCRIPTION *--------------------*/ @@ -8764,7 +8763,6 @@ static const lv_font_fmt_txt_cmap_t cmaps[] = { * KERNING *----------------*/ - /*Map glyph_ids to kern left classes*/ static const uint8_t kern_left_class_mapping[] = { 0, 0, 1, 2, 0, 3, 4, 5, @@ -9191,7 +9189,6 @@ static const int8_t kern_class_values[] = { 0, 0, 0, 0, 0 }; - /*Collect the kern class' data in one place*/ static const lv_font_fmt_txt_kern_classes_t kern_classes = { .class_pair_values = kern_class_values, @@ -9226,7 +9223,6 @@ static lv_font_fmt_txt_dsc_t font_dsc = { #endif }; - /*----------------- * PUBLIC FONT *----------------*/ @@ -9251,7 +9247,4 @@ lv_font_t lv_font_montserrat_40 = { .dsc = &font_dsc /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */ }; - - #endif /*#if LV_FONT_MONTSERRAT_40*/ - diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_42.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/font/lv_font_montserrat_42.c similarity index 99% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_42.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/font/lv_font_montserrat_42.c index a656393..c1c6c04 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_42.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/font/lv_font_montserrat_42.c @@ -9409,7 +9409,6 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0x0, 0x0 }; - /*--------------------- * GLYPH DESCRIPTION *--------------------*/ @@ -9606,7 +9605,6 @@ static const lv_font_fmt_txt_cmap_t cmaps[] = { * KERNING *----------------*/ - /*Map glyph_ids to kern left classes*/ static const uint8_t kern_left_class_mapping[] = { 0, 0, 1, 2, 0, 3, 4, 5, @@ -10033,7 +10031,6 @@ static const int8_t kern_class_values[] = { 0, 0, 0, 0, 0 }; - /*Collect the kern class' data in one place*/ static const lv_font_fmt_txt_kern_classes_t kern_classes = { .class_pair_values = kern_class_values, @@ -10068,7 +10065,6 @@ static lv_font_fmt_txt_dsc_t font_dsc = { #endif }; - /*----------------- * PUBLIC FONT *----------------*/ @@ -10093,7 +10089,4 @@ lv_font_t lv_font_montserrat_42 = { .dsc = &font_dsc /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */ }; - - #endif /*#if LV_FONT_MONTSERRAT_42*/ - diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_44.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/font/lv_font_montserrat_44.c similarity index 99% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_44.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/font/lv_font_montserrat_44.c index 4156909..062d9ac 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_44.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/font/lv_font_montserrat_44.c @@ -10235,7 +10235,6 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0x0, 0x0, 0x0, 0x0, 0x0 }; - /*--------------------- * GLYPH DESCRIPTION *--------------------*/ @@ -10432,7 +10431,6 @@ static const lv_font_fmt_txt_cmap_t cmaps[] = { * KERNING *----------------*/ - /*Map glyph_ids to kern left classes*/ static const uint8_t kern_left_class_mapping[] = { 0, 0, 1, 2, 0, 3, 4, 5, @@ -10859,7 +10857,6 @@ static const int8_t kern_class_values[] = { 0, 0, 0, 0, 0 }; - /*Collect the kern class' data in one place*/ static const lv_font_fmt_txt_kern_classes_t kern_classes = { .class_pair_values = kern_class_values, @@ -10894,7 +10891,6 @@ static lv_font_fmt_txt_dsc_t font_dsc = { #endif }; - /*----------------- * PUBLIC FONT *----------------*/ @@ -10919,7 +10915,4 @@ lv_font_t lv_font_montserrat_44 = { .dsc = &font_dsc /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */ }; - - #endif /*#if LV_FONT_MONTSERRAT_44*/ - diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_46.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/font/lv_font_montserrat_46.c similarity index 99% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_46.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/font/lv_font_montserrat_46.c index 745b42c..7b9022b 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_46.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/font/lv_font_montserrat_46.c @@ -11187,7 +11187,6 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0x0 }; - /*--------------------- * GLYPH DESCRIPTION *--------------------*/ @@ -11384,7 +11383,6 @@ static const lv_font_fmt_txt_cmap_t cmaps[] = { * KERNING *----------------*/ - /*Map glyph_ids to kern left classes*/ static const uint8_t kern_left_class_mapping[] = { 0, 0, 1, 2, 0, 3, 4, 5, @@ -11811,7 +11809,6 @@ static const int8_t kern_class_values[] = { 0, 0, 0, 0, 0 }; - /*Collect the kern class' data in one place*/ static const lv_font_fmt_txt_kern_classes_t kern_classes = { .class_pair_values = kern_class_values, @@ -11846,7 +11843,6 @@ static lv_font_fmt_txt_dsc_t font_dsc = { #endif }; - /*----------------- * PUBLIC FONT *----------------*/ @@ -11871,7 +11867,4 @@ lv_font_t lv_font_montserrat_46 = { .dsc = &font_dsc /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */ }; - - #endif /*#if LV_FONT_MONTSERRAT_46*/ - diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_48.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/font/lv_font_montserrat_48.c similarity index 99% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_48.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/font/lv_font_montserrat_48.c index 9961b83..12299c5 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_48.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/font/lv_font_montserrat_48.c @@ -11888,7 +11888,6 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 }; - /*--------------------- * GLYPH DESCRIPTION *--------------------*/ @@ -12085,7 +12084,6 @@ static const lv_font_fmt_txt_cmap_t cmaps[] = { * KERNING *----------------*/ - /*Map glyph_ids to kern left classes*/ static const uint8_t kern_left_class_mapping[] = { 0, 0, 1, 2, 0, 3, 4, 5, @@ -12512,7 +12510,6 @@ static const int8_t kern_class_values[] = { 0, 0, 0, 0, 0 }; - /*Collect the kern class' data in one place*/ static const lv_font_fmt_txt_kern_classes_t kern_classes = { .class_pair_values = kern_class_values, @@ -12547,7 +12544,6 @@ static lv_font_fmt_txt_dsc_t font_dsc = { #endif }; - /*----------------- * PUBLIC FONT *----------------*/ @@ -12572,7 +12568,4 @@ lv_font_t lv_font_montserrat_48 = { .dsc = &font_dsc /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */ }; - - #endif /*#if LV_FONT_MONTSERRAT_48*/ - diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_8.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/font/lv_font_montserrat_8.c similarity index 99% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_8.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/font/lv_font_montserrat_8.c index 3903332..6c901bb 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_8.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/font/lv_font_montserrat_8.c @@ -759,7 +759,6 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0x0, 0x0, 0x0 }; - /*--------------------- * GLYPH DESCRIPTION *--------------------*/ @@ -956,7 +955,6 @@ static const lv_font_fmt_txt_cmap_t cmaps[] = { * KERNING *----------------*/ - /*Map glyph_ids to kern left classes*/ static const uint8_t kern_left_class_mapping[] = { 0, 0, 1, 2, 0, 3, 4, 5, @@ -1383,7 +1381,6 @@ static const int8_t kern_class_values[] = { 0, 0, 0, 0, 0 }; - /*Collect the kern class' data in one place*/ static const lv_font_fmt_txt_kern_classes_t kern_classes = { .class_pair_values = kern_class_values, @@ -1418,7 +1415,6 @@ static lv_font_fmt_txt_dsc_t font_dsc = { #endif }; - /*----------------- * PUBLIC FONT *----------------*/ @@ -1443,7 +1439,4 @@ lv_font_t lv_font_montserrat_8 = { .dsc = &font_dsc /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */ }; - - #endif /*#if LV_FONT_MONTSERRAT_8*/ - diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/font/lv_font_simsun_16_cjk.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/font/lv_font_simsun_16_cjk.c similarity index 99% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/font/lv_font_simsun_16_cjk.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/font/lv_font_simsun_16_cjk.c index bcd7c14..73abe1b 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/font/lv_font_simsun_16_cjk.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/font/lv_font_simsun_16_cjk.c @@ -22100,7 +22100,6 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0x2f, 0xdd, 0xdd, 0x80, 0x0, 0x0, 0x0, 0x0 }; - /*--------------------- * GLYPH DESCRIPTION *--------------------*/ @@ -23723,8 +23722,6 @@ static const lv_font_fmt_txt_cmap_t cmaps[] = { } }; - - /*-------------------- * ALL CUSTOM DATA *--------------------*/ @@ -23750,7 +23747,6 @@ static lv_font_fmt_txt_dsc_t font_dsc = { #endif }; - /*----------------- * PUBLIC FONT *----------------*/ @@ -23775,7 +23771,4 @@ lv_font_t lv_font_simsun_16_cjk = { .dsc = &font_dsc /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */ }; - - #endif /*#if LV_FONT_SIMSUN_16_CJK*/ - diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/font/lv_font_unscii_16.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/font/lv_font_unscii_16.c similarity index 99% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/font/lv_font_unscii_16.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/font/lv_font_unscii_16.c index d6b0eaa..1a897bb 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/font/lv_font_unscii_16.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/font/lv_font_unscii_16.c @@ -475,7 +475,6 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0xc0 }; - /*--------------------- * GLYPH DESCRIPTION *--------------------*/ @@ -584,8 +583,6 @@ static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = { * CHARACTER MAPPING *--------------------*/ - - /*Collect the unicode lists and glyph_id offsets*/ static const lv_font_fmt_txt_cmap_t cmaps[] = { { @@ -594,8 +591,6 @@ static const lv_font_fmt_txt_cmap_t cmaps[] = { } }; - - /*-------------------- * ALL CUSTOM DATA *--------------------*/ @@ -621,7 +616,6 @@ static lv_font_fmt_txt_dsc_t font_dsc = { #endif }; - /*----------------- * PUBLIC FONT *----------------*/ @@ -646,7 +640,4 @@ lv_font_t lv_font_unscii_16 = { .dsc = &font_dsc /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */ }; - - #endif /*#if LV_FONT_UNSCII_16*/ - diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/font/lv_font_unscii_8.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/font/lv_font_unscii_8.c similarity index 99% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/font/lv_font_unscii_8.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/font/lv_font_unscii_8.c index 1b03c85..9680cdd 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/font/lv_font_unscii_8.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/font/lv_font_unscii_8.c @@ -311,7 +311,6 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0xc1, 0x42, 0xbd, 0x2c, 0x40, 0x81, 0x0 }; - /*--------------------- * GLYPH DESCRIPTION *--------------------*/ @@ -420,8 +419,6 @@ static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = { * CHARACTER MAPPING *--------------------*/ - - /*Collect the unicode lists and glyph_id offsets*/ static const lv_font_fmt_txt_cmap_t cmaps[] = { { @@ -430,8 +427,6 @@ static const lv_font_fmt_txt_cmap_t cmaps[] = { } }; - - /*-------------------- * ALL CUSTOM DATA *--------------------*/ @@ -457,7 +452,6 @@ static lv_font_fmt_txt_dsc_t font_dsc = { #endif }; - /*----------------- * PUBLIC FONT *----------------*/ @@ -482,7 +476,4 @@ lv_font_t lv_font_unscii_8 = { .dsc = &font_dsc /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */ }; - - #endif /*#if LV_FONT_UNSCII_8*/ - diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/font/lv_symbol_def.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/font/lv_symbol_def.h similarity index 99% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/font/lv_symbol_def.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/font/lv_symbol_def.h index 696daf1..7c23658 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/font/lv_symbol_def.h +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/font/lv_symbol_def.h @@ -31,7 +31,6 @@ extern "C" { * If they are not predefined, they will use the following values */ - #if !defined LV_SYMBOL_AUDIO #define LV_SYMBOL_AUDIO "\xEF\x80\x81" /*61441, 0xF001*/ #endif diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/hal/Makefile b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/hal/Makefile similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/hal/Makefile rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/hal/Makefile diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/hal/lv_hal.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/hal/lv_hal.h similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/hal/lv_hal.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/hal/lv_hal.h diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/hal/lv_hal.mk b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/hal/lv_hal.mk similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/hal/lv_hal.mk rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/hal/lv_hal.mk diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/hal/lv_hal_disp.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/hal/lv_hal_disp.c similarity index 94% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/hal/lv_hal_disp.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/hal/lv_hal_disp.c index 0dd8f6b..f395e1d 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/hal/lv_hal_disp.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/hal/lv_hal_disp.c @@ -23,9 +23,10 @@ #include "../draw/stm32_dma2d/lv_gpu_stm32_dma2d.h" #include "../draw/swm341_dma2d/lv_gpu_swm341_dma2d.h" #include "../draw/arm2d/lv_gpu_arm2d.h" -#if LV_USE_GPU_NXP_PXP || LV_USE_GPU_NXP_VG_LITE - #include "../draw/nxp/lv_gpu_nxp.h" -#endif +#include "../draw/nxp/vglite/lv_draw_vglite.h" +#include "../draw/nxp/pxp/lv_draw_pxp.h" +#include "../draw/renesas/lv_gpu_d2_ra6m3.h" +#include "../draw/nema_gfx/lv_draw_nema_gfx.h" #if LV_USE_THEME_DEFAULT #include "../extra/themes/default/lv_theme_default.h" @@ -96,8 +97,11 @@ void lv_disp_drv_init(lv_disp_drv_t * driver) driver->dpi = LV_DPI_DEF; driver->color_chroma_key = LV_COLOR_CHROMA_KEY; - -#if LV_USE_GPU_STM32_DMA2D +#if LV_USE_GPU_RA6M3_G2D + driver->draw_ctx_init = lv_draw_ra6m3_2d_ctx_init; + driver->draw_ctx_deinit = lv_draw_ra6m3_2d_ctx_init; + driver->draw_ctx_size = sizeof(lv_draw_ra6m3_dma2d_ctx_t); +#elif LV_USE_GPU_STM32_DMA2D driver->draw_ctx_init = lv_draw_stm32_dma2d_ctx_init; driver->draw_ctx_deinit = lv_draw_stm32_dma2d_ctx_init; driver->draw_ctx_size = sizeof(lv_draw_stm32_dma2d_ctx_t); @@ -105,10 +109,14 @@ void lv_disp_drv_init(lv_disp_drv_t * driver) driver->draw_ctx_init = lv_draw_swm341_dma2d_ctx_init; driver->draw_ctx_deinit = lv_draw_swm341_dma2d_ctx_init; driver->draw_ctx_size = sizeof(lv_draw_swm341_dma2d_ctx_t); -#elif LV_USE_GPU_NXP_PXP || LV_USE_GPU_NXP_VG_LITE - driver->draw_ctx_init = lv_draw_nxp_ctx_init; - driver->draw_ctx_deinit = lv_draw_nxp_ctx_deinit; - driver->draw_ctx_size = sizeof(lv_draw_nxp_ctx_t); +#elif LV_USE_GPU_NXP_VG_LITE + driver->draw_ctx_init = lv_draw_vglite_ctx_init; + driver->draw_ctx_deinit = lv_draw_vglite_ctx_deinit; + driver->draw_ctx_size = sizeof(lv_draw_vglite_ctx_t); +#elif LV_USE_GPU_NXP_PXP + driver->draw_ctx_init = lv_draw_pxp_ctx_init; + driver->draw_ctx_deinit = lv_draw_pxp_ctx_deinit; + driver->draw_ctx_size = sizeof(lv_draw_pxp_ctx_t); #elif LV_USE_GPU_SDL driver->draw_ctx_init = lv_draw_sdl_init_ctx; driver->draw_ctx_deinit = lv_draw_sdl_deinit_ctx; @@ -117,6 +125,10 @@ void lv_disp_drv_init(lv_disp_drv_t * driver) driver->draw_ctx_init = lv_draw_arm2d_ctx_init; driver->draw_ctx_deinit = lv_draw_arm2d_ctx_init; driver->draw_ctx_size = sizeof(lv_draw_arm2d_ctx_t); +#elif LV_USE_NEMA_GFX + driver->draw_ctx_init = lv_draw_nema_gfx_ctx_init; + driver->draw_ctx_deinit = lv_draw_nema_gfx_ctx_deinit; + driver->draw_ctx_size = sizeof(lv_draw_nema_gfx_ctx_t); #else driver->draw_ctx_init = lv_draw_sw_init_ctx; driver->draw_ctx_deinit = lv_draw_sw_init_ctx; @@ -179,6 +191,8 @@ lv_disp_t * lv_disp_drv_register(lv_disp_drv_t * driver) disp->inv_en_cnt = 1; + _lv_ll_init(&disp->sync_areas, sizeof(lv_area_t)); + lv_disp_t * disp_def_tmp = disp_def; disp_def = disp; /*Temporarily change the default screen to create the default screens on the new display*/ @@ -309,6 +323,7 @@ void lv_disp_remove(lv_disp_t * disp) } _lv_ll_remove(&LV_GC_ROOT(_lv_disp_ll), disp); + _lv_ll_clear(&disp->sync_areas); if(disp->refr_timer) lv_timer_del(disp->refr_timer); lv_mem_free(disp); @@ -506,7 +521,7 @@ lv_coord_t lv_disp_get_dpi(const lv_disp_t * disp) * Call in the display driver's `flush_cb` function when the flushing is finished * @param disp_drv pointer to display driver in `flush_cb` where this function is called */ -LV_ATTRIBUTE_FLUSH_READY void lv_disp_flush_ready(lv_disp_drv_t * disp_drv) +void LV_ATTRIBUTE_FLUSH_READY lv_disp_flush_ready(lv_disp_drv_t * disp_drv) { disp_drv->draw_buf->flushing = 0; disp_drv->draw_buf->flushing_last = 0; @@ -518,7 +533,7 @@ LV_ATTRIBUTE_FLUSH_READY void lv_disp_flush_ready(lv_disp_drv_t * disp_drv) * @param disp_drv pointer to display driver * @return true: it's the last area to flush; false: there are other areas too which will be refreshed soon */ -LV_ATTRIBUTE_FLUSH_READY bool lv_disp_flush_is_last(lv_disp_drv_t * disp_drv) +bool LV_ATTRIBUTE_FLUSH_READY lv_disp_flush_is_last(lv_disp_drv_t * disp_drv) { return disp_drv->draw_buf->flushing_last; } diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/hal/lv_hal_disp.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/hal/lv_hal_disp.h similarity index 96% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/hal/lv_hal_disp.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/hal/lv_hal_disp.h index d3425fe..d942860 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/hal/lv_hal_disp.h +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/hal/lv_hal_disp.h @@ -23,6 +23,7 @@ extern "C" { #include "../misc/lv_area.h" #include "../misc/lv_ll.h" #include "../misc/lv_timer.h" +#include "../misc/lv_ll.h" /********************* * DEFINES @@ -117,7 +118,6 @@ typedef struct _lv_disp_drv_t { void (*clear_cb)(struct _lv_disp_drv_t * disp_drv, uint8_t * buf, uint32_t size); - /** OPTIONAL: Called after every refresh cycle to tell the rendering and flushing time + the * number of flushed pixels*/ void (*monitor_cb)(struct _lv_disp_drv_t * disp_drv, uint32_t time, uint32_t px); @@ -173,10 +173,8 @@ typedef struct _lv_disp_t { struct _lv_obj_t * top_layer; /**< @see lv_disp_get_layer_top*/ struct _lv_obj_t * sys_layer; /**< @see lv_disp_get_layer_sys*/ uint32_t screen_cnt; -uint8_t draw_prev_over_act : - 1; /**< 1: Draw previous screen over active screen*/ -uint8_t del_prev : - 1; /**< 1: Automatically delete the previous screen when the screen load animation is ready*/ + uint8_t draw_prev_over_act : 1; /**< 1: Draw previous screen over active screen*/ + uint8_t del_prev : 1; /**< 1: Automatically delete the previous screen when the screen load anim. is ready*/ uint8_t rendering_in_progress : 1; /**< 1: The current screen rendering is in progress*/ lv_opa_t bg_opa; /**0 to cache this number of bytes in lv_fs_read()*/ + #endif + #endif +#endif + /*PNG decoder library*/ #ifndef LV_USE_PNG #ifdef CONFIG_LV_USE_PNG @@ -2169,6 +2226,25 @@ #endif #endif +/*Tiny TTF library*/ +#ifndef LV_USE_TINY_TTF + #ifdef CONFIG_LV_USE_TINY_TTF + #define LV_USE_TINY_TTF CONFIG_LV_USE_TINY_TTF + #else + #define LV_USE_TINY_TTF 0 + #endif +#endif +#if LV_USE_TINY_TTF + /*Load TTF data from files*/ + #ifndef LV_TINY_TTF_FILE_SUPPORT + #ifdef CONFIG_LV_TINY_TTF_FILE_SUPPORT + #define LV_TINY_TTF_FILE_SUPPORT CONFIG_LV_TINY_TTF_FILE_SUPPORT + #else + #define LV_TINY_TTF_FILE_SUPPORT 0 + #endif + #endif +#endif + /*Rlottie library*/ #ifndef LV_USE_RLOTTIE #ifdef CONFIG_LV_USE_RLOTTIE diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/lv_conf_kconfig.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/lv_conf_kconfig.h similarity index 98% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/lv_conf_kconfig.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/lv_conf_kconfig.h index 7742fe7..80f7061 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/lv_conf_kconfig.h +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/lv_conf_kconfig.h @@ -47,7 +47,7 @@ extern "C" { #ifdef CONFIG_LV_PERF_MONITOR_ALIGN_TOP_LEFT # define CONFIG_LV_USE_PERF_MONITOR_POS LV_ALIGN_TOP_LEFT -#elif defined(CONFIG_LV_USE_PERF_MONITOR_ALIGN_TOP_MID) +#elif defined(CONFIG_LV_PERF_MONITOR_ALIGN_TOP_MID) # define CONFIG_LV_USE_PERF_MONITOR_POS LV_ALIGN_TOP_MID #elif defined(CONFIG_LV_PERF_MONITOR_ALIGN_TOP_RIGHT) # define CONFIG_LV_USE_PERF_MONITOR_POS LV_ALIGN_TOP_RIGHT @@ -67,7 +67,7 @@ extern "C" { #ifdef CONFIG_LV_MEM_MONITOR_ALIGN_TOP_LEFT # define CONFIG_LV_USE_MEM_MONITOR_POS LV_ALIGN_TOP_LEFT -#elif defined(CONFIG_LV_USE_MEM_MONITOR_ALIGN_TOP_MID) +#elif defined(CONFIG_LV_MEM_MONITOR_ALIGN_TOP_MID) # define CONFIG_LV_USE_MEM_MONITOR_POS LV_ALIGN_TOP_MID #elif defined(CONFIG_LV_MEM_MONITOR_ALIGN_TOP_RIGHT) # define CONFIG_LV_USE_MEM_MONITOR_POS LV_ALIGN_TOP_RIGHT diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/lvgl.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/lvgl.h similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/lvgl.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/lvgl.h diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/Makefile b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/misc/Makefile similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/Makefile rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/misc/Makefile diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_anim.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/misc/lv_anim.c similarity index 99% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_anim.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/misc/lv_anim.c index 4e4253a..9291cf4 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_anim.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/misc/lv_anim.c @@ -49,7 +49,6 @@ static lv_timer_t * _lv_anim_tmr; #define TRACE_ANIM(...) #endif - /********************** * GLOBAL FUNCTIONS **********************/ diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_anim.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/misc/lv_anim.h similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_anim.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/misc/lv_anim.h diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_anim_timeline.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/misc/lv_anim_timeline.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_anim_timeline.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/misc/lv_anim_timeline.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_anim_timeline.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/misc/lv_anim_timeline.h similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_anim_timeline.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/misc/lv_anim_timeline.h diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_area.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/misc/lv_area.c similarity index 88% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_area.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/misc/lv_area.c index c0221f7..9226235 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_area.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/misc/lv_area.c @@ -143,6 +143,78 @@ bool _lv_area_intersect(lv_area_t * res_p, const lv_area_t * a1_p, const lv_area return union_ok; } +/** + * Get resulting sub areas after removing the common parts of two areas from the first area + * @param res_p pointer to an array of areas with a count of 4, the resulting areas will be stored here + * @param a1_p pointer to the first area + * @param a2_p pointer to the second area + * @return number of results or -1 if no intersect + */ +int8_t _lv_area_diff(lv_area_t * res_p, const lv_area_t * a1_p, const lv_area_t * a2_p) +{ + /*Areas have no common parts*/ + if(!_lv_area_is_on(a1_p, a2_p)) return -1; + + /*No remaining areas after removing common parts*/ + if(_lv_area_is_in(a1_p, a2_p, 0)) return 0; + + /*Result counter*/ + int8_t res_c = 0; + + /*Get required information*/ + lv_area_t n; + lv_coord_t a1_w = lv_area_get_width(a1_p) - 1; + lv_coord_t a1_h = lv_area_get_height(a1_p) - 1; + + /*Compute top rectangle*/ + lv_coord_t th = a2_p->y1 - a1_p->y1; + if(th > 0) { + n.x1 = a1_p->x1; + n.y1 = a1_p->y1; + n.x2 = a1_p->x2; + n.y2 = a1_p->y1 + th; + res_p[res_c++] = n; + } + + /*Compute the bottom rectangle*/ + lv_coord_t bh = a1_h - (a2_p->y2 - a1_p->y1); + if(bh > 0 && a2_p->y2 < a1_p->y2) { + n.x1 = a1_p->x1; + n.y1 = a2_p->y2; + n.x2 = a1_p->x2; + n.y2 = a2_p->y2 + bh; + res_p[res_c++] = n; + } + + /*Compute side height*/ + lv_coord_t y1 = a2_p->y1 > a1_p->y1 ? a2_p->y1 : a1_p->y1; + lv_coord_t y2 = a2_p->y2 < a1_p->y2 ? a2_p->y2 : a1_p->y2; + lv_coord_t sh = y2 - y1; + + /*Compute the left rectangle*/ + lv_coord_t lw = a2_p->x1 - a1_p->x1; + if(lw > 0 && sh > 0) { + n.x1 = a1_p->x1; + n.y1 = y1; + n.x2 = a1_p->x1 + lw; + n.y2 = y1 + sh; + res_p[res_c++] = n; + } + + /*Compute the right rectangle*/ + lv_coord_t rw = a1_w - (a2_p->x2 - a1_p->x1); + if(rw > 0) { + n.x1 = a2_p->x2; + n.y1 = y1; + n.x2 = a2_p->x2 + rw; + n.y2 = y1 + sh; + res_p[res_c++] = n; + } + + //Return number of results + return res_c; +} + /** * Join two areas into a third which involves the other two * @param res_p pointer to an area, the result will be stored here @@ -508,7 +580,6 @@ void lv_point_transform(lv_point_t * p, int32_t angle, int32_t zoom, const lv_po } } - /********************** * STATIC FUNCTIONS **********************/ diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_area.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/misc/lv_area.h similarity index 95% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_area.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/misc/lv_area.h index 137931a..b30eabe 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_area.h +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/misc/lv_area.h @@ -177,6 +177,15 @@ void lv_area_move(lv_area_t * area, lv_coord_t x_ofs, lv_coord_t y_ofs); */ bool _lv_area_intersect(lv_area_t * res_p, const lv_area_t * a1_p, const lv_area_t * a2_p); +/** + * Get resulting sub areas after removing the common parts of two areas from the first area + * @param res_p pointer to an array of areas with a count of 4, the resulting areas will be stored here + * @param a1_p pointer to the first area + * @param a2_p pointer to the second area + * @return number of results (max 4) or -1 if no intersect + */ +int8_t _lv_area_diff(lv_area_t * res_p, const lv_area_t * a1_p, const lv_area_t * a2_p); + /** * Join two areas into a third which involves the other two * @param res_p pointer to an area, the result will be stored here @@ -211,7 +220,6 @@ bool _lv_area_is_on(const lv_area_t * a1_p, const lv_area_t * a2_p); */ bool _lv_area_is_in(const lv_area_t * ain_p, const lv_area_t * aholder_p, lv_coord_t radius); - /** * Check if an area is fully out of an other * @param aout_p pointer to an area which could be in 'aholder_p' diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_assert.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/misc/lv_assert.h similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_assert.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/misc/lv_assert.h diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_async.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/misc/lv_async.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_async.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/misc/lv_async.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_async.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/misc/lv_async.h similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_async.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/misc/lv_async.h diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_bidi.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/misc/lv_bidi.c similarity index 99% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_bidi.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/misc/lv_bidi.c index 3dc3ce7..70af1c4 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_bidi.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/misc/lv_bidi.c @@ -376,7 +376,6 @@ static bool lv_bidi_letter_is_weak(uint32_t letter) */ static bool lv_bidi_letter_is_rtl(uint32_t letter) { - if(letter >= 0x5d0 && letter <= 0x5ea) return true; if(letter == 0x202E) return true; /*Unicode of LV_BIDI_RLO*/ /*Check for Persian and Arabic characters [https://en.wikipedia.org/wiki/Arabic_script_in_Unicode]*/ @@ -384,6 +383,10 @@ static bool lv_bidi_letter_is_rtl(uint32_t letter) if(letter >= 0xFB50 && letter <= 0xFDFF) return true; if(letter >= 0xFE70 && letter <= 0xFEFF) return true; + /*Check for Hebrew characters [https://en.wikipedia.org/wiki/Unicode_and_HTML_for_the_Hebrew_alphabet]*/ + if(letter >= 0x590 && letter <= 0x5FF) return true; + if(letter >= 0xFB1D && letter <= 0xFB4F) return true; + return false; } diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_bidi.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/misc/lv_bidi.h similarity index 99% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_bidi.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/misc/lv_bidi.h index a27b580..b75308e 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_bidi.h +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/misc/lv_bidi.h @@ -113,7 +113,6 @@ void _lv_bidi_process_paragraph(const char * str_in, char * str_out, uint32_t le */ void lv_bidi_calculate_align(lv_text_align_t * align, lv_base_dir_t * base_dir, const char * txt); - /********************** * MACROS **********************/ diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_color.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/misc/lv_color.c similarity index 99% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_color.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/misc/lv_color.c index 0e26624..9ad5a14 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_color.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/misc/lv_color.c @@ -33,7 +33,7 @@ * GLOBAL FUNCTIONS **********************/ -LV_ATTRIBUTE_FAST_MEM void lv_color_fill(lv_color_t * buf, lv_color_t color, uint32_t px_num) +void LV_ATTRIBUTE_FAST_MEM lv_color_fill(lv_color_t * buf, lv_color_t color, uint32_t px_num) { #if LV_COLOR_DEPTH == 16 uintptr_t buf_int = (uintptr_t)buf; diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_color.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/misc/lv_color.h similarity index 97% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_color.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/misc/lv_color.h index 2cc92f2..522d15c 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_color.h +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/misc/lv_color.h @@ -254,7 +254,6 @@ typedef struct _lv_color_filter_dsc_t { void * user_data; } lv_color_filter_dsc_t; - typedef enum { LV_PALETTE_RED, LV_PALETTE_PINK, @@ -436,11 +435,15 @@ static inline uint32_t lv_color_to32(lv_color_t color) * @param mix The ratio of the colors. 0: full `c2`, 255: full `c1`, 127: half `c1` and half`c2` * @return the mixed color */ -LV_ATTRIBUTE_FAST_MEM static inline lv_color_t lv_color_mix(lv_color_t c1, lv_color_t c2, uint8_t mix) +static inline lv_color_t LV_ATTRIBUTE_FAST_MEM lv_color_mix(lv_color_t c1, lv_color_t c2, uint8_t mix) { lv_color_t ret; -#if LV_COLOR_DEPTH == 16 && LV_COLOR_16_SWAP == 0 && LV_COLOR_MIX_ROUND_OFS == 0 +#if LV_COLOR_DEPTH == 16 && LV_COLOR_MIX_ROUND_OFS == 0 +#if LV_COLOR_16_SWAP == 1 + c1.full = c1.full << 8 | c1.full >> 8; + c2.full = c2.full << 8 | c2.full >> 8; +#endif /*Source: https://stackoverflow.com/a/50012418/1999969*/ mix = (uint32_t)((uint32_t)mix + 4) >> 3; uint32_t bg = (uint32_t)((uint32_t)c2.full | ((uint32_t)c2.full << 16)) & @@ -448,6 +451,9 @@ LV_ATTRIBUTE_FAST_MEM static inline lv_color_t lv_color_mix(lv_color_t c1, lv_co uint32_t fg = (uint32_t)((uint32_t)c1.full | ((uint32_t)c1.full << 16)) & 0x7E0F81F; uint32_t result = ((((fg - bg) * mix) >> 5) + bg) & 0x7E0F81F; ret.full = (uint16_t)((result >> 16) | result); +#if LV_COLOR_16_SWAP == 1 + ret.full = ret.full << 8 | ret.full >> 8; +#endif #elif LV_COLOR_DEPTH != 1 /*LV_COLOR_DEPTH == 8, 16 or 32*/ LV_COLOR_SET_R(ret, LV_UDIV255((uint16_t)LV_COLOR_GET_R(c1) * mix + LV_COLOR_GET_R(c2) * @@ -465,7 +471,7 @@ LV_ATTRIBUTE_FAST_MEM static inline lv_color_t lv_color_mix(lv_color_t c1, lv_co return ret; } -LV_ATTRIBUTE_FAST_MEM static inline void lv_color_premult(lv_color_t c, uint8_t mix, uint16_t * out) +static inline void LV_ATTRIBUTE_FAST_MEM lv_color_premult(lv_color_t c, uint8_t mix, uint16_t * out) { #if LV_COLOR_DEPTH != 1 out[0] = (uint16_t)LV_COLOR_GET_R(c) * mix; @@ -490,7 +496,7 @@ LV_ATTRIBUTE_FAST_MEM static inline void lv_color_premult(lv_color_t c, uint8_t * @return the mixed color * @note 255 won't give clearly `c1`. */ -LV_ATTRIBUTE_FAST_MEM static inline lv_color_t lv_color_mix_premult(uint16_t * premult_c1, lv_color_t c2, uint8_t mix) +static inline lv_color_t LV_ATTRIBUTE_FAST_MEM lv_color_mix_premult(uint16_t * premult_c1, lv_color_t c2, uint8_t mix) { lv_color_t ret; #if LV_COLOR_DEPTH != 1 @@ -521,7 +527,7 @@ LV_ATTRIBUTE_FAST_MEM static inline lv_color_t lv_color_mix_premult(uint16_t * p * @param res_color the result color * @param res_opa the result opacity */ -LV_ATTRIBUTE_FAST_MEM static inline void lv_color_mix_with_alpha(lv_color_t bg_color, lv_opa_t bg_opa, +static inline void LV_ATTRIBUTE_FAST_MEM lv_color_mix_with_alpha(lv_color_t bg_color, lv_opa_t bg_opa, lv_color_t fg_color, lv_opa_t fg_opa, lv_color_t * res_color, lv_opa_t * res_opa) { @@ -637,7 +643,7 @@ static inline void lv_color_filter_dsc_init(lv_color_filter_dsc_t * dsc, lv_colo //! @cond Doxygen_Suppress //! -LV_ATTRIBUTE_FAST_MEM void lv_color_fill(lv_color_t * buf, lv_color_t color, uint32_t px_num); +void /* LV_ATTRIBUTE_FAST_MEM */ lv_color_fill(lv_color_t * buf, lv_color_t color, uint32_t px_num); //! @endcond lv_color_t lv_color_lighten(lv_color_t c, lv_opa_t lvl); diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_fs.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/misc/lv_fs.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_fs.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/misc/lv_fs.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_fs.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/misc/lv_fs.h similarity index 99% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_fs.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/misc/lv_fs.h index 9f65e1b..c941402 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_fs.h +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/misc/lv_fs.h @@ -57,7 +57,6 @@ enum { }; typedef uint8_t lv_fs_mode_t; - /** * Seek modes. */ diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_gc.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/misc/lv_gc.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_gc.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/misc/lv_gc.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_gc.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/misc/lv_gc.h similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_gc.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/misc/lv_gc.h diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_ll.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/misc/lv_ll.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_ll.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/misc/lv_ll.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_ll.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/misc/lv_ll.h similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_ll.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/misc/lv_ll.h diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_log.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/misc/lv_log.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_log.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/misc/lv_log.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_log.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/misc/lv_log.h similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_log.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/misc/lv_log.h diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_lru.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/misc/lv_lru.c similarity index 97% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_lru.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/misc/lv_lru.c index 6ff8390..b85554e 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_lru.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/misc/lv_lru.c @@ -99,13 +99,12 @@ lv_lru_t * lv_lru_create(size_t cache_size, size_t average_length, lv_lru_free_t return cache; } - void lv_lru_del(lv_lru_t * cache) { LV_ASSERT_NULL(cache); // free each of the cached items, and the hash table - lv_lru_item_t * item = NULL, *next = NULL; + lv_lru_item_t * item = NULL, * next = NULL; uint32_t i = 0; if(cache->items) { for(; i < cache->hash_table_size; i++) { @@ -135,7 +134,6 @@ void lv_lru_del(lv_lru_t * cache) lv_mem_free(cache); } - lv_lru_res_t lv_lru_set(lv_lru_t * cache, const void * key, size_t key_length, void * value, size_t value_length) { test_for_missing_cache(); @@ -146,7 +144,7 @@ lv_lru_res_t lv_lru_set(lv_lru_t * cache, const void * key, size_t key_length, v // see if the key already exists uint32_t hash_index = lv_lru_hash(cache, key, key_length); int required = 0; - lv_lru_item_t * item = NULL, *prev = NULL; + lv_lru_item_t * item = NULL, * prev = NULL; item = cache->items[hash_index]; while(item && lv_lru_cmp_keys(item, key, key_length)) { @@ -188,7 +186,6 @@ lv_lru_res_t lv_lru_set(lv_lru_t * cache, const void * key, size_t key_length, v return LV_LRU_OK; } - lv_lru_res_t lv_lru_get(lv_lru_t * cache, const void * key, size_t key_size, void ** value) { test_for_missing_cache(); @@ -218,7 +215,7 @@ lv_lru_res_t lv_lru_remove(lv_lru_t * cache, const void * key, size_t key_size) test_for_missing_key(); // loop until we find the item, or hit the end of a chain - lv_lru_item_t * item = NULL, *prev = NULL; + lv_lru_item_t * item = NULL, * prev = NULL; uint32_t hash_index = lv_lru_hash(cache, key, key_size); item = cache->items[hash_index]; @@ -236,8 +233,8 @@ lv_lru_res_t lv_lru_remove(lv_lru_t * cache, const void * key, size_t key_size) void lv_lru_remove_lru_item(lv_lru_t * cache) { - lv_lru_item_t * min_item = NULL, *min_prev = NULL; - lv_lru_item_t * item = NULL, *prev = NULL; + lv_lru_item_t * min_item = NULL, * min_prev = NULL; + lv_lru_item_t * item = NULL, * prev = NULL; uint32_t i = 0, min_index = -1; uint64_t min_access_count = -1; diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_lru.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/misc/lv_lru.h similarity index 99% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_lru.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/misc/lv_lru.h index 2d0134e..de0c20e 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_lru.h +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/misc/lv_lru.h @@ -21,7 +21,6 @@ extern "C" { #include #include - /********************* * DEFINES *********************/ @@ -55,7 +54,6 @@ typedef struct lv_lru_t { lv_lru_item_t * free_items; } lv_lru_t; - /********************** * GLOBAL PROTOTYPES **********************/ diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_math.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/misc/lv_math.c similarity index 98% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_math.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/misc/lv_math.c index bfb3934..cf2d0fb 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_math.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/misc/lv_math.c @@ -45,7 +45,7 @@ static const int16_t sin0_90_table[] = { * @param angle * @return sinus of 'angle'. sin(-90) = -32767, sin(90) = 32767 */ -LV_ATTRIBUTE_FAST_MEM int16_t lv_trigo_sin(int16_t angle) +int16_t LV_ATTRIBUTE_FAST_MEM lv_trigo_sin(int16_t angle) { int16_t ret = 0; angle = angle % 360; @@ -106,7 +106,7 @@ uint32_t lv_bezier3(uint32_t t, uint32_t u0, uint32_t u1, uint32_t u2, uint32_t * If root < 256: mask = 0x800 * Else: mask = 0x8000 */ -LV_ATTRIBUTE_FAST_MEM void lv_sqrt(uint32_t x, lv_sqrt_res_t * q, uint32_t mask) +void LV_ATTRIBUTE_FAST_MEM lv_sqrt(uint32_t x, lv_sqrt_res_t * q, uint32_t mask) { x = x << 8; /*To get 4 bit precision. (sqrt(256) = 16 = 4 bit)*/ diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_math.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/misc/lv_math.h similarity index 94% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_math.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/misc/lv_math.h index 4b2860a..771b4aa 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_math.h +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/misc/lv_math.h @@ -44,9 +44,9 @@ typedef struct { * @param angle * @return sinus of 'angle'. sin(-90) = -32767, sin(90) = 32767 */ -LV_ATTRIBUTE_FAST_MEM int16_t lv_trigo_sin(int16_t angle); +int16_t /* LV_ATTRIBUTE_FAST_MEM */ lv_trigo_sin(int16_t angle); -static inline LV_ATTRIBUTE_FAST_MEM int16_t lv_trigo_cos(int16_t angle) +static inline int16_t LV_ATTRIBUTE_FAST_MEM lv_trigo_cos(int16_t angle) { return lv_trigo_sin(angle + 90); } @@ -84,7 +84,7 @@ uint16_t lv_atan2(int x, int y); * If root < 256: mask = 0x800 * Else: mask = 0x8000 */ -LV_ATTRIBUTE_FAST_MEM void lv_sqrt(uint32_t x, lv_sqrt_res_t * q, uint32_t mask); +void /* LV_ATTRIBUTE_FAST_MEM */ lv_sqrt(uint32_t x, lv_sqrt_res_t * q, uint32_t mask); //! @endcond diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_mem.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/misc/lv_mem.c similarity index 98% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_mem.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/misc/lv_mem.c index b7c602f..a7acc98 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_mem.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/misc/lv_mem.c @@ -268,7 +268,6 @@ void lv_mem_monitor(lv_mem_monitor_t * mon_p) #endif } - /** * Get a temporal buffer with the given size. * @param size the required size @@ -365,7 +364,7 @@ void lv_mem_buf_free_all(void) * @param src pointer to the source buffer * @param len number of byte to copy */ -LV_ATTRIBUTE_FAST_MEM void * lv_memcpy(void * dst, const void * src, size_t len) +void * LV_ATTRIBUTE_FAST_MEM lv_memcpy(void * dst, const void * src, size_t len) { uint8_t * d8 = dst; const uint8_t * s8 = src; @@ -427,7 +426,7 @@ LV_ATTRIBUTE_FAST_MEM void * lv_memcpy(void * dst, const void * src, size_t len) * @param v value to set [0..255] * @param len number of byte to set */ -LV_ATTRIBUTE_FAST_MEM void lv_memset(void * dst, uint8_t v, size_t len) +void LV_ATTRIBUTE_FAST_MEM lv_memset(void * dst, uint8_t v, size_t len) { uint8_t * d8 = (uint8_t *)dst; @@ -470,7 +469,7 @@ LV_ATTRIBUTE_FAST_MEM void lv_memset(void * dst, uint8_t v, size_t len) * @param dst pointer to the destination buffer * @param len number of byte to set */ -LV_ATTRIBUTE_FAST_MEM void lv_memset_00(void * dst, size_t len) +void LV_ATTRIBUTE_FAST_MEM lv_memset_00(void * dst, size_t len) { uint8_t * d8 = (uint8_t *)dst; uintptr_t d_align = (lv_uintptr_t) d8 & ALIGN_MASK; @@ -508,7 +507,7 @@ LV_ATTRIBUTE_FAST_MEM void lv_memset_00(void * dst, size_t len) * @param dst pointer to the destination buffer * @param len number of byte to set */ -LV_ATTRIBUTE_FAST_MEM void lv_memset_ff(void * dst, size_t len) +void LV_ATTRIBUTE_FAST_MEM lv_memset_ff(void * dst, size_t len) { uint8_t * d8 = (uint8_t *)dst; uintptr_t d_align = (lv_uintptr_t) d8 & ALIGN_MASK; diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_mem.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/misc/lv_mem.h similarity index 93% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_mem.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/misc/lv_mem.h index 7a83b3d..d5d1d89 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_mem.h +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/misc/lv_mem.h @@ -101,7 +101,6 @@ lv_res_t lv_mem_test(void); */ void lv_mem_monitor(lv_mem_monitor_t * mon_p); - /** * Get a temporal buffer with the given size. * @param size the required size @@ -183,7 +182,7 @@ static inline void lv_memset_ff(void * dst, size_t len) * @param src pointer to the source buffer * @param len number of byte to copy */ -LV_ATTRIBUTE_FAST_MEM void * lv_memcpy(void * dst, const void * src, size_t len); +void * /* LV_ATTRIBUTE_FAST_MEM */ lv_memcpy(void * dst, const void * src, size_t len); /** * Same as `memcpy` but optimized to copy only a few bytes. @@ -191,7 +190,7 @@ LV_ATTRIBUTE_FAST_MEM void * lv_memcpy(void * dst, const void * src, size_t len) * @param src pointer to the source buffer * @param len number of byte to copy */ -LV_ATTRIBUTE_FAST_MEM static inline void * lv_memcpy_small(void * dst, const void * src, size_t len) +static inline void * LV_ATTRIBUTE_FAST_MEM lv_memcpy_small(void * dst, const void * src, size_t len) { uint8_t * d8 = (uint8_t *)dst; const uint8_t * s8 = (const uint8_t *)src; @@ -212,21 +211,21 @@ LV_ATTRIBUTE_FAST_MEM static inline void * lv_memcpy_small(void * dst, const voi * @param v value to set [0..255] * @param len number of byte to set */ -LV_ATTRIBUTE_FAST_MEM void lv_memset(void * dst, uint8_t v, size_t len); +void /* LV_ATTRIBUTE_FAST_MEM */ lv_memset(void * dst, uint8_t v, size_t len); /** * Same as `memset(dst, 0x00, len)` but optimized for 4 byte operation. * @param dst pointer to the destination buffer * @param len number of byte to set */ -LV_ATTRIBUTE_FAST_MEM void lv_memset_00(void * dst, size_t len); +void /* LV_ATTRIBUTE_FAST_MEM */ lv_memset_00(void * dst, size_t len); /** * Same as `memset(dst, 0xFF, len)` but optimized for 4 byte operation. * @param dst pointer to the destination buffer * @param len number of byte to set */ -LV_ATTRIBUTE_FAST_MEM void lv_memset_ff(void * dst, size_t len); +void /* LV_ATTRIBUTE_FAST_MEM */ lv_memset_ff(void * dst, size_t len); //! @endcond diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_misc.mk b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/misc/lv_misc.mk similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_misc.mk rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/misc/lv_misc.mk diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_printf.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/misc/lv_printf.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_printf.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/misc/lv_printf.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_printf.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/misc/lv_printf.h similarity index 95% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_printf.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/misc/lv_printf.h index 4cbbd84..09563db 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_printf.h +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/misc/lv_printf.h @@ -40,14 +40,20 @@ /* platform-specific printf format for int32_t, usually "d" or "ld" */ #define LV_PRId32 PRId32 #define LV_PRIu32 PRIu32 + #define LV_PRIx32 PRIx32 + #define LV_PRIX32 PRIX32 #else #define LV_PRId32 "d" #define LV_PRIu32 "u" + #define LV_PRIx32 "x" + #define LV_PRIX32 "X" #endif #else /* hope this is correct for ports without __has_include or without inttypes.h */ #define LV_PRId32 "d" #define LV_PRIu32 "u" + #define LV_PRIx32 "x" + #define LV_PRIX32 "X" #endif #ifdef __cplusplus diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_style.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/misc/lv_style.c similarity index 99% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_style.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/misc/lv_style.c index 419c29e..994be81 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_style.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/misc/lv_style.c @@ -119,7 +119,8 @@ const uint8_t _lv_style_builtin_prop_flag_lookup_table[_LV_STYLE_NUM_BUILT_IN_PR [LV_STYLE_RADIUS] = 0, [LV_STYLE_CLIP_CORNER] = 0, - [LV_STYLE_OPA] = LV_STYLE_PROP_LAYER_REFR, + [LV_STYLE_OPA] = 0, + [LV_STYLE_OPA_LAYERED] = LV_STYLE_PROP_LAYER_REFR, [LV_STYLE_COLOR_FILTER_DSC] = LV_STYLE_PROP_INHERIT, [LV_STYLE_COLOR_FILTER_OPA] = LV_STYLE_PROP_INHERIT, [LV_STYLE_ANIM_TIME] = 0, @@ -330,6 +331,7 @@ lv_style_value_t lv_style_prop_get_default(lv_style_prop_t prop) value.color = lv_color_black(); break; case LV_STYLE_OPA: + case LV_STYLE_OPA_LAYERED: case LV_STYLE_BORDER_OPA: case LV_STYLE_TEXT_OPA: case LV_STYLE_IMG_OPA: diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_style.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/misc/lv_style.h similarity index 96% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_style.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/misc/lv_style.h index 5cf0b19..a46036b 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_style.h +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/misc/lv_style.h @@ -260,23 +260,24 @@ typedef enum { /*Group 6*/ LV_STYLE_OPA = 96, - LV_STYLE_COLOR_FILTER_DSC = 97, - LV_STYLE_COLOR_FILTER_OPA = 98, - LV_STYLE_ANIM = 99, - LV_STYLE_ANIM_TIME = 100, - LV_STYLE_ANIM_SPEED = 101, - LV_STYLE_TRANSITION = 102, - LV_STYLE_BLEND_MODE = 103, - LV_STYLE_TRANSFORM_WIDTH = 104, - LV_STYLE_TRANSFORM_HEIGHT = 105, - LV_STYLE_TRANSLATE_X = 106, - LV_STYLE_TRANSLATE_Y = 107, - LV_STYLE_TRANSFORM_ZOOM = 108, - LV_STYLE_TRANSFORM_ANGLE = 109, - LV_STYLE_TRANSFORM_PIVOT_X = 110, - LV_STYLE_TRANSFORM_PIVOT_Y = 111, + LV_STYLE_OPA_LAYERED = 97, + LV_STYLE_COLOR_FILTER_DSC = 98, + LV_STYLE_COLOR_FILTER_OPA = 99, + LV_STYLE_ANIM = 100, + LV_STYLE_ANIM_TIME = 101, + LV_STYLE_ANIM_SPEED = 102, + LV_STYLE_TRANSITION = 103, + LV_STYLE_BLEND_MODE = 104, + LV_STYLE_TRANSFORM_WIDTH = 105, + LV_STYLE_TRANSFORM_HEIGHT = 106, + LV_STYLE_TRANSLATE_X = 107, + LV_STYLE_TRANSLATE_Y = 108, + LV_STYLE_TRANSFORM_ZOOM = 109, + LV_STYLE_TRANSFORM_ANGLE = 110, + LV_STYLE_TRANSFORM_PIVOT_X = 111, + LV_STYLE_TRANSFORM_PIVOT_Y = 112, - _LV_STYLE_LAST_BUILT_IN_PROP = 111, + _LV_STYLE_LAST_BUILT_IN_PROP = 112, _LV_STYLE_NUM_BUILT_IN_PROPS = _LV_STYLE_LAST_BUILT_IN_PROP + 1, LV_STYLE_PROP_ANY = 0xFFFF, @@ -338,7 +339,6 @@ typedef struct { * GLOBAL PROTOTYPES **********************/ - /** * Initialize a style * @param style pointer to a style to initialize diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_style_gen.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/misc/lv_style_gen.c similarity index 98% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_style_gen.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/misc/lv_style_gen.c index 13d8560..0b8479d 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_style_gen.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/misc/lv_style_gen.c @@ -600,6 +600,14 @@ void lv_style_set_opa(lv_style_t * style, lv_opa_t value) lv_style_set_prop(style, LV_STYLE_OPA, v); } +void lv_style_set_opa_layered(lv_style_t * style, lv_opa_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_OPA_LAYERED, v); +} + void lv_style_set_color_filter_dsc(lv_style_t * style, const lv_color_filter_dsc_t * value) { lv_style_value_t v = { diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_style_gen.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/misc/lv_style_gen.h similarity index 98% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_style_gen.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/misc/lv_style_gen.h index 8bf3b68..66ba068 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_style_gen.h +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/misc/lv_style_gen.h @@ -73,6 +73,7 @@ void lv_style_set_text_align(lv_style_t * style, lv_text_align_t value); void lv_style_set_radius(lv_style_t * style, lv_coord_t value); void lv_style_set_clip_corner(lv_style_t * style, bool value); void lv_style_set_opa(lv_style_t * style, lv_opa_t value); +void lv_style_set_opa_layered(lv_style_t * style, lv_opa_t value); void lv_style_set_color_filter_dsc(lv_style_t * style, const lv_color_filter_dsc_t * value); void lv_style_set_color_filter_opa(lv_style_t * style, lv_opa_t value); void lv_style_set_anim(lv_style_t * style, const lv_anim_t * value); @@ -458,6 +459,11 @@ void lv_style_set_base_dir(lv_style_t * style, lv_base_dir_t value); .prop = LV_STYLE_OPA, .value = { .num = (int32_t)val } \ } +#define LV_STYLE_CONST_OPA_LAYERED(val) \ + { \ + .prop = LV_STYLE_OPA_LAYERED, .value = { .num = (int32_t)val } \ + } + #define LV_STYLE_CONST_COLOR_FILTER_DSC(val) \ { \ .prop = LV_STYLE_COLOR_FILTER_DSC, .value = { .ptr = val } \ diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_templ.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/misc/lv_templ.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_templ.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/misc/lv_templ.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_templ.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/misc/lv_templ.h similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_templ.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/misc/lv_templ.h diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_timer.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/misc/lv_timer.c similarity index 99% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_timer.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/misc/lv_timer.c index d8dd55b..a21038a 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_timer.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/misc/lv_timer.c @@ -64,7 +64,7 @@ void _lv_timer_core_init(void) * Call it periodically to handle lv_timers. * @return the time after which it must be called again */ -LV_ATTRIBUTE_TIMER_HANDLER uint32_t lv_timer_handler(void) +uint32_t LV_ATTRIBUTE_TIMER_HANDLER lv_timer_handler(void) { TIMER_TRACE("begin"); diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_timer.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/misc/lv_timer.h similarity index 97% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_timer.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/misc/lv_timer.h index a9a8e50..50da8c9 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_timer.h +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/misc/lv_timer.h @@ -65,7 +65,7 @@ void _lv_timer_core_init(void); * Call it periodically to handle lv_timers. * @return time till it needs to be run next (in ms) */ -LV_ATTRIBUTE_TIMER_HANDLER uint32_t lv_timer_handler(void); +uint32_t /* LV_ATTRIBUTE_TIMER_HANDLER */ lv_timer_handler(void); //! @endcond @@ -75,7 +75,7 @@ LV_ATTRIBUTE_TIMER_HANDLER uint32_t lv_timer_handler(void); * This function is used to simplify the porting. * @param __ms the period for running lv_timer_handler() */ -static inline LV_ATTRIBUTE_TIMER_HANDLER uint32_t lv_timer_handler_run_in_period(uint32_t ms) +static inline uint32_t LV_ATTRIBUTE_TIMER_HANDLER lv_timer_handler_run_in_period(uint32_t ms) { static uint32_t last_tick = 0; uint32_t curr_tick = lv_tick_get(); diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_tlsf.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/misc/lv_tlsf.c similarity index 99% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_tlsf.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/misc/lv_tlsf.c index 27e0a46..fd3cc76 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_tlsf.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/misc/lv_tlsf.c @@ -358,7 +358,6 @@ static const size_t block_size_min = sizeof(block_header_t) - sizeof(block_header_t *); static const size_t block_size_max = tlsf_cast(size_t, 1) << FL_INDEX_MAX; - /* The TLSF control structure. */ typedef struct control_t { /* Empty lists point at this block to indicate they are free. */ diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_tlsf.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/misc/lv_tlsf.h similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_tlsf.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/misc/lv_tlsf.h diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_txt.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/misc/lv_txt.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_txt.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/misc/lv_txt.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_txt.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/misc/lv_txt.h similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_txt.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/misc/lv_txt.h diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_txt_ap.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/misc/lv_txt_ap.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_txt_ap.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/misc/lv_txt_ap.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_txt_ap.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/misc/lv_txt_ap.h similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_txt_ap.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/misc/lv_txt_ap.h diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_types.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/misc/lv_types.h similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_types.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/misc/lv_types.h diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_utils.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/misc/lv_utils.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_utils.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/misc/lv_utils.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_utils.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/misc/lv_utils.h similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_utils.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/misc/lv_utils.h diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/widgets/Makefile b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/widgets/Makefile similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/widgets/Makefile rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/widgets/Makefile diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/widgets/lv_arc.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/widgets/lv_arc.c similarity index 78% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/widgets/lv_arc.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/widgets/lv_arc.c index 6cab5f3..944a587 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/widgets/lv_arc.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/widgets/lv_arc.c @@ -21,6 +21,10 @@ #define MY_CLASS &lv_arc_class #define VALUE_UNSET INT16_MIN +#define CLICK_OUTSIDE_BG_ANGLES ((uint32_t) 0x00U) +#define CLICK_INSIDE_BG_ANGLES ((uint32_t) 0x01U) +#define CLICK_CLOSER_TO_MAX_END ((uint32_t) 0x00U) +#define CLICK_CLOSER_TO_MIN_END ((uint32_t) 0x01U) /********************** * TYPEDEFS @@ -39,6 +43,8 @@ static void get_center(const lv_obj_t * obj, lv_point_t * center, lv_coord_t * a static lv_coord_t get_angle(const lv_obj_t * obj); static void get_knob_area(lv_obj_t * arc, const lv_point_t * center, lv_coord_t r, lv_area_t * knob_area); static void value_update(lv_obj_t * arc); +static lv_coord_t knob_get_extra_size(lv_obj_t * obj); +static bool lv_arc_angle_within_bg_bounds(lv_obj_t * obj, const uint32_t angle, const uint32_t tolerance_deg); /********************** * STATIC VARIABLES @@ -322,7 +328,6 @@ lv_arc_mode_t lv_arc_get_mode(const lv_obj_t * obj) * Other functions *====================*/ - void lv_arc_align_obj_to_angle(const lv_obj_t * obj, lv_obj_t * obj_to_align, lv_coord_t r_offset) { LV_ASSERT_OBJ(obj, MY_CLASS); @@ -371,7 +376,6 @@ void lv_arc_rotate_obj_to_angle(const lv_obj_t * obj, lv_obj_t * obj_to_rotate, lv_obj_set_style_transform_angle(obj_to_rotate, angle * 10 + 900, 0); } - /********************** * STATIC FUNCTIONS **********************/ @@ -398,12 +402,12 @@ static void lv_arc_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) arc->chg_rate = 720; arc->last_tick = lv_tick_get(); arc->last_angle = arc->indic_angle_end; + arc->in_out = CLICK_OUTSIDE_BG_ANGLES; lv_obj_add_flag(obj, LV_OBJ_FLAG_CLICKABLE); lv_obj_clear_flag(obj, LV_OBJ_FLAG_SCROLL_CHAIN | LV_OBJ_FLAG_SCROLLABLE); lv_obj_set_ext_click_area(obj, LV_DPI_DEF / 10); - LV_TRACE_OBJ_CREATE("finished"); } @@ -477,29 +481,54 @@ static void lv_arc_event(const lv_obj_class_t * class_p, lv_event_t * e) angle -= arc->rotation; angle -= arc->bg_angle_start; /*Make the angle relative to the start angle*/ + /* If we click near the bg_angle_start the angle will be close to 360° instead of an small angle */ if(angle < 0) angle += 360; - int16_t deg_range = bg_end - arc->bg_angle_start; + const uint32_t circumference = (uint32_t)((2U * r * 314U) / 100U); /* Equivalent to: 2r * 3.14, avoiding floats */ + const uint32_t tolerance_deg = (360U * LV_DPX(50U)) / circumference; + const uint32_t min_close_prev = (uint32_t) arc->min_close; + const bool is_angle_within_bg_bounds = lv_arc_angle_within_bg_bounds(obj, (uint32_t) angle, tolerance_deg); + if(!is_angle_within_bg_bounds) { + return; + } + + int16_t deg_range = bg_end - arc->bg_angle_start; int16_t last_angle_rel = arc->last_angle - arc->bg_angle_start; int16_t delta_angle = angle - last_angle_rel; - /*Do not allow big jumps. + /*Do not allow big jumps (jumps bigger than 280°). *It's mainly to avoid jumping to the opposite end if the "dead" range between min. and max. is crossed. *Check which end was closer on the last valid press (arc->min_close) and prefer that end*/ if(LV_ABS(delta_angle) > 280) { if(arc->min_close) angle = 0; else angle = deg_range; } - else { - if(angle < deg_range / 2)arc->min_close = 1; - else arc->min_close = 0; + /* Check if click was outside the background arc start and end angles */ + else if(CLICK_OUTSIDE_BG_ANGLES == arc->in_out) { + if(arc->min_close) angle = -deg_range; + else angle = deg_range; } + else { /* Keep the angle value */ } + + /* Prevent big jumps when the click goes from start to end angle in the invisible + * part of the background arc without being released */ + if(((min_close_prev == CLICK_CLOSER_TO_MIN_END) && (arc->min_close == CLICK_CLOSER_TO_MAX_END)) + && ((CLICK_OUTSIDE_BG_ANGLES == arc->in_out) && (LV_ABS(delta_angle) > 280))) { + angle = 0; + } + else if(((min_close_prev == CLICK_CLOSER_TO_MAX_END) && (arc->min_close == CLICK_CLOSER_TO_MIN_END)) + && (CLICK_OUTSIDE_BG_ANGLES == arc->in_out)) { + angle = deg_range; + } + else { /* Keep the angle value */ } /*Calculate the slew rate limited angle based on change rate (degrees/sec)*/ delta_angle = angle - last_angle_rel; + uint32_t delta_tick = lv_tick_elaps(arc->last_tick); - int16_t delta_angle_max = (arc->chg_rate * delta_tick) / 1000; + /* delta_angle_max can never be signed. delta_tick is always signed, same for ch_rate */ + const uint16_t delta_angle_max = (arc->chg_rate * delta_tick) / 1000; if(delta_angle > delta_angle_max) { delta_angle = delta_angle_max; @@ -507,6 +536,7 @@ static void lv_arc_event(const lv_obj_class_t * class_p, lv_event_t * e) else if(delta_angle < -delta_angle_max) { delta_angle = -delta_angle_max; } + else { /* Nothing to do */ } angle = last_angle_rel + delta_angle; /*Apply the limited angle change*/ @@ -520,6 +550,11 @@ static void lv_arc_event(const lv_obj_class_t * class_p, lv_event_t * e) /*Set the new value*/ int16_t old_value = arc->value; int16_t new_value = lv_map(angle, arc->bg_angle_start, bg_end, arc->min_value, arc->max_value); + if(arc->type == LV_ARC_MODE_REVERSE) { + new_value = arc->max_value - new_value + arc->min_value; + } + + if(new_value != lv_arc_get_value(obj)) { arc->last_tick = lv_tick_get(); /*Cache timestamp for the next iteration*/ lv_arc_set_value(obj, new_value); /*set_value caches the last_angle for the next iteration*/ @@ -563,7 +598,7 @@ static void lv_arc_event(const lv_obj_class_t * class_p, lv_event_t * e) } } else if(code == LV_EVENT_HIT_TEST) { - lv_hit_test_info_t * info = lv_event_get_param(e);; + lv_hit_test_info_t * info = lv_event_get_param(e); lv_point_t p; lv_coord_t r; @@ -600,8 +635,11 @@ static void lv_arc_event(const lv_obj_class_t * class_p, lv_event_t * e) lv_coord_t knob_bottom = lv_obj_get_style_pad_bottom(obj, LV_PART_KNOB); lv_coord_t knob_pad = LV_MAX4(knob_left, knob_right, knob_top, knob_bottom) + 2; + lv_coord_t knob_extra_size = knob_pad - bg_pad; + knob_extra_size += knob_get_extra_size(obj); + lv_coord_t * s = lv_event_get_param(e); - *s = LV_MAX(*s, knob_pad - bg_pad); + *s = LV_MAX(*s, knob_extra_size); } else if(code == LV_EVENT_DRAW_MAIN) { lv_arc_draw(e); @@ -716,6 +754,7 @@ static void inv_arc_area(lv_obj_t * obj, uint16_t start_angle, uint16_t end_angl lv_area_t inv_area; lv_draw_arc_get_area(c.x, c.y, r, start_angle, end_angle, w, rounded, &inv_area); + lv_obj_invalidate_area(obj, &inv_area); } @@ -727,6 +766,13 @@ static void inv_knob_area(lv_obj_t * obj) lv_area_t a; get_knob_area(obj, &c, r, &a); + + lv_coord_t knob_extra_size = knob_get_extra_size(obj); + + if(knob_extra_size > 0) { + lv_area_increase(&a, knob_extra_size, knob_extra_size); + } + lv_obj_invalidate_area(obj, &a); } @@ -771,7 +817,6 @@ static lv_coord_t get_angle(const lv_obj_t * obj) return angle; } - static void get_knob_area(lv_obj_t * obj, const lv_point_t * center, lv_coord_t r, lv_area_t * knob_area) { lv_coord_t indic_width = lv_obj_get_style_arc_width(obj, LV_PART_INDICATOR); @@ -841,4 +886,136 @@ static void value_update(lv_obj_t * obj) arc->last_angle = angle; /*Cache angle for slew rate limiting*/ } +static lv_coord_t knob_get_extra_size(lv_obj_t * obj) +{ + lv_coord_t knob_shadow_size = 0; + knob_shadow_size += lv_obj_get_style_shadow_width(obj, LV_PART_KNOB); + knob_shadow_size += lv_obj_get_style_shadow_spread(obj, LV_PART_KNOB); + knob_shadow_size += LV_ABS(lv_obj_get_style_shadow_ofs_x(obj, LV_PART_KNOB)); + knob_shadow_size += LV_ABS(lv_obj_get_style_shadow_ofs_y(obj, LV_PART_KNOB)); + + lv_coord_t knob_outline_size = 0; + knob_outline_size += lv_obj_get_style_outline_width(obj, LV_PART_KNOB); + knob_outline_size += lv_obj_get_style_outline_pad(obj, LV_PART_KNOB); + + return LV_MAX(knob_shadow_size, knob_outline_size); +} + +/** + * Check if angle is within arc background bounds + * + * In order to avoid unexpected value update of the arc value when the user clicks + * outside of the arc background we need to check if the angle (of the clicked point) + * is within the bounds of the background. + * + * A tolerance (extra room) also should be taken into consideration. + * + * E.g. Arc with start angle of 0° and end angle of 90°, the background is only visible in + * that range, from 90° to 360° the background is invisible. Click in 150° should not update + * the arc value, click within the arc angle range should. + * + * IMPORTANT NOTE: angle is always relative to bg_angle_start, e.g. if bg_angle_start is 30 + * and we click a bit to the left, angle is 10, not the expected 40. + * + * @param obj Pointer to lv_arc + * @param angle Angle to be checked + * @param tolerance_deg Tolerance + * + * @return true if angle is within arc background bounds, false otherwise + */ +static bool lv_arc_angle_within_bg_bounds(lv_obj_t * obj, const uint32_t angle, const uint32_t tolerance_deg) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_arc_t * arc = (lv_arc_t *)obj; + + uint32_t smaller_angle = 0; + uint32_t bigger_angle = 0; + + /* Determine which background angle is smaller and bigger */ + if(arc->bg_angle_start < arc->bg_angle_end) { + bigger_angle = arc->bg_angle_end; + smaller_angle = arc->bg_angle_start; + } + else { + bigger_angle = (360 - arc->bg_angle_start) + arc->bg_angle_end; + smaller_angle = 0; + } + + /* Angle is between both background angles */ + if((smaller_angle <= angle) && (angle <= bigger_angle)) { + + if(((bigger_angle - smaller_angle) / 2U) >= angle) { + arc->min_close = 1; + } + else { + arc->min_close = 0; + } + + arc->in_out = CLICK_INSIDE_BG_ANGLES; + + return true; + } + /* Distance between background start and end angles is less than tolerance, + * consider the click inside the arc */ + else if(((smaller_angle - tolerance_deg) <= 0U) && + (360U - (bigger_angle + (smaller_angle - tolerance_deg)))) { + + arc->min_close = 1; + arc->in_out = CLICK_INSIDE_BG_ANGLES; + return true; + } + else { /* Case handled below */ } + + /* Legends: + * 0° = angle 0 + * 360° = angle 360 + * T: Tolerance + * A: Angle + * S: Arc background start angle + * E: Arc background end angle + * + * Start angle is bigger or equal to tolerance */ + if((smaller_angle >= tolerance_deg) + /* (360° - T) --- A --- 360° */ + && ((angle >= (360U - tolerance_deg)) && (angle <= 360U))) { + + arc->min_close = 1; + arc->in_out = CLICK_OUTSIDE_BG_ANGLES; + return true; + } + /* Tolerance is bigger than bg start angle */ + else if((smaller_angle < tolerance_deg) + /* (360° - (T - S)) --- A --- 360° */ + && (((360U - (tolerance_deg - smaller_angle)) <= angle)) && (angle <= 360U)) { + + arc->min_close = 1; + arc->in_out = CLICK_OUTSIDE_BG_ANGLES; + return true; + } + /* 360° is bigger than background end angle + tolerance */ + else if((360U >= (bigger_angle + tolerance_deg)) + /* E --- A --- (E + T) */ + && ((bigger_angle <= (angle + smaller_angle)) && + ((angle + smaller_angle) <= (bigger_angle + tolerance_deg)))) { + + arc->min_close = 0; + arc->in_out = CLICK_OUTSIDE_BG_ANGLES; + return true; + } + /* Background end angle + tolerance is bigger than 360° and bg_start_angle + tolerance is not near 0° + ((bg_end_angle + tolerance) - 360°) + * Here we can assume background is not near 0° because of the first two initial checks */ + else if((360U < (bigger_angle + tolerance_deg)) + && (angle <= 0U + ((bigger_angle + tolerance_deg) - 360U)) && (angle > bigger_angle)) { + + arc->min_close = 0; + arc->in_out = CLICK_OUTSIDE_BG_ANGLES; + return true; + } + else { + /* Nothing to do */ + } + + return false; +} + #endif diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/widgets/lv_arc.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/widgets/lv_arc.h similarity index 95% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/widgets/lv_arc.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/widgets/lv_arc.h index fd53fc1..6a8a072 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/widgets/lv_arc.h +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/widgets/lv_arc.h @@ -44,10 +44,11 @@ typedef struct { int16_t value; /*Current value of the arc*/ int16_t min_value; /*Minimum value of the arc*/ int16_t max_value; /*Maximum value of the arc*/ - uint16_t dragging : 1; - uint16_t type : 2; - uint16_t min_close : 1; /*1: the last pressed angle was closer to minimum end*/ - uint16_t chg_rate; /*Drag angle rate of change of the arc (degrees/sec)*/ + uint32_t dragging : 1; + uint32_t type : 2; + uint32_t min_close : 1; /*1: the last pressed angle was closer to minimum end*/ + uint32_t in_out : 1; /* 1: The click was within the background arc angles. 0: Click outside */ + uint32_t chg_rate; /*Drag angle rate of change of the arc (degrees/sec)*/ uint32_t last_tick; /*Last dragging event timestamp of the arc*/ int16_t last_angle; /*Last dragging angle of the arc*/ } lv_arc_t; diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/widgets/lv_bar.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/widgets/lv_bar.c similarity index 99% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/widgets/lv_bar.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/widgets/lv_bar.c index 0da2a98..a057618 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/widgets/lv_bar.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/widgets/lv_bar.c @@ -571,6 +571,8 @@ static void lv_bar_set_value_with_anim(lv_obj_t * obj, int32_t new_value, int32_ _lv_bar_anim_t * anim_info, lv_anim_enable_t en) { if(en == LV_ANIM_OFF) { + lv_anim_del(anim_info, NULL); + anim_info->anim_state = LV_BAR_ANIM_STATE_INV; *value_ptr = new_value; lv_obj_invalidate((lv_obj_t *)obj); } diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/widgets/lv_bar.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/widgets/lv_bar.h similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/widgets/lv_bar.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/widgets/lv_bar.h diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/widgets/lv_btn.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/widgets/lv_btn.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/widgets/lv_btn.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/widgets/lv_btn.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/widgets/lv_btn.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/widgets/lv_btn.h similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/widgets/lv_btn.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/widgets/lv_btn.h diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/widgets/lv_btnmatrix.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/widgets/lv_btnmatrix.c similarity index 95% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/widgets/lv_btnmatrix.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/widgets/lv_btnmatrix.c index 92a4d2f..5616b66 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/widgets/lv_btnmatrix.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/widgets/lv_btnmatrix.c @@ -23,7 +23,7 @@ #define MY_CLASS &lv_btnmatrix_class #define BTN_EXTRA_CLICK_AREA_MAX (LV_DPI_DEF / 10) -#define LV_BTNMATRIX_WIDTH_MASK 0x0007 +#define LV_BTNMATRIX_WIDTH_MASK 0x000F /********************** * TYPEDEFS @@ -208,7 +208,7 @@ void lv_btnmatrix_set_btn_ctrl(lv_obj_t * obj, uint16_t btn_id, lv_btnmatrix_ctr { LV_ASSERT_OBJ(obj, MY_CLASS); - lv_btnmatrix_t * btnm = (lv_btnmatrix_t *)obj;; + lv_btnmatrix_t * btnm = (lv_btnmatrix_t *)obj; if(btn_id >= btnm->btn_cnt) return; @@ -216,6 +216,19 @@ void lv_btnmatrix_set_btn_ctrl(lv_obj_t * obj, uint16_t btn_id, lv_btnmatrix_ctr lv_btnmatrix_clear_btn_ctrl_all(obj, LV_BTNMATRIX_CTRL_CHECKED); } + /* If we hide a button if all buttons are now hidden hide the whole button matrix to make focus behave correctly */ + if(ctrl & LV_BTNMATRIX_CTRL_HIDDEN) { + bool all_buttons_hidden = true; + if(btnm->btn_cnt > 1) { + for(uint16_t btn_idx = 0; btn_idx < btnm->btn_cnt; btn_idx++) { + if(btn_idx == btn_id) continue; + if(!(btnm->ctrl_bits[btn_idx] & LV_BTNMATRIX_CTRL_HIDDEN)) all_buttons_hidden = false; + } + + } + if(all_buttons_hidden) lv_obj_add_flag(obj, LV_OBJ_FLAG_HIDDEN); + } + btnm->ctrl_bits[btn_id] |= ctrl; invalidate_button_area(obj, btn_id); @@ -228,10 +241,15 @@ void lv_btnmatrix_clear_btn_ctrl(lv_obj_t * obj, uint16_t btn_id, lv_btnmatrix_c { LV_ASSERT_OBJ(obj, MY_CLASS); - lv_btnmatrix_t * btnm = (lv_btnmatrix_t *)obj;; + lv_btnmatrix_t * btnm = (lv_btnmatrix_t *)obj; if(btn_id >= btnm->btn_cnt) return; + /* If all buttons were hidden the whole button matrix is hidden so we need to check and remove hidden flag if present */ + if(ctrl & LV_BTNMATRIX_CTRL_HIDDEN) { + if(lv_obj_has_flag(obj, LV_OBJ_FLAG_HIDDEN)) lv_obj_clear_flag(obj, LV_OBJ_FLAG_HIDDEN); + } + btnm->ctrl_bits[btn_id] &= (~ctrl); invalidate_button_area(obj, btn_id); @@ -422,6 +440,7 @@ static void lv_btnmatrix_event(const lv_obj_class_t * class_p, lv_event_t * e) lv_indev_get_point(param, &p); btn_pr = get_button_from_point(obj, &p); /*Handle the case where there is no button there*/ + btnm->btn_id_sel = LV_BTNMATRIX_BTN_NONE; if(btn_pr != LV_BTNMATRIX_BTN_NONE) { if(button_is_inactive(btnm->ctrl_bits[btn_pr]) == false && button_is_hidden(btnm->ctrl_bits[btn_pr]) == false) { @@ -429,6 +448,9 @@ static void lv_btnmatrix_event(const lv_obj_class_t * class_p, lv_event_t * e) invalidate_button_area(obj, btnm->btn_id_sel); /*Invalidate the new area*/ } } + else { + btnm->btn_id_sel = LV_BTNMATRIX_BTN_NONE; + } } if(btnm->btn_id_sel != LV_BTNMATRIX_BTN_NONE) { @@ -489,7 +511,6 @@ static void lv_btnmatrix_event(const lv_obj_class_t * class_p, lv_event_t * e) if(btnm->one_check) make_one_button_checked(obj, btnm->btn_id_sel); } - if((button_is_click_trig(btnm->ctrl_bits[btnm->btn_id_sel]) == true || button_is_popover(btnm->ctrl_bits[btnm->btn_id_sel]) == true) && button_is_inactive(btnm->ctrl_bits[btnm->btn_id_sel]) == false && @@ -520,6 +541,8 @@ static void lv_btnmatrix_event(const lv_obj_class_t * class_p, lv_event_t * e) btnm->btn_id_sel = LV_BTNMATRIX_BTN_NONE; } else if(code == LV_EVENT_FOCUSED) { + if(btnm->btn_cnt == 0) return; + lv_indev_t * indev = lv_event_get_param(e); lv_indev_type_t indev_type = lv_indev_get_type(indev); @@ -563,9 +586,15 @@ static void lv_btnmatrix_event(const lv_obj_class_t * class_p, lv_event_t * e) else btnm->btn_id_sel++; if(btnm->btn_id_sel >= btnm->btn_cnt) btnm->btn_id_sel = 0; + uint16_t btn_id_start = btnm->btn_id_sel; while(button_is_hidden(btnm->ctrl_bits[btnm->btn_id_sel]) || button_is_inactive(btnm->ctrl_bits[btnm->btn_id_sel])) { btnm->btn_id_sel++; if(btnm->btn_id_sel >= btnm->btn_cnt) btnm->btn_id_sel = 0; + + if(btnm->btn_id_sel == btn_id_start) { + btnm->btn_id_sel = LV_BTNMATRIX_BTN_NONE; + break; + } } } else if(c == LV_KEY_LEFT) { @@ -574,9 +603,15 @@ static void lv_btnmatrix_event(const lv_obj_class_t * class_p, lv_event_t * e) if(btnm->btn_id_sel == 0) btnm->btn_id_sel = btnm->btn_cnt - 1; else if(btnm->btn_id_sel > 0) btnm->btn_id_sel--; + uint16_t btn_id_start = btnm->btn_id_sel; while(button_is_hidden(btnm->ctrl_bits[btnm->btn_id_sel]) || button_is_inactive(btnm->ctrl_bits[btnm->btn_id_sel])) { if(btnm->btn_id_sel > 0) btnm->btn_id_sel--; else btnm->btn_id_sel = btnm->btn_cnt - 1; + + if(btnm->btn_id_sel == btn_id_start) { + btnm->btn_id_sel = LV_BTNMATRIX_BTN_NONE; + break; + } } } else if(c == LV_KEY_DOWN) { @@ -586,7 +621,10 @@ static void lv_btnmatrix_event(const lv_obj_class_t * class_p, lv_event_t * e) btnm->btn_id_sel = 0; while(button_is_hidden(btnm->ctrl_bits[btnm->btn_id_sel]) || button_is_inactive(btnm->ctrl_bits[btnm->btn_id_sel])) { btnm->btn_id_sel++; - if(btnm->btn_id_sel >= btnm->btn_cnt) btnm->btn_id_sel = 0; + if(btnm->btn_id_sel >= btnm->btn_cnt) { + btnm->btn_id_sel = LV_BTNMATRIX_BTN_NONE; + break; + } } } else { @@ -614,7 +652,10 @@ static void lv_btnmatrix_event(const lv_obj_class_t * class_p, lv_event_t * e) btnm->btn_id_sel = 0; while(button_is_hidden(btnm->ctrl_bits[btnm->btn_id_sel]) || button_is_inactive(btnm->ctrl_bits[btnm->btn_id_sel])) { btnm->btn_id_sel++; - if(btnm->btn_id_sel >= btnm->btn_cnt) btnm->btn_id_sel = 0; + if(btnm->btn_id_sel >= btnm->btn_cnt) { + btnm->btn_id_sel = LV_BTNMATRIX_BTN_NONE; + break; + } } } else { @@ -743,7 +784,6 @@ static void draw_main(lv_event_t * e) if(recolor) draw_label_dsc_act.flag |= LV_TEXT_FLAG_RECOLOR; else draw_label_dsc_act.flag &= ~LV_TEXT_FLAG_RECOLOR; - part_draw_dsc.draw_area = &btn_area; part_draw_dsc.id = btn_i; lv_event_send(obj, LV_EVENT_DRAW_PART_BEGIN, &part_draw_dsc); diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/widgets/lv_btnmatrix.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/widgets/lv_btnmatrix.h similarity index 87% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/widgets/lv_btnmatrix.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/widgets/lv_btnmatrix.h index 780d57b..2edf202 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/widgets/lv_btnmatrix.h +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/widgets/lv_btnmatrix.h @@ -32,18 +32,19 @@ LV_EXPORT_CONST_INT(LV_BTNMATRIX_BTN_NONE); /** Type to store button control bits (disabled, hidden etc.) * The first 3 bits are used to store the width*/ enum { - _LV_BTNMATRIX_WIDTH = 0x0007, /**< Reserved to stire the size units*/ - LV_BTNMATRIX_CTRL_HIDDEN = 0x0008, /**< Button hidden*/ - LV_BTNMATRIX_CTRL_NO_REPEAT = 0x0010, /**< Do not repeat press this button.*/ - LV_BTNMATRIX_CTRL_DISABLED = 0x0020, /**< Disable this button.*/ - LV_BTNMATRIX_CTRL_CHECKABLE = 0x0040, /**< The button can be toggled.*/ - LV_BTNMATRIX_CTRL_CHECKED = 0x0080, /**< Button is currently toggled (e.g. checked).*/ - LV_BTNMATRIX_CTRL_CLICK_TRIG = 0x0100, /**< 1: Send LV_EVENT_VALUE_CHANGE on CLICK, 0: Send LV_EVENT_VALUE_CHANGE on PRESS*/ - LV_BTNMATRIX_CTRL_POPOVER = 0x0200, /**< Show a popover when pressing this key*/ - LV_BTNMATRIX_CTRL_RECOLOR = 0x1000, /**< Enable text recoloring with `#color`*/ - _LV_BTNMATRIX_CTRL_RESERVED = 0x2000, /**< Reserved for later use*/ - LV_BTNMATRIX_CTRL_CUSTOM_1 = 0x4000, /**< Custom free to use flag*/ - LV_BTNMATRIX_CTRL_CUSTOM_2 = 0x8000, /**< Custom free to use flag*/ + _LV_BTNMATRIX_WIDTH = 0x000F, /**< Reserved to store the size units*/ + LV_BTNMATRIX_CTRL_HIDDEN = 0x0010, /**< Button hidden*/ + LV_BTNMATRIX_CTRL_NO_REPEAT = 0x0020, /**< Do not repeat press this button.*/ + LV_BTNMATRIX_CTRL_DISABLED = 0x0040, /**< Disable this button.*/ + LV_BTNMATRIX_CTRL_CHECKABLE = 0x0080, /**< The button can be toggled.*/ + LV_BTNMATRIX_CTRL_CHECKED = 0x0100, /**< Button is currently toggled (e.g. checked).*/ + LV_BTNMATRIX_CTRL_CLICK_TRIG = 0x0200, /**< 1: Send LV_EVENT_VALUE_CHANGE on CLICK, 0: Send LV_EVENT_VALUE_CHANGE on PRESS*/ + LV_BTNMATRIX_CTRL_POPOVER = 0x0400, /**< Show a popover when pressing this key*/ + LV_BTNMATRIX_CTRL_RECOLOR = 0x0800, /**< Enable text recoloring with `#color`*/ + _LV_BTNMATRIX_CTRL_RESERVED_1 = 0x1000, /**< Reserved for later use*/ + _LV_BTNMATRIX_CTRL_RESERVED_2 = 0x2000, /**< Reserved for later use*/ + LV_BTNMATRIX_CTRL_CUSTOM_1 = 0x4000, /**< Custom free to use flag*/ + LV_BTNMATRIX_CTRL_CUSTOM_2 = 0x8000, /**< Custom free to use flag*/ }; typedef uint16_t lv_btnmatrix_ctrl_t; diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/widgets/lv_canvas.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/widgets/lv_canvas.c similarity index 97% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/widgets/lv_canvas.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/widgets/lv_canvas.c index 1f94927..243a083 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/widgets/lv_canvas.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/widgets/lv_canvas.c @@ -189,20 +189,18 @@ void lv_canvas_transform(lv_obj_t * obj, lv_img_dsc_t * src_img, int16_t angle, lv_color_t * cbuf = lv_mem_alloc(dest_img->header.w * sizeof(lv_color_t)); lv_opa_t * abuf = lv_mem_alloc(dest_img->header.w * sizeof(lv_opa_t)); for(y = 0; y < dest_img->header.h; y++) { - if(y + offset_y >= 0) { - lv_draw_sw_transform(NULL, &dest_area, src_img->data, src_img->header.w, src_img->header.h, src_img->header.w, - &draw_dsc, canvas->dsc.header.cf, cbuf, abuf); + lv_draw_sw_transform(NULL, &dest_area, src_img->data, src_img->header.w, src_img->header.h, src_img->header.w, + &draw_dsc, canvas->dsc.header.cf, cbuf, abuf); - for(x = 0; x < dest_img->header.w; x++) { - if(abuf[x]) { - lv_img_buf_set_px_color(dest_img, x, y, cbuf[x]); - lv_img_buf_set_px_alpha(dest_img, x, y, abuf[x]); - } + for(x = 0; x < dest_img->header.w; x++) { + if(abuf[x]) { + lv_img_buf_set_px_color(dest_img, x, y, cbuf[x]); + lv_img_buf_set_px_alpha(dest_img, x, y, abuf[x]); } - - dest_area.y1++; - dest_area.y2++; } + + dest_area.y1++; + dest_area.y2++; } lv_mem_free(cbuf); lv_mem_free(abuf); @@ -658,7 +656,6 @@ void lv_canvas_draw_line(lv_obj_t * canvas, const lv_point_t points[], uint32_t lv_disp_t * refr_ori = _lv_refr_get_disp_refreshing(); _lv_refr_set_disp_refreshing(&fake_disp); - /*Disable anti-aliasing if drawing with transparent color to chroma keyed canvas*/ lv_color_t ctransp = LV_COLOR_CHROMA_KEY; if(dsc->header.cf == LV_IMG_CF_TRUE_COLOR_CHROMA_KEYED && @@ -791,7 +788,6 @@ static void lv_canvas_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj) lv_img_cache_invalidate_src(&canvas->dsc); } - static void init_fake_disp(lv_obj_t * canvas, lv_disp_t * disp, lv_disp_drv_t * drv, lv_area_t * clip_area) { lv_img_dsc_t * dsc = lv_canvas_get_img(canvas); @@ -831,6 +827,4 @@ static void deinit_fake_disp(lv_obj_t * canvas, lv_disp_t * disp) lv_mem_free(disp->driver->draw_ctx); } - - #endif diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/widgets/lv_canvas.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/widgets/lv_canvas.h similarity index 99% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/widgets/lv_canvas.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/widgets/lv_canvas.h index 71f0516..cb1341b 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/widgets/lv_canvas.h +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/widgets/lv_canvas.h @@ -91,7 +91,6 @@ static inline void lv_canvas_set_px(lv_obj_t * canvas, lv_coord_t x, lv_coord_t */ void lv_canvas_set_px_opa(lv_obj_t * canvas, lv_coord_t x, lv_coord_t y, lv_opa_t opa); - /** * Set the palette color of a canvas with index format. Valid only for `LV_IMG_CF_INDEXED1/2/4/8` * @param canvas pointer to canvas object @@ -247,7 +246,7 @@ void lv_canvas_draw_polygon(lv_obj_t * canvas, const lv_point_t points[], uint32 * @param r radius of the arc * @param start_angle start angle in degrees * @param end_angle end angle in degrees - * @param draw_dsc pointer to an initialized `lv_draw_line_dsc_t` variable + * @param draw_dsc pointer to an initialized `lv_draw_arc_dsc_t` variable */ void lv_canvas_draw_arc(lv_obj_t * canvas, lv_coord_t x, lv_coord_t y, lv_coord_t r, int32_t start_angle, int32_t end_angle, const lv_draw_arc_dsc_t * draw_dsc); diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/widgets/lv_checkbox.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/widgets/lv_checkbox.c similarity index 96% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/widgets/lv_checkbox.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/widgets/lv_checkbox.c index dd3b3d1..fa79b37 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/widgets/lv_checkbox.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/widgets/lv_checkbox.c @@ -74,14 +74,16 @@ void lv_checkbox_set_text(lv_obj_t * obj, const char * txt) size_t len = strlen(txt); #endif - if(!cb->static_txt) cb->txt = lv_mem_realloc(cb->txt, len + 1); - else cb->txt = lv_mem_alloc(len + 1); + char * _txt = (char *)cb->txt; + if(!cb->static_txt) _txt = lv_mem_realloc(_txt, len + 1); + else _txt = lv_mem_alloc(len + 1); #if LV_USE_ARABIC_PERSIAN_CHARS - _lv_txt_ap_proc(txt, cb->txt); + _lv_txt_ap_proc(txt, _txt); #else - strcpy(cb->txt, txt); + strcpy(_txt, txt); #endif + cb->txt = _txt; cb->static_txt = 0; lv_obj_refresh_self_size(obj); @@ -92,7 +94,7 @@ void lv_checkbox_set_text_static(lv_obj_t * obj, const char * txt) { lv_checkbox_t * cb = (lv_checkbox_t *)obj; - if(!cb->static_txt) lv_mem_free(cb->txt); + if(!cb->static_txt) lv_mem_free((void *)cb->txt); cb->txt = (char *)txt; cb->static_txt = 1; @@ -138,7 +140,7 @@ static void lv_checkbox_destructor(const lv_obj_class_t * class_p, lv_obj_t * ob lv_checkbox_t * cb = (lv_checkbox_t *)obj; if(!cb->static_txt) { - lv_mem_free(cb->txt); + lv_mem_free((void *)cb->txt); cb->txt = NULL; } LV_TRACE_OBJ_CREATE("finished"); diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/widgets/lv_checkbox.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/widgets/lv_checkbox.h similarity index 98% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/widgets/lv_checkbox.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/widgets/lv_checkbox.h index 772f500..11405bd 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/widgets/lv_checkbox.h +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/widgets/lv_checkbox.h @@ -28,7 +28,7 @@ extern "C" { typedef struct { lv_obj_t obj; - char * txt; + const char * txt; uint32_t static_txt : 1; } lv_checkbox_t; diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/widgets/lv_dropdown.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/widgets/lv_dropdown.c similarity index 99% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/widgets/lv_dropdown.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/widgets/lv_dropdown.c index 241d177..aa51816 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/widgets/lv_dropdown.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/widgets/lv_dropdown.c @@ -79,7 +79,6 @@ const lv_obj_class_t lv_dropdownlist_class = { .base_class = &lv_obj_class }; - /********************** * MACROS **********************/ @@ -285,6 +284,10 @@ void lv_dropdown_set_selected(lv_obj_t * obj, uint16_t sel_opt) dropdown->sel_opt_id = sel_opt < dropdown->option_cnt ? sel_opt : dropdown->option_cnt - 1; dropdown->sel_opt_id_orig = dropdown->sel_opt_id; + if(dropdown->list) { + position_to_selected(obj); + } + lv_obj_invalidate(obj); } @@ -403,21 +406,25 @@ int32_t lv_dropdown_get_option_index(lv_obj_t * obj, const char * option) const char * opts = lv_dropdown_get_options(obj); uint32_t char_i = 0; uint32_t opt_i = 0; + uint32_t option_len = strlen(option); const char * start = opts; while(start[char_i] != '\0') { for(char_i = 0; (start[char_i] != '\n') && (start[char_i] != '\0'); char_i++); - if(memcmp(start, option, LV_MIN(strlen(option), char_i)) == 0) return opt_i; + if(option_len == char_i && memcmp(start, option, LV_MIN(option_len, char_i)) == 0) { + return opt_i; + } + start = &start[char_i]; if(start[0] == '\n') start++; + char_i = 0; opt_i++; } return -1; } - const char * lv_dropdown_get_symbol(lv_obj_t * obj) { LV_ASSERT_OBJ(obj, MY_CLASS); @@ -769,7 +776,6 @@ static void lv_dropdown_list_event(const lv_obj_class_t * class_p, lv_event_t * } } - static void draw_main(lv_event_t * e) { lv_obj_t * obj = lv_event_get_target(e); @@ -1004,7 +1010,6 @@ static void draw_box_label(lv_obj_t * dropdown_obj, lv_draw_ctx_t * draw_ctx, ui list_obj->skip_trans = 0; } - static lv_res_t btn_release_handler(lv_obj_t * obj) { lv_dropdown_t * dropdown = (lv_dropdown_t *)obj; diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/widgets/lv_dropdown.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/widgets/lv_dropdown.h similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/widgets/lv_dropdown.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/widgets/lv_dropdown.h diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/widgets/lv_img.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/widgets/lv_img.c similarity index 98% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/widgets/lv_img.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/widgets/lv_img.c index f47a789..6cc30bd 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/widgets/lv_img.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/widgets/lv_img.c @@ -166,8 +166,6 @@ void lv_img_set_offset_x(lv_obj_t * obj, lv_coord_t x) lv_img_t * img = (lv_img_t *)obj; - x = x % img->w; - img->offset.x = x; lv_obj_invalidate(obj); } @@ -178,15 +176,14 @@ void lv_img_set_offset_y(lv_obj_t * obj, lv_coord_t y) lv_img_t * img = (lv_img_t *)obj; - y = y % img->h; - img->offset.y = y; lv_obj_invalidate(obj); } void lv_img_set_angle(lv_obj_t * obj, int16_t angle) { - if(angle < 0 || angle >= 3600) angle = angle % 3600; + while(angle >= 3600) angle -= 3600; + while(angle < 0) angle += 3600; lv_img_t * img = (lv_img_t *)obj; if(angle == img->angle) return; @@ -427,7 +424,6 @@ static lv_point_t lv_img_get_transformed_size(lv_obj_t * obj) { lv_img_t * img = (lv_img_t *)obj; - lv_area_t area_transform; _lv_img_buf_get_transformed_area(&area_transform, img->w, img->h, img->angle, img->zoom, &img->pivot); @@ -659,12 +655,14 @@ static void draw_img(lv_event_t * e) draw_ctx->clip_area = &img_clip_area; lv_area_t coords_tmp; - coords_tmp.y1 = img_max_area.y1 + img->offset.y; + lv_coord_t offset_x = img->offset.x % img->w; + lv_coord_t offset_y = img->offset.y % img->h; + coords_tmp.y1 = img_max_area.y1 + offset_y; if(coords_tmp.y1 > img_max_area.y1) coords_tmp.y1 -= img->h; coords_tmp.y2 = coords_tmp.y1 + img->h - 1; for(; coords_tmp.y1 < img_max_area.y2; coords_tmp.y1 += img_size_final.y, coords_tmp.y2 += img_size_final.y) { - coords_tmp.x1 = img_max_area.x1 + img->offset.x; + coords_tmp.x1 = img_max_area.x1 + offset_x; if(coords_tmp.x1 > img_max_area.x1) coords_tmp.x1 -= img->w; coords_tmp.x2 = coords_tmp.x1 + img->w - 1; diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/widgets/lv_img.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/widgets/lv_img.h similarity index 99% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/widgets/lv_img.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/widgets/lv_img.h index eb76c8d..59ef535 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/widgets/lv_img.h +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/widgets/lv_img.h @@ -110,7 +110,6 @@ void lv_img_set_offset_x(lv_obj_t * obj, lv_coord_t x); */ void lv_img_set_offset_y(lv_obj_t * obj, lv_coord_t y); - /** * Set the rotation angle of the image. * The image will be rotated around the set pivot set by `lv_img_set_pivot()` @@ -129,7 +128,6 @@ void lv_img_set_angle(lv_obj_t * obj, int16_t angle); */ void lv_img_set_pivot(lv_obj_t * obj, lv_coord_t x, lv_coord_t y); - /** * Set the zoom factor of the image. * Note that indexed and alpha only images can't be transformed. diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/widgets/lv_label.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/widgets/lv_label.c similarity index 99% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/widgets/lv_label.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/widgets/lv_label.c index f4fbe01..e1b3e8d 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/widgets/lv_label.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/widgets/lv_label.c @@ -717,7 +717,6 @@ static void lv_label_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) lv_label_set_long_mode(obj, LV_LABEL_LONG_WRAP); lv_label_set_text(obj, "Text"); - LV_TRACE_OBJ_CREATE("finished"); } @@ -787,7 +786,6 @@ static void lv_label_event(const lv_obj_class_t * class_p, lv_event_t * e) } } - static void draw_main(lv_event_t * e) { lv_obj_t * obj = lv_event_get_target(e); @@ -1061,6 +1059,7 @@ static void lv_label_refr_text(lv_obj_t * obj) if(anim_template) { a.act_time = anim_template->act_time; a.repeat_delay = anim_template->repeat_delay; + a.repeat_cnt = anim_template->repeat_cnt; } else if(act_time < a.time) { a.act_time = act_time; /*To keep the old position when the label text is updated mid-scrolling*/ @@ -1088,6 +1087,7 @@ static void lv_label_refr_text(lv_obj_t * obj) if(anim_template) { a.act_time = anim_template->act_time; a.repeat_delay = anim_template->repeat_delay; + a.repeat_cnt = anim_template->repeat_cnt; } else if(act_time < a.time) { a.act_time = act_time; /*To keep the old position when the label text is updated mid-scrolling*/ @@ -1168,7 +1168,6 @@ static void lv_label_refr_text(lv_obj_t * obj) lv_obj_invalidate(obj); } - static void lv_label_revert_dots(lv_obj_t * obj) { @@ -1255,7 +1254,6 @@ static void lv_label_dot_tmp_free(lv_obj_t * obj) label->dot.tmp_ptr = NULL; } - static void set_ofs_x_anim(void * obj, int32_t v) { lv_label_t * label = (lv_label_t *)obj; @@ -1270,5 +1268,4 @@ static void set_ofs_y_anim(void * obj, int32_t v) lv_obj_invalidate(obj); } - #endif diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/widgets/lv_label.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/widgets/lv_label.h similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/widgets/lv_label.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/widgets/lv_label.h diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/widgets/lv_line.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/widgets/lv_line.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/widgets/lv_line.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/widgets/lv_line.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/widgets/lv_line.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/widgets/lv_line.h similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/widgets/lv_line.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/widgets/lv_line.h diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/widgets/lv_objx_templ.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/widgets/lv_objx_templ.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/widgets/lv_objx_templ.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/widgets/lv_objx_templ.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/widgets/lv_objx_templ.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/widgets/lv_objx_templ.h similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/widgets/lv_objx_templ.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/widgets/lv_objx_templ.h diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/widgets/lv_roller.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/widgets/lv_roller.c similarity index 94% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/widgets/lv_roller.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/widgets/lv_roller.c index fd9b394..bcfc314 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/widgets/lv_roller.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/widgets/lv_roller.c @@ -254,7 +254,6 @@ void lv_roller_get_selected_str(const lv_obj_t * obj, char * buf, uint32_t buf_s buf[c] = '\0'; } - /** * Get the options of a roller * @param roller pointer to roller object @@ -267,7 +266,6 @@ const char * lv_roller_get_options(const lv_obj_t * obj) return lv_label_get_text(get_label(obj)); } - /** * Get the total number of options * @param roller pointer to a roller object @@ -290,7 +288,6 @@ uint16_t lv_roller_get_option_cnt(const lv_obj_t * obj) * STATIC FUNCTIONS **********************/ - static void lv_roller_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) { LV_UNUSED(class_p); @@ -350,7 +347,7 @@ static void lv_roller_event(const lv_obj_class_t * class_p, lv_event_t * e) lv_indev_get_vect(indev, &p); if(p.y) { lv_obj_t * label = get_label(obj); - lv_obj_set_y(label, lv_obj_get_y(label) + p.y); + lv_obj_set_y(label, lv_obj_get_y_aligned(label) + p.y); roller->moved = 1; } } @@ -446,7 +443,6 @@ static void lv_roller_label_event(const lv_obj_class_t * class_p, lv_event_t * e } } - static void draw_main(lv_event_t * e) { lv_event_code_t code = lv_event_get_code(e); @@ -477,28 +473,34 @@ static void draw_main(lv_event_t * e) area_ok = _lv_area_intersect(&mask_sel, draw_ctx->clip_area, &sel_area); if(area_ok) { lv_obj_t * label = get_label(obj); + if(lv_label_get_recolor(label)) label_dsc.flag |= LV_TEXT_FLAG_RECOLOR; /*Get the size of the "selected text"*/ - lv_point_t res_p; - lv_txt_get_size(&res_p, lv_label_get_text(label), label_dsc.font, label_dsc.letter_space, label_dsc.line_space, - lv_obj_get_width(obj), LV_TEXT_FLAG_EXPAND); + lv_point_t label_sel_size; + lv_txt_get_size(&label_sel_size, lv_label_get_text(label), label_dsc.font, label_dsc.letter_space, + label_dsc.line_space, lv_obj_get_width(obj), LV_TEXT_FLAG_EXPAND); /*Move the selected label proportionally with the background label*/ lv_coord_t roller_h = lv_obj_get_height(obj); - int32_t label_y_prop = label->coords.y1 - (roller_h / 2 + - obj->coords.y1); /*label offset from the middle line of the roller*/ - label_y_prop = (label_y_prop * 16384) / lv_obj_get_height( - label); /*Proportional position from the middle line (upscaled by << 14)*/ - - /*Apply a correction with different line heights*/ const lv_font_t * normal_label_font = lv_obj_get_style_text_font(obj, LV_PART_MAIN); - lv_coord_t corr = (label_dsc.font->line_height - normal_label_font->line_height) / 2; + /*label offset from the middle line of the roller*/ + int32_t label_y_prop = (label->coords.y1 + normal_label_font->line_height / 2) - (roller_h / 2 + obj->coords.y1); + + /*Proportional position from the middle line. + *Will be 0 for the first option, and 1 for the last option (upscaled by << 14)*/ + lv_coord_t remain_h = lv_obj_get_height(label) - normal_label_font->line_height; + if(remain_h > 0) { + label_y_prop = (label_y_prop << 14) / remain_h; + } + + /*We don't want the selected label start and end exactly where the normal label is as + *a larger font won't centered on selected area.*/ + int32_t corr = label_dsc.font->line_height; /*Apply the proportional position to the selected text*/ - res_p.y -= corr; int32_t label_sel_y = roller_h / 2 + obj->coords.y1; - label_sel_y += (label_y_prop * res_p.y) >> 14; - label_sel_y -= corr; + label_sel_y += ((label_sel_size.y - corr) * label_y_prop) >> 14; + label_sel_y -= corr / 2; lv_coord_t bwidth = lv_obj_get_style_border_width(obj, LV_PART_MAIN); lv_coord_t pleft = lv_obj_get_style_pad_left(obj, LV_PART_MAIN); @@ -509,7 +511,7 @@ static void draw_main(lv_event_t * e) label_sel_area.x1 = obj->coords.x1 + pleft + bwidth; label_sel_area.y1 = label_sel_y; label_sel_area.x2 = obj->coords.x2 - pright - bwidth; - label_sel_area.y2 = label_sel_area.y1 + res_p.y; + label_sel_area.y2 = label_sel_area.y1 + label_sel_size.y; label_dsc.flag |= LV_TEXT_FLAG_EXPAND; const lv_area_t * clip_area_ori = draw_ctx->clip_area; @@ -529,6 +531,8 @@ static void draw_label(lv_event_t * e) lv_draw_label_dsc_t label_draw_dsc; lv_draw_label_dsc_init(&label_draw_dsc); lv_obj_init_draw_label_dsc(roller, LV_PART_MAIN, &label_draw_dsc); + if(lv_label_get_recolor(label_obj)) label_draw_dsc.flag |= LV_TEXT_FLAG_RECOLOR; + lv_draw_ctx_t * draw_ctx = lv_event_get_draw_ctx(e); /*If the roller has shadow or outline it has some ext. draw size @@ -744,7 +748,6 @@ static void inf_normalize(lv_obj_t * obj) lv_obj_t * label = get_label(obj); - lv_coord_t sel_y1 = roller->sel_opt_id * (font_h + line_space); lv_coord_t mid_y1 = h / 2 - font_h / 2; lv_coord_t new_y = mid_y1 - sel_y1; @@ -757,7 +760,6 @@ static lv_obj_t * get_label(const lv_obj_t * obj) return lv_obj_get_child(obj, 0); } - static lv_coord_t get_selected_label_width(const lv_obj_t * obj) { lv_obj_t * label = get_label(obj); @@ -777,7 +779,6 @@ static void scroll_anim_ready_cb(lv_anim_t * a) inf_normalize(obj); } - static void set_y_anim(void * obj, int32_t v) { lv_obj_set_y(obj, v); diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/widgets/lv_roller.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/widgets/lv_roller.h similarity index 99% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/widgets/lv_roller.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/widgets/lv_roller.h index 14411de..b6dc7b8 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/widgets/lv_roller.h +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/widgets/lv_roller.h @@ -52,7 +52,6 @@ typedef struct { extern const lv_obj_class_t lv_roller_class; - /********************** * GLOBAL PROTOTYPES **********************/ @@ -110,7 +109,6 @@ uint16_t lv_roller_get_selected(const lv_obj_t * obj); */ void lv_roller_get_selected_str(const lv_obj_t * obj, char * buf, uint32_t buf_size); - /** * Get the options of a roller * @param obj pointer to roller object diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/widgets/lv_slider.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/widgets/lv_slider.c similarity index 98% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/widgets/lv_slider.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/widgets/lv_slider.c index 3f85efc..98711da 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/widgets/lv_slider.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/widgets/lv_slider.c @@ -239,8 +239,12 @@ static void lv_slider_event(const lv_obj_class_t * class_p, lv_event_t * e) new_value = LV_CLAMP(real_min_value, new_value, real_max_value); if(*slider->value_to_set != new_value) { - *slider->value_to_set = new_value; - lv_obj_invalidate(obj); + if(slider->value_to_set == &slider->bar.start_value) { + lv_bar_set_start_value(obj, new_value, LV_ANIM_ON); + } + else { + lv_bar_set_value(obj, new_value, LV_ANIM_ON); + } res = lv_event_send(obj, LV_EVENT_VALUE_CHANGED, NULL); if(res != LV_RES_OK) return; } diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/widgets/lv_slider.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/widgets/lv_slider.h similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/widgets/lv_slider.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/widgets/lv_slider.h diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/widgets/lv_switch.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/widgets/lv_switch.c similarity index 99% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/widgets/lv_switch.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/widgets/lv_switch.c index b328610..f9235ba 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/widgets/lv_switch.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/widgets/lv_switch.c @@ -273,5 +273,4 @@ static void lv_switch_trigger_anim(lv_obj_t * obj) } } - #endif diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/widgets/lv_switch.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/widgets/lv_switch.h similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/widgets/lv_switch.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/widgets/lv_switch.h diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/widgets/lv_table.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/widgets/lv_table.c similarity index 87% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/widgets/lv_table.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/widgets/lv_table.c index f789e8d..8320bf5 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/widgets/lv_table.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/widgets/lv_table.c @@ -40,7 +40,7 @@ static void refr_size_form_row(lv_obj_t * obj, uint32_t start_row); static void refr_cell_size(lv_obj_t * obj, uint32_t row, uint32_t col); static lv_res_t get_pressed_cell(lv_obj_t * obj, uint16_t * row, uint16_t * col); static size_t get_cell_txt_len(const char * txt); -static void copy_cell_txt(char * dst, const char * txt); +static void copy_cell_txt(lv_table_cell_t * dst, const char * txt); static void get_cell_area(lv_obj_t * obj, uint16_t row, uint16_t col, lv_area_t * area); static void scroll_to_selected_cell(lv_obj_t * obj); @@ -98,7 +98,14 @@ void lv_table_set_cell_value(lv_obj_t * obj, uint16_t row, uint16_t col, const c lv_table_cell_ctrl_t ctrl = 0; /*Save the control byte*/ - if(table->cell_data[cell]) ctrl = table->cell_data[cell][0]; + if(table->cell_data[cell]) ctrl = table->cell_data[cell]->ctrl; + +#if LV_USE_USER_DATA + void * user_data = NULL; + + /*Save the user data*/ + if(table->cell_data[cell]) user_data = table->cell_data[cell]->user_data; +#endif size_t to_allocate = get_cell_txt_len(txt); @@ -108,7 +115,10 @@ void lv_table_set_cell_value(lv_obj_t * obj, uint16_t row, uint16_t col, const c copy_cell_txt(table->cell_data[cell], txt); - table->cell_data[cell][0] = ctrl; + table->cell_data[cell]->ctrl = ctrl; +#if LV_USE_USER_DATA + table->cell_data[cell]->user_data = user_data; +#endif refr_cell_size(obj, row, col); } @@ -131,7 +141,14 @@ void lv_table_set_cell_value_fmt(lv_obj_t * obj, uint16_t row, uint16_t col, con lv_table_cell_ctrl_t ctrl = 0; /*Save the control byte*/ - if(table->cell_data[cell]) ctrl = table->cell_data[cell][0]; + if(table->cell_data[cell]) ctrl = table->cell_data[cell]->ctrl; + +#if LV_USE_USER_DATA + void * user_data = NULL; + + /*Save the user_data*/ + if(table->cell_data[cell]) user_data = table->cell_data[cell]->user_data; +#endif va_list ap, ap2; va_start(ap, fmt); @@ -154,32 +171,35 @@ void lv_table_set_cell_value_fmt(lv_obj_t * obj, uint16_t row, uint16_t col, con /*Get the size of the Arabic text and process it*/ size_t len_ap = _lv_txt_ap_calc_bytes_cnt(raw_txt); - table->cell_data[cell] = lv_mem_realloc(table->cell_data[cell], len_ap + 1); + table->cell_data[cell] = lv_mem_realloc(table->cell_data[cell], sizeof(lv_table_cell_t) + len_ap + 1); LV_ASSERT_MALLOC(table->cell_data[cell]); if(table->cell_data[cell] == NULL) { va_end(ap2); return; } - _lv_txt_ap_proc(raw_txt, &table->cell_data[cell][1]); + _lv_txt_ap_proc(raw_txt, table->cell_data[cell]->txt); lv_mem_buf_release(raw_txt); #else - table->cell_data[cell] = lv_mem_realloc(table->cell_data[cell], len + 2); /*+1: trailing '\0; +1: format byte*/ + table->cell_data[cell] = lv_mem_realloc(table->cell_data[cell], + sizeof(lv_table_cell_t) + len + 1); /*+1: trailing '\0; */ LV_ASSERT_MALLOC(table->cell_data[cell]); if(table->cell_data[cell] == NULL) { va_end(ap2); return; } - table->cell_data[cell][len + 1] = 0; /*Ensure NULL termination*/ + table->cell_data[cell]->txt[len] = 0; /*Ensure NULL termination*/ - lv_vsnprintf(&table->cell_data[cell][1], len + 1, fmt, ap2); + lv_vsnprintf(table->cell_data[cell]->txt, len + 1, fmt, ap2); #endif va_end(ap2); - table->cell_data[cell][0] = ctrl; - + table->cell_data[cell]->ctrl = ctrl; +#if LV_USE_USER_DATA + table->cell_data[cell]->user_data = user_data; +#endif refr_cell_size(obj, row, col); } @@ -204,11 +224,17 @@ void lv_table_set_row_cnt(lv_obj_t * obj, uint16_t row_cnt) uint32_t new_cell_cnt = table->col_cnt * table->row_cnt; uint32_t i; for(i = new_cell_cnt; i < old_cell_cnt; i++) { +#if LV_USE_USER_DATA + if(table->cell_data[i]->user_data) { + lv_mem_free(table->cell_data[i]->user_data); + table->cell_data[i]->user_data = NULL; + } +#endif lv_mem_free(table->cell_data[i]); } } - table->cell_data = lv_mem_realloc(table->cell_data, table->row_cnt * table->col_cnt * sizeof(char *)); + table->cell_data = lv_mem_realloc(table->cell_data, table->row_cnt * table->col_cnt * sizeof(lv_table_cell_t *)); LV_ASSERT_MALLOC(table->cell_data); if(table->cell_data == NULL) return; @@ -233,7 +259,7 @@ void lv_table_set_col_cnt(lv_obj_t * obj, uint16_t col_cnt) uint16_t old_col_cnt = table->col_cnt; table->col_cnt = col_cnt; - char ** new_cell_data = lv_mem_alloc(table->row_cnt * table->col_cnt * sizeof(char *)); + lv_table_cell_t ** new_cell_data = lv_mem_alloc(table->row_cnt * table->col_cnt * sizeof(lv_table_cell_t *)); LV_ASSERT_MALLOC(new_cell_data); if(new_cell_data == NULL) return; uint32_t new_cell_cnt = table->col_cnt * table->row_cnt; @@ -256,6 +282,12 @@ void lv_table_set_col_cnt(lv_obj_t * obj, uint16_t col_cnt) int32_t i; for(i = 0; i < (int32_t)old_col_cnt - col_cnt; i++) { uint32_t idx = old_col_start + min_col_cnt + i; +#if LV_USE_USER_DATA + if(table->cell_data[idx]->user_data) { + lv_mem_free(table->cell_data[idx]->user_data); + table->cell_data[idx]->user_data = NULL; + } +#endif lv_mem_free(table->cell_data[idx]); table->cell_data[idx] = NULL; } @@ -274,7 +306,6 @@ void lv_table_set_col_cnt(lv_obj_t * obj, uint16_t col_cnt) table->col_w[col] = LV_DPI_DEF; } - refr_size_form_row(obj, 0) ; } @@ -304,15 +335,18 @@ void lv_table_add_cell_ctrl(lv_obj_t * obj, uint16_t row, uint16_t col, lv_table uint32_t cell = row * table->col_cnt + col; if(is_cell_empty(table->cell_data[cell])) { - table->cell_data[cell] = lv_mem_alloc(2); /*+1: trailing '\0; +1: format byte*/ + table->cell_data[cell] = lv_mem_alloc(sizeof(lv_table_cell_t) + 1); /*+1: trailing '\0 */ LV_ASSERT_MALLOC(table->cell_data[cell]); if(table->cell_data[cell] == NULL) return; - table->cell_data[cell][0] = 0; - table->cell_data[cell][1] = '\0'; + table->cell_data[cell]->ctrl = 0; +#if LV_USE_USER_DATA + table->cell_data[cell]->user_data = NULL; +#endif + table->cell_data[cell]->txt[0] = '\0'; } - table->cell_data[cell][0] |= ctrl; + table->cell_data[cell]->ctrl |= ctrl; } void lv_table_clear_cell_ctrl(lv_obj_t * obj, uint16_t row, uint16_t col, lv_table_cell_ctrl_t ctrl) @@ -328,17 +362,51 @@ void lv_table_clear_cell_ctrl(lv_obj_t * obj, uint16_t row, uint16_t col, lv_tab uint32_t cell = row * table->col_cnt + col; if(is_cell_empty(table->cell_data[cell])) { - table->cell_data[cell] = lv_mem_alloc(2); /*+1: trailing '\0; +1: format byte*/ + table->cell_data[cell] = lv_mem_alloc(sizeof(lv_table_cell_t) + 1); /*+1: trailing '\0 */ LV_ASSERT_MALLOC(table->cell_data[cell]); if(table->cell_data[cell] == NULL) return; - table->cell_data[cell][0] = 0; - table->cell_data[cell][1] = '\0'; + table->cell_data[cell]->ctrl = 0; +#if LV_USE_USER_DATA + table->cell_data[cell]->user_data = NULL; +#endif + table->cell_data[cell]->txt[0] = '\0'; } - table->cell_data[cell][0] &= (~ctrl); + table->cell_data[cell]->ctrl &= (~ctrl); } +#if LV_USE_USER_DATA +void lv_table_set_cell_user_data(lv_obj_t * obj, uint16_t row, uint16_t col, void * user_data) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_table_t * table = (lv_table_t *)obj; + + /*Auto expand*/ + if(col >= table->col_cnt) lv_table_set_col_cnt(obj, col + 1); + if(row >= table->row_cnt) lv_table_set_row_cnt(obj, row + 1); + + uint32_t cell = row * table->col_cnt + col; + + if(is_cell_empty(table->cell_data[cell])) { + table->cell_data[cell] = lv_mem_alloc(sizeof(lv_table_cell_t) + 1); /*+1: trailing '\0 */ + LV_ASSERT_MALLOC(table->cell_data[cell]); + if(table->cell_data[cell] == NULL) return; + + table->cell_data[cell]->ctrl = 0; + table->cell_data[cell]->user_data = NULL; + table->cell_data[cell]->txt[0] = '\0'; + } + + if(table->cell_data[cell]->user_data) { + lv_mem_free(table->cell_data[cell]->user_data); + } + + table->cell_data[cell]->user_data = user_data; +} +#endif + /*===================== * Getter functions *====================*/ @@ -356,7 +424,7 @@ const char * lv_table_get_cell_value(lv_obj_t * obj, uint16_t row, uint16_t col) if(is_cell_empty(table->cell_data[cell])) return ""; - return &table->cell_data[cell][1]; /*Skip the format byte*/ + return table->cell_data[cell]->txt; } uint16_t lv_table_get_row_cnt(lv_obj_t * obj) @@ -401,7 +469,7 @@ bool lv_table_has_cell_ctrl(lv_obj_t * obj, uint16_t row, uint16_t col, lv_table uint32_t cell = row * table->col_cnt + col; if(is_cell_empty(table->cell_data[cell])) return false; - else return (table->cell_data[cell][0] & ctrl) == ctrl; + else return (table->cell_data[cell]->ctrl & ctrl) == ctrl; } void lv_table_get_selected_cell(lv_obj_t * obj, uint16_t * row, uint16_t * col) @@ -411,6 +479,24 @@ void lv_table_get_selected_cell(lv_obj_t * obj, uint16_t * row, uint16_t * col) *col = table->col_act; } +#if LV_USE_USER_DATA +void * lv_table_get_cell_user_data(lv_obj_t * obj, uint16_t row, uint16_t col) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_table_t * table = (lv_table_t *)obj; + if(row >= table->row_cnt || col >= table->col_cnt) { + LV_LOG_WARN("invalid row or column"); + return NULL; + } + uint32_t cell = row * table->col_cnt + col; + + if(is_cell_empty(table->cell_data[cell])) return NULL; + + return table->cell_data[cell]->user_data; +} +#endif + /********************** * STATIC FUNCTIONS **********************/ @@ -428,7 +514,7 @@ static void lv_table_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) table->row_h = lv_mem_alloc(table->row_cnt * sizeof(table->row_h[0])); table->col_w[0] = LV_DPI_DEF; table->row_h[0] = LV_DPI_DEF; - table->cell_data = lv_mem_realloc(table->cell_data, table->row_cnt * table->col_cnt * sizeof(char *)); + table->cell_data = lv_mem_realloc(table->cell_data, table->row_cnt * table->col_cnt * sizeof(lv_table_cell_t *)); table->cell_data[0] = NULL; LV_TRACE_OBJ_CREATE("finished"); @@ -442,6 +528,12 @@ static void lv_table_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj) uint16_t i; for(i = 0; i < table->col_cnt * table->row_cnt; i++) { if(table->cell_data[i]) { +#if LV_USE_USER_DATA + if(table->cell_data[i]->user_data) { + lv_mem_free(table->cell_data[i]->user_data); + table->cell_data[i]->user_data = NULL; + } +#endif lv_mem_free(table->cell_data[i]); table->cell_data[i] = NULL; } @@ -573,7 +665,6 @@ static void lv_table_event(const lv_obj_class_t * class_p, lv_event_t * e) } } - static void draw_main(lv_event_t * e) { lv_obj_t * obj = lv_event_get_target(e); @@ -639,7 +730,7 @@ static void draw_main(lv_event_t * e) for(col = 0; col < table->col_cnt; col++) { lv_table_cell_ctrl_t ctrl = 0; - if(table->cell_data[cell]) ctrl = table->cell_data[cell][0]; + if(table->cell_data[cell]) ctrl = table->cell_data[cell]->ctrl; if(rtl) { cell_area.x2 = cell_area.x1 - 1; @@ -652,11 +743,11 @@ static void draw_main(lv_event_t * e) uint16_t col_merge = 0; for(col_merge = 0; col_merge + col < table->col_cnt - 1; col_merge++) { - char * next_cell_data = table->cell_data[cell + col_merge]; + lv_table_cell_t * next_cell_data = table->cell_data[cell + col_merge]; if(is_cell_empty(next_cell_data)) break; - lv_table_cell_ctrl_t merge_ctrl = (lv_table_cell_ctrl_t) next_cell_data[0]; + lv_table_cell_ctrl_t merge_ctrl = (lv_table_cell_ctrl_t) next_cell_data->ctrl; if(merge_ctrl & LV_TABLE_CELL_CTRL_MERGE_RIGHT) { lv_coord_t offset = table->col_w[col + col_merge + 1]; @@ -739,7 +830,7 @@ static void draw_main(lv_event_t * e) bool crop = ctrl & LV_TABLE_CELL_CTRL_TEXT_CROP ? true : false; if(crop) txt_flags = LV_TEXT_FLAG_EXPAND; - lv_txt_get_size(&txt_size, table->cell_data[cell] + 1, label_dsc_def.font, + lv_txt_get_size(&txt_size, table->cell_data[cell]->txt, label_dsc_def.font, label_dsc_act.letter_space, label_dsc_act.line_space, lv_area_get_width(&txt_area), txt_flags); @@ -754,7 +845,7 @@ static void draw_main(lv_event_t * e) label_mask_ok = _lv_area_intersect(&label_clip_area, &clip_area, &cell_area); if(label_mask_ok) { draw_ctx->clip_area = &label_clip_area; - lv_draw_label(draw_ctx, &label_dsc_act, &txt_area, table->cell_data[cell] + 1, NULL); + lv_draw_label(draw_ctx, &label_dsc_act, &txt_area, table->cell_data[cell]->txt, NULL); draw_ctx->clip_area = &clip_area; } } @@ -796,7 +887,6 @@ static void refr_size_form_row(lv_obj_t * obj, uint32_t start_row) lv_obj_invalidate(obj); } - static void refr_cell_size(lv_obj_t * obj, uint32_t row, uint32_t col) { const lv_coord_t cell_pad_left = lv_obj_get_style_pad_left(obj, LV_PART_ITEMS); @@ -845,7 +935,7 @@ static lv_coord_t get_row_height(lv_obj_t * obj, uint16_t row_id, const lv_font_ uint16_t cell; uint16_t col; for(cell = row_start, col = 0; cell < row_start + table->col_cnt; cell++, col++) { - char * cell_data = table->cell_data[cell]; + lv_table_cell_t * cell_data = table->cell_data[cell]; if(is_cell_empty(cell_data)) { continue; @@ -858,11 +948,11 @@ static lv_coord_t get_row_height(lv_obj_t * obj, uint16_t row_id, const lv_font_ * exit the traversal when the current cell control is not LV_TABLE_CELL_CTRL_MERGE_RIGHT */ uint16_t col_merge = 0; for(col_merge = 0; col_merge + col < table->col_cnt - 1; col_merge++) { - char * next_cell_data = table->cell_data[cell + col_merge]; + lv_table_cell_t * next_cell_data = table->cell_data[cell + col_merge]; if(is_cell_empty(next_cell_data)) break; - lv_table_cell_ctrl_t ctrl = (lv_table_cell_ctrl_t) next_cell_data[0]; + lv_table_cell_ctrl_t ctrl = (lv_table_cell_ctrl_t) next_cell_data->ctrl; if(ctrl & LV_TABLE_CELL_CTRL_MERGE_RIGHT) { txt_w += table->col_w[col + col_merge + 1]; } @@ -871,7 +961,7 @@ static lv_coord_t get_row_height(lv_obj_t * obj, uint16_t row_id, const lv_font_ } } - lv_table_cell_ctrl_t ctrl = (lv_table_cell_ctrl_t) cell_data[0]; + lv_table_cell_ctrl_t ctrl = (lv_table_cell_ctrl_t) cell_data->ctrl; /*When cropping the text we can assume the row height is equal to the line height*/ if(ctrl & LV_TABLE_CELL_CTRL_TEXT_CROP) { @@ -883,7 +973,7 @@ static lv_coord_t get_row_height(lv_obj_t * obj, uint16_t row_id, const lv_font_ lv_point_t txt_size; txt_w -= cell_left + cell_right; - lv_txt_get_size(&txt_size, table->cell_data[cell] + 1, font, + lv_txt_get_size(&txt_size, table->cell_data[cell]->txt, font, letter_space, line_space, txt_w, LV_TEXT_FLAG_NONE); h_max = LV_MAX(txt_size.y + cell_top + cell_bottom, h_max); @@ -953,23 +1043,21 @@ static size_t get_cell_txt_len(const char * txt) size_t retval = 0; #if LV_USE_ARABIC_PERSIAN_CHARS - retval = _lv_txt_ap_calc_bytes_cnt(txt) + 1; + retval = sizeof(lv_table_cell_t) + _lv_txt_ap_calc_bytes_cnt(txt) + 1; #else - /* cell_data layout: [ctrl][txt][trailing '\0' terminator] - * +2 because of the trailing '\0' and the ctrl */ - retval = strlen(txt) + 2; + retval = sizeof(lv_table_cell_t) + strlen(txt) + 1; #endif return retval; } /* Copy txt into dst skipping the format byte */ -static void copy_cell_txt(char * dst, const char * txt) +static void copy_cell_txt(lv_table_cell_t * dst, const char * txt) { #if LV_USE_ARABIC_PERSIAN_CHARS - _lv_txt_ap_proc(txt, &dst[1]); + _lv_txt_ap_proc(txt, dst->txt); #else - strcpy(&dst[1], txt); + strcpy(dst->txt, txt); #endif } @@ -1008,7 +1096,6 @@ static void get_cell_area(lv_obj_t * obj, uint16_t row, uint16_t col, lv_area_t } - static void scroll_to_selected_cell(lv_obj_t * obj) { lv_table_t * table = (lv_table_t *)obj; diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/widgets/lv_table.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/widgets/lv_table.h similarity index 86% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/widgets/lv_table.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/widgets/lv_table.h index 9106270..4aed657 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/widgets/lv_table.h +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/widgets/lv_table.h @@ -46,12 +46,21 @@ enum { typedef uint8_t lv_table_cell_ctrl_t; +/*Data of cell*/ +typedef struct { + lv_table_cell_ctrl_t ctrl; +#if LV_USE_USER_DATA + void * user_data; /**< Custom user data*/ +#endif + char txt[1]; +} lv_table_cell_t; + /*Data of table*/ typedef struct { lv_obj_t obj; uint16_t col_cnt; uint16_t row_cnt; - char ** cell_data; + lv_table_cell_t ** cell_data; lv_coord_t * row_h; lv_coord_t * col_w; uint16_t col_act; @@ -134,7 +143,6 @@ void lv_table_set_col_width(lv_obj_t * obj, uint16_t col_id, lv_coord_t w); */ void lv_table_add_cell_ctrl(lv_obj_t * obj, uint16_t row, uint16_t col, lv_table_cell_ctrl_t ctrl); - /** * Clear control bits of the cell. * @param obj pointer to a Table object @@ -144,6 +152,17 @@ void lv_table_add_cell_ctrl(lv_obj_t * obj, uint16_t row, uint16_t col, lv_table */ void lv_table_clear_cell_ctrl(lv_obj_t * obj, uint16_t row, uint16_t col, lv_table_cell_ctrl_t ctrl); +#if LV_USE_USER_DATA +/** + * Add custom user data to the cell. + * @param obj pointer to a Table object + * @param row id of the row [0 .. row_cnt -1] + * @param col id of the column [0 .. col_cnt -1] + * @param user_data pointer to the new user_data. It must be allocated by user as it will be freed automatically + */ +void lv_table_set_cell_user_data(lv_obj_t * obj, uint16_t row, uint16_t col, void * user_data); +#endif + /*===================== * Getter functions *====================*/ @@ -197,6 +216,16 @@ bool lv_table_has_cell_ctrl(lv_obj_t * obj, uint16_t row, uint16_t col, lv_table */ void lv_table_get_selected_cell(lv_obj_t * obj, uint16_t * row, uint16_t * col); +#if LV_USE_USER_DATA +/** + * Get custom user data to the cell. + * @param obj pointer to a Table object + * @param row id of the row [0 .. row_cnt -1] + * @param col id of the column [0 .. col_cnt -1] + */ +void * lv_table_get_cell_user_data(lv_obj_t * obj, uint16_t row, uint16_t col); +#endif + /********************** * MACROS **********************/ diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/widgets/lv_textarea.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/widgets/lv_textarea.c similarity index 99% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/widgets/lv_textarea.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/widgets/lv_textarea.c index 4d497e6..7084244 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/widgets/lv_textarea.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/widgets/lv_textarea.c @@ -922,8 +922,6 @@ static void label_event_cb(lv_event_t * e) } } - - /** * Called to blink the cursor * @param ta pointer to a text area @@ -1309,7 +1307,6 @@ static void draw_cursor(lv_event_t * e) lv_area_t cur_area; lv_area_copy(&cur_area, &ta->cursor.area); - cur_area.x1 += ta->label->coords.x1; cur_area.y1 += ta->label->coords.y1; cur_area.x2 += ta->label->coords.x1; diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/widgets/lv_textarea.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/widgets/lv_textarea.h similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/widgets/lv_textarea.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/widgets/lv_textarea.h diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/widgets/lv_widgets.mk b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/widgets/lv_widgets.mk similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/widgets/lv_widgets.mk rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/src/widgets/lv_widgets.mk diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/.gitignore b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/tests/.gitignore similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/.gitignore rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/tests/.gitignore diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/CMakeLists.txt b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/tests/CMakeLists.txt similarity index 95% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/CMakeLists.txt rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/tests/CMakeLists.txt index 2f8250d..0792db7 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/CMakeLists.txt +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/tests/CMakeLists.txt @@ -1,376 +1,377 @@ -if(ESP_PLATFORM) - -################################### -# Tests do not build for ESP-IDF. # -################################### - -else() - -cmake_minimum_required(VERSION 3.13) -project(lvgl_tests LANGUAGES C) - -include(CTest) - -set(LVGL_TEST_DIR ${CMAKE_CURRENT_SOURCE_DIR}) - -set(LVGL_TEST_COMMON_EXAMPLE_OPTIONS - -DLV_BUILD_EXAMPLES=1 - -DLV_USE_DEMO_WIDGETS=1 - -DLV_USE_DEMO_STRESS=1 -) - -set(LVGL_TEST_OPTIONS_MINIMAL_MONOCHROME - -DLV_COLOR_DEPTH=1 - -DLV_MEM_SIZE=65535 - -DLV_DPI_DEF=40 - -DLV_DRAW_COMPLEX=0 - -DLV_USE_METER=0 - -DLV_USE_LOG=1 - -DLV_USE_ASSERT_NULL=0 - -DLV_USE_ASSERT_MALLOC=0 - -DLV_USE_ASSERT_MEM_INTEGRITY=0 - -DLV_USE_ASSERT_OBJ=0 - -DLV_USE_ASSERT_STYLE=0 - -DLV_USE_USER_DATA=0 - -DLV_FONT_UNSCII_8=1 - -DLV_USE_BIDI=0 - -DLV_USE_ARABIC_PERSIAN_CHARS=0 - -DLV_BUILD_EXAMPLES=1 - -DLV_FONT_DEFAULT=&lv_font_montserrat_14 - -DLV_USE_PNG=1 - -DLV_USE_BMP=1 - -DLV_USE_GIF=1 - -DLV_USE_QRCODE=1 -) - -set(LVGL_TEST_OPTIONS_NORMAL_8BIT - -DLV_COLOR_DEPTH=8 - -DLV_MEM_SIZE=65535 - -DLV_DPI_DEF=40 - -DLV_DRAW_COMPLEX=1 - -DLV_USE_LOG=1 - -DLV_USE_ASSERT_NULL=0 - -DLV_USE_ASSERT_MALLOC=0 - -DLV_USE_ASSERT_MEM_INTEGRITY=0 - -DLV_USE_ASSERT_OBJ=0 - -DLV_USE_ASSERT_STYLE=0 - -DLV_USE_USER_DATA=1 - -DLV_FONT_UNSCII_8=1 - -DLV_USE_FONT_SUBPX=1 - -DLV_USE_BIDI=0 - -DLV_USE_ARABIC_PERSIAN_CHARS=0 - ${LVGL_TEST_COMMON_EXAMPLE_OPTIONS} - -DLV_FONT_DEFAULT=&lv_font_montserrat_14 - -DLV_USE_PNG=1 - -DLV_USE_BMP=1 - -DLV_USE_SJPG=1 - -DLV_USE_GIF=1 - -DLV_USE_QRCODE=1 -) - -set(LVGL_TEST_OPTIONS_16BIT - -DLV_COLOR_DEPTH=16 - -DLV_COLOR_16_SWAP=0 - -DLV_MEM_SIZE=65536 - -DLV_DPI_DEF=40 - -DLV_DRAW_COMPLEX=1 - -DLV_DITHER_GRADIENT=1 - -DLV_USE_LOG=1 - -DLV_USE_ASSERT_NULL=0 - -DLV_USE_ASSERT_MALLOC=0 - -DLV_USE_ASSERT_MEM_INTEGRITY=0 - -DLV_USE_ASSERT_OBJ=0 - -DLV_USE_ASSERT_STYLE=0 - -DLV_USE_USER_DATA=1 - -DLV_FONT_UNSCII_8=1 - -DLV_USE_FONT_SUBPX=1 - -DLV_USE_BIDI=0 - -DLV_USE_ARABIC_PERSIAN_CHARS=0 - ${LVGL_TEST_COMMON_EXAMPLE_OPTIONS} - -DLV_FONT_DEFAULT=&lv_font_montserrat_14 - -DLV_USE_PNG=1 - -DLV_USE_BMP=1 - -DLV_USE_SJPG=1 - -DLV_USE_GIF=1 - -DLV_USE_QRCODE=1 -) - -set(LVGL_TEST_OPTIONS_16BIT_SWAP - -DLV_COLOR_DEPTH=16 - -DLV_COLOR_16_SWAP=1 - -DLV_MEM_SIZE=65536 - -DLV_DPI_DEF=40 - -DLV_DRAW_COMPLEX=1 - -DLV_DITHER_GRADIENT=1 - -DLV_DITHER_ERROR_DIFFUSION=1 - -DLV_GRAD_CACHE_DEF_SIZE=8*1024 - -DLV_USE_LOG=1 - -DLV_USE_ASSERT_NULL=0 - -DLV_USE_ASSERT_MALLOC=0 - -DLV_USE_ASSERT_MEM_INTEGRITY=0 - -DLV_USE_ASSERT_OBJ=0 - -DLV_USE_ASSERT_STYLE=0 - -DLV_USE_USER_DATA=1 - -DLV_FONT_UNSCII_8=1 - -DLV_USE_FONT_SUBPX=1 - -DLV_USE_BIDI=0 - -DLV_USE_ARABIC_PERSIAN_CHARS=0 - ${LVGL_TEST_COMMON_EXAMPLE_OPTIONS} - -DLV_FONT_DEFAULT=&lv_font_montserrat_14 - -DLV_USE_PNG=1 - -DLV_USE_BMP=1 - -DLV_USE_SJPG=1 - -DLV_USE_GIF=1 - -DLV_USE_QRCODE=1 -) - -set(LVGL_TEST_OPTIONS_FULL_32BIT - -DLV_COLOR_DEPTH=32 - -DLV_MEM_SIZE=8388608 - -DLV_DPI_DEF=160 - -DLV_DRAW_COMPLEX=1 - -DLV_SHADOW_CACHE_SIZE=1 - -DLV_IMG_CACHE_DEF_SIZE=32 - -DLV_USE_LOG=1 - -DLV_LOG_LEVEL=LV_LOG_LEVEL_TRACE - -DLV_LOG_PRINTF=1 - -DLV_USE_FONT_SUBPX=1 - -DLV_FONT_SUBPX_BGR=1 - -DLV_USE_PERF_MONITOR=1 - -DLV_USE_ASSERT_NULL=1 - -DLV_USE_ASSERT_MALLOC=1 - -DLV_USE_ASSERT_MEM_INTEGRITY=1 - -DLV_USE_ASSERT_OBJ=1 - -DLV_USE_ASSERT_STYLE=1 - -DLV_USE_USER_DATA=1 - -DLV_USE_LARGE_COORD=1 - -DLV_FONT_MONTSERRAT_8=1 - -DLV_FONT_MONTSERRAT_10=1 - -DLV_FONT_MONTSERRAT_12=1 - -DLV_FONT_MONTSERRAT_14=1 - -DLV_FONT_MONTSERRAT_16=1 - -DLV_FONT_MONTSERRAT_18=1 - -DLV_FONT_MONTSERRAT_20=1 - -DLV_FONT_MONTSERRAT_22=1 - -DLV_FONT_MONTSERRAT_24=1 - -DLV_FONT_MONTSERRAT_26=1 - -DLV_FONT_MONTSERRAT_28=1 - -DLV_FONT_MONTSERRAT_30=1 - -DLV_FONT_MONTSERRAT_32=1 - -DLV_FONT_MONTSERRAT_34=1 - -DLV_FONT_MONTSERRAT_36=1 - -DLV_FONT_MONTSERRAT_38=1 - -DLV_FONT_MONTSERRAT_40=1 - -DLV_FONT_MONTSERRAT_42=1 - -DLV_FONT_MONTSERRAT_44=1 - -DLV_FONT_MONTSERRAT_46=1 - -DLV_FONT_MONTSERRAT_48=1 - -DLV_FONT_MONTSERRAT_12_SUBPX=1 - -DLV_FONT_MONTSERRAT_28_COMPRESSED=1 - -DLV_FONT_DEJAVU_16_PERSIAN_HEBREW=1 - -DLV_FONT_SIMSUN_16_CJK=1 - -DLV_FONT_UNSCII_8=1 - -DLV_FONT_UNSCII_16=1 - -DLV_FONT_FMT_TXT_LARGE=1 - -DLV_USE_FONT_COMPRESSED=1 - -DLV_USE_BIDI=1 - -DLV_USE_ARABIC_PERSIAN_CHARS=1 - -DLV_USE_PERF_MONITOR=1 - -DLV_USE_MEM_MONITOR=1 - -DLV_LABEL_TEXT_SELECTION=1 - ${LVGL_TEST_COMMON_EXAMPLE_OPTIONS} - -DLV_FONT_DEFAULT=&lv_font_montserrat_24 - -DLV_USE_FS_STDIO=1 - -DLV_FS_STDIO_LETTER='A' - -DLV_USE_FS_POSIX=1 - -DLV_FS_POSIX_LETTER='B' - -DLV_USE_PNG=1 - -DLV_USE_BMP=1 - -DLV_USE_SJPG=1 - -DLV_USE_GIF=1 - -DLV_USE_QRCODE=1 - -DLV_USE_FRAGMENT=1 - -DLV_USE_IMGFONT=1 - -DLV_USE_MSG=1 -) - -set(LVGL_TEST_OPTIONS_TEST_COMMON - --coverage - -DLV_COLOR_DEPTH=32 - -DLV_MEM_SIZE=2097152 - -DLV_SHADOW_CACHE_SIZE=10240 - -DLV_IMG_CACHE_DEF_SIZE=32 - -DLV_DITHER_GRADIENT=1 - -DLV_DITHER_ERROR_DIFFUSION=1 - -DLV_GRAD_CACHE_DEF_SIZE=8*1024 - -DLV_USE_LOG=1 - -DLV_LOG_PRINTF=1 - -DLV_USE_FONT_SUBPX=1 - -DLV_FONT_SUBPX_BGR=1 - -DLV_USE_ASSERT_NULL=0 - -DLV_USE_ASSERT_MALLOC=0 - -DLV_USE_ASSERT_MEM_INTEGRITY=0 - -DLV_USE_ASSERT_OBJ=0 - -DLV_USE_ASSERT_STYLE=0 - -DLV_USE_USER_DATA=1 - -DLV_USE_LARGE_COORD=1 - -DLV_FONT_MONTSERRAT_14=1 - -DLV_FONT_MONTSERRAT_16=1 - -DLV_FONT_MONTSERRAT_18=1 - -DLV_FONT_MONTSERRAT_24=1 - -DLV_FONT_MONTSERRAT_48=1 - -DLV_FONT_MONTSERRAT_12_SUBPX=1 - -DLV_FONT_MONTSERRAT_28_COMPRESSED=1 - -DLV_FONT_DEJAVU_16_PERSIAN_HEBREW=1 - -DLV_FONT_SIMSUN_16_CJK=1 - -DLV_FONT_UNSCII_8=1 - -DLV_FONT_UNSCII_16=1 - -DLV_FONT_FMT_TXT_LARGE=1 - -DLV_USE_FONT_COMPRESSED=1 - -DLV_USE_BIDI=1 - -DLV_USE_ARABIC_PERSIAN_CHARS=1 - -DLV_LABEL_TEXT_SELECTION=1 - -DLV_USE_FS_STDIO=1 - -DLV_FS_STDIO_LETTER='A' - -DLV_FS_STDIO_CACHE_SIZE=100 - -DLV_USE_FS_POSIX=1 - -DLV_FS_POSIX_LETTER='B' - -DLV_FS_POSIX_CACHE_SIZE=0 - ${LVGL_TEST_COMMON_EXAMPLE_OPTIONS} - -DLV_FONT_DEFAULT=&lv_font_montserrat_14 - -Wno-unused-but-set-variable # unused variables are common in the dual-heap arrangement - -Wno-unused-variable -) - -set(LVGL_TEST_OPTIONS_TEST_SYSHEAP - ${LVGL_TEST_OPTIONS_TEST_COMMON} - -DLVGL_CI_USING_SYS_HEAP - -DLV_MEM_CUSTOM=1 - -fsanitize=address -) - -set(LVGL_TEST_OPTIONS_TEST_DEFHEAP - ${LVGL_TEST_OPTIONS_TEST_COMMON} - -DLVGL_CI_USING_DEF_HEAP - -DLV_MEM_SIZE=2097152 - -fsanitize=address -) - -if (OPTIONS_MINIMAL_MONOCHROME) - set (BUILD_OPTIONS ${LVGL_TEST_OPTIONS_MINIMAL_MONOCHROME}) -elseif (OPTIONS_NORMAL_8BIT) - set (BUILD_OPTIONS ${LVGL_TEST_OPTIONS_NORMAL_8BIT}) -elseif (OPTIONS_16BIT) - set (BUILD_OPTIONS ${LVGL_TEST_OPTIONS_16BIT}) -elseif (OPTIONS_16BIT_SWAP) - set (BUILD_OPTIONS ${LVGL_TEST_OPTIONS_16BIT_SWAP}) -elseif (OPTIONS_FULL_32BIT) - set (BUILD_OPTIONS ${LVGL_TEST_OPTIONS_FULL_32BIT}) -elseif (OPTIONS_TEST_SYSHEAP) - set (BUILD_OPTIONS ${LVGL_TEST_OPTIONS_TEST_SYSHEAP}) - set (TEST_LIBS --coverage -fsanitize=address) -elseif (OPTIONS_TEST_DEFHEAP) - set (BUILD_OPTIONS ${LVGL_TEST_OPTIONS_TEST_DEFHEAP}) - set (TEST_LIBS --coverage -fsanitize=address) -else() - message(FATAL_ERROR "Must provide a known options value (check main.py?).") -endif() - -# Options lvgl and examples are compiled with. -set(COMPILE_OPTIONS - -DLV_CONF_PATH=${LVGL_TEST_DIR}/src/lv_test_conf.h - -DLV_BUILD_TEST - -pedantic-errors - -Wall - -Wclobbered - -Wdeprecated - -Wdouble-promotion - -Wempty-body - -Werror - -Wextra - -Wformat-security - -Wmaybe-uninitialized - -Wmissing-prototypes - -Wpointer-arith - -Wmultichar - -Wno-discarded-qualifiers - -Wpedantic - -Wreturn-type - -Wshadow - -Wshift-negative-value - -Wsizeof-pointer-memaccess - -Wstack-usage=5000 - -Wtype-limits - -Wundef - -Wuninitialized - -Wunreachable-code - ${BUILD_OPTIONS} -) - -# Options test cases are compiled with. -set(LVGL_TESTFILE_COMPILE_OPTIONS - ${COMPILE_OPTIONS} - -Wno-missing-prototypes -) - -get_filename_component(LVGL_DIR ${LVGL_TEST_DIR} DIRECTORY) - -# Include lvgl project file. -include(${LVGL_DIR}/CMakeLists.txt) -target_compile_options(lvgl PUBLIC ${COMPILE_OPTIONS}) -target_compile_options(lvgl_examples PUBLIC ${COMPILE_OPTIONS}) - - -set(TEST_INCLUDE_DIRS - $ - $ - $ -) - -add_library(test_common - STATIC - src/lv_test_indev.c - src/lv_test_init.c - src/test_fonts/font_1.c - src/test_fonts/font_2.c - src/test_fonts/font_3.c - unity/unity_support.c - unity/unity.c -) -target_include_directories(test_common PUBLIC ${TEST_INCLUDE_DIRS}) -target_compile_options(test_common PUBLIC ${LVGL_TESTFILE_COMPILE_OPTIONS}) - -# Some examples `#include "lvgl/lvgl.h"` - which is a path which is not -# in this source repository. If this repo is in a directory names 'lvgl' -# then we can add our parent directory to the include path. -# TODO: This is not good practice and should be fixed. -get_filename_component(LVGL_PARENT_DIR ${LVGL_DIR} DIRECTORY) -target_include_directories(lvgl_examples PUBLIC $) - -# Generate one test executable for each source file pair. -# The sources in src/test_runners is auto-generated, the -# sources in src/test_cases is the actual test case. -file( GLOB TEST_CASE_FILES src/test_cases/*.c ) -foreach( test_case_fname ${TEST_CASE_FILES} ) - # If test file is foo/bar/baz.c then test_name is "baz". - get_filename_component(test_name ${test_case_fname} NAME_WLE) - if (${test_name} STREQUAL "_test_template") - continue() - endif() - # Create path to auto-generated source file. - set(test_runner_fname src/test_runners/${test_name}_Runner.c) - add_executable( ${test_name} - ${test_case_fname} - ${test_runner_fname} - ) - target_link_libraries(${test_name} test_common lvgl_examples lvgl_demos lvgl png ${TEST_LIBS}) - target_include_directories(${test_name} PUBLIC ${TEST_INCLUDE_DIRS}) - target_compile_options(${test_name} PUBLIC ${LVGL_TESTFILE_COMPILE_OPTIONS}) - - add_test( - NAME ${test_name} - WORKING_DIRECTORY ${LVGL_TEST_DIR} - COMMAND ${test_name}) -endforeach( test_case_fname ${TEST_CASE_FILES} ) - -endif() +if(ESP_PLATFORM) + +################################### +# Tests do not build for ESP-IDF. # +################################### + +else() + +cmake_minimum_required(VERSION 3.13) +project(lvgl_tests LANGUAGES C) + +include(CTest) + +set(LVGL_TEST_DIR ${CMAKE_CURRENT_SOURCE_DIR}) + +set(LVGL_TEST_COMMON_EXAMPLE_OPTIONS + -DLV_BUILD_EXAMPLES=1 + -DLV_USE_DEMO_WIDGETS=1 + -DLV_USE_DEMO_STRESS=1 +) + +set(LVGL_TEST_OPTIONS_MINIMAL_MONOCHROME + -DLV_COLOR_DEPTH=1 + -DLV_MEM_SIZE=65535 + -DLV_DPI_DEF=40 + -DLV_DRAW_COMPLEX=0 + -DLV_USE_METER=0 + -DLV_USE_LOG=1 + -DLV_USE_ASSERT_NULL=0 + -DLV_USE_ASSERT_MALLOC=0 + -DLV_USE_ASSERT_MEM_INTEGRITY=0 + -DLV_USE_ASSERT_OBJ=0 + -DLV_USE_ASSERT_STYLE=0 + -DLV_USE_USER_DATA=0 + -DLV_FONT_UNSCII_8=1 + -DLV_USE_BIDI=0 + -DLV_USE_ARABIC_PERSIAN_CHARS=0 + -DLV_BUILD_EXAMPLES=1 + -DLV_FONT_DEFAULT=&lv_font_montserrat_14 + -DLV_USE_PNG=1 + -DLV_USE_BMP=1 + -DLV_USE_GIF=1 + -DLV_USE_QRCODE=1 +) + +set(LVGL_TEST_OPTIONS_NORMAL_8BIT + -DLV_COLOR_DEPTH=8 + -DLV_MEM_SIZE=65535 + -DLV_DPI_DEF=40 + -DLV_DRAW_COMPLEX=1 + -DLV_USE_LOG=1 + -DLV_USE_ASSERT_NULL=0 + -DLV_USE_ASSERT_MALLOC=0 + -DLV_USE_ASSERT_MEM_INTEGRITY=0 + -DLV_USE_ASSERT_OBJ=0 + -DLV_USE_ASSERT_STYLE=0 + -DLV_USE_USER_DATA=1 + -DLV_FONT_UNSCII_8=1 + -DLV_USE_FONT_SUBPX=1 + -DLV_USE_BIDI=0 + -DLV_USE_ARABIC_PERSIAN_CHARS=0 + ${LVGL_TEST_COMMON_EXAMPLE_OPTIONS} + -DLV_FONT_DEFAULT=&lv_font_montserrat_14 + -DLV_USE_PNG=1 + -DLV_USE_BMP=1 + -DLV_USE_SJPG=1 + -DLV_USE_GIF=1 + -DLV_USE_QRCODE=1 +) + +set(LVGL_TEST_OPTIONS_16BIT + -DLV_COLOR_DEPTH=16 + -DLV_COLOR_16_SWAP=0 + -DLV_MEM_SIZE=65536 + -DLV_DPI_DEF=40 + -DLV_DRAW_COMPLEX=1 + -DLV_DITHER_GRADIENT=1 + -DLV_USE_LOG=1 + -DLV_USE_ASSERT_NULL=0 + -DLV_USE_ASSERT_MALLOC=0 + -DLV_USE_ASSERT_MEM_INTEGRITY=0 + -DLV_USE_ASSERT_OBJ=0 + -DLV_USE_ASSERT_STYLE=0 + -DLV_USE_USER_DATA=1 + -DLV_FONT_UNSCII_8=1 + -DLV_USE_FONT_SUBPX=1 + -DLV_USE_BIDI=0 + -DLV_USE_ARABIC_PERSIAN_CHARS=0 + ${LVGL_TEST_COMMON_EXAMPLE_OPTIONS} + -DLV_FONT_DEFAULT=&lv_font_montserrat_14 + -DLV_USE_PNG=1 + -DLV_USE_BMP=1 + -DLV_USE_SJPG=1 + -DLV_USE_GIF=1 + -DLV_USE_QRCODE=1 +) + +set(LVGL_TEST_OPTIONS_16BIT_SWAP + -DLV_COLOR_DEPTH=16 + -DLV_COLOR_16_SWAP=1 + -DLV_MEM_SIZE=65536 + -DLV_DPI_DEF=40 + -DLV_DRAW_COMPLEX=1 + -DLV_DITHER_GRADIENT=1 + -DLV_DITHER_ERROR_DIFFUSION=1 + -DLV_GRAD_CACHE_DEF_SIZE=8*1024 + -DLV_USE_LOG=1 + -DLV_USE_ASSERT_NULL=0 + -DLV_USE_ASSERT_MALLOC=0 + -DLV_USE_ASSERT_MEM_INTEGRITY=0 + -DLV_USE_ASSERT_OBJ=0 + -DLV_USE_ASSERT_STYLE=0 + -DLV_USE_USER_DATA=1 + -DLV_FONT_UNSCII_8=1 + -DLV_USE_FONT_SUBPX=1 + -DLV_USE_BIDI=0 + -DLV_USE_ARABIC_PERSIAN_CHARS=0 + ${LVGL_TEST_COMMON_EXAMPLE_OPTIONS} + -DLV_FONT_DEFAULT=&lv_font_montserrat_14 + -DLV_USE_PNG=1 + -DLV_USE_BMP=1 + -DLV_USE_SJPG=1 + -DLV_USE_GIF=1 + -DLV_USE_QRCODE=1 +) + +set(LVGL_TEST_OPTIONS_FULL_32BIT + -DLV_COLOR_DEPTH=32 + -DLV_MEM_SIZE=8388608 + -DLV_DPI_DEF=160 + -DLV_DRAW_COMPLEX=1 + -DLV_SHADOW_CACHE_SIZE=1 + -DLV_IMG_CACHE_DEF_SIZE=32 + -DLV_USE_LOG=1 + -DLV_LOG_LEVEL=LV_LOG_LEVEL_TRACE + -DLV_LOG_PRINTF=1 + -DLV_USE_FONT_SUBPX=1 + -DLV_FONT_SUBPX_BGR=1 + -DLV_USE_PERF_MONITOR=1 + -DLV_USE_ASSERT_NULL=1 + -DLV_USE_ASSERT_MALLOC=1 + -DLV_USE_ASSERT_MEM_INTEGRITY=1 + -DLV_USE_ASSERT_OBJ=1 + -DLV_USE_ASSERT_STYLE=1 + -DLV_USE_USER_DATA=1 + -DLV_USE_LARGE_COORD=1 + -DLV_FONT_MONTSERRAT_8=1 + -DLV_FONT_MONTSERRAT_10=1 + -DLV_FONT_MONTSERRAT_12=1 + -DLV_FONT_MONTSERRAT_14=1 + -DLV_FONT_MONTSERRAT_16=1 + -DLV_FONT_MONTSERRAT_18=1 + -DLV_FONT_MONTSERRAT_20=1 + -DLV_FONT_MONTSERRAT_22=1 + -DLV_FONT_MONTSERRAT_24=1 + -DLV_FONT_MONTSERRAT_26=1 + -DLV_FONT_MONTSERRAT_28=1 + -DLV_FONT_MONTSERRAT_30=1 + -DLV_FONT_MONTSERRAT_32=1 + -DLV_FONT_MONTSERRAT_34=1 + -DLV_FONT_MONTSERRAT_36=1 + -DLV_FONT_MONTSERRAT_38=1 + -DLV_FONT_MONTSERRAT_40=1 + -DLV_FONT_MONTSERRAT_42=1 + -DLV_FONT_MONTSERRAT_44=1 + -DLV_FONT_MONTSERRAT_46=1 + -DLV_FONT_MONTSERRAT_48=1 + -DLV_FONT_MONTSERRAT_12_SUBPX=1 + -DLV_FONT_MONTSERRAT_28_COMPRESSED=1 + -DLV_FONT_DEJAVU_16_PERSIAN_HEBREW=1 + -DLV_FONT_SIMSUN_16_CJK=1 + -DLV_FONT_UNSCII_8=1 + -DLV_FONT_UNSCII_16=1 + -DLV_FONT_FMT_TXT_LARGE=1 + -DLV_USE_FONT_COMPRESSED=1 + -DLV_USE_BIDI=1 + -DLV_USE_ARABIC_PERSIAN_CHARS=1 + -DLV_USE_PERF_MONITOR=1 + -DLV_USE_MEM_MONITOR=1 + -DLV_LABEL_TEXT_SELECTION=1 + ${LVGL_TEST_COMMON_EXAMPLE_OPTIONS} + -DLV_FONT_DEFAULT=&lv_font_montserrat_24 + -DLV_USE_FS_STDIO=1 + -DLV_FS_STDIO_LETTER='A' + -DLV_USE_FS_POSIX=1 + -DLV_FS_POSIX_LETTER='B' + -DLV_USE_PNG=1 + -DLV_USE_BMP=1 + -DLV_USE_SJPG=1 + -DLV_USE_GIF=1 + -DLV_USE_QRCODE=1 + -DLV_USE_FRAGMENT=1 + -DLV_USE_IMGFONT=1 + -DLV_USE_MSG=1 +) + +set(LVGL_TEST_OPTIONS_TEST_COMMON + --coverage + -DLV_COLOR_DEPTH=32 + -DLV_MEM_SIZE=2097152 + -DLV_SHADOW_CACHE_SIZE=10240 + -DLV_IMG_CACHE_DEF_SIZE=32 + -DLV_DITHER_GRADIENT=1 + -DLV_DITHER_ERROR_DIFFUSION=1 + -DLV_GRAD_CACHE_DEF_SIZE=8*1024 + -DLV_USE_LOG=1 + -DLV_LOG_PRINTF=1 + -DLV_USE_FONT_SUBPX=1 + -DLV_FONT_SUBPX_BGR=1 + -DLV_USE_ASSERT_NULL=0 + -DLV_USE_ASSERT_MALLOC=0 + -DLV_USE_ASSERT_MEM_INTEGRITY=0 + -DLV_USE_ASSERT_OBJ=0 + -DLV_USE_ASSERT_STYLE=0 + -DLV_USE_USER_DATA=1 + -DLV_USE_LARGE_COORD=1 + -DLV_FONT_MONTSERRAT_14=1 + -DLV_FONT_MONTSERRAT_16=1 + -DLV_FONT_MONTSERRAT_18=1 + -DLV_FONT_MONTSERRAT_24=1 + -DLV_FONT_MONTSERRAT_48=1 + -DLV_FONT_MONTSERRAT_12_SUBPX=1 + -DLV_FONT_MONTSERRAT_28_COMPRESSED=1 + -DLV_FONT_DEJAVU_16_PERSIAN_HEBREW=1 + -DLV_FONT_SIMSUN_16_CJK=1 + -DLV_FONT_UNSCII_8=1 + -DLV_FONT_UNSCII_16=1 + -DLV_FONT_FMT_TXT_LARGE=1 + -DLV_USE_FONT_COMPRESSED=1 + -DLV_USE_BIDI=1 + -DLV_USE_ARABIC_PERSIAN_CHARS=1 + -DLV_LABEL_TEXT_SELECTION=1 + -DLV_USE_FS_STDIO=1 + -DLV_FS_STDIO_LETTER='A' + -DLV_FS_STDIO_CACHE_SIZE=100 + -DLV_USE_FS_POSIX=1 + -DLV_FS_POSIX_LETTER='B' + -DLV_FS_POSIX_CACHE_SIZE=0 + ${LVGL_TEST_COMMON_EXAMPLE_OPTIONS} + -DLV_FONT_DEFAULT=&lv_font_montserrat_14 + -Wno-unused-but-set-variable # unused variables are common in the dual-heap arrangement + -Wno-unused-variable +) + +set(LVGL_TEST_OPTIONS_TEST_SYSHEAP + ${LVGL_TEST_OPTIONS_TEST_COMMON} + -DLVGL_CI_USING_SYS_HEAP + -DLV_MEM_CUSTOM=1 + -fsanitize=address +) + +set(LVGL_TEST_OPTIONS_TEST_DEFHEAP + ${LVGL_TEST_OPTIONS_TEST_COMMON} + -DLVGL_CI_USING_DEF_HEAP + -DLV_MEM_SIZE=2097152 + -fsanitize=address +) + +if (OPTIONS_MINIMAL_MONOCHROME) + set (BUILD_OPTIONS ${LVGL_TEST_OPTIONS_MINIMAL_MONOCHROME}) +elseif (OPTIONS_NORMAL_8BIT) + set (BUILD_OPTIONS ${LVGL_TEST_OPTIONS_NORMAL_8BIT}) +elseif (OPTIONS_16BIT) + set (BUILD_OPTIONS ${LVGL_TEST_OPTIONS_16BIT}) +elseif (OPTIONS_16BIT_SWAP) + set (BUILD_OPTIONS ${LVGL_TEST_OPTIONS_16BIT_SWAP}) +elseif (OPTIONS_FULL_32BIT) + set (BUILD_OPTIONS ${LVGL_TEST_OPTIONS_FULL_32BIT}) +elseif (OPTIONS_TEST_SYSHEAP) + set (BUILD_OPTIONS ${LVGL_TEST_OPTIONS_TEST_SYSHEAP}) + set (TEST_LIBS --coverage -fsanitize=address) +elseif (OPTIONS_TEST_DEFHEAP) + set (BUILD_OPTIONS ${LVGL_TEST_OPTIONS_TEST_DEFHEAP}) + set (TEST_LIBS --coverage -fsanitize=address) +else() + message(FATAL_ERROR "Must provide a known options value (check main.py?).") +endif() + +# Options lvgl and examples are compiled with. +set(COMPILE_OPTIONS + -DLV_CONF_PATH=${LVGL_TEST_DIR}/src/lv_test_conf.h + -DLV_BUILD_TEST + -pedantic-errors + -Wall + -Wclobbered + -Wdeprecated + -Wdouble-promotion + -Wempty-body + -Werror + -Wextra + -Wformat-security + -Wmaybe-uninitialized + -Wmissing-prototypes + -Wpointer-arith + -Wmultichar + -Wno-discarded-qualifiers + -Wpedantic + -Wreturn-type + -Wshadow + -Wshift-negative-value + -Wsizeof-pointer-memaccess + -Wstack-usage=5000 + -Wtype-limits + -Wundef + -Wuninitialized + -Wunreachable-code + ${BUILD_OPTIONS} +) + +# Options test cases are compiled with. +set(LVGL_TESTFILE_COMPILE_OPTIONS + ${COMPILE_OPTIONS} + -Wno-missing-prototypes +) + +get_filename_component(LVGL_DIR ${LVGL_TEST_DIR} DIRECTORY) + +# Include lvgl project file. +include(${LVGL_DIR}/CMakeLists.txt) +target_compile_options(lvgl PUBLIC ${COMPILE_OPTIONS}) +target_compile_options(lvgl_examples PUBLIC ${COMPILE_OPTIONS}) + + +set(TEST_INCLUDE_DIRS + $ + $ + $ +) + +add_library(test_common + STATIC + src/lv_test_indev.c + src/lv_test_init.c + src/test_fonts/font_1.c + src/test_fonts/font_2.c + src/test_fonts/font_3.c + src/test_fonts/ubuntu_font.c + unity/unity_support.c + unity/unity.c +) +target_include_directories(test_common PUBLIC ${TEST_INCLUDE_DIRS}) +target_compile_options(test_common PUBLIC ${LVGL_TESTFILE_COMPILE_OPTIONS}) + +# Some examples `#include "lvgl/lvgl.h"` - which is a path which is not +# in this source repository. If this repo is in a directory names 'lvgl' +# then we can add our parent directory to the include path. +# TODO: This is not good practice and should be fixed. +get_filename_component(LVGL_PARENT_DIR ${LVGL_DIR} DIRECTORY) +target_include_directories(lvgl_examples PUBLIC $) + +# Generate one test executable for each source file pair. +# The sources in src/test_runners is auto-generated, the +# sources in src/test_cases is the actual test case. +file( GLOB TEST_CASE_FILES src/test_cases/*.c ) +foreach( test_case_fname ${TEST_CASE_FILES} ) + # If test file is foo/bar/baz.c then test_name is "baz". + get_filename_component(test_name ${test_case_fname} NAME_WLE) + if (${test_name} STREQUAL "_test_template") + continue() + endif() + # Create path to auto-generated source file. + set(test_runner_fname src/test_runners/${test_name}_Runner.c) + add_executable( ${test_name} + ${test_case_fname} + ${test_runner_fname} + ) + target_link_libraries(${test_name} test_common lvgl_examples lvgl_demos lvgl png m ${TEST_LIBS}) + target_include_directories(${test_name} PUBLIC ${TEST_INCLUDE_DIRS}) + target_compile_options(${test_name} PUBLIC ${LVGL_TESTFILE_COMPILE_OPTIONS}) + + add_test( + NAME ${test_name} + WORKING_DIRECTORY ${LVGL_TEST_DIR} + COMMAND ${test_name}) +endforeach( test_case_fname ${TEST_CASE_FILES} ) + +endif() diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/README.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/tests/README.md similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/README.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/tests/README.md diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/__makefile__/Makefile b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/tests/__makefile__/Makefile similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/__makefile__/Makefile rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/tests/__makefile__/Makefile diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/__makefile__/test.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/tests/__makefile__/test.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/__makefile__/test.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/tests/__makefile__/test.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/config.yml b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/tests/config.yml similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/config.yml rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/tests/config.yml diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/main.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/tests/main.py old mode 100644 new mode 100755 similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/main.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/tests/main.py diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/tests/ref_imgs/arc_1.png b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/tests/ref_imgs/arc_1.png new file mode 100644 index 0000000..b84a065 Binary files /dev/null and b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/tests/ref_imgs/arc_1.png differ diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/tests/ref_imgs/arc_2.png b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/tests/ref_imgs/arc_2.png new file mode 100644 index 0000000..cbe4316 Binary files /dev/null and b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/tests/ref_imgs/arc_2.png differ diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/tests/ref_imgs/dropdown_1.png b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/tests/ref_imgs/dropdown_1.png new file mode 100644 index 0000000..2793014 Binary files /dev/null and b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/tests/ref_imgs/dropdown_1.png differ diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/ref_imgs/dropdown_2.png b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/tests/ref_imgs/dropdown_2.png similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/ref_imgs/dropdown_2.png rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/tests/ref_imgs/dropdown_2.png diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/tests/ref_imgs/roller_1.png b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/tests/ref_imgs/roller_1.png new file mode 100644 index 0000000..671a729 Binary files /dev/null and b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/tests/ref_imgs/roller_1.png differ diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/tests/ref_imgs/roller_2.png b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/tests/ref_imgs/roller_2.png new file mode 100644 index 0000000..d1d4157 Binary files /dev/null and b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/tests/ref_imgs/roller_2.png differ diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/ref_imgs/scr1.png b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/tests/ref_imgs/scr1.png similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/ref_imgs/scr1.png rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/tests/ref_imgs/scr1.png diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/ref_imgs/table_1.png b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/tests/ref_imgs/table_1.png similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/ref_imgs/table_1.png rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/tests/ref_imgs/table_1.png diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/tests/ref_imgs/tiny_ttf_1.png b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/tests/ref_imgs/tiny_ttf_1.png new file mode 100644 index 0000000..2c2034b Binary files /dev/null and b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/tests/ref_imgs/tiny_ttf_1.png differ diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/src/lv_test_conf.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/tests/src/lv_test_conf.h similarity index 83% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/src/lv_test_conf.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/tests/src/lv_test_conf.h index d47fe63..991065b 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/src/lv_test_conf.h +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/tests/src/lv_test_conf.h @@ -20,6 +20,12 @@ extern "C" { * DEFINES *********************/ +#define LV_USE_TINY_TTF 1 +#define LV_FONT_MONTSERRAT_8 1 +#define LV_FONT_MONTSERRAT_16 1 +#define LV_FONT_MONTSERRAT_24 1 +#define LV_FONT_MONTSERRAT_36 1 + void lv_test_assert_fail(void); #define LV_ASSERT_HANDLER lv_test_assert_fail(); diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/src/lv_test_helpers.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/tests/src/lv_test_helpers.h similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/src/lv_test_helpers.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/tests/src/lv_test_helpers.h diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/src/lv_test_indev.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/tests/src/lv_test_indev.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/src/lv_test_indev.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/tests/src/lv_test_indev.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/src/lv_test_indev.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/tests/src/lv_test_indev.h similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/src/lv_test_indev.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/tests/src/lv_test_indev.h diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/src/lv_test_init.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/tests/src/lv_test_init.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/src/lv_test_init.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/tests/src/lv_test_init.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/src/lv_test_init.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/tests/src/lv_test_init.h similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/src/lv_test_init.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/tests/src/lv_test_init.h diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/src/test_cases/_test_template.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/tests/src/test_cases/_test_template.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/src/test_cases/_test_template.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/tests/src/test_cases/_test_template.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/src/test_cases/test_arc.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/tests/src/test_cases/test_arc.c similarity index 78% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/src/test_cases/test_arc.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/tests/src/test_cases/test_arc.c index adb3037..4dfaa02 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/src/test_cases/test_arc.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/tests/src/test_cases/test_arc.c @@ -158,6 +158,53 @@ void test_arc_click_area_with_adv_hittest(void) TEST_ASSERT_EQUAL_UINT32(0, event_cnt); } +/* Check value doesn't go to max when clicking on the other side of the arc */ +void test_arc_click_sustained_from_start_to_end_does_not_set_value_to_max(void) +{ + arc = lv_arc_create(lv_scr_act()); + lv_arc_set_value(arc, 0); + + lv_obj_set_size(arc, 100, 100); + lv_obj_center(arc); + lv_obj_add_event_cb(arc, dummy_event_cb, LV_EVENT_PRESSED, NULL); + event_cnt = 0; + + /* Click close to start angle */ + event_cnt = 0; + lv_test_mouse_move_to(376, 285); + lv_test_mouse_press(); + lv_test_indev_wait(50); + lv_test_mouse_release(); + lv_test_indev_wait(50); + + TEST_ASSERT_EQUAL_UINT32(1, event_cnt); + TEST_ASSERT_EQUAL_UINT32(lv_arc_get_value(arc), lv_arc_get_min_value(arc)); + + /* Click close to end angle */ + event_cnt = 0; + + lv_test_mouse_move_to(376, 285); + lv_test_mouse_press(); + lv_test_indev_wait(50); + lv_test_mouse_move_to(415, 281); + lv_test_indev_wait(50); + lv_test_mouse_release(); + lv_test_indev_wait(50); + + TEST_ASSERT_EQUAL_UINT32(1, event_cnt); + TEST_ASSERT_NOT_EQUAL_UINT32(lv_arc_get_value(arc), lv_arc_get_max_value(arc)); + + TEST_ASSERT_EQUAL_SCREENSHOT("arc_2.png"); +} + +void test_arc_basic_render(void) +{ + arc = lv_arc_create(lv_scr_act()); + lv_obj_set_size(arc, 100, 100); + lv_obj_center(arc); + TEST_ASSERT_EQUAL_SCREENSHOT("arc_1.png"); +} + static void dummy_event_cb(lv_event_t * e) { LV_UNUSED(e); diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/src/test_cases/test_bar.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/tests/src/test_cases/test_bar.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/src/test_cases/test_bar.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/tests/src/test_cases/test_bar.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/src/test_cases/test_checkbox.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/tests/src/test_cases/test_checkbox.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/src/test_cases/test_checkbox.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/tests/src/test_cases/test_checkbox.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/src/test_cases/test_config.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/tests/src/test_cases/test_config.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/src/test_cases/test_config.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/tests/src/test_cases/test_config.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/src/test_cases/test_demo_stress.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/tests/src/test_cases/test_demo_stress.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/src/test_cases/test_demo_stress.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/tests/src/test_cases/test_demo_stress.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/src/test_cases/test_demo_widgets.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/tests/src/test_cases/test_demo_widgets.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/src/test_cases/test_demo_widgets.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/tests/src/test_cases/test_demo_widgets.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/src/test_cases/test_dropdown.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/tests/src/test_cases/test_dropdown.c similarity index 99% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/src/test_cases/test_dropdown.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/tests/src/test_cases/test_dropdown.c index a49cc1d..81a10f3 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/src/test_cases/test_dropdown.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/tests/src/test_cases/test_dropdown.c @@ -260,7 +260,6 @@ void test_dropdown_keypad(void) lv_group_del(g); } - void test_dropdown_encoder(void) { lv_obj_clean(lv_scr_act()); @@ -317,7 +316,6 @@ void test_dropdown_encoder(void) lv_group_del(g); } - void test_dropdown_render_1(void) { lv_obj_clean(lv_scr_act()); @@ -355,11 +353,10 @@ void test_dropdown_render_1(void) lv_dropdown_set_options(dd3, "a0\na1\na2\na3\na4\na5\na6\na7\na8\na9\na10\na11\na12\na13\na14\na15\na16"); lv_dropdown_open(dd3); - lv_dropdown_set_selected(dd3, 3); lv_obj_t * list = lv_dropdown_get_list(dd3); lv_obj_set_style_text_line_space(list, 5, 0); lv_obj_set_style_bg_color(list, lv_color_hex3(0xf00), LV_PART_SELECTED | LV_STATE_CHECKED); - + lv_dropdown_set_selected(dd3, 3); TEST_ASSERT_EQUAL_SCREENSHOT("dropdown_1.png"); } @@ -441,5 +438,4 @@ void test_dropdown_should_list_on_top(void) TEST_ASSERT_EQUAL_INT(2, lv_obj_get_index(list)); } - #endif diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/src/test_cases/test_event.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/tests/src/test_cases/test_event.c similarity index 99% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/src/test_cases/test_event.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/tests/src/test_cases/test_event.c index 0ef4186..cf7fc3f 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/src/test_cases/test_event.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/tests/src/test_cases/test_event.c @@ -16,7 +16,6 @@ static const lv_obj_class_t event_object_deletion_class = { .base_class = &lv_obj_class }; - /* Checks for memory leaks/invalid memory accesses on deleted objects */ void test_event_object_deletion(void) { diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/src/test_cases/test_font_loader.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/tests/src/test_cases/test_font_loader.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/src/test_cases/test_font_loader.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/tests/src/test_cases/test_font_loader.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/src/test_cases/test_fs.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/tests/src/test_cases/test_fs.c similarity index 99% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/src/test_cases/test_fs.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/tests/src/test_cases/test_fs.c index 7e31a96..8000c6a 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/src/test_cases/test_fs.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/tests/src/test_cases/test_fs.c @@ -3,7 +3,6 @@ #include "unity/unity.h" - const char * read_exp = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam sed maximus orci. Morbi massa nisi, varius eu convallis ac, venenatis at metus. In in nibh id urna pretium feugiat vitae eu libero. Ut eget fringilla eros. Nunc ullamcorper lectus mauris, vel rhoncus velit volutpat et. Phasellus sed molestie massa. Maecenas quis dui sollicitudin, vulputate nunc ut, dictum quam. Nam a congue lorem. Nulla non facilisis sapien. Ut luctus nulla nibh, sed finibus urna porta non. Duis aliquet augue id urna euismod auctor. Integer pellentesque vulputate enim non mattis. Donec finibus mattis dolor, et feugiat nisi pharetra porta. Mauris ullamcorper cursus magna. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus."; diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/src/test_cases/test_line.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/tests/src/test_cases/test_line.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/src/test_cases/test_line.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/tests/src/test_cases/test_line.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/src/test_cases/test_mem.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/tests/src/test_cases/test_mem.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/src/test_cases/test_mem.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/tests/src/test_cases/test_mem.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/src/test_cases/test_obj_tree.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/tests/src/test_cases/test_obj_tree.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/src/test_cases/test_obj_tree.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/tests/src/test_cases/test_obj_tree.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/tests/src/test_cases/test_roller.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/tests/src/test_cases/test_roller.c new file mode 100644 index 0000000..13d7fd4 --- /dev/null +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/tests/src/test_cases/test_roller.c @@ -0,0 +1,107 @@ +#if LV_BUILD_TEST +#include "../lvgl.h" + +#include "unity/unity.h" + +/** + * see test_roller.c from v9.1 to borrow more test fixture components +*/ + +static lv_obj_t * active_screen = NULL; +static lv_obj_t * roller = NULL; +static lv_obj_t * roller_infinite = NULL; + +void setUp(void) +{ + active_screen = lv_scr_act(); + roller = lv_roller_create(active_screen); + roller_infinite = lv_roller_create(active_screen); +} + +void tearDown(void) +{ + lv_obj_clean(active_screen); +} + +void test_roller_appearance(void) +{ + /* use a number, a symbol, a high letter, a low letter */ + const char * opts = + "0@Tg\n0@Tg\n0@Tg\n0@Tg\n0@Tg\n0@Tg\n0@Tg\n0@Tg\n0@Tg\n0@Tg\n0@Tg\n0@Tg\n0@Tg\n0@Tg\n0@Tg\n0@Tg\n0@Tg\n0@Tg\n0@Tg\n0@Tg\n0@Tg"; + + lv_obj_t * rollers[10] = {roller, roller_infinite}; + uint32_t i = 2; + + /* a normal and infinite roller with the same size font for the main and selected parts */ + lv_obj_set_pos(roller, 20, 20); + lv_roller_set_options(roller, opts, LV_PART_MAIN); + lv_obj_set_pos(roller_infinite, 20, 200); + lv_roller_set_options(roller_infinite, opts, LV_ROLLER_MODE_INFINITE); + + /* a normal and infinite roller with slightly different size fonts for the main and selected parts */ + lv_obj_t * r = lv_roller_create(active_screen); + lv_obj_set_pos(r, 130, 20); + lv_roller_set_options(r, opts, LV_ROLLER_MODE_NORMAL); + lv_obj_set_style_text_font(r, &lv_font_montserrat_16, LV_PART_MAIN); + lv_obj_set_style_text_font(r, &lv_font_montserrat_24, LV_PART_SELECTED); + rollers[i++] = r; + r = lv_roller_create(active_screen); + lv_obj_set_pos(r, 130, 200); + lv_roller_set_options(r, opts, LV_ROLLER_MODE_INFINITE); + lv_obj_set_style_text_font(r, &lv_font_montserrat_16, LV_PART_MAIN); + lv_obj_set_style_text_font(r, &lv_font_montserrat_24, LV_PART_SELECTED); + rollers[i++] = r; + + /* same as previous pair but the fonts are swapped for the main and selected parts */ + r = lv_roller_create(active_screen); + lv_obj_set_pos(r, 270, 20); + lv_roller_set_options(r, opts, LV_ROLLER_MODE_NORMAL); + lv_obj_set_style_text_font(r, &lv_font_montserrat_24, LV_PART_MAIN); + lv_obj_set_style_text_font(r, &lv_font_montserrat_16, LV_PART_SELECTED); + rollers[i++] = r; + r = lv_roller_create(active_screen); + lv_obj_set_pos(r, 270, 200); + lv_roller_set_options(r, opts, LV_ROLLER_MODE_INFINITE); + lv_obj_set_style_text_font(r, &lv_font_montserrat_24, LV_PART_MAIN); + lv_obj_set_style_text_font(r, &lv_font_montserrat_16, LV_PART_SELECTED); + rollers[i++] = r; + + /* a normal and infinite roller with extremely different size fonts for the main and selected parts */ + r = lv_roller_create(active_screen); + lv_obj_set_pos(r, 410, 20); + lv_roller_set_options(r, opts, LV_ROLLER_MODE_NORMAL); + lv_obj_set_style_text_font(r, &lv_font_montserrat_8, LV_PART_MAIN); + lv_obj_set_style_text_font(r, &lv_font_montserrat_36, LV_PART_SELECTED); + rollers[i++] = r; + r = lv_roller_create(active_screen); + lv_obj_set_pos(r, 410, 200); + lv_roller_set_options(r, opts, LV_ROLLER_MODE_INFINITE); + lv_obj_set_style_text_font(r, &lv_font_montserrat_8, LV_PART_MAIN); + lv_obj_set_style_text_font(r, &lv_font_montserrat_36, LV_PART_SELECTED); + rollers[i++] = r; + + /* same as previous pair but the fonts are swapped for the main and selected parts */ + r = lv_roller_create(active_screen); + lv_obj_set_pos(r, 580, 20); + lv_roller_set_options(r, opts, LV_ROLLER_MODE_NORMAL); + lv_obj_set_style_text_font(r, &lv_font_montserrat_36, LV_PART_MAIN); + lv_obj_set_style_text_font(r, &lv_font_montserrat_8, LV_PART_SELECTED); + rollers[i++] = r; + r = lv_roller_create(active_screen); + lv_obj_set_pos(r, 580, 200); + lv_roller_set_options(r, opts, LV_ROLLER_MODE_INFINITE); + lv_obj_set_style_text_font(r, &lv_font_montserrat_36, LV_PART_MAIN); + lv_obj_set_style_text_font(r, &lv_font_montserrat_8, LV_PART_SELECTED); + rollers[i++] = r; + + TEST_ASSERT_EQUAL_SCREENSHOT("roller_1.png"); + + /* test that the selected label stays in sync with the main label for scrolling */ + for(i = 0; i < 10; i++) { + lv_roller_set_selected(rollers[i], lv_roller_get_option_cnt(rollers[i]) - 1, LV_ANIM_OFF); + } + + TEST_ASSERT_EQUAL_SCREENSHOT("roller_2.png"); +} + +#endif diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/tests/src/test_cases/test_screen_load.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/tests/src/test_cases/test_screen_load.c new file mode 100644 index 0000000..a1f1e1b --- /dev/null +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/tests/src/test_cases/test_screen_load.c @@ -0,0 +1,127 @@ +#if LV_BUILD_TEST +#include "../lvgl.h" + +#include "unity/unity.h" +#include "lv_test_indev.h" + +void test_screen_load_no_crash(void) +{ + /*load new screen should not crash*/ + lv_obj_t * screen = lv_obj_create(NULL); + lv_scr_load(screen); + + /*Consecutively loading multiple screens with transition animations should not crash*/ + lv_obj_t * screen_with_anim_1 = lv_obj_create(NULL); + lv_obj_t * screen_with_anim_2 = lv_obj_create(NULL); + lv_scr_load_anim(screen_with_anim_1, LV_SCR_LOAD_ANIM_OVER_LEFT, 2000, 0, false); + lv_scr_load_anim(screen_with_anim_2, LV_SCR_LOAD_ANIM_OVER_RIGHT, 1000, 500, false); +} + +void test_screen_load_with_delete_no_crash(void) +{ + /*load new screen should not crash*/ + lv_obj_t * screen = lv_obj_create(NULL); + lv_scr_load(screen); + + /*Consecutively loading multiple screens (while deleting one) with transition animations should not crash*/ + lv_obj_t * screen_with_anim_1 = lv_obj_create(NULL); + lv_obj_t * screen_with_anim_2 = lv_obj_create(NULL); + lv_obj_t * screen_with_anim_3 = lv_obj_create(NULL); + + lv_scr_load_anim(screen_with_anim_1, LV_SCR_LOAD_ANIM_OVER_LEFT, 0, 0, false); + lv_scr_load_anim(screen_with_anim_2, LV_SCR_LOAD_ANIM_OVER_RIGHT, 1000, 0, true); + + /*Wait to trigger the animation start callbacks*/ + lv_test_indev_wait(100); + + lv_scr_load_anim(screen_with_anim_3, LV_SCR_LOAD_ANIM_OVER_LEFT, 200, 0, true); + + /*The active screen should be immediately replaced*/ + TEST_ASSERT_EQUAL(lv_scr_act(), screen_with_anim_2); + + lv_test_indev_wait(400); + + /*Check for the screens status after the transition*/ + TEST_ASSERT_EQUAL(lv_obj_is_valid(screen_with_anim_1), false); + TEST_ASSERT_EQUAL(lv_obj_is_valid(screen_with_anim_2), false); + TEST_ASSERT_EQUAL(lv_obj_is_valid(screen_with_anim_3), true); +} + +void test_screen_load_with_delete_no_crash2(void) +{ + /*load new screen should not crash*/ + lv_obj_t * screen = lv_obj_create(NULL); + lv_scr_load(screen); + + /*Consecutively loading multiple screens (while deleting one) with transition animations should not crash*/ + lv_obj_t * screen_with_anim_1 = lv_obj_create(NULL); + lv_obj_t * screen_with_anim_2 = lv_obj_create(NULL); + lv_obj_t * screen_with_anim_3 = lv_obj_create(NULL); + lv_obj_t * screen_with_anim_4 = lv_obj_create(NULL); + + lv_scr_load_anim(screen_with_anim_1, LV_SCR_LOAD_ANIM_OVER_LEFT, 0, 0, false); + lv_scr_load_anim(screen_with_anim_2, LV_SCR_LOAD_ANIM_OVER_RIGHT, 1000, 0, true); + lv_scr_load_anim(screen_with_anim_3, LV_SCR_LOAD_ANIM_OVER_LEFT, 0, 0, true); + + /*Wait to trigger the animation start callbacks*/ + lv_test_indev_wait(100); + + lv_scr_load_anim(screen_with_anim_4, LV_SCR_LOAD_ANIM_OVER_LEFT, 200, 0, true); + + /*The active screen should be immediately replaced*/ + TEST_ASSERT_EQUAL(lv_scr_act(), screen_with_anim_3); + + lv_test_indev_wait(400); + + /*Check for the screens status after the transition*/ + TEST_ASSERT_EQUAL(lv_obj_is_valid(screen_with_anim_1), false); + TEST_ASSERT_EQUAL(lv_obj_is_valid(screen_with_anim_2), false); + TEST_ASSERT_EQUAL(lv_obj_is_valid(screen_with_anim_3), false); + TEST_ASSERT_EQUAL(lv_obj_is_valid(screen_with_anim_4), true); +} + +static bool screen_1_unloaded_called = false; + +static void screen_with_anim_1_unloaded_cb(lv_event_t * e) +{ + LV_UNUSED(e); + screen_1_unloaded_called = true; +} + +void test_screen_load_with_delete_event(void) +{ + /*load new screen should not crash*/ + lv_obj_t * screen = lv_obj_create(NULL); + lv_scr_load(screen); + + /*Consecutively loading multiple screens (while deleting one) with transition animations should not crash*/ + lv_obj_t * screen_with_anim_1 = lv_obj_create(NULL); + lv_obj_t * screen_with_anim_2 = lv_obj_create(NULL); + lv_obj_t * screen_with_anim_3 = lv_obj_create(NULL); + lv_obj_t * screen_with_anim_4 = lv_obj_create(NULL); + + lv_scr_load_anim(screen_with_anim_1, LV_SCR_LOAD_ANIM_OVER_LEFT, 0, 0, false); + lv_obj_add_event_cb(screen_with_anim_1, screen_with_anim_1_unloaded_cb, LV_EVENT_SCREEN_UNLOADED, NULL); + lv_scr_load_anim(screen_with_anim_2, LV_SCR_LOAD_ANIM_OVER_RIGHT, 1000, 0, true); + lv_scr_load_anim(screen_with_anim_3, LV_SCR_LOAD_ANIM_OVER_LEFT, 0, 0, true); + + /*Wait to trigger the animation start callbacks*/ + lv_test_indev_wait(100); + + TEST_ASSERT_EQUAL(screen_1_unloaded_called, true); + + lv_scr_load_anim(screen_with_anim_4, LV_SCR_LOAD_ANIM_OVER_LEFT, 200, 0, true); + + /*The active screen should be immediately replaced*/ + TEST_ASSERT_EQUAL(lv_scr_act(), screen_with_anim_3); + + lv_test_indev_wait(400); + + /*Check for the screens status after the transition*/ + TEST_ASSERT_EQUAL(lv_obj_is_valid(screen_with_anim_1), false); + TEST_ASSERT_EQUAL(lv_obj_is_valid(screen_with_anim_2), false); + TEST_ASSERT_EQUAL(lv_obj_is_valid(screen_with_anim_3), false); + TEST_ASSERT_EQUAL(lv_obj_is_valid(screen_with_anim_4), true); +} + +#endif diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/src/test_cases/test_slider.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/tests/src/test_cases/test_slider.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/src/test_cases/test_slider.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/tests/src/test_cases/test_slider.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/src/test_cases/test_snapshot.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/tests/src/test_cases/test_snapshot.c similarity index 99% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/src/test_cases/test_snapshot.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/tests/src/test_cases/test_snapshot.c index 0c87b31..591822c 100644 --- a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/src/test_cases/test_snapshot.c +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/tests/src/test_cases/test_snapshot.c @@ -5,7 +5,6 @@ #include "unity/unity.h" - #define NUM_SNAPSHOTS 1 void test_snapshot_should_not_leak_memory(void) diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/src/test_cases/test_style.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/tests/src/test_cases/test_style.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/src/test_cases/test_style.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/tests/src/test_cases/test_style.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/src/test_cases/test_switch.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/tests/src/test_cases/test_switch.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/src/test_cases/test_switch.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/tests/src/test_cases/test_switch.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/src/test_cases/test_table.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/tests/src/test_cases/test_table.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/src/test_cases/test_table.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/tests/src/test_cases/test_table.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/src/test_cases/test_textarea.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/tests/src/test_cases/test_textarea.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/src/test_cases/test_textarea.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/tests/src/test_cases/test_textarea.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/tests/src/test_cases/test_tiny_ttf.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/tests/src/test_cases/test_tiny_ttf.c new file mode 100644 index 0000000..574e526 --- /dev/null +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/tests/src/test_cases/test_tiny_ttf.c @@ -0,0 +1,49 @@ +#if LV_BUILD_TEST +#include "../lvgl.h" + +#include "unity/unity.h" + +void setUp(void) +{ + /* Function run before every test */ +} + +void tearDown(void) +{ + /* Function run after every test */ +} + +void test_tiny_ttf_rendering_test(void) +{ +#if LV_USE_TINY_TTF + /*Create a font*/ + extern const uint8_t ubuntu_font[]; + extern size_t ubuntu_font_size; + lv_font_t * font = lv_tiny_ttf_create_data(ubuntu_font, ubuntu_font_size, 30); + + /*Create style with the new font*/ + static lv_style_t style; + lv_style_init(&style); + lv_style_set_text_font(&style, font); + lv_style_set_text_align(&style, LV_TEXT_ALIGN_CENTER); + lv_style_set_bg_opa(&style, LV_OPA_COVER); + lv_style_set_bg_color(&style, lv_color_hex(0xffaaaa)); + + /*Create a label with the new style*/ + lv_obj_t * label = lv_label_create(lv_scr_act()); + lv_obj_add_style(label, &style, 0); + lv_label_set_text(label, "Hello world\n" + "I'm a font created with Tiny TTF\n" + "Accents: ÁÉÍÓÖŐÜŰ áéíóöőüű"); + lv_obj_center(label); + + TEST_ASSERT_EQUAL_SCREENSHOT("tiny_ttf_1.png"); + + lv_obj_del(label); + lv_tiny_ttf_destroy(font); +#else + TEST_PASS(); +#endif +} + +#endif diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/src/test_cases/test_txt.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/tests/src/test_cases/test_txt.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/src/test_cases/test_txt.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/tests/src/test_cases/test_txt.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/src/test_files/readtest.txt b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/tests/src/test_files/readtest.txt similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/src/test_files/readtest.txt rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/tests/src/test_files/readtest.txt diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/src/test_fonts/font_1.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/tests/src/test_fonts/font_1.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/src/test_fonts/font_1.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/tests/src/test_fonts/font_1.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/src/test_fonts/font_1.fnt b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/tests/src/test_fonts/font_1.fnt similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/src/test_fonts/font_1.fnt rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/tests/src/test_fonts/font_1.fnt diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/src/test_fonts/font_2.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/tests/src/test_fonts/font_2.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/src/test_fonts/font_2.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/tests/src/test_fonts/font_2.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/src/test_fonts/font_2.fnt b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/tests/src/test_fonts/font_2.fnt similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/src/test_fonts/font_2.fnt rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/tests/src/test_fonts/font_2.fnt diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/src/test_fonts/font_3.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/tests/src/test_fonts/font_3.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/src/test_fonts/font_3.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/tests/src/test_fonts/font_3.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/src/test_fonts/font_3.fnt b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/tests/src/test_fonts/font_3.fnt similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/src/test_fonts/font_3.fnt rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/tests/src/test_fonts/font_3.fnt diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/tests/src/test_fonts/ubuntu_font.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/tests/src/test_fonts/ubuntu_font.c new file mode 100644 index 0000000..56467be --- /dev/null +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/tests/src/test_fonts/ubuntu_font.c @@ -0,0 +1,11970 @@ +#include +#include + +const uint8_t ubuntu_font[] = { + 0x00, 0x01, 0x00, 0x00, 0x00, 0x11, 0x01, 0x00, 0x00, 0x04, 0x00, 0x10, 0x44, 0x53, 0x49, 0x47, + 0x1b, 0x79, 0x61, 0x63, 0x00, 0x02, 0xd2, 0x78, 0x00, 0x00, 0x19, 0x30, 0x47, 0x53, 0x55, 0x42, + 0x0f, 0xff, 0x5a, 0xb8, 0x00, 0x02, 0xa9, 0x3c, 0x00, 0x00, 0x29, 0x3c, 0x4f, 0x53, 0x2f, 0x32, + 0x89, 0xee, 0x00, 0xb2, 0x00, 0x00, 0x01, 0x98, 0x00, 0x00, 0x00, 0x60, 0x56, 0x44, 0x4d, 0x58, + 0x6c, 0x3c, 0x73, 0xda, 0x00, 0x00, 0x0c, 0x1c, 0x00, 0x00, 0x05, 0xe0, 0x63, 0x6d, 0x61, 0x70, + 0xf6, 0x78, 0x50, 0x3f, 0x00, 0x00, 0x11, 0xfc, 0x00, 0x00, 0x06, 0x86, 0x63, 0x76, 0x74, 0x20, + 0x39, 0x1e, 0x29, 0x66, 0x00, 0x00, 0x1f, 0xcc, 0x00, 0x00, 0x01, 0x76, 0x66, 0x70, 0x67, 0x6d, + 0x76, 0xbd, 0x44, 0xc4, 0x00, 0x00, 0x18, 0x84, 0x00, 0x00, 0x06, 0x23, 0x67, 0x61, 0x73, 0x70, + 0xff, 0xff, 0x00, 0x03, 0x00, 0x02, 0xa9, 0x34, 0x00, 0x00, 0x00, 0x08, 0x67, 0x6c, 0x79, 0x66, + 0x2f, 0x97, 0x44, 0x0e, 0x00, 0x00, 0x35, 0x88, 0x00, 0x02, 0x40, 0x6c, 0x68, 0x65, 0x61, 0x64, + 0xf4, 0xc1, 0x1f, 0x12, 0x00, 0x00, 0x01, 0x1c, 0x00, 0x00, 0x00, 0x36, 0x68, 0x68, 0x65, 0x61, + 0x05, 0x35, 0x00, 0xa7, 0x00, 0x00, 0x01, 0x54, 0x00, 0x00, 0x00, 0x24, 0x68, 0x6d, 0x74, 0x78, + 0x35, 0xc2, 0x2e, 0x2f, 0x00, 0x00, 0x01, 0xf8, 0x00, 0x00, 0x0a, 0x22, 0x6c, 0x6f, 0x63, 0x61, + 0x06, 0x3a, 0x83, 0x48, 0x00, 0x00, 0x21, 0x44, 0x00, 0x00, 0x14, 0x44, 0x6d, 0x61, 0x78, 0x70, + 0x0b, 0x80, 0x09, 0x9f, 0x00, 0x00, 0x01, 0x78, 0x00, 0x00, 0x00, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x91, 0xf0, 0xf2, 0x7c, 0x00, 0x02, 0x75, 0xf4, 0x00, 0x00, 0x04, 0x89, 0x70, 0x6f, 0x73, 0x74, + 0x33, 0xda, 0xb4, 0xf4, 0x00, 0x02, 0x7a, 0x80, 0x00, 0x00, 0x2e, 0xb1, 0x70, 0x72, 0x65, 0x70, + 0xf6, 0x58, 0xc3, 0xbb, 0x00, 0x00, 0x1e, 0xa8, 0x00, 0x00, 0x01, 0x23, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x00, 0xcc, 0xcc, 0x37, 0x91, 0x47, 0x0b, 0x5f, 0x0f, 0x3c, 0xf5, 0x00, 0x09, 0x03, 0xe8, + 0x00, 0x00, 0x00, 0x00, 0xc9, 0xe5, 0xbe, 0xcb, 0x00, 0x00, 0x00, 0x00, 0xca, 0xa6, 0x4f, 0xff, + 0xfe, 0x7e, 0xff, 0x56, 0x02, 0x99, 0x03, 0x3f, 0x00, 0x01, 0x00, 0x09, 0x00, 0x02, 0x00, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x03, 0x3e, 0xff, 0x56, 0x00, 0x00, 0x01, 0xf4, + 0xff, 0x5b, 0xff, 0x5b, 0x02, 0x99, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x05, 0x10, 0x01, 0x54, + 0x00, 0x55, 0x00, 0x6a, 0x00, 0x07, 0x00, 0x02, 0x00, 0x10, 0x00, 0x2f, 0x00, 0x59, 0x00, 0x00, + 0x05, 0xa7, 0x07, 0xaf, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x01, 0xf4, 0x02, 0xbc, 0x00, 0x05, + 0x00, 0x00, 0x02, 0xbc, 0x02, 0x8a, 0x00, 0x00, 0x00, 0x8c, 0x02, 0xbc, 0x02, 0x8a, 0x00, 0x00, + 0x01, 0xdd, 0x00, 0x32, 0x00, 0xfa, 0x00, 0x00, 0x02, 0x0b, 0x08, 0x09, 0x03, 0x06, 0x02, 0x03, + 0x02, 0x04, 0xe0, 0x00, 0x02, 0xff, 0x50, 0x00, 0x20, 0x5b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x44, 0x41, 0x4d, 0x41, 0x00, 0x20, 0x00, 0x00, 0xff, 0xfd, 0x02, 0xb5, 0xff, 0x5b, + 0x00, 0x31, 0x03, 0x3e, 0x00, 0xaa, 0x20, 0x00, 0x00, 0x9f, 0x56, 0x01, 0x00, 0x00, 0x02, 0x08, + 0x02, 0xb5, 0x00, 0x00, 0x00, 0x20, 0x00, 0x03, 0x01, 0xf4, 0x00, 0x32, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xa7, 0x00, 0x57, 0x00, 0x12, 0x00, 0x22, 0x00, 0x02, 0x00, 0x15, 0x00, 0xba, + 0x00, 0x5e, 0x00, 0x55, 0x00, 0x2e, 0x00, 0x28, 0x00, 0x7e, 0x00, 0x71, 0x00, 0xa1, 0x00, 0x2f, + 0x00, 0x23, 0x00, 0x30, 0x00, 0x2b, 0x00, 0x29, 0x00, 0x1b, 0x00, 0x23, 0x00, 0x2e, 0x00, 0x31, + 0x00, 0x26, 0x00, 0x2d, 0x00, 0xa1, 0x00, 0x76, 0x00, 0x2d, 0x00, 0x28, 0x00, 0x28, 0x00, 0x45, + 0x00, 0x12, 0x00, 0x09, 0x00, 0x36, 0x00, 0x1b, 0x00, 0x36, 0x00, 0x3f, 0x00, 0x3f, 0x00, 0x1b, + 0x00, 0x2d, 0x00, 0x36, 0x00, 0x2a, 0x00, 0x2d, 0x00, 0x47, 0x00, 0x17, 0x00, 0x2e, 0x00, 0x1b, + 0x00, 0x36, 0x00, 0x1b, 0x00, 0x36, 0x00, 0x28, 0x00, 0x19, 0x00, 0x27, 0x00, 0x0d, 0x00, 0x17, + 0x00, 0x0b, 0x00, 0x0d, 0x00, 0x2e, 0x00, 0x71, 0x00, 0x31, 0x00, 0x6d, 0x00, 0x10, 0x00, 0x08, + 0x00, 0x98, 0x00, 0x2c, 0x00, 0x3e, 0x00, 0x2c, 0x00, 0x1c, 0x00, 0x1f, 0x00, 0x24, 0x00, 0x21, + 0x00, 0x3f, 0x00, 0x24, 0x00, 0x31, 0x00, 0x3f, 0x00, 0x24, 0x00, 0x1d, 0x00, 0x3f, 0x00, 0x1d, + 0x00, 0x3f, 0x00, 0x1f, 0x00, 0x59, 0x00, 0x36, 0x00, 0x24, 0x00, 0x3b, 0x00, 0x0e, 0x00, 0x0b, + 0x00, 0x14, 0x00, 0x14, 0x00, 0x43, 0x00, 0x3f, 0x00, 0xbd, 0x00, 0x3f, 0x00, 0x15, 0x00, 0x1f, + 0x00, 0x7e, 0xff, 0xff, 0x00, 0x0c, 0x00, 0x1c, 0x00, 0x3e, 0x00, 0x3a, 0x00, 0x70, 0x00, 0x09, + 0x00, 0x28, 0x00, 0x84, 0x00, 0x12, 0x00, 0x90, 0x00, 0x90, 0x00, 0x29, 0x00, 0x1d, 0x00, 0x72, + 0x00, 0x36, 0x00, 0x00, 0x00, 0x5a, 0x00, 0x12, 0x00, 0x36, 0x00, 0x9b, 0x00, 0x16, 0x00, 0x0d, + 0x00, 0x00, 0x00, 0xa7, 0x00, 0x2e, 0x00, 0x26, 0x00, 0x14, 0x00, 0x0d, 0x00, 0xbd, 0x00, 0x31, + 0x00, 0x53, 0x00, 0x19, 0x00, 0x68, 0x00, 0x32, 0x00, 0x2d, 0x00, 0x71, 0x00, 0x19, 0x00, 0x6c, + 0x00, 0x6c, 0x00, 0x28, 0x00, 0x71, 0x00, 0x71, 0x00, 0x98, 0x00, 0x3b, 0x00, 0x13, 0x00, 0xa1, + 0x00, 0x9f, 0x00, 0x81, 0x00, 0x4a, 0x00, 0x32, 0x00, 0x02, 0x00, 0x02, 0x00, 0x0c, 0x00, 0x45, + 0x00, 0x09, 0x00, 0x09, 0x00, 0x09, 0x00, 0x09, 0x00, 0x09, 0x00, 0x09, 0x00, 0x09, 0x00, 0x1b, + 0x00, 0x3f, 0x00, 0x3f, 0x00, 0x3f, 0x00, 0x3f, 0x00, 0x36, 0x00, 0x36, 0x00, 0x36, 0x00, 0x36, + 0x00, 0x12, 0x00, 0x2e, 0x00, 0x1b, 0x00, 0x1b, 0x00, 0x1b, 0x00, 0x1b, 0x00, 0x1b, 0x00, 0x3c, + 0x00, 0x1b, 0x00, 0x27, 0x00, 0x27, 0x00, 0x27, 0x00, 0x27, 0x00, 0x0d, 0x00, 0x36, 0x00, 0x1f, + 0x00, 0x2c, 0x00, 0x2c, 0x00, 0x2c, 0x00, 0x2c, 0x00, 0x2c, 0x00, 0x2c, 0x00, 0x17, 0x00, 0x2c, + 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x24, 0x00, 0x24, 0x00, 0x24, 0x00, 0x24, + 0x00, 0x28, 0x00, 0x3f, 0x00, 0x1d, 0x00, 0x1d, 0x00, 0x1d, 0x00, 0x1d, 0x00, 0x1d, 0x00, 0x28, + 0x00, 0x1d, 0x00, 0x3b, 0x00, 0x3b, 0x00, 0x3b, 0x00, 0x3b, 0x00, 0x14, 0x00, 0x3f, 0x00, 0x14, + 0x00, 0x09, 0x00, 0x2c, 0x00, 0x09, 0x00, 0x2c, 0x00, 0x09, 0x00, 0x2c, 0x00, 0x1b, 0x00, 0x2c, + 0x00, 0x1b, 0x00, 0x2c, 0x00, 0x1b, 0x00, 0x2c, 0x00, 0x1b, 0x00, 0x2c, 0x00, 0x36, 0x00, 0x0d, + 0x00, 0x12, 0x00, 0x1c, 0x00, 0x3f, 0x00, 0x1f, 0x00, 0x3f, 0x00, 0x1f, 0x00, 0x3f, 0x00, 0x1f, + 0x00, 0x3f, 0x00, 0x1f, 0x00, 0x3f, 0x00, 0x1f, 0x00, 0x1b, 0x00, 0x21, 0x00, 0x1b, 0x00, 0x21, + 0x00, 0x1b, 0x00, 0x21, 0x00, 0x1b, 0x00, 0x21, 0x00, 0x2d, 0x00, 0x37, 0x00, 0x12, 0x00, 0x19, + 0x00, 0x36, 0x00, 0x24, 0x00, 0x36, 0x00, 0x24, 0x00, 0x36, 0x00, 0x24, 0x00, 0x36, 0x00, 0x24, + 0x00, 0x36, 0x00, 0x24, 0x00, 0x24, 0x00, 0x18, 0x00, 0x37, 0x00, 0x2a, 0x00, 0x31, 0x00, 0x2d, + 0x00, 0x3f, 0x00, 0x2d, 0x00, 0x3f, 0x00, 0x47, 0x00, 0x24, 0x00, 0x47, 0x00, 0x24, 0x00, 0x47, + 0x00, 0x24, 0x00, 0x47, 0x00, 0x24, 0xff, 0xf6, 0x00, 0x24, 0x00, 0x2e, 0x00, 0x3f, 0x00, 0x2e, + 0x00, 0x3f, 0x00, 0x2e, 0x00, 0x3f, 0x00, 0x09, 0xff, 0xe6, 0x00, 0x2e, 0x00, 0x3f, 0x00, 0x1b, + 0x00, 0x1d, 0x00, 0x1b, 0x00, 0x1d, 0x00, 0x1b, 0x00, 0x1d, 0x00, 0x36, 0x00, 0x59, 0x00, 0x36, + 0x00, 0x23, 0x00, 0x36, 0x00, 0x59, 0x00, 0x28, 0x00, 0x36, 0x00, 0x28, 0x00, 0x36, 0x00, 0x28, + 0x00, 0x36, 0x00, 0x19, 0x00, 0x24, 0x00, 0x19, 0x00, 0x24, 0x00, 0x19, 0x00, 0x24, 0x00, 0x27, + 0x00, 0x3b, 0x00, 0x27, 0x00, 0x3b, 0x00, 0x27, 0x00, 0x3b, 0x00, 0x27, 0x00, 0x3b, 0x00, 0x27, + 0x00, 0x3b, 0x00, 0x27, 0x00, 0x3b, 0x00, 0x17, 0x00, 0x0b, 0x00, 0x0d, 0x00, 0x14, 0x00, 0x2e, + 0x00, 0x43, 0x00, 0x2e, 0x00, 0x43, 0x00, 0x2e, 0x00, 0x43, 0x00, 0x8b, 0x00, 0x28, 0x00, 0x36, + 0x00, 0x19, 0x00, 0x24, 0x00, 0x31, 0x00, 0xb0, 0x00, 0x70, 0x00, 0x6a, 0x00, 0x69, 0x00, 0xb3, + 0x00, 0x91, 0x00, 0xa3, 0x00, 0x43, 0x00, 0x17, 0x00, 0x0b, 0x00, 0x17, 0x00, 0x0b, 0x00, 0x17, + 0x00, 0x0b, 0x00, 0x0d, 0x00, 0x14, 0x00, 0x19, 0x00, 0x66, 0x00, 0x59, 0x00, 0x71, 0x00, 0x62, + 0x00, 0x6b, 0x00, 0x6a, 0x00, 0x81, 0x00, 0x66, 0x00, 0x81, 0x00, 0x71, 0x00, 0x71, 0x00, 0x59, + 0x00, 0x71, 0x00, 0x62, 0x00, 0x6b, 0x00, 0x6a, 0x00, 0x81, 0x00, 0x35, 0x00, 0x1b, 0x00, 0x02, + 0x00, 0x00, 0x00, 0x02, 0x00, 0x03, 0x00, 0x05, 0x00, 0x16, 0x00, 0x02, 0x00, 0x00, 0x00, 0x0c, + 0x00, 0x00, 0x00, 0x02, 0x00, 0x05, 0x00, 0x02, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x05, + 0x00, 0x09, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x10, 0x00, 0x00, 0x00, 0x1d, + 0x00, 0x09, 0x00, 0x28, 0x00, 0x1f, 0x00, 0x09, 0x00, 0x28, 0x00, 0x19, 0x00, 0xa7, 0x00, 0x09, + 0x00, 0x0e, 0x00, 0x31, 0x00, 0x15, 0x00, 0x28, 0x00, 0x2c, 0x00, 0x2c, 0x00, 0x19, 0x00, 0x12, + 0x00, 0x12, 0x00, 0x12, 0x00, 0x12, 0x00, 0x66, 0x00, 0x81, 0x00, 0x71, 0x00, 0x71, 0x00, 0x59, + 0x00, 0x71, 0x00, 0x62, 0x00, 0x6b, 0x00, 0x6a, 0x00, 0x81, 0x00, 0x66, 0x00, 0x81, 0x00, 0x71, + 0x00, 0x71, 0x00, 0x59, 0x00, 0x71, 0x00, 0x62, 0x00, 0x6b, 0x00, 0x6a, 0x00, 0x81, 0x00, 0xc4, + 0x00, 0xa4, 0x00, 0xa1, 0x00, 0xc4, 0x00, 0x5e, 0x00, 0x55, 0x00, 0x71, 0x00, 0x2f, 0x00, 0x12, + 0x00, 0x71, 0x00, 0x31, 0x00, 0x6d, 0x00, 0x3f, 0x00, 0x3f, 0x00, 0x84, 0x00, 0x72, 0x00, 0x36, + 0x00, 0x00, 0x00, 0x9b, 0x00, 0xa9, 0x00, 0x32, 0x00, 0x32, 0x00, 0x45, 0x00, 0x12, 0x00, 0x00, + 0x00, 0x36, 0x00, 0x3f, 0xff, 0xf2, 0xff, 0xfc, 0x00, 0x1b, 0x00, 0x1b, 0x00, 0x28, 0x00, 0x12, + 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1c, 0x00, 0x1f, 0x00, 0x3f, 0x00, 0x19, 0x00, 0x1f, 0xff, 0xcc, + 0x00, 0x1b, 0x00, 0x09, 0x00, 0x1b, 0x00, 0x20, 0x00, 0x36, 0x00, 0x2d, 0x00, 0x3f, 0x00, 0x3b, + 0x00, 0x12, 0x00, 0x14, 0xff, 0xbc, 0x00, 0x3f, 0x00, 0x1b, 0x00, 0x1b, 0x00, 0x1d, 0x00, 0x1e, + 0x00, 0x17, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x36, 0x00, 0x28, 0x00, 0x36, 0x00, 0x1c, 0x00, 0x09, + 0x00, 0x24, 0x00, 0x0a, 0x00, 0x24, 0x00, 0x19, 0x00, 0x27, 0x00, 0x29, 0x00, 0x09, 0x00, 0x27, + 0x00, 0x0d, 0x00, 0x14, 0x00, 0x2e, 0x00, 0x43, 0x00, 0x1a, 0x00, 0x28, 0x00, 0x36, 0x00, 0x2d, + 0x00, 0x1c, 0x00, 0x1b, 0x00, 0x24, 0x00, 0x35, 0x00, 0x3f, 0x00, 0xbd, 0x00, 0x5c, 0x00, 0x16, + 0x00, 0xa7, 0x00, 0x12, 0x00, 0x12, 0x00, 0x09, 0x00, 0x12, 0x00, 0x2d, 0x00, 0x37, 0x00, 0x12, + 0x00, 0x12, 0x00, 0x12, 0x00, 0x09, 0x00, 0x2c, 0x00, 0x36, 0x00, 0x24, 0x00, 0x1b, 0x00, 0x1d, + 0x00, 0x27, 0x00, 0x3b, 0x00, 0x27, 0x00, 0x3b, 0x00, 0x27, 0x00, 0x3b, 0x00, 0x27, 0x00, 0x3b, + 0x00, 0x27, 0x00, 0x3b, 0x00, 0x1f, 0x00, 0x09, 0x00, 0x2c, 0x00, 0x09, 0x00, 0x2c, 0x00, 0x09, + 0x00, 0x17, 0x00, 0x1b, 0x00, 0x21, 0x00, 0x1b, 0x00, 0x21, 0x00, 0x2d, 0x00, 0x37, 0x00, 0x1b, + 0x00, 0x1d, 0x00, 0x1b, 0x00, 0x1d, 0x00, 0x1a, 0x00, 0x1f, 0x00, 0x31, 0x00, 0x12, 0x00, 0x12, + 0x00, 0x09, 0x00, 0x1b, 0x00, 0x21, 0x00, 0x1e, 0x00, 0x36, 0x00, 0x2e, 0x00, 0x3f, 0x00, 0x09, + 0x00, 0x2c, 0x00, 0x09, 0x00, 0x17, 0x00, 0x1b, 0x00, 0x1d, 0x00, 0x09, 0x00, 0x2c, 0x00, 0x09, + 0x00, 0x2c, 0x00, 0x3c, 0x00, 0x1f, 0x00, 0x3f, 0x00, 0x1f, 0x00, 0x36, 0x00, 0x24, 0x00, 0x36, + 0x00, 0x24, 0x00, 0x1b, 0x00, 0x1d, 0x00, 0x1b, 0x00, 0x1d, 0x00, 0x2c, 0x00, 0x4f, 0x00, 0x36, + 0x00, 0x59, 0x00, 0x27, 0x00, 0x3b, 0x00, 0x27, 0x00, 0x3b, 0x00, 0x22, 0x00, 0x4b, 0x00, 0x2d, + 0x00, 0x37, 0x00, 0x2d, 0x00, 0x11, 0x00, 0x1b, 0x00, 0x1b, 0x00, 0x2e, 0x00, 0x43, 0x00, 0x09, + 0x00, 0x2c, 0x00, 0x3f, 0x00, 0x1f, 0x00, 0x1b, 0x00, 0x1d, 0x00, 0x1b, 0x00, 0x1d, 0x00, 0x1b, + 0x00, 0x1d, 0x00, 0x1b, 0x00, 0x1d, 0x00, 0x0d, 0x00, 0x14, 0x00, 0x24, 0x00, 0x1b, 0x00, 0x24, + 0x00, 0x18, 0x00, 0x18, 0x00, 0x09, 0x00, 0x1b, 0x00, 0x27, 0x00, 0x12, 0xff, 0xfc, 0x00, 0x24, + 0x00, 0x43, 0x00, 0x37, 0x00, 0x3c, 0x00, 0x12, 0x00, 0x12, 0x00, 0x09, 0x00, 0x36, 0x00, 0x16, + 0x00, 0x2a, 0x00, 0x31, 0x00, 0x1b, 0x00, 0x1f, 0x00, 0x12, 0x00, 0x12, 0x00, 0x09, 0x00, 0x09, + 0x00, 0x1f, 0x00, 0x69, 0x00, 0x4f, 0x00, 0xa1, 0x00, 0x6d, 0x00, 0x86, 0x00, 0x4a, 0x00, 0x4a, + 0x00, 0x4a, 0x00, 0x6f, 0x00, 0x8b, 0x00, 0x77, 0x00, 0x77, 0x00, 0x4d, 0x00, 0x4d, 0x00, 0x4d, + 0x00, 0x3f, 0x00, 0x3f, 0x00, 0x12, 0x00, 0x24, 0x00, 0x1b, 0x00, 0x28, 0x00, 0x36, 0x00, 0x36, + 0x00, 0x2a, 0x00, 0x04, 0x00, 0x2e, 0x00, 0x12, 0x00, 0x2d, 0x00, 0x2e, 0x00, 0x05, 0x00, 0x2d, + 0x00, 0x09, 0x00, 0x36, 0x00, 0x36, 0x00, 0x24, 0x00, 0x0f, 0x00, 0x3f, 0x00, 0x09, 0x00, 0x17, + 0x00, 0x2e, 0x00, 0x2e, 0x00, 0x2d, 0x00, 0x08, 0x00, 0x17, 0x00, 0x2d, 0x00, 0x1b, 0x00, 0x2d, + 0x00, 0x36, 0x00, 0x1b, 0x00, 0x19, 0x00, 0x05, 0x00, 0x19, 0x00, 0x0b, 0x00, 0x2d, 0x00, 0x2d, + 0x00, 0x17, 0x00, 0x17, 0x00, 0x12, 0x00, 0x22, 0x00, 0x36, 0x00, 0x2a, 0x00, 0x1e, 0x00, 0x14, + 0x00, 0x2c, 0x00, 0x28, 0x00, 0x44, 0x00, 0x59, 0x00, 0x18, 0x00, 0x1f, 0x00, 0x0e, 0x00, 0x33, + 0x00, 0x3f, 0x00, 0x3f, 0x00, 0x3f, 0x00, 0x11, 0x00, 0x18, 0x00, 0x3b, 0x00, 0x1d, 0x00, 0x3f, + 0x00, 0x3f, 0x00, 0x2c, 0x00, 0x26, 0x00, 0x14, 0x00, 0x18, 0x00, 0x14, 0x00, 0x3f, 0x00, 0x2b, + 0x00, 0x20, 0x00, 0x20, 0x00, 0x12, 0x00, 0x22, 0x00, 0x36, 0x00, 0x18, 0x00, 0x17, 0x00, 0x14, + 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x19, 0x00, 0x59, 0x00, 0x27, 0x00, 0x36, 0x00, 0x24, 0x00, 0x24, + 0x00, 0x31, 0x00, 0x04, 0x00, 0x2e, 0x00, 0x19, 0x00, 0x3f, 0x00, 0x3f, 0x00, 0x14, 0x00, 0x3f, + 0x00, 0x1f, 0x00, 0x12, 0x00, 0x12, 0x00, 0x1b, 0x00, 0x1d, 0x00, 0x03, 0x00, 0x0e, 0x00, 0x2e, + 0x00, 0x3f, 0x00, 0x12, 0x00, 0x12, 0x00, 0x36, 0x00, 0x3f, 0x00, 0x24, 0x00, 0x59, 0x00, 0x24, + 0x00, 0x12, 0x00, 0x2d, 0x00, 0x3f, 0x00, 0x09, 0x00, 0x0e, 0x00, 0x17, 0x00, 0x33, 0x00, 0x2d, + 0x00, 0x3f, 0x00, 0x1c, 0x00, 0x1c, 0x00, 0x1b, 0x00, 0x12, 0x00, 0x12, 0x00, 0x12, 0x00, 0x2d, + 0x00, 0x3b, 0x00, 0x2d, 0x00, 0x3b, 0x00, 0x24, 0x00, 0x24, 0x00, 0x12, 0x00, 0x11, 0x00, 0x1b, + 0x00, 0x2c, 0x00, 0x19, 0x00, 0x26, 0x00, 0x0d, 0x00, 0x0e, 0x00, 0x0d, 0x00, 0x0e, 0x00, 0x0b, + 0x00, 0x14, 0x00, 0x11, 0x00, 0x12, 0x00, 0x2d, 0x00, 0x2b, 0x00, 0x1b, 0x00, 0x2d, 0x00, 0x36, + 0x00, 0x3f, 0x00, 0x09, 0x00, 0x09, 0x00, 0x09, 0x00, 0x09, 0x00, 0x36, 0x00, 0x09, 0x00, 0x0e, + 0x00, 0x2d, 0x00, 0x3f, 0x00, 0x08, 0x00, 0x11, 0x00, 0x2d, 0x00, 0x3b, 0x00, 0x2d, 0x00, 0x3b, + 0x00, 0x2d, 0x00, 0x2b, 0x00, 0x17, 0x00, 0x18, 0x00, 0x36, 0x00, 0x09, 0x00, 0x2c, 0x00, 0x09, + 0x00, 0x2c, 0x00, 0x09, 0x00, 0x17, 0x00, 0x3f, 0x00, 0x1f, 0x00, 0x19, 0x00, 0x1f, 0x00, 0x19, + 0x00, 0x1f, 0x00, 0x09, 0x00, 0x0e, 0x00, 0x17, 0x00, 0x33, 0x00, 0x1a, 0x00, 0x1f, 0x00, 0x2e, + 0x00, 0x3f, 0x00, 0x2e, 0x00, 0x3f, 0x00, 0x1b, 0x00, 0x1d, 0x00, 0x1b, 0x00, 0x1d, 0x00, 0x1b, + 0x00, 0x1d, 0x00, 0x2a, 0x00, 0x18, 0x00, 0x05, 0x00, 0x14, 0x00, 0x05, 0x00, 0x14, 0x00, 0x05, + 0x00, 0x14, 0x00, 0x2d, 0x00, 0x2b, 0x00, 0x24, 0x00, 0x59, 0x00, 0x22, 0x00, 0x22, 0x00, 0x12, + 0x00, 0x00, 0x00, 0x15, 0x00, 0x19, 0x00, 0x19, 0x00, 0x12, 0x00, 0x60, 0x00, 0x09, 0x00, 0x36, + 0x00, 0x24, 0x00, 0x09, 0x00, 0x3f, 0x00, 0x2e, 0x00, 0x2d, 0x00, 0x16, 0x00, 0x36, 0x00, 0x2d, + 0x00, 0x09, 0x00, 0x17, 0x00, 0x2e, 0x00, 0x20, 0x00, 0x1b, 0x00, 0x2d, 0x00, 0x36, 0x00, 0x1c, + 0x00, 0x19, 0x00, 0x0d, 0x00, 0x19, 0x00, 0x0b, 0x00, 0x19, 0x00, 0x09, 0x00, 0x28, 0x00, 0x36, + 0x00, 0x0e, 0x00, 0x1f, 0x00, 0x40, 0x00, 0x36, 0x00, 0x3f, 0x00, 0x1f, 0x00, 0x24, 0x00, 0x3f, + 0x00, 0x13, 0x00, 0x3b, 0x00, 0x0e, 0x00, 0x35, 0x00, 0x1d, 0x00, 0x3f, 0x00, 0x3f, 0x00, 0x2d, + 0x00, 0x1d, 0x00, 0x24, 0x00, 0x33, 0x00, 0x18, 0x00, 0x14, 0x00, 0x18, 0x00, 0x19, 0xff, 0xe8, + 0xff, 0x7b, 0xff, 0x6a, 0xff, 0x6d, 0x00, 0x36, 0xff, 0x80, 0xff, 0x5a, 0x00, 0x0d, 0xff, 0x80, + 0x00, 0x28, 0x00, 0x40, 0x00, 0x3f, 0x00, 0x24, 0x00, 0x24, 0x00, 0x24, 0x00, 0x1d, 0x00, 0x33, + 0x00, 0x33, 0x00, 0x26, 0x00, 0x19, 0x00, 0x97, 0x00, 0xab, 0x00, 0x26, 0x00, 0x28, 0x00, 0x28, + 0x00, 0x28, 0x00, 0x28, 0x00, 0x28, 0x00, 0x28, 0x00, 0x28, 0x00, 0x28, 0xff, 0xe0, 0xff, 0xcb, + 0xfe, 0xfb, 0xff, 0x17, 0xff, 0x36, 0xff, 0x29, 0xff, 0x77, 0xff, 0x78, 0x00, 0x40, 0x00, 0x40, + 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0xff, 0x6b, 0xff, 0x7b, 0xfe, 0xa4, 0xfe, 0xbf, + 0xfe, 0xc3, 0xfe, 0xb2, 0x00, 0x3f, 0x00, 0x3f, 0x00, 0x3f, 0x00, 0x3f, 0x00, 0x3f, 0x00, 0x3f, + 0x00, 0x3f, 0x00, 0x3f, 0xff, 0x5a, 0xff, 0x66, 0xfe, 0x90, 0xfe, 0xad, 0xfe, 0xb0, 0xfe, 0x9e, + 0xfe, 0xf6, 0xfe, 0xf6, 0x00, 0x24, 0x00, 0x24, 0x00, 0x24, 0x00, 0x24, 0x00, 0x24, 0x00, 0x24, + 0x00, 0x24, 0x00, 0x24, 0xff, 0x64, 0xff, 0x60, 0xfe, 0x99, 0xfe, 0xb5, 0xfe, 0xb9, 0xfe, 0xa7, + 0xfe, 0xfe, 0xfe, 0xff, 0x00, 0x1d, 0x00, 0x1d, 0x00, 0x1d, 0x00, 0x1d, 0x00, 0x1d, 0x00, 0x1d, + 0xff, 0x7d, 0xff, 0x60, 0xfe, 0x99, 0xfe, 0xb5, 0xfe, 0xcf, 0xfe, 0xba, 0x00, 0x33, 0x00, 0x33, + 0x00, 0x33, 0x00, 0x33, 0x00, 0x33, 0x00, 0x33, 0x00, 0x33, 0x00, 0x33, 0xff, 0x72, 0xfe, 0xc7, + 0xfe, 0x9a, 0xfe, 0xdb, 0x00, 0x19, 0x00, 0x19, 0x00, 0x19, 0x00, 0x19, 0x00, 0x19, 0x00, 0x19, + 0x00, 0x19, 0x00, 0x19, 0xff, 0x6b, 0xff, 0x47, 0xfe, 0x7e, 0xfe, 0x9c, 0xfe, 0xcb, 0xfe, 0xbd, + 0xfe, 0xff, 0xfe, 0xfe, 0x00, 0x28, 0x00, 0x28, 0x00, 0x40, 0x00, 0x40, 0x00, 0x3f, 0x00, 0x3f, + 0x00, 0x24, 0x00, 0x24, 0x00, 0x1d, 0x00, 0x1d, 0x00, 0x33, 0x00, 0x33, 0x00, 0x19, 0x00, 0x19, + 0x00, 0x28, 0x00, 0x28, 0x00, 0x28, 0x00, 0x28, 0x00, 0x28, 0x00, 0x28, 0x00, 0x28, 0x00, 0x28, + 0xff, 0xaa, 0xff, 0x9e, 0xfe, 0xc5, 0xfe, 0xe2, 0xfe, 0xf7, 0xfe, 0xea, 0xff, 0x2e, 0xff, 0x2e, + 0x00, 0x3f, 0x00, 0x3f, 0x00, 0x3f, 0x00, 0x3f, 0x00, 0x3f, 0x00, 0x3f, 0x00, 0x3f, 0x00, 0x3f, + 0xff, 0x51, 0xff, 0x5d, 0xfe, 0x87, 0xfe, 0xa4, 0xfe, 0xa7, 0xfe, 0x9b, 0xfe, 0xe0, 0xfe, 0xe0, + 0x00, 0x19, 0x00, 0x19, 0x00, 0x19, 0x00, 0x19, 0x00, 0x19, 0x00, 0x19, 0x00, 0x19, 0x00, 0x19, + 0xff, 0x6b, 0xff, 0x47, 0xfe, 0x7e, 0xfe, 0x9c, 0xfe, 0xcb, 0xfe, 0xbd, 0xfe, 0xff, 0xfe, 0xfe, + 0x00, 0x28, 0x00, 0x28, 0x00, 0x28, 0x00, 0x28, 0x00, 0x28, 0x00, 0x28, 0x00, 0x28, 0x00, 0x09, + 0x00, 0x09, 0xff, 0x67, 0xff, 0x8b, 0x00, 0x09, 0x00, 0xab, 0x00, 0xa4, 0x00, 0xab, 0x00, 0x69, + 0x00, 0x5e, 0x00, 0x3f, 0x00, 0x3f, 0x00, 0x3f, 0x00, 0x3f, 0x00, 0x3f, 0xff, 0x39, 0xff, 0x42, + 0xff, 0x27, 0xff, 0x31, 0x00, 0x12, 0x00, 0x40, 0x00, 0x4e, 0x00, 0x6e, 0x00, 0x24, 0x00, 0x24, + 0x00, 0x15, 0x00, 0x15, 0x00, 0x24, 0x00, 0x24, 0x00, 0x36, 0x00, 0x36, 0xff, 0x25, 0xff, 0x1f, + 0x00, 0x4f, 0x00, 0x48, 0x00, 0x6e, 0x00, 0x33, 0x00, 0x33, 0x00, 0x26, 0x00, 0x26, 0x00, 0x3f, + 0x00, 0x3f, 0x00, 0x33, 0x00, 0x33, 0x00, 0x0d, 0x00, 0x0d, 0xff, 0x37, 0xff, 0x27, 0xff, 0x57, + 0x00, 0x26, 0x00, 0x26, 0x00, 0x85, 0x00, 0x19, 0x00, 0x19, 0x00, 0x19, 0x00, 0x19, 0x00, 0x19, + 0xff, 0x14, 0xff, 0x44, 0xfe, 0xfa, 0xff, 0x33, 0x00, 0x09, 0x00, 0x85, 0x00, 0xab, 0xff, 0xaa, + 0xff, 0xa7, 0xfe, 0xd7, 0xfe, 0xf4, 0xff, 0x1b, 0xff, 0x0e, 0xff, 0x5c, 0xff, 0x5d, 0xff, 0x5a, + 0xff, 0x66, 0xfe, 0x90, 0xfe, 0xad, 0xfe, 0xb0, 0xfe, 0x9e, 0xfe, 0xf6, 0xfe, 0xf6, 0xff, 0x6b, + 0xff, 0x47, 0xfe, 0x7e, 0xfe, 0x9c, 0xfe, 0xcb, 0xfe, 0xbd, 0xfe, 0xff, 0xfe, 0xfe, 0x00, 0x09, + 0x00, 0x2d, 0x00, 0x09, 0x00, 0x2e, 0x00, 0x39, 0xff, 0x5b, 0x00, 0x04, 0x00, 0x09, 0x00, 0x00, + 0x00, 0xd2, 0x00, 0xd2, 0x00, 0xd2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd2, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd2, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xd2, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd2, 0x00, 0x82, 0x00, 0x00, 0x00, 0x00, 0x00, 0x82, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x82, 0x00, 0x00, 0x00, 0x00, 0x00, 0x82, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x82, 0x00, 0x00, 0x00, 0x00, 0x00, 0x82, 0x00, 0x00, 0x00, 0x00, 0x00, 0x82, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, + 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x0c, 0x00, 0xf8, 0x08, 0xff, 0x00, 0x08, 0x00, 0x08, + 0xff, 0xfe, 0x00, 0x09, 0x00, 0x09, 0xff, 0xfe, 0x00, 0x0a, 0x00, 0x09, 0xff, 0xfe, 0x00, 0x0b, + 0x00, 0x0a, 0xff, 0xfe, 0x00, 0x0c, 0x00, 0x0b, 0xff, 0xfe, 0x00, 0x0d, 0x00, 0x0b, 0xff, 0xfe, + 0x00, 0x0e, 0x00, 0x0d, 0xff, 0xfe, 0x00, 0x0f, 0x00, 0x0d, 0xff, 0xfd, 0x00, 0x10, 0x00, 0x0e, + 0xff, 0xfd, 0x00, 0x11, 0x00, 0x0f, 0xff, 0xfd, 0x00, 0x12, 0x00, 0x0f, 0xff, 0xfd, 0x00, 0x13, + 0x00, 0x10, 0xff, 0xfd, 0x00, 0x14, 0x00, 0x11, 0xff, 0xfd, 0x00, 0x15, 0x00, 0x12, 0xff, 0xfc, + 0x00, 0x16, 0x00, 0x13, 0xff, 0xfc, 0x00, 0x17, 0x00, 0x14, 0xff, 0xfc, 0x00, 0x18, 0x00, 0x14, + 0xff, 0xfc, 0x00, 0x19, 0x00, 0x15, 0xff, 0xfc, 0x00, 0x1a, 0x00, 0x16, 0xff, 0xfc, 0x00, 0x1b, + 0x00, 0x17, 0xff, 0xfb, 0x00, 0x1c, 0x00, 0x17, 0xff, 0xfb, 0x00, 0x1d, 0x00, 0x18, 0xff, 0xfb, + 0x00, 0x1e, 0x00, 0x19, 0xff, 0xfb, 0x00, 0x1f, 0x00, 0x1a, 0xff, 0xfb, 0x00, 0x20, 0x00, 0x1b, + 0xff, 0xfb, 0x00, 0x21, 0x00, 0x1c, 0xff, 0xfa, 0x00, 0x22, 0x00, 0x1d, 0xff, 0xfa, 0x00, 0x23, + 0x00, 0x1d, 0xff, 0xfa, 0x00, 0x24, 0x00, 0x1e, 0xff, 0xfa, 0x00, 0x25, 0x00, 0x1f, 0xff, 0xfa, + 0x00, 0x26, 0x00, 0x20, 0xff, 0xfa, 0x00, 0x27, 0x00, 0x20, 0xff, 0xf9, 0x00, 0x28, 0x00, 0x22, + 0xff, 0xf9, 0x00, 0x29, 0x00, 0x22, 0xff, 0xf9, 0x00, 0x2a, 0x00, 0x24, 0xff, 0xf8, 0x00, 0x2b, + 0x00, 0x25, 0xff, 0xf8, 0x00, 0x2c, 0x00, 0x25, 0xff, 0xf8, 0x00, 0x2d, 0x00, 0x26, 0xff, 0xf8, + 0x00, 0x2e, 0x00, 0x27, 0xff, 0xf7, 0x00, 0x2f, 0x00, 0x28, 0xff, 0xf7, 0x00, 0x30, 0x00, 0x29, + 0xff, 0xf7, 0x00, 0x31, 0x00, 0x29, 0xff, 0xf7, 0x00, 0x32, 0x00, 0x2a, 0xff, 0xf7, 0x00, 0x33, + 0x00, 0x2b, 0xff, 0xf7, 0x00, 0x34, 0x00, 0x2b, 0xff, 0xf6, 0x00, 0x35, 0x00, 0x2d, 0xff, 0xf6, + 0x00, 0x36, 0x00, 0x2e, 0xff, 0xf6, 0x00, 0x37, 0x00, 0x2e, 0xff, 0xf6, 0x00, 0x38, 0x00, 0x2f, + 0xff, 0xf6, 0x00, 0x39, 0x00, 0x30, 0xff, 0xf6, 0x00, 0x3a, 0x00, 0x31, 0xff, 0xf5, 0x00, 0x3b, + 0x00, 0x32, 0xff, 0xf5, 0x00, 0x3c, 0x00, 0x32, 0xff, 0xf5, 0x00, 0x3d, 0x00, 0x33, 0xff, 0xf5, + 0x00, 0x3e, 0x00, 0x34, 0xff, 0xf5, 0x00, 0x3f, 0x00, 0x35, 0xff, 0xf5, 0x00, 0x40, 0x00, 0x36, + 0xff, 0xf4, 0x00, 0x41, 0x00, 0x36, 0xff, 0xf4, 0x00, 0x42, 0x00, 0x37, 0xff, 0xf4, 0x00, 0x43, + 0x00, 0x38, 0xff, 0xf4, 0x00, 0x44, 0x00, 0x39, 0xff, 0xf4, 0x00, 0x45, 0x00, 0x3a, 0xff, 0xf4, + 0x00, 0x46, 0x00, 0x3b, 0xff, 0xf3, 0x00, 0x47, 0x00, 0x3b, 0xff, 0xf3, 0x00, 0x48, 0x00, 0x3c, + 0xff, 0xf3, 0x00, 0x49, 0x00, 0x3d, 0xff, 0xf3, 0x00, 0x4a, 0x00, 0x3e, 0xff, 0xf3, 0x00, 0x4b, + 0x00, 0x3f, 0xff, 0xf3, 0x00, 0x4c, 0x00, 0x40, 0xff, 0xf2, 0x00, 0x4d, 0x00, 0x41, 0xff, 0xf2, + 0x00, 0x4e, 0x00, 0x41, 0xff, 0xf2, 0x00, 0x4f, 0x00, 0x42, 0xff, 0xf2, 0x00, 0x50, 0x00, 0x43, + 0xff, 0xf2, 0x00, 0x51, 0x00, 0x44, 0xff, 0xf2, 0x00, 0x52, 0x00, 0x44, 0xff, 0xf1, 0x00, 0x53, + 0x00, 0x46, 0xff, 0xf1, 0x00, 0x54, 0x00, 0x46, 0xff, 0xf1, 0x00, 0x55, 0x00, 0x47, 0xff, 0xf1, + 0x00, 0x56, 0x00, 0x48, 0xff, 0xf1, 0x00, 0x57, 0x00, 0x49, 0xff, 0xf1, 0x00, 0x58, 0x00, 0x49, + 0xff, 0xf0, 0x00, 0x59, 0x00, 0x4a, 0xff, 0xf0, 0x00, 0x5a, 0x00, 0x4b, 0xff, 0xf0, 0x00, 0x5b, + 0x00, 0x4c, 0xff, 0xf0, 0x00, 0x5c, 0x00, 0x4d, 0xff, 0xf0, 0x00, 0x5d, 0x00, 0x4e, 0xff, 0xf0, + 0x00, 0x5e, 0x00, 0x4e, 0xff, 0xef, 0x00, 0x5f, 0x00, 0x4f, 0xff, 0xef, 0x00, 0x60, 0x00, 0x50, + 0xff, 0xef, 0x00, 0x61, 0x00, 0x51, 0xff, 0xef, 0x00, 0x62, 0x00, 0x52, 0xff, 0xef, 0x00, 0x63, + 0x00, 0x53, 0xff, 0xef, 0x00, 0x64, 0x00, 0x53, 0xff, 0xee, 0x00, 0x65, 0x00, 0x54, 0xff, 0xee, + 0x00, 0x66, 0x00, 0x55, 0xff, 0xee, 0x00, 0x67, 0x00, 0x56, 0xff, 0xee, 0x00, 0x68, 0x00, 0x57, + 0xff, 0xee, 0x00, 0x69, 0x00, 0x58, 0xff, 0xee, 0x00, 0x6a, 0x00, 0x58, 0xff, 0xee, 0x00, 0x6b, + 0x00, 0x59, 0xff, 0xed, 0x00, 0x6c, 0x00, 0x5a, 0xff, 0xed, 0x00, 0x6d, 0x00, 0x5b, 0xff, 0xed, + 0x00, 0x6e, 0x00, 0x5c, 0xff, 0xed, 0x00, 0x6f, 0x00, 0x5c, 0xff, 0xed, 0x00, 0x70, 0x00, 0x5e, + 0xff, 0xed, 0x00, 0x71, 0x00, 0x5e, 0xff, 0xec, 0x00, 0x72, 0x00, 0x5f, 0xff, 0xec, 0x00, 0x73, + 0x00, 0x60, 0xff, 0xeb, 0x00, 0x74, 0x00, 0x61, 0xff, 0xeb, 0x00, 0x75, 0x00, 0x61, 0xff, 0xeb, + 0x00, 0x76, 0x00, 0x62, 0xff, 0xeb, 0x00, 0x77, 0x00, 0x64, 0xff, 0xeb, 0x00, 0x78, 0x00, 0x65, + 0xff, 0xeb, 0x00, 0x79, 0x00, 0x65, 0xff, 0xeb, 0x00, 0x7a, 0x00, 0x66, 0xff, 0xea, 0x00, 0x7b, + 0x00, 0x66, 0xff, 0xea, 0x00, 0x7c, 0x00, 0x67, 0xff, 0xea, 0x00, 0x7d, 0x00, 0x68, 0xff, 0xea, + 0x00, 0x7e, 0x00, 0x6a, 0xff, 0xea, 0x00, 0x7f, 0x00, 0x6a, 0xff, 0xea, 0x00, 0x80, 0x00, 0x6b, + 0xff, 0xea, 0x00, 0x81, 0x00, 0x6b, 0xff, 0xea, 0x00, 0x82, 0x00, 0x6c, 0xff, 0xea, 0x00, 0x83, + 0x00, 0x6d, 0xff, 0xea, 0x00, 0x84, 0x00, 0x6e, 0xff, 0xea, 0x00, 0x85, 0x00, 0x6e, 0xff, 0xe9, + 0x00, 0x86, 0x00, 0x70, 0xff, 0xe9, 0x00, 0x87, 0x00, 0x70, 0xff, 0xe9, 0x00, 0x88, 0x00, 0x71, + 0xff, 0xe9, 0x00, 0x89, 0x00, 0x72, 0xff, 0xe9, 0x00, 0x8a, 0x00, 0x73, 0xff, 0xe9, 0x00, 0x8b, + 0x00, 0x73, 0xff, 0xe8, 0x00, 0x8c, 0x00, 0x75, 0xff, 0xe8, 0x00, 0x8d, 0x00, 0x76, 0xff, 0xe8, + 0x00, 0x8e, 0x00, 0x76, 0xff, 0xe8, 0x00, 0x8f, 0x00, 0x77, 0xff, 0xe8, 0x00, 0x90, 0x00, 0x78, + 0xff, 0xe8, 0x00, 0x91, 0x00, 0x78, 0xff, 0xe7, 0x00, 0x92, 0x00, 0x79, 0xff, 0xe7, 0x00, 0x93, + 0x00, 0x7a, 0xff, 0xe7, 0x00, 0x94, 0x00, 0x7b, 0xff, 0xe7, 0x00, 0x95, 0x00, 0x7c, 0xff, 0xe7, + 0x00, 0x96, 0x00, 0x7d, 0xff, 0xe6, 0x00, 0x97, 0x00, 0x7d, 0xff, 0xe6, 0x00, 0x98, 0x00, 0x7f, + 0xff, 0xe6, 0x00, 0x99, 0x00, 0x7f, 0xff, 0xe6, 0x00, 0x9a, 0x00, 0x80, 0xff, 0xe6, 0x00, 0x9b, + 0x00, 0x81, 0xff, 0xe6, 0x00, 0x9c, 0x00, 0x82, 0xff, 0xe5, 0x00, 0x9d, 0x00, 0x83, 0xff, 0xe5, + 0x00, 0x9e, 0x00, 0x84, 0xff, 0xe5, 0x00, 0x9f, 0x00, 0x84, 0xff, 0xe5, 0x00, 0xa0, 0x00, 0x85, + 0xff, 0xe5, 0x00, 0xa1, 0x00, 0x86, 0xff, 0xe5, 0x00, 0xa2, 0x00, 0x87, 0xff, 0xe4, 0x00, 0xa3, + 0x00, 0x88, 0xff, 0xe4, 0x00, 0xa4, 0x00, 0x89, 0xff, 0xe4, 0x00, 0xa5, 0x00, 0x89, 0xff, 0xe4, + 0x00, 0xa6, 0x00, 0x8a, 0xff, 0xe3, 0x00, 0xa7, 0x00, 0x8b, 0xff, 0xe3, 0x00, 0xa8, 0x00, 0x8b, + 0xff, 0xe3, 0x00, 0xa9, 0x00, 0x8c, 0xff, 0xe3, 0x00, 0xaa, 0x00, 0x8e, 0xff, 0xe3, 0x00, 0xab, + 0x00, 0x8e, 0xff, 0xe2, 0x00, 0xac, 0x00, 0x8f, 0xff, 0xe2, 0x00, 0xad, 0x00, 0x90, 0xff, 0xe2, + 0x00, 0xae, 0x00, 0x91, 0xff, 0xe2, 0x00, 0xaf, 0x00, 0x91, 0xff, 0xe2, 0x00, 0xb0, 0x00, 0x92, + 0xff, 0xe2, 0x00, 0xb1, 0x00, 0x93, 0xff, 0xe1, 0x00, 0xb2, 0x00, 0x94, 0xff, 0xe1, 0x00, 0xb3, + 0x00, 0x95, 0xff, 0xe1, 0x00, 0xb4, 0x00, 0x96, 0xff, 0xe1, 0x00, 0xb5, 0x00, 0x96, 0xff, 0xe1, + 0x00, 0xb6, 0x00, 0x97, 0xff, 0xe1, 0x00, 0xb7, 0x00, 0x98, 0xff, 0xe1, 0x00, 0xb8, 0x00, 0x99, + 0xff, 0xe0, 0x00, 0xb9, 0x00, 0x9a, 0xff, 0xe0, 0x00, 0xba, 0x00, 0x9b, 0xff, 0xe0, 0x00, 0xbb, + 0x00, 0x9b, 0xff, 0xe0, 0x00, 0xbc, 0x00, 0x9c, 0xff, 0xe0, 0x00, 0xbd, 0x00, 0x9d, 0xff, 0xe0, + 0x00, 0xbe, 0x00, 0x9e, 0xff, 0xdf, 0x00, 0xbf, 0x00, 0x9f, 0xff, 0xdf, 0x00, 0xc0, 0x00, 0xa0, + 0xff, 0xdf, 0x00, 0xc1, 0x00, 0xa1, 0xff, 0xdf, 0x00, 0xc2, 0x00, 0xa1, 0xff, 0xdf, 0x00, 0xc3, + 0x00, 0xa2, 0xff, 0xdf, 0x00, 0xc4, 0x00, 0xa3, 0xff, 0xde, 0x00, 0xc5, 0x00, 0xa4, 0xff, 0xde, + 0x00, 0xc6, 0x00, 0xa5, 0xff, 0xde, 0x00, 0xc7, 0x00, 0xa6, 0xff, 0xde, 0x00, 0xc8, 0x00, 0xa6, + 0xff, 0xde, 0x00, 0xc9, 0x00, 0xa7, 0xff, 0xde, 0x00, 0xca, 0x00, 0xa8, 0xff, 0xdd, 0x00, 0xcb, + 0x00, 0xa9, 0xff, 0xdd, 0x00, 0xcc, 0x00, 0xa9, 0xff, 0xdd, 0x00, 0xcd, 0x00, 0xab, 0xff, 0xdd, + 0x00, 0xce, 0x00, 0xac, 0xff, 0xdd, 0x00, 0xcf, 0x00, 0xac, 0xff, 0xdd, 0x00, 0xd0, 0x00, 0xad, + 0xff, 0xdd, 0x00, 0xd1, 0x00, 0xae, 0xff, 0xdc, 0x00, 0xd2, 0x00, 0xae, 0xff, 0xdc, 0x00, 0xd3, + 0x00, 0xaf, 0xff, 0xdc, 0x00, 0xd4, 0x00, 0xb0, 0xff, 0xdc, 0x00, 0xd5, 0x00, 0xb2, 0xff, 0xdc, + 0x00, 0xd6, 0x00, 0xb2, 0xff, 0xdc, 0x00, 0xd7, 0x00, 0xb3, 0xff, 0xdb, 0x00, 0xd8, 0x00, 0xb3, + 0xff, 0xdb, 0x00, 0xd9, 0x00, 0xb4, 0xff, 0xdb, 0x00, 0xda, 0x00, 0xb5, 0xff, 0xdb, 0x00, 0xdb, + 0x00, 0xb6, 0xff, 0xdb, 0x00, 0xdc, 0x00, 0xb7, 0xff, 0xdb, 0x00, 0xdd, 0x00, 0xb8, 0xff, 0xda, + 0x00, 0xde, 0x00, 0xb9, 0xff, 0xda, 0x00, 0xdf, 0x00, 0xb9, 0xff, 0xda, 0x00, 0xe0, 0x00, 0xba, + 0xff, 0xda, 0x00, 0xe1, 0x00, 0xbb, 0xff, 0xda, 0x00, 0xe2, 0x00, 0xbc, 0xff, 0xda, 0x00, 0xe3, + 0x00, 0xbd, 0xff, 0xd9, 0x00, 0xe4, 0x00, 0xbe, 0xff, 0xd9, 0x00, 0xe5, 0x00, 0xbe, 0xff, 0xd9, + 0x00, 0xe6, 0x00, 0xbf, 0xff, 0xd9, 0x00, 0xe7, 0x00, 0xc0, 0xff, 0xd9, 0x00, 0xe8, 0x00, 0xc1, + 0xff, 0xd9, 0x00, 0xe9, 0x00, 0xc1, 0xff, 0xd8, 0x00, 0xea, 0x00, 0xc3, 0xff, 0xd8, 0x00, 0xeb, + 0x00, 0xc4, 0xff, 0xd8, 0x00, 0xec, 0x00, 0xc4, 0xff, 0xd8, 0x00, 0xed, 0x00, 0xc5, 0xff, 0xd8, + 0x00, 0xee, 0x00, 0xc6, 0xff, 0xd8, 0x00, 0xef, 0x00, 0xc6, 0xff, 0xd7, 0x00, 0xf0, 0x00, 0xc7, + 0xff, 0xd7, 0x00, 0xf1, 0x00, 0xc9, 0xff, 0xd7, 0x00, 0xf2, 0x00, 0xc9, 0xff, 0xd7, 0x00, 0xf3, + 0x00, 0xca, 0xff, 0xd7, 0x00, 0xf4, 0x00, 0xcb, 0xff, 0xd7, 0x00, 0xf5, 0x00, 0xcc, 0xff, 0xd6, + 0x00, 0xf6, 0x00, 0xcc, 0xff, 0xd6, 0x00, 0xf7, 0x00, 0xcd, 0xff, 0xd6, 0x00, 0xf8, 0x00, 0xce, + 0xff, 0xd6, 0x00, 0xf9, 0x00, 0xcf, 0xff, 0xd6, 0x00, 0xfa, 0x00, 0xd0, 0xff, 0xd5, 0x00, 0xfb, + 0x00, 0xd1, 0xff, 0xd5, 0x00, 0xfc, 0x00, 0xd2, 0xff, 0xd5, 0x00, 0xfd, 0x00, 0xd2, 0xff, 0xd5, + 0x00, 0xfe, 0x00, 0xd3, 0xff, 0xd5, 0x00, 0xff, 0x00, 0xd4, 0xff, 0xd5, 0x00, 0x00, 0x00, 0x03, + 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x04, 0x7c, + 0x00, 0x03, 0x00, 0x01, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x04, 0x04, 0x60, 0x00, 0x00, 0x00, 0xe2, + 0x00, 0x80, 0x00, 0x06, 0x00, 0x62, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0d, 0x00, 0x1d, 0x00, 0x7e, + 0x01, 0x31, 0x01, 0x37, 0x01, 0x48, 0x01, 0x51, 0x01, 0x53, 0x01, 0x5f, 0x01, 0x61, 0x01, 0x77, + 0x01, 0x7f, 0x01, 0x91, 0x01, 0x92, 0x02, 0x17, 0x02, 0x1b, 0x02, 0x36, 0x02, 0x37, 0x02, 0x4f, + 0x02, 0x92, 0x02, 0xbc, 0x02, 0xc7, 0x02, 0xc9, 0x02, 0xdd, 0x03, 0x11, 0x03, 0x86, 0x03, 0x8a, + 0x03, 0x8c, 0x03, 0x90, 0x03, 0xa1, 0x03, 0xa9, 0x03, 0xb0, 0x03, 0xc9, 0x03, 0xce, 0x04, 0x5f, + 0x04, 0x63, 0x04, 0x75, 0x04, 0xf9, 0x1e, 0x85, 0x1e, 0xf3, 0x1f, 0x15, 0x1f, 0x1d, 0x1f, 0x45, + 0x1f, 0x4d, 0x1f, 0x57, 0x1f, 0x59, 0x1f, 0x5b, 0x1f, 0x5d, 0x1f, 0x7d, 0x1f, 0xb4, 0x1f, 0xc4, + 0x1f, 0xd3, 0x1f, 0xdb, 0x1f, 0xef, 0x1f, 0xf4, 0x1f, 0xfe, 0x20, 0x15, 0x20, 0x1a, 0x20, 0x1e, + 0x20, 0x22, 0x20, 0x26, 0x20, 0x30, 0x20, 0x3a, 0x20, 0x44, 0x20, 0x70, 0x20, 0x79, 0x20, 0x89, + 0x20, 0xac, 0x20, 0xae, 0x20, 0xb4, 0x20, 0xb9, 0x21, 0x13, 0x21, 0x16, 0x21, 0x22, 0x21, 0x26, + 0x21, 0x2e, 0x21, 0x5e, 0x22, 0x02, 0x22, 0x06, 0x22, 0x0f, 0x22, 0x12, 0x22, 0x15, 0x22, 0x1a, + 0x22, 0x1e, 0x22, 0x2b, 0x22, 0x48, 0x22, 0x60, 0x22, 0x65, 0x25, 0x00, 0x25, 0x02, 0x25, 0x0c, + 0x25, 0x10, 0x25, 0x14, 0x25, 0x18, 0x25, 0x1c, 0x25, 0x24, 0x25, 0x2c, 0x25, 0x34, 0x25, 0x3c, + 0x25, 0x6c, 0x25, 0x88, 0x25, 0x93, 0x25, 0xca, 0xe0, 0xff, 0xef, 0xfd, 0xf0, 0x02, 0xf5, 0x11, + 0xf8, 0x1d, 0xfb, 0x02, 0xff, 0xfd, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0d, + 0x00, 0x1d, 0x00, 0x20, 0x00, 0xa0, 0x01, 0x32, 0x01, 0x38, 0x01, 0x49, 0x01, 0x52, 0x01, 0x54, + 0x01, 0x60, 0x01, 0x62, 0x01, 0x78, 0x01, 0x80, 0x01, 0x92, 0x01, 0x93, 0x02, 0x18, 0x02, 0x1c, + 0x02, 0x37, 0x02, 0x38, 0x02, 0x92, 0x02, 0xbc, 0x02, 0xc6, 0x02, 0xc9, 0x02, 0xd8, 0x03, 0x11, + 0x03, 0x84, 0x03, 0x88, 0x03, 0x8c, 0x03, 0x8e, 0x03, 0x91, 0x03, 0xa3, 0x03, 0xaa, 0x03, 0xb1, + 0x03, 0xca, 0x04, 0x00, 0x04, 0x62, 0x04, 0x72, 0x04, 0x8a, 0x1e, 0x80, 0x1e, 0xf2, 0x1f, 0x00, + 0x1f, 0x18, 0x1f, 0x20, 0x1f, 0x48, 0x1f, 0x50, 0x1f, 0x59, 0x1f, 0x5b, 0x1f, 0x5d, 0x1f, 0x5f, + 0x1f, 0x80, 0x1f, 0xb6, 0x1f, 0xc6, 0x1f, 0xd6, 0x1f, 0xdd, 0x1f, 0xf2, 0x1f, 0xf6, 0x20, 0x13, + 0x20, 0x18, 0x20, 0x1c, 0x20, 0x20, 0x20, 0x26, 0x20, 0x30, 0x20, 0x39, 0x20, 0x44, 0x20, 0x70, + 0x20, 0x74, 0x20, 0x80, 0x20, 0xac, 0x20, 0xae, 0x20, 0xb4, 0x20, 0xb9, 0x21, 0x13, 0x21, 0x16, + 0x21, 0x22, 0x21, 0x26, 0x21, 0x2e, 0x21, 0x53, 0x22, 0x02, 0x22, 0x06, 0x22, 0x0f, 0x22, 0x11, + 0x22, 0x15, 0x22, 0x19, 0x22, 0x1e, 0x22, 0x2b, 0x22, 0x48, 0x22, 0x60, 0x22, 0x64, 0x25, 0x00, + 0x25, 0x02, 0x25, 0x0c, 0x25, 0x10, 0x25, 0x14, 0x25, 0x18, 0x25, 0x1c, 0x25, 0x24, 0x25, 0x2c, + 0x25, 0x34, 0x25, 0x3c, 0x25, 0x50, 0x25, 0x88, 0x25, 0x91, 0x25, 0xca, 0xe0, 0xff, 0xef, 0xfd, + 0xf0, 0x00, 0xf5, 0x06, 0xf8, 0x0a, 0xfb, 0x01, 0xff, 0xfd, 0xff, 0xff, 0x00, 0x01, 0xff, 0xf9, + 0xff, 0xf5, 0xff, 0xe4, 0xff, 0xe3, 0xff, 0xdb, 0xff, 0xdc, 0xff, 0xdd, 0xff, 0xde, 0x00, 0x00, + 0xff, 0xdc, 0x00, 0x00, 0xff, 0xda, 0x00, 0x00, 0x00, 0x59, 0xfe, 0xd2, 0x00, 0x58, 0xff, 0x41, + 0x00, 0x54, 0xff, 0x26, 0x00, 0x53, 0x00, 0x11, 0xfe, 0xa2, 0x00, 0x00, 0xfe, 0x97, 0x00, 0x00, + 0xff, 0x93, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x3b, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, + 0xff, 0xf8, 0x00, 0x00, 0xfe, 0xb3, 0xfe, 0xb2, 0xfe, 0xa4, 0xfe, 0x90, 0xe2, 0xe6, 0xe2, 0x7a, + 0xe4, 0xd9, 0xe4, 0xd7, 0xe4, 0xd5, 0xe4, 0xd3, 0xe4, 0xd1, 0xe4, 0xd0, 0xe4, 0xcf, 0xe4, 0xce, + 0xe4, 0xcd, 0xe4, 0xcb, 0xe4, 0xca, 0xe4, 0xc9, 0xe4, 0xc7, 0xe4, 0xc6, 0xe4, 0xc4, 0xe4, 0xc3, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x40, 0xe0, 0x3a, 0x00, 0x00, 0xe1, 0x2a, + 0xe0, 0xff, 0xe0, 0xfc, 0xe0, 0xf6, 0xdf, 0xb6, 0xe2, 0xdf, 0xe2, 0xd8, 0xe4, 0x24, 0xe0, 0x6d, + 0xe2, 0x74, 0xdf, 0x54, 0xe0, 0x78, 0xe0, 0x53, 0x00, 0x00, 0xdf, 0x98, 0xdf, 0x95, 0xdf, 0x8d, + 0x00, 0x00, 0xdf, 0x8b, 0xdf, 0x88, 0xdf, 0x85, 0xdf, 0x79, 0xdf, 0x5d, 0xdf, 0x46, 0xdf, 0x43, + 0xdf, 0xe6, 0xdf, 0xe3, 0xdf, 0xd8, 0xdf, 0xde, 0xdf, 0xcf, 0xdf, 0xca, 0xdf, 0xce, 0xdf, 0xc3, + 0xdf, 0xbc, 0xdf, 0xb5, 0xdf, 0xaf, 0x00, 0x00, 0xdf, 0x82, 0xdf, 0x7a, 0xdb, 0xdf, 0x23, 0xdf, + 0x14, 0xe4, 0x00, 0x00, 0x0c, 0x88, 0x09, 0xa4, 0x00, 0x00, 0x04, 0xe3, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xd0, 0x00, 0x00, 0x00, 0xd0, 0x00, 0x00, 0x00, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcc, 0x00, 0x00, + 0x00, 0xcc, 0x00, 0x00, 0x00, 0xd4, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd4, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xd4, 0x00, 0x00, 0x00, 0xde, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xba, 0x00, 0xbe, 0x00, 0xc2, 0x00, 0xc6, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xae, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xca, 0x00, 0x00, 0x00, 0x00, 0x00, 0xca, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x6d, 0x00, 0x79, 0x00, 0x6b, 0x00, 0x77, 0x00, 0x7a, 0x01, 0x52, 0x01, 0x53, 0x01, 0x54, + 0x01, 0x55, 0x01, 0x56, 0x01, 0x57, 0x01, 0x58, 0x00, 0x69, 0x01, 0x5f, 0x01, 0x61, 0x01, 0x62, + 0x01, 0x63, 0x01, 0x64, 0x00, 0x75, 0x01, 0x65, 0x03, 0xd6, 0x03, 0xd8, 0x03, 0xc2, 0x03, 0xc8, + 0x03, 0xca, 0x03, 0xd0, 0x03, 0xc6, 0x03, 0xc9, 0x03, 0xcb, 0x03, 0xcc, 0x03, 0xcd, 0x03, 0xce, + 0x03, 0xd4, 0x03, 0xcf, 0x03, 0xd2, 0x03, 0xd1, 0x03, 0xd3, 0x03, 0xd5, 0x00, 0x73, 0x00, 0x74, + 0x03, 0x8b, 0x00, 0x6e, 0x00, 0x6f, 0x00, 0x63, 0x00, 0x70, 0x00, 0x71, 0x00, 0x65, 0x00, 0x67, + 0x00, 0x68, 0x00, 0x72, 0x00, 0x6c, 0x00, 0x78, 0x01, 0x82, 0x01, 0x83, 0x01, 0x88, 0x01, 0x89, + 0x01, 0x8a, 0x01, 0x8b, 0x01, 0x8c, 0x01, 0x8d, 0x01, 0x84, 0x01, 0x85, 0x01, 0x86, 0x01, 0x87, + 0x01, 0x9d, 0x01, 0x9f, 0x05, 0x01, 0x04, 0xf7, 0x04, 0xf6, 0x05, 0x09, 0x05, 0x00, 0x04, 0xf5, + 0x05, 0x08, 0x04, 0xff, 0x04, 0xf3, 0x05, 0x06, 0x04, 0xfd, 0x04, 0xf2, 0x05, 0x05, 0x04, 0xfc, + 0x04, 0xf0, 0x05, 0x03, 0x04, 0xfa, 0x04, 0xef, 0x05, 0x02, 0x04, 0xf9, 0x04, 0xf4, 0x05, 0x07, + 0x04, 0xfe, 0x04, 0xf1, 0x05, 0x04, 0x04, 0xfb, 0x05, 0x0f, 0x05, 0x0e, 0x04, 0xf8, 0x04, 0xdf, + 0x01, 0xaa, 0x01, 0xac, 0x01, 0xab, 0x01, 0xad, 0x00, 0x06, 0x02, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x03, 0x00, 0x04, 0x00, 0x05, 0x00, 0x06, 0x00, 0x07, 0x00, 0x08, 0x00, 0x09, + 0x00, 0x0a, 0x00, 0x0b, 0x00, 0x0c, 0x00, 0x0d, 0x00, 0x0e, 0x00, 0x0f, 0x00, 0x10, 0x00, 0x11, + 0x00, 0x12, 0x00, 0x13, 0x00, 0x14, 0x00, 0x15, 0x00, 0x16, 0x00, 0x17, 0x00, 0x18, 0x00, 0x19, + 0x00, 0x1a, 0x00, 0x1b, 0x00, 0x1c, 0x00, 0x1d, 0x00, 0x1e, 0x00, 0x1f, 0x00, 0x20, 0x00, 0x21, + 0x00, 0x22, 0x00, 0x23, 0x00, 0x24, 0x00, 0x25, 0x00, 0x26, 0x00, 0x27, 0x00, 0x28, 0x00, 0x29, + 0x00, 0x2a, 0x00, 0x2b, 0x00, 0x2c, 0x00, 0x2d, 0x00, 0x2e, 0x00, 0x2f, 0x00, 0x30, 0x00, 0x31, + 0x00, 0x32, 0x00, 0x33, 0x00, 0x34, 0x00, 0x35, 0x00, 0x36, 0x00, 0x37, 0x00, 0x38, 0x00, 0x39, + 0x00, 0x3a, 0x00, 0x3b, 0x00, 0x3c, 0x00, 0x3d, 0x00, 0x3e, 0x00, 0x3f, 0x00, 0x40, 0x00, 0x41, + 0x00, 0x42, 0x00, 0x43, 0x00, 0x44, 0x00, 0x45, 0x00, 0x46, 0x00, 0x47, 0x00, 0x48, 0x00, 0x49, + 0x00, 0x4a, 0x00, 0x4b, 0x00, 0x4c, 0x00, 0x4d, 0x00, 0x4e, 0x00, 0x4f, 0x00, 0x50, 0x00, 0x51, + 0x00, 0x52, 0x00, 0x53, 0x00, 0x54, 0x00, 0x55, 0x00, 0x56, 0x00, 0x57, 0x00, 0x58, 0x00, 0x59, + 0x00, 0x5a, 0x00, 0x5b, 0x00, 0x5c, 0x00, 0x5d, 0x00, 0x5e, 0x00, 0x5f, 0x00, 0x60, 0x00, 0x61, + 0x00, 0x00, 0x00, 0x9f, 0x00, 0xa0, 0x00, 0xa2, 0x00, 0xa4, 0x00, 0xac, 0x00, 0xb1, 0x00, 0xb7, + 0x00, 0xbc, 0x00, 0xbb, 0x00, 0xbd, 0x00, 0xbf, 0x00, 0xbe, 0x00, 0xc0, 0x00, 0xc2, 0x00, 0xc4, + 0x00, 0xc3, 0x00, 0xc5, 0x00, 0xc6, 0x00, 0xc8, 0x00, 0xc7, 0x00, 0xc9, 0x00, 0xca, 0x00, 0xcc, + 0x00, 0xce, 0x00, 0xcd, 0x00, 0xcf, 0x00, 0xd1, 0x00, 0xd0, 0x00, 0xd5, 0x00, 0xd4, 0x00, 0xd6, + 0x00, 0xd7, 0x00, 0x67, 0x00, 0x8b, 0x00, 0x7d, 0x00, 0x7e, 0x00, 0x82, 0x00, 0x72, 0x00, 0x91, + 0x00, 0xba, 0x00, 0x89, 0x00, 0x84, 0x00, 0x76, 0x00, 0x8f, 0x00, 0x83, 0x01, 0xa6, 0x00, 0xa1, + 0x00, 0xb3, 0x01, 0xa3, 0x00, 0x8c, 0x01, 0xa7, 0x01, 0xa8, 0x00, 0x80, 0x00, 0x90, 0x01, 0x9a, + 0x01, 0x9d, 0x01, 0x9c, 0x03, 0xb8, 0x01, 0xa4, 0x00, 0x85, 0x00, 0x95, 0x01, 0x9e, 0x00, 0xc1, + 0x00, 0xd3, 0x00, 0x9a, 0x00, 0x7c, 0x00, 0x87, 0x01, 0xa2, 0x00, 0x64, 0x01, 0xa5, 0x01, 0x9b, + 0x00, 0x86, 0x00, 0x96, 0x00, 0x66, 0x00, 0x7b, 0x00, 0x9b, 0x00, 0x9e, 0x00, 0xb0, 0x00, 0x6d, + 0x00, 0x79, 0x00, 0x73, 0x00, 0x74, 0x00, 0x70, 0x00, 0x71, 0x00, 0x6e, 0x00, 0x6f, 0x00, 0xd2, + 0x01, 0xa9, 0x00, 0xda, 0x00, 0x7a, 0x01, 0x6e, 0x00, 0x62, 0x00, 0x6c, 0x00, 0x78, 0x01, 0xab, + 0x01, 0xad, 0x00, 0x68, 0x00, 0x92, 0x00, 0x63, 0x00, 0x65, 0x00, 0x6a, 0x00, 0x9d, 0x00, 0xa5, + 0x00, 0x9c, 0x00, 0xa6, 0x00, 0xa3, 0x00, 0xa8, 0x00, 0xa9, 0x00, 0xaa, 0x00, 0xa7, 0x00, 0xae, + 0x00, 0xaf, 0x00, 0x00, 0x00, 0xad, 0x00, 0xb5, 0x00, 0xb6, 0x00, 0xb4, 0x01, 0x0c, 0x00, 0x69, + 0x00, 0x75, 0x00, 0x8a, 0x01, 0x61, 0x01, 0x62, 0x01, 0x63, 0x00, 0x93, 0x01, 0x65, 0x01, 0x64, + 0x01, 0x5f, 0x00, 0x00, 0x40, 0x3f, 0x58, 0x55, 0x54, 0x53, 0x52, 0x51, 0x50, 0x4f, 0x4e, 0x4d, + 0x4c, 0x4b, 0x4a, 0x49, 0x48, 0x47, 0x46, 0x45, 0x44, 0x43, 0x42, 0x41, 0x40, 0x3f, 0x3e, 0x3d, + 0x3c, 0x3b, 0x3a, 0x39, 0x38, 0x37, 0x36, 0x35, 0x2f, 0x2e, 0x2d, 0x2c, 0x28, 0x26, 0x25, 0x24, + 0x23, 0x22, 0x1f, 0x18, 0x14, 0x11, 0x10, 0x0f, 0x0d, 0x0b, 0x0a, 0x09, 0x08, 0x07, 0x06, 0x05, + 0x04, 0x03, 0x02, 0x01, 0x00, 0x2c, 0x45, 0x23, 0x46, 0x60, 0x20, 0xb0, 0x26, 0x60, 0xb0, 0x04, + 0x26, 0x23, 0x48, 0x48, 0x2d, 0x2c, 0x45, 0x23, 0x46, 0x23, 0x61, 0x20, 0xb0, 0x26, 0x61, 0xb0, + 0x04, 0x26, 0x23, 0x48, 0x48, 0x2d, 0x2c, 0x45, 0x23, 0x46, 0x60, 0xb0, 0x20, 0x61, 0x20, 0xb0, + 0x46, 0x60, 0xb0, 0x04, 0x26, 0x23, 0x48, 0x48, 0x2d, 0x2c, 0x45, 0x23, 0x46, 0x23, 0x61, 0xb0, + 0x20, 0x60, 0x20, 0xb0, 0x26, 0x61, 0xb0, 0x20, 0x61, 0xb0, 0x04, 0x26, 0x23, 0x48, 0x48, 0x2d, + 0x2c, 0x45, 0x23, 0x46, 0x60, 0xb0, 0x40, 0x61, 0x20, 0xb0, 0x66, 0x60, 0xb0, 0x04, 0x26, 0x23, + 0x48, 0x48, 0x2d, 0x2c, 0x45, 0x23, 0x46, 0x23, 0x61, 0xb0, 0x40, 0x60, 0x20, 0xb0, 0x26, 0x61, + 0xb0, 0x40, 0x61, 0xb0, 0x04, 0x26, 0x23, 0x48, 0x48, 0x2d, 0x2c, 0x01, 0x10, 0x20, 0x3c, 0x00, + 0x3c, 0x2d, 0x2c, 0x20, 0x45, 0x23, 0x20, 0xb0, 0xcd, 0x44, 0x23, 0x20, 0xb8, 0x01, 0x5a, 0x51, + 0x58, 0x23, 0x20, 0xb0, 0x8d, 0x44, 0x23, 0x59, 0x20, 0xb0, 0xed, 0x51, 0x58, 0x23, 0x20, 0xb0, + 0x4d, 0x44, 0x23, 0x59, 0x20, 0xb0, 0x04, 0x26, 0x51, 0x58, 0x23, 0x20, 0xb0, 0x0d, 0x44, 0x23, + 0x59, 0x21, 0x21, 0x2d, 0x2c, 0x20, 0x20, 0x45, 0x18, 0x68, 0x44, 0x20, 0xb0, 0x01, 0x60, 0x20, + 0x45, 0xb0, 0x46, 0x76, 0x68, 0x8a, 0x45, 0x60, 0x44, 0x2d, 0x2c, 0x01, 0xb1, 0x0b, 0x0a, 0x43, + 0x23, 0x43, 0x65, 0x0a, 0x2d, 0x2c, 0x00, 0xb1, 0x0a, 0x0b, 0x43, 0x23, 0x43, 0x0b, 0x2d, 0x2c, + 0x00, 0xb0, 0x28, 0x23, 0x70, 0xb1, 0x01, 0x28, 0x3e, 0x01, 0xb0, 0x28, 0x23, 0x70, 0xb1, 0x02, + 0x28, 0x45, 0x3a, 0xb1, 0x02, 0x00, 0x08, 0x0d, 0x2d, 0x2c, 0x20, 0x45, 0xb0, 0x03, 0x25, 0x45, + 0x61, 0x64, 0xb0, 0x50, 0x51, 0x58, 0x45, 0x44, 0x1b, 0x21, 0x21, 0x59, 0x2d, 0x2c, 0x20, 0x45, + 0xb0, 0x00, 0x43, 0x60, 0x44, 0x2d, 0x2c, 0x01, 0xb0, 0x06, 0x43, 0xb0, 0x07, 0x43, 0x65, 0x0a, + 0x2d, 0x2c, 0x20, 0x69, 0xb0, 0x40, 0x61, 0xb0, 0x00, 0x8b, 0x20, 0xb1, 0x2c, 0xc0, 0x8a, 0x8c, + 0xb8, 0x10, 0x00, 0x62, 0x60, 0x2b, 0x0c, 0x64, 0x23, 0x64, 0x61, 0x5c, 0x58, 0xb0, 0x03, 0x61, + 0x59, 0x2d, 0x2c, 0x8a, 0x03, 0x45, 0x8a, 0x8a, 0x87, 0xb0, 0x11, 0x2b, 0xb0, 0x29, 0x23, 0x44, + 0xb0, 0x29, 0x7a, 0xe4, 0x18, 0x2d, 0x2c, 0x45, 0x65, 0xb0, 0x2c, 0x23, 0x44, 0x45, 0xb0, 0x2b, + 0x23, 0x44, 0x2d, 0x2c, 0x4b, 0x52, 0x58, 0x45, 0x44, 0x1b, 0x21, 0x21, 0x59, 0x2d, 0x2c, 0x01, + 0xb0, 0x05, 0x25, 0x10, 0x23, 0x20, 0x8a, 0xf5, 0x00, 0xb0, 0x01, 0x60, 0x23, 0xed, 0xec, 0x2d, + 0x2c, 0x01, 0xb0, 0x05, 0x25, 0x10, 0x23, 0x20, 0x8a, 0xf5, 0x00, 0xb0, 0x01, 0x61, 0x23, 0xed, + 0xec, 0x2d, 0x2c, 0x01, 0xb0, 0x06, 0x25, 0x10, 0xf5, 0x00, 0xed, 0xec, 0x2d, 0x2c, 0x20, 0xb0, + 0x01, 0x60, 0x01, 0x10, 0x20, 0x3c, 0x00, 0x3c, 0x2d, 0x2c, 0x20, 0xb0, 0x01, 0x61, 0x01, 0x10, + 0x20, 0x3c, 0x00, 0x3c, 0x2d, 0x2c, 0x00, 0xb0, 0x07, 0x43, 0xb0, 0x06, 0x43, 0x0b, 0x2d, 0x2c, + 0x21, 0x21, 0x0c, 0x64, 0x23, 0x64, 0x8b, 0xb8, 0x40, 0x00, 0x62, 0x2d, 0x2c, 0x21, 0xb0, 0x80, + 0x51, 0x58, 0x0c, 0x64, 0x23, 0x64, 0x8b, 0xb8, 0x20, 0x00, 0x62, 0x1b, 0xb2, 0x00, 0x40, 0x2f, + 0x2b, 0x59, 0xb0, 0x02, 0x60, 0x2d, 0x2c, 0x21, 0xb0, 0xc0, 0x51, 0x58, 0x0c, 0x64, 0x23, 0x64, + 0x8b, 0xb8, 0x15, 0x55, 0x62, 0x1b, 0xb2, 0x00, 0x80, 0x2f, 0x2b, 0x59, 0xb0, 0x02, 0x60, 0x2d, + 0x2c, 0x0c, 0x64, 0x23, 0x64, 0x8b, 0xb8, 0x40, 0x00, 0x62, 0x60, 0x23, 0x21, 0x2d, 0x2c, 0x45, + 0x23, 0x45, 0x60, 0x23, 0x45, 0x60, 0x23, 0x45, 0x60, 0x23, 0x76, 0x68, 0x18, 0xb0, 0x80, 0x62, + 0x20, 0x2d, 0x2c, 0xb0, 0x04, 0x26, 0xb0, 0x04, 0x26, 0xb0, 0x04, 0x25, 0xb0, 0x04, 0x25, 0x45, + 0x23, 0x45, 0x20, 0xb0, 0x03, 0x26, 0x60, 0x62, 0x63, 0x68, 0x20, 0xb0, 0x03, 0x26, 0x61, 0x65, + 0x8a, 0x23, 0x44, 0x44, 0x2d, 0x2c, 0x20, 0x45, 0xb0, 0x00, 0x54, 0x58, 0xb0, 0x40, 0x44, 0x20, + 0x45, 0xb0, 0x40, 0x61, 0x44, 0x1b, 0x21, 0x21, 0x59, 0x2d, 0x2c, 0x45, 0xb1, 0x30, 0x2f, 0x45, + 0x23, 0x45, 0x61, 0x60, 0xb0, 0x01, 0x60, 0x69, 0x44, 0x2d, 0x2c, 0x4b, 0x51, 0x58, 0xb0, 0x2f, + 0x23, 0x70, 0xb0, 0x14, 0x23, 0x42, 0x1b, 0x21, 0x21, 0x59, 0x2d, 0x2c, 0x4b, 0x51, 0x58, 0x20, + 0xb0, 0x03, 0x25, 0x45, 0x69, 0x53, 0x58, 0x44, 0x1b, 0x21, 0x21, 0x59, 0x1b, 0x21, 0x21, 0x59, + 0x2d, 0x2c, 0x45, 0xb0, 0x14, 0x43, 0xb0, 0x00, 0x60, 0x63, 0xb0, 0x01, 0x60, 0x69, 0x44, 0x2d, + 0x2c, 0xb0, 0x2f, 0x45, 0x44, 0x2d, 0x2c, 0x45, 0x23, 0x20, 0x45, 0x8a, 0x60, 0x44, 0x2d, 0x2c, + 0x45, 0x23, 0x45, 0x60, 0x44, 0x2d, 0x2c, 0x4b, 0x23, 0x51, 0x58, 0xb9, 0x00, 0x33, 0xff, 0xe0, + 0xb1, 0x34, 0x20, 0x1b, 0xb3, 0x33, 0x00, 0x34, 0x00, 0x59, 0x44, 0x44, 0x2d, 0x2c, 0xb0, 0x16, + 0x43, 0x58, 0xb0, 0x03, 0x26, 0x45, 0x8a, 0x58, 0x64, 0x66, 0xb0, 0x1f, 0x60, 0x1b, 0x64, 0xb0, + 0x20, 0x60, 0x66, 0x20, 0x58, 0x1b, 0x21, 0xb0, 0x40, 0x59, 0xb0, 0x01, 0x61, 0x59, 0x23, 0x58, + 0x65, 0x59, 0xb0, 0x29, 0x23, 0x44, 0x23, 0x10, 0xb0, 0x29, 0xe0, 0x1b, 0x21, 0x21, 0x21, 0x21, + 0x21, 0x59, 0x2d, 0x2c, 0xb0, 0x16, 0x43, 0x58, 0xb0, 0x04, 0x25, 0x45, 0x64, 0xb0, 0x20, 0x60, + 0x66, 0x20, 0x58, 0x1b, 0x21, 0xb0, 0x40, 0x59, 0xb0, 0x01, 0x61, 0x23, 0x58, 0x65, 0x59, 0xb0, + 0x29, 0x23, 0x44, 0xb0, 0x04, 0x25, 0xb0, 0x07, 0x25, 0x08, 0x20, 0x58, 0x02, 0x1b, 0x03, 0x59, + 0xb0, 0x05, 0x25, 0x10, 0xb0, 0x04, 0x25, 0x20, 0x46, 0xb0, 0x04, 0x25, 0x23, 0x42, 0x3c, 0xb0, + 0x07, 0x25, 0x10, 0xb0, 0x06, 0x25, 0x20, 0x46, 0xb0, 0x04, 0x25, 0xb0, 0x01, 0x60, 0x23, 0x42, + 0x3c, 0x20, 0x58, 0x01, 0x1b, 0x00, 0x59, 0xb0, 0x05, 0x25, 0x10, 0xb0, 0x04, 0x25, 0xb0, 0x29, + 0xe0, 0xb0, 0x07, 0x25, 0x10, 0xb0, 0x06, 0x25, 0xb0, 0x29, 0xe0, 0xb0, 0x04, 0x25, 0xb0, 0x07, + 0x25, 0x08, 0x20, 0x58, 0x02, 0x1b, 0x03, 0x59, 0xb0, 0x04, 0x25, 0xb0, 0x03, 0x25, 0x43, 0x48, + 0xb0, 0x06, 0x25, 0xb0, 0x03, 0x25, 0xb0, 0x01, 0x60, 0x43, 0x48, 0x1b, 0x21, 0x59, 0x21, 0x21, + 0x21, 0x21, 0x21, 0x21, 0x21, 0x2d, 0x2c, 0xb0, 0x16, 0x43, 0x58, 0xb0, 0x04, 0x25, 0x45, 0x64, + 0xb0, 0x20, 0x60, 0x66, 0x20, 0x58, 0x1b, 0x21, 0xb0, 0x40, 0x59, 0xb0, 0x01, 0x61, 0x23, 0x58, + 0x1b, 0x65, 0x59, 0xb0, 0x29, 0x23, 0x44, 0xb0, 0x05, 0x25, 0xb0, 0x08, 0x25, 0x08, 0x20, 0x58, + 0x02, 0x1b, 0x03, 0x59, 0xb0, 0x04, 0x25, 0x10, 0xb0, 0x05, 0x25, 0x20, 0x46, 0xb0, 0x04, 0x25, + 0x23, 0x42, 0x3c, 0xb0, 0x04, 0x25, 0xb0, 0x07, 0x25, 0x08, 0xb0, 0x07, 0x25, 0x10, 0xb0, 0x06, + 0x25, 0x20, 0x46, 0xb0, 0x04, 0x25, 0xb0, 0x01, 0x60, 0x23, 0x42, 0x3c, 0x20, 0x58, 0x01, 0x1b, + 0x00, 0x59, 0xb0, 0x04, 0x25, 0x10, 0xb0, 0x05, 0x25, 0xb0, 0x29, 0xe0, 0xb0, 0x29, 0x20, 0x45, + 0x65, 0x44, 0xb0, 0x07, 0x25, 0x10, 0xb0, 0x06, 0x25, 0xb0, 0x29, 0xe0, 0xb0, 0x05, 0x25, 0xb0, + 0x08, 0x25, 0x08, 0x20, 0x58, 0x02, 0x1b, 0x03, 0x59, 0xb0, 0x05, 0x25, 0xb0, 0x03, 0x25, 0x43, + 0x48, 0xb0, 0x04, 0x25, 0xb0, 0x07, 0x25, 0x08, 0xb0, 0x06, 0x25, 0xb0, 0x03, 0x25, 0xb0, 0x01, + 0x60, 0x43, 0x48, 0x1b, 0x21, 0x59, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x2d, 0x2c, 0x02, + 0xb0, 0x04, 0x25, 0x20, 0x20, 0x46, 0xb0, 0x04, 0x25, 0x23, 0x42, 0xb0, 0x05, 0x25, 0x08, 0xb0, + 0x03, 0x25, 0x45, 0x48, 0x21, 0x21, 0x21, 0x21, 0x2d, 0x2c, 0x02, 0xb0, 0x03, 0x25, 0x20, 0xb0, + 0x04, 0x25, 0x08, 0xb0, 0x02, 0x25, 0x43, 0x48, 0x21, 0x21, 0x21, 0x2d, 0x2c, 0x45, 0x23, 0x20, + 0x45, 0x18, 0x20, 0xb0, 0x00, 0x50, 0x20, 0x58, 0x23, 0x65, 0x23, 0x59, 0x23, 0x68, 0x20, 0xb0, + 0x40, 0x50, 0x58, 0x21, 0xb0, 0x40, 0x59, 0x23, 0x58, 0x65, 0x59, 0x8a, 0x60, 0x44, 0x2d, 0x2c, + 0x4b, 0x53, 0x23, 0x4b, 0x51, 0x5a, 0x58, 0x20, 0x45, 0x8a, 0x60, 0x44, 0x1b, 0x21, 0x21, 0x59, + 0x2d, 0x2c, 0x4b, 0x54, 0x58, 0x20, 0x45, 0x8a, 0x60, 0x44, 0x1b, 0x21, 0x21, 0x59, 0x2d, 0x2c, + 0x4b, 0x53, 0x23, 0x4b, 0x51, 0x5a, 0x58, 0x38, 0x1b, 0x21, 0x21, 0x59, 0x2d, 0x2c, 0x4b, 0x54, + 0x58, 0x38, 0x1b, 0x21, 0x21, 0x59, 0x2d, 0x2c, 0xb0, 0x02, 0x43, 0x54, 0x58, 0xb0, 0x46, 0x2b, + 0x1b, 0x21, 0x21, 0x21, 0x21, 0x59, 0x2d, 0x2c, 0xb0, 0x02, 0x43, 0x54, 0x58, 0xb0, 0x47, 0x2b, + 0x1b, 0x21, 0x21, 0x21, 0x59, 0x2d, 0x2c, 0xb0, 0x02, 0x43, 0x54, 0x58, 0xb0, 0x48, 0x2b, 0x1b, + 0x21, 0x21, 0x21, 0x21, 0x59, 0x2d, 0x2c, 0xb0, 0x02, 0x43, 0x54, 0x58, 0xb0, 0x49, 0x2b, 0x1b, + 0x21, 0x21, 0x21, 0x59, 0x2d, 0x2c, 0x20, 0x8a, 0x08, 0x23, 0x4b, 0x53, 0x8a, 0x4b, 0x51, 0x5a, + 0x58, 0x23, 0x38, 0x1b, 0x21, 0x21, 0x59, 0x2d, 0x2c, 0x00, 0x20, 0x8a, 0x49, 0xb0, 0x00, 0x51, + 0x58, 0xb0, 0x40, 0x23, 0x20, 0x8a, 0x38, 0x12, 0x34, 0x1b, 0x21, 0x21, 0x59, 0x2d, 0x2c, 0x01, + 0x46, 0x23, 0x46, 0x60, 0x23, 0x46, 0x61, 0x23, 0x20, 0x10, 0x20, 0x46, 0x8a, 0x61, 0xb8, 0xff, + 0x80, 0x62, 0x8a, 0xb1, 0x40, 0x40, 0x8a, 0x70, 0x45, 0x60, 0x68, 0x3a, 0x2d, 0x2c, 0x20, 0x8a, + 0x23, 0x49, 0x64, 0x8a, 0x23, 0x53, 0x58, 0x3c, 0x1b, 0x21, 0x59, 0x2d, 0x2c, 0x4b, 0x52, 0x58, + 0x7d, 0x1b, 0x7a, 0x59, 0x2d, 0x2c, 0xb0, 0x12, 0x00, 0x4b, 0x01, 0x4b, 0x54, 0x42, 0x2d, 0x2c, + 0xb1, 0x02, 0x00, 0x42, 0xb1, 0x23, 0x01, 0x88, 0x51, 0xb1, 0x40, 0x01, 0x88, 0x53, 0x5a, 0x58, + 0xb9, 0x10, 0x00, 0x00, 0x20, 0x88, 0x54, 0x58, 0xb1, 0x02, 0x01, 0x42, 0x59, 0x59, 0x2d, 0x2c, + 0x45, 0x18, 0x68, 0x23, 0x4b, 0x51, 0x58, 0x23, 0x20, 0x45, 0x20, 0x64, 0xb0, 0x40, 0x50, 0x58, + 0x7c, 0x59, 0x68, 0x8a, 0x60, 0x59, 0x44, 0x2d, 0x2c, 0xb0, 0x00, 0x16, 0xb0, 0x02, 0x25, 0xb0, + 0x02, 0x25, 0x01, 0xb0, 0x01, 0x23, 0x3e, 0x00, 0xb0, 0x02, 0x23, 0x3e, 0xb1, 0x01, 0x02, 0x06, + 0x0c, 0xb0, 0x0a, 0x23, 0x65, 0x42, 0xb0, 0x0b, 0x23, 0x42, 0x01, 0xb0, 0x01, 0x23, 0x3f, 0x00, + 0xb0, 0x02, 0x23, 0x3f, 0xb1, 0x01, 0x02, 0x06, 0x0c, 0xb0, 0x06, 0x23, 0x65, 0x42, 0xb0, 0x07, + 0x23, 0x42, 0xb0, 0x01, 0x16, 0x01, 0x2d, 0x00, 0x40, 0xa0, 0x76, 0x6e, 0x29, 0x1f, 0x75, 0x6f, + 0x64, 0x1f, 0x74, 0x72, 0x64, 0x1f, 0x72, 0x43, 0x29, 0x1f, 0x71, 0x6f, 0x64, 0x1f, 0x70, 0x6e, + 0x64, 0x1f, 0x6f, 0x42, 0x1b, 0x1f, 0x6e, 0x42, 0x1b, 0x1f, 0x69, 0x61, 0x29, 0x1f, 0x67, 0x65, + 0x64, 0x1f, 0x65, 0x43, 0x29, 0x1f, 0x64, 0x42, 0x0e, 0x1f, 0x63, 0x61, 0x64, 0x1f, 0x61, 0x42, + 0x1b, 0x1f, 0x59, 0x51, 0x29, 0x1f, 0x58, 0x42, 0x15, 0x1f, 0x57, 0x55, 0x64, 0x1f, 0x55, 0x43, + 0x29, 0x1f, 0x54, 0x42, 0x15, 0x1f, 0x53, 0x51, 0x64, 0x1f, 0x52, 0x42, 0x1b, 0x1f, 0x51, 0x42, + 0x1b, 0x1f, 0x4c, 0x44, 0x29, 0x1f, 0x4a, 0x48, 0x64, 0x1f, 0x48, 0x43, 0x29, 0x1f, 0x46, 0x44, + 0x64, 0x1f, 0x44, 0x42, 0x1b, 0x1f, 0x43, 0x41, 0x11, 0x1f, 0x2f, 0x42, 0x3f, 0x42, 0x02, 0x9d, + 0x9c, 0x2a, 0x1f, 0x0d, 0x2a, 0x0c, 0x55, 0x05, 0x2a, 0x04, 0x55, 0x00, 0x9c, 0x10, 0x9c, 0x02, + 0x0f, 0x2a, 0x0e, 0x55, 0x0b, 0x2a, 0x0a, 0x55, 0x07, 0x2a, 0x06, 0x55, 0x01, 0x2a, 0x00, 0x55, + 0x09, 0x2a, 0x08, 0x55, 0x03, 0x2a, 0x02, 0x55, 0x54, 0x53, 0xb8, 0x01, 0x00, 0xb3, 0x16, 0x01, + 0x05, 0x01, 0xb8, 0x01, 0x90, 0x4b, 0xb8, 0x08, 0x00, 0x52, 0x4b, 0xb0, 0x08, 0x50, 0x5b, 0xb0, + 0x01, 0x88, 0xb0, 0x25, 0x53, 0xb0, 0x01, 0x88, 0xb0, 0x40, 0x51, 0x5a, 0xb0, 0x06, 0x88, 0xb0, + 0x00, 0x55, 0x5a, 0x5b, 0x58, 0xb1, 0x01, 0x01, 0x8e, 0x59, 0x85, 0x8d, 0x8d, 0x00, 0x42, 0x1d, + 0x4b, 0xb0, 0x1d, 0x53, 0x58, 0xb0, 0xa0, 0x1d, 0x59, 0x4b, 0xb0, 0x80, 0x53, 0x58, 0xb0, 0x00, + 0x1d, 0xb1, 0x16, 0x00, 0x42, 0x59, 0x2b, 0x2b, 0x00, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x74, + 0x2b, 0x2b, 0x2b, 0x01, 0x73, 0x00, 0x2b, 0x01, 0x2b, 0x2b, 0x00, 0x2b, 0x2b, 0x2b, 0x01, 0x2b, + 0x2b, 0x2b, 0x2b, 0x00, 0x2b, 0x2b, 0x2b, 0x2b, 0x01, 0x2b, 0x2b, 0x2b, 0x00, 0x2b, 0x2b, 0x2b, + 0x01, 0x2b, 0x2b, 0x2b, 0x2b, 0x00, 0x2b, 0x2b, 0x2b, 0x2b, 0x18, 0x00, 0x02, 0xb0, 0x00, 0x05, + 0x02, 0x6b, 0x00, 0x0e, 0x02, 0x6b, 0x00, 0x0e, 0x00, 0x00, 0xff, 0xf5, 0x00, 0x00, 0xff, 0xf3, + 0x01, 0xd6, 0x00, 0x0c, 0x00, 0x00, 0xff, 0xf3, 0xff, 0x5b, 0xff, 0xfd, 0x02, 0xbb, 0x00, 0x00, + 0xff, 0x5b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, + 0x00, 0x7c, 0x00, 0x66, 0x00, 0x7c, 0x00, 0x50, 0x00, 0x7d, 0x00, 0x00, 0x00, 0x66, 0x00, 0x50, + 0x00, 0x6b, 0x00, 0x00, 0x00, 0x72, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7b, + 0x00, 0x64, 0x00, 0x7d, 0x00, 0x9b, 0x00, 0x66, 0x00, 0x00, 0x00, 0x6b, 0x00, 0x9b, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7b, + 0x00, 0x00, 0x00, 0x7d, 0x00, 0x6f, 0x00, 0x66, 0x00, 0x00, 0x00, 0x6b, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7b, 0x00, 0x8e, 0x00, 0x7d, 0x00, 0xa6, + 0x00, 0x66, 0x00, 0x54, 0x00, 0x6b, 0x00, 0xa6, 0x00, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, + 0x00, 0xb3, 0x00, 0xb3, 0x00, 0x50, 0x00, 0x50, 0x02, 0x01, 0x00, 0x3c, 0x00, 0x3c, 0x00, 0x3a, + 0x00, 0x3a, 0x01, 0x64, 0x00, 0x64, 0x00, 0x5f, 0x03, 0x40, 0xff, 0x9f, 0xff, 0x7e, 0x00, 0x00, + 0x02, 0xc6, 0x02, 0x72, 0x00, 0xfa, 0x00, 0xfb, 0x00, 0x00, 0x00, 0x55, 0x00, 0x2a, 0xff, 0xd8, + 0xff, 0x57, 0x02, 0x87, 0xff, 0x21, 0x00, 0x8c, 0x00, 0x8c, 0x02, 0x87, 0x02, 0xa3, 0x00, 0x47, + 0x01, 0x03, 0x01, 0x03, 0x01, 0x78, 0x01, 0x6f, 0x02, 0x7b, 0x02, 0xb5, 0x02, 0xaa, 0x01, 0x39, + 0x01, 0x6a, 0x01, 0x95, 0x00, 0x5a, 0x00, 0x5c, 0x02, 0xb6, 0x02, 0x12, 0x02, 0x2e, 0x00, 0x72, + 0xff, 0xd3, 0x02, 0xbe, 0x02, 0x2b, 0x00, 0x7a, 0x02, 0x34, 0x00, 0x59, 0x03, 0x2a, 0x02, 0x43, + 0x00, 0x72, 0x00, 0x72, 0x02, 0x51, 0x00, 0x59, 0xff, 0xa7, 0x03, 0x12, 0x02, 0xf4, 0x00, 0xdd, + 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x00, 0x5c, + 0x00, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x00, 0xcc, 0x00, 0x00, 0x01, 0x58, + 0x00, 0x00, 0x03, 0x20, 0x00, 0x00, 0x03, 0xfc, 0x00, 0x00, 0x05, 0x84, 0x00, 0x00, 0x07, 0x0c, + 0x00, 0x00, 0x07, 0x7c, 0x00, 0x00, 0x07, 0xd0, 0x00, 0x00, 0x08, 0x24, 0x00, 0x00, 0x09, 0x38, + 0x00, 0x00, 0x09, 0xf0, 0x00, 0x00, 0x0a, 0x50, 0x00, 0x00, 0x0a, 0x7c, 0x00, 0x00, 0x0b, 0x14, + 0x00, 0x00, 0x0b, 0x5c, 0x00, 0x00, 0x0c, 0x1c, 0x00, 0x00, 0x0c, 0x88, 0x00, 0x00, 0x0d, 0x20, + 0x00, 0x00, 0x0e, 0x2c, 0x00, 0x00, 0x0e, 0xa8, 0x00, 0x00, 0x0f, 0x54, 0x00, 0x00, 0x10, 0x18, + 0x00, 0x00, 0x10, 0x78, 0x00, 0x00, 0x12, 0x1c, 0x00, 0x00, 0x12, 0xdc, 0x00, 0x00, 0x13, 0x08, + 0x00, 0x00, 0x13, 0x20, 0x00, 0x00, 0x13, 0x74, 0x00, 0x00, 0x13, 0xbc, 0x00, 0x00, 0x14, 0x14, + 0x00, 0x00, 0x14, 0xd0, 0x00, 0x00, 0x16, 0xe8, 0x00, 0x00, 0x17, 0x7c, 0x00, 0x00, 0x18, 0x60, + 0x00, 0x00, 0x18, 0xfc, 0x00, 0x00, 0x19, 0x9c, 0x00, 0x00, 0x1a, 0x18, 0x00, 0x00, 0x1a, 0x88, + 0x00, 0x00, 0x1b, 0x28, 0x00, 0x00, 0x1b, 0x90, 0x00, 0x00, 0x1b, 0xe8, 0x00, 0x00, 0x1c, 0x58, + 0x00, 0x00, 0x1c, 0xdc, 0x00, 0x00, 0x1d, 0x28, 0x00, 0x00, 0x1e, 0xf8, 0x00, 0x00, 0x1f, 0x84, + 0x00, 0x00, 0x20, 0x10, 0x00, 0x00, 0x20, 0xa0, 0x00, 0x00, 0x21, 0x48, 0x00, 0x00, 0x22, 0x10, + 0x00, 0x00, 0x22, 0xf0, 0x00, 0x00, 0x23, 0x34, 0x00, 0x00, 0x23, 0xb4, 0x00, 0x00, 0x24, 0x80, + 0x00, 0x00, 0x26, 0x6c, 0x00, 0x00, 0x27, 0x24, 0x00, 0x00, 0x27, 0xa8, 0x00, 0x00, 0x28, 0x4c, + 0x00, 0x00, 0x28, 0xa0, 0x00, 0x00, 0x28, 0xe8, 0x00, 0x00, 0x29, 0x3c, 0x00, 0x00, 0x29, 0x8c, + 0x00, 0x00, 0x29, 0xbc, 0x00, 0x00, 0x29, 0xe8, 0x00, 0x00, 0x2a, 0xc4, 0x00, 0x00, 0x2b, 0x84, + 0x00, 0x00, 0x2c, 0x1c, 0x00, 0x00, 0x2c, 0xd8, 0x00, 0x00, 0x2d, 0xa8, 0x00, 0x00, 0x2e, 0x50, + 0x00, 0x00, 0x2f, 0x10, 0x00, 0x00, 0x2f, 0x98, 0x00, 0x00, 0x30, 0x48, 0x00, 0x00, 0x30, 0xf8, + 0x00, 0x00, 0x31, 0xa0, 0x00, 0x00, 0x32, 0x18, 0x00, 0x00, 0x33, 0x14, 0x00, 0x00, 0x33, 0x84, + 0x00, 0x00, 0x34, 0x0c, 0x00, 0x00, 0x34, 0xa0, 0x00, 0x00, 0x35, 0x3c, 0x00, 0x00, 0x35, 0xa4, + 0x00, 0x00, 0x36, 0x80, 0x00, 0x00, 0x37, 0x40, 0x00, 0x00, 0x37, 0xb0, 0x00, 0x00, 0x38, 0x40, + 0x00, 0x00, 0x39, 0xfc, 0x00, 0x00, 0x3a, 0x74, 0x00, 0x00, 0x3b, 0x10, 0x00, 0x00, 0x3b, 0xa4, + 0x00, 0x00, 0x3c, 0x40, 0x00, 0x00, 0x3c, 0x84, 0x00, 0x00, 0x3d, 0x38, 0x00, 0x00, 0x3d, 0xb8, + 0x00, 0x00, 0x3e, 0xb8, 0x00, 0x00, 0x3f, 0x14, 0x00, 0x00, 0x3f, 0xc0, 0x00, 0x00, 0x40, 0x58, + 0x00, 0x00, 0x41, 0x0c, 0x00, 0x00, 0x41, 0x80, 0x00, 0x00, 0x42, 0x34, 0x00, 0x00, 0x42, 0x98, + 0x00, 0x00, 0x44, 0x88, 0x00, 0x00, 0x44, 0xb4, 0x00, 0x00, 0x45, 0x10, 0x00, 0x00, 0x45, 0xec, + 0x00, 0x00, 0x46, 0x48, 0x00, 0x00, 0x46, 0xac, 0x00, 0x00, 0x47, 0x4c, 0x00, 0x00, 0x47, 0xf4, + 0x00, 0x00, 0x48, 0x4c, 0x00, 0x00, 0x48, 0x78, 0x00, 0x00, 0x48, 0xa4, 0x00, 0x00, 0x49, 0x98, + 0x00, 0x00, 0x4a, 0x94, 0x00, 0x00, 0x4a, 0xbc, 0x00, 0x00, 0x4b, 0x3c, 0x00, 0x00, 0x4c, 0x5c, + 0x00, 0x00, 0x4c, 0x90, 0x00, 0x00, 0x4c, 0x90, 0x00, 0x00, 0x4d, 0x04, 0x00, 0x00, 0x4d, 0xc8, + 0x00, 0x00, 0x4e, 0x8c, 0x00, 0x00, 0x4f, 0xe8, 0x00, 0x00, 0x50, 0xcc, 0x00, 0x00, 0x51, 0x14, + 0x00, 0x00, 0x52, 0x5c, 0x00, 0x00, 0x52, 0xc8, 0x00, 0x00, 0x54, 0x14, 0x00, 0x00, 0x55, 0x04, + 0x00, 0x00, 0x55, 0x98, 0x00, 0x00, 0x55, 0xd0, 0x00, 0x00, 0x55, 0xe0, 0x00, 0x00, 0x57, 0x9c, + 0x00, 0x00, 0x57, 0xc8, 0x00, 0x00, 0x58, 0x3c, 0x00, 0x00, 0x58, 0xf0, 0x00, 0x00, 0x59, 0x84, + 0x00, 0x00, 0x5a, 0xe0, 0x00, 0x00, 0x5b, 0x0c, 0x00, 0x00, 0x5b, 0x94, 0x00, 0x00, 0x5c, 0x18, + 0x00, 0x00, 0x5c, 0x2c, 0x00, 0x00, 0x5c, 0x98, 0x00, 0x00, 0x5d, 0x0c, 0x00, 0x00, 0x5d, 0xd0, + 0x00, 0x00, 0x5e, 0x40, 0x00, 0x00, 0x5f, 0x88, 0x00, 0x00, 0x60, 0x88, 0x00, 0x00, 0x61, 0xd4, + 0x00, 0x00, 0x62, 0xa8, 0x00, 0x00, 0x62, 0xd8, 0x00, 0x00, 0x63, 0x04, 0x00, 0x00, 0x63, 0x30, + 0x00, 0x00, 0x63, 0x5c, 0x00, 0x00, 0x63, 0x90, 0x00, 0x00, 0x64, 0xd8, 0x00, 0x00, 0x65, 0xc0, + 0x00, 0x00, 0x66, 0xac, 0x00, 0x00, 0x66, 0xdc, 0x00, 0x00, 0x67, 0x0c, 0x00, 0x00, 0x67, 0x3c, + 0x00, 0x00, 0x67, 0x70, 0x00, 0x00, 0x67, 0xa0, 0x00, 0x00, 0x67, 0xd0, 0x00, 0x00, 0x67, 0xfc, + 0x00, 0x00, 0x68, 0x30, 0x00, 0x00, 0x68, 0xf4, 0x00, 0x00, 0x69, 0x20, 0x00, 0x00, 0x69, 0x50, + 0x00, 0x00, 0x69, 0x7c, 0x00, 0x00, 0x69, 0xa8, 0x00, 0x00, 0x69, 0xd4, 0x00, 0x00, 0x6a, 0x08, + 0x00, 0x00, 0x6a, 0xb0, 0x00, 0x00, 0x6b, 0xc0, 0x00, 0x00, 0x6b, 0xf0, 0x00, 0x00, 0x6c, 0x1c, + 0x00, 0x00, 0x6c, 0x48, 0x00, 0x00, 0x6c, 0x7c, 0x00, 0x00, 0x6c, 0xa8, 0x00, 0x00, 0x6d, 0x3c, + 0x00, 0x00, 0x6e, 0x54, 0x00, 0x00, 0x6e, 0x7c, 0x00, 0x00, 0x6e, 0xa4, 0x00, 0x00, 0x6e, 0xcc, + 0x00, 0x00, 0x6e, 0xf4, 0x00, 0x00, 0x6f, 0x24, 0x00, 0x00, 0x6f, 0x50, 0x00, 0x00, 0x70, 0xc0, + 0x00, 0x00, 0x71, 0xa8, 0x00, 0x00, 0x71, 0xd4, 0x00, 0x00, 0x71, 0xfc, 0x00, 0x00, 0x72, 0x24, + 0x00, 0x00, 0x72, 0x54, 0x00, 0x00, 0x72, 0x80, 0x00, 0x00, 0x72, 0xac, 0x00, 0x00, 0x72, 0xd8, + 0x00, 0x00, 0x73, 0x0c, 0x00, 0x00, 0x74, 0x0c, 0x00, 0x00, 0x74, 0x34, 0x00, 0x00, 0x74, 0x60, + 0x00, 0x00, 0x74, 0x88, 0x00, 0x00, 0x74, 0xb0, 0x00, 0x00, 0x74, 0xd8, 0x00, 0x00, 0x75, 0x08, + 0x00, 0x00, 0x75, 0xc0, 0x00, 0x00, 0x76, 0x90, 0x00, 0x00, 0x76, 0xbc, 0x00, 0x00, 0x76, 0xe4, + 0x00, 0x00, 0x77, 0x0c, 0x00, 0x00, 0x77, 0x3c, 0x00, 0x00, 0x77, 0x64, 0x00, 0x00, 0x78, 0x14, + 0x00, 0x00, 0x78, 0x44, 0x00, 0x00, 0x78, 0x70, 0x00, 0x00, 0x78, 0x98, 0x00, 0x00, 0x78, 0xc4, + 0x00, 0x00, 0x78, 0xec, 0x00, 0x00, 0x79, 0xb8, 0x00, 0x00, 0x7a, 0xd0, 0x00, 0x00, 0x7a, 0xfc, + 0x00, 0x00, 0x7b, 0x24, 0x00, 0x00, 0x7b, 0x50, 0x00, 0x00, 0x7b, 0x78, 0x00, 0x00, 0x7b, 0xa4, + 0x00, 0x00, 0x7b, 0xcc, 0x00, 0x00, 0x7b, 0xf8, 0x00, 0x00, 0x7c, 0x20, 0x00, 0x00, 0x7c, 0x50, + 0x00, 0x00, 0x7d, 0x04, 0x00, 0x00, 0x7d, 0x14, 0x00, 0x00, 0x7d, 0xc4, 0x00, 0x00, 0x7d, 0xf4, + 0x00, 0x00, 0x7e, 0x1c, 0x00, 0x00, 0x7e, 0x4c, 0x00, 0x00, 0x7e, 0x74, 0x00, 0x00, 0x7e, 0xa4, + 0x00, 0x00, 0x7e, 0xcc, 0x00, 0x00, 0x7f, 0x88, 0x00, 0x00, 0x80, 0xa0, 0x00, 0x00, 0x80, 0xd0, + 0x00, 0x00, 0x80, 0xf8, 0x00, 0x00, 0x81, 0x24, 0x00, 0x00, 0x81, 0x4c, 0x00, 0x00, 0x81, 0x78, + 0x00, 0x00, 0x81, 0xa0, 0x00, 0x00, 0x81, 0xcc, 0x00, 0x00, 0x81, 0xf4, 0x00, 0x00, 0x82, 0x18, + 0x00, 0x00, 0x82, 0x40, 0x00, 0x00, 0x82, 0x6c, 0x00, 0x00, 0x83, 0x10, 0x00, 0x00, 0x83, 0xbc, + 0x00, 0x00, 0x84, 0xc4, 0x00, 0x00, 0x84, 0xf0, 0x00, 0x00, 0x85, 0x1c, 0x00, 0x00, 0x85, 0x48, + 0x00, 0x00, 0x85, 0x74, 0x00, 0x00, 0x85, 0xa0, 0x00, 0x00, 0x85, 0xcc, 0x00, 0x00, 0x86, 0x88, + 0x00, 0x00, 0x87, 0x70, 0x00, 0x00, 0x87, 0x9c, 0x00, 0x00, 0x88, 0x18, 0x00, 0x00, 0x88, 0x28, + 0x00, 0x00, 0x88, 0xb8, 0x00, 0x00, 0x89, 0xc4, 0x00, 0x00, 0x89, 0xf0, 0x00, 0x00, 0x8a, 0x18, + 0x00, 0x00, 0x8a, 0x40, 0x00, 0x00, 0x8a, 0x68, 0x00, 0x00, 0x8b, 0x50, 0x00, 0x00, 0x8b, 0xcc, + 0x00, 0x00, 0x8b, 0xfc, 0x00, 0x00, 0x8c, 0x84, 0x00, 0x00, 0x8c, 0xac, 0x00, 0x00, 0x8c, 0xd0, + 0x00, 0x00, 0x8c, 0xf4, 0x00, 0x00, 0x8d, 0x18, 0x00, 0x00, 0x8d, 0xa0, 0x00, 0x00, 0x8e, 0x50, + 0x00, 0x00, 0x8e, 0xc8, 0x00, 0x00, 0x8f, 0x5c, 0x00, 0x00, 0x8f, 0x88, 0x00, 0x00, 0x8f, 0xb0, + 0x00, 0x00, 0x8f, 0xd8, 0x00, 0x00, 0x90, 0x00, 0x00, 0x00, 0x90, 0x2c, 0x00, 0x00, 0x90, 0x58, + 0x00, 0x00, 0x91, 0x50, 0x00, 0x00, 0x91, 0x70, 0x00, 0x00, 0x92, 0x10, 0x00, 0x00, 0x92, 0xa0, + 0x00, 0x00, 0x92, 0xcc, 0x00, 0x00, 0x92, 0xf4, 0x00, 0x00, 0x93, 0x20, 0x00, 0x00, 0x93, 0x48, + 0x00, 0x00, 0x93, 0x7c, 0x00, 0x00, 0x93, 0xac, 0x00, 0x00, 0x93, 0xdc, 0x00, 0x00, 0x94, 0x04, + 0x00, 0x00, 0x94, 0x2c, 0x00, 0x00, 0x94, 0x54, 0x00, 0x00, 0x94, 0x84, 0x00, 0x00, 0x94, 0xac, + 0x00, 0x00, 0x94, 0xd8, 0x00, 0x00, 0x95, 0x00, 0x00, 0x00, 0x95, 0x2c, 0x00, 0x00, 0x95, 0x54, + 0x00, 0x00, 0x96, 0x98, 0x00, 0x00, 0x98, 0x04, 0x00, 0x00, 0x98, 0xb8, 0x00, 0x00, 0x99, 0xb4, + 0x00, 0x00, 0x99, 0xe0, 0x00, 0x00, 0x9a, 0x04, 0x00, 0x00, 0x9a, 0x98, 0x00, 0x00, 0x9b, 0x9c, + 0x00, 0x00, 0x9b, 0xc8, 0x00, 0x00, 0x9b, 0xf0, 0x00, 0x00, 0x9c, 0x1c, 0x00, 0x00, 0x9c, 0x44, + 0x00, 0x00, 0x9c, 0x70, 0x00, 0x00, 0x9c, 0x98, 0x00, 0x00, 0x9d, 0x90, 0x00, 0x00, 0x9d, 0xb4, + 0x00, 0x00, 0x9d, 0xe8, 0x00, 0x00, 0x9e, 0x18, 0x00, 0x00, 0x9e, 0xc4, 0x00, 0x00, 0x9f, 0x78, + 0x00, 0x00, 0x9f, 0xa4, 0x00, 0x00, 0x9f, 0xcc, 0x00, 0x00, 0x9f, 0xf8, 0x00, 0x00, 0xa0, 0x20, + 0x00, 0x00, 0xa0, 0x4c, 0x00, 0x00, 0xa0, 0x74, 0x00, 0x00, 0xa0, 0xa0, 0x00, 0x00, 0xa0, 0xcc, + 0x00, 0x00, 0xa0, 0xf8, 0x00, 0x00, 0xa1, 0x20, 0x00, 0x00, 0xa1, 0x98, 0x00, 0x00, 0xa1, 0xc0, + 0x00, 0x00, 0xa1, 0xe8, 0x00, 0x00, 0xa2, 0x10, 0x00, 0x00, 0xa2, 0x34, 0x00, 0x00, 0xa2, 0x9c, + 0x00, 0x00, 0xa2, 0xe8, 0x00, 0x00, 0xa3, 0x48, 0x00, 0x00, 0xa3, 0x74, 0x00, 0x00, 0xa3, 0xd4, + 0x00, 0x00, 0xa4, 0x14, 0x00, 0x00, 0xa4, 0x98, 0x00, 0x00, 0xa4, 0xf8, 0x00, 0x00, 0xa5, 0x48, + 0x00, 0x00, 0xa5, 0x78, 0x00, 0x00, 0xa5, 0xa4, 0x00, 0x00, 0xa5, 0xd0, 0x00, 0x00, 0xa5, 0xf8, + 0x00, 0x00, 0xa6, 0x2c, 0x00, 0x00, 0xa6, 0x5c, 0x00, 0x00, 0xa6, 0x8c, 0x00, 0x00, 0xa6, 0xb8, + 0x00, 0x00, 0xa6, 0xf0, 0x00, 0x00, 0xa7, 0x8c, 0x00, 0x00, 0xa8, 0x20, 0x00, 0x00, 0xa8, 0xfc, + 0x00, 0x00, 0xa9, 0xd8, 0x00, 0x00, 0xaa, 0x48, 0x00, 0x00, 0xab, 0x90, 0x00, 0x00, 0xac, 0x80, + 0x00, 0x00, 0xac, 0x94, 0x00, 0x00, 0xac, 0xa8, 0x00, 0x00, 0xac, 0xbc, 0x00, 0x00, 0xac, 0xd0, + 0x00, 0x00, 0xac, 0xe4, 0x00, 0x00, 0xac, 0xf8, 0x00, 0x00, 0xad, 0x0c, 0x00, 0x00, 0xad, 0x20, + 0x00, 0x00, 0xad, 0x34, 0x00, 0x00, 0xad, 0x48, 0x00, 0x00, 0xae, 0x08, 0x00, 0x00, 0xae, 0xf4, + 0x00, 0x00, 0xb0, 0x54, 0x00, 0x00, 0xb1, 0xf8, 0x00, 0x00, 0xb3, 0x78, 0x00, 0x00, 0xb5, 0x60, + 0x00, 0x00, 0xb7, 0xa0, 0x00, 0x00, 0xb9, 0x48, 0x00, 0x00, 0xba, 0x84, 0x00, 0x00, 0xbc, 0x3c, + 0x00, 0x00, 0xbe, 0x14, 0x00, 0x00, 0xbf, 0x74, 0x00, 0x00, 0xc0, 0xac, 0x00, 0x00, 0xc2, 0x60, + 0x00, 0x00, 0xc3, 0x5c, 0x00, 0x00, 0xc4, 0x88, 0x00, 0x00, 0xc6, 0x00, 0x00, 0x00, 0xc7, 0x2c, + 0x00, 0x00, 0xc8, 0x8c, 0x00, 0x00, 0xc9, 0xdc, 0x00, 0x00, 0xcb, 0x40, 0x00, 0x00, 0xcc, 0xc4, + 0x00, 0x00, 0xce, 0x44, 0x00, 0x00, 0xcf, 0xe8, 0x00, 0x00, 0xd1, 0x20, 0x00, 0x00, 0xd3, 0x80, + 0x00, 0x00, 0xd4, 0x60, 0x00, 0x00, 0xd4, 0xe0, 0x00, 0x00, 0xd5, 0x30, 0x00, 0x00, 0xd5, 0xb0, + 0x00, 0x00, 0xd6, 0x98, 0x00, 0x00, 0xd6, 0xc8, 0x00, 0x00, 0xd6, 0xd8, 0x00, 0x00, 0xd7, 0x18, + 0x00, 0x00, 0xd7, 0x94, 0x00, 0x00, 0xd8, 0x74, 0x00, 0x00, 0xd9, 0x18, 0x00, 0x00, 0xd9, 0x30, + 0x00, 0x00, 0xd9, 0xb0, 0x00, 0x00, 0xda, 0x2c, 0x00, 0x00, 0xda, 0xbc, 0x00, 0x00, 0xdb, 0xa4, + 0x00, 0x00, 0xdc, 0x7c, 0x00, 0x00, 0xdc, 0x8c, 0x00, 0x00, 0xdd, 0x7c, 0x00, 0x00, 0xdd, 0x8c, + 0x00, 0x00, 0xdd, 0x9c, 0x00, 0x00, 0xdd, 0xac, 0x00, 0x00, 0xdd, 0xbc, 0x00, 0x00, 0xdd, 0xcc, + 0x00, 0x00, 0xdd, 0xdc, 0x00, 0x00, 0xdd, 0xec, 0x00, 0x00, 0xdd, 0xfc, 0x00, 0x00, 0xde, 0x0c, + 0x00, 0x00, 0xde, 0x1c, 0x00, 0x00, 0xde, 0x2c, 0x00, 0x00, 0xde, 0x40, 0x00, 0x00, 0xde, 0x54, + 0x00, 0x00, 0xde, 0x68, 0x00, 0x00, 0xde, 0x7c, 0x00, 0x00, 0xde, 0x90, 0x00, 0x00, 0xde, 0xa4, + 0x00, 0x00, 0xde, 0xb8, 0x00, 0x00, 0xde, 0xcc, 0x00, 0x00, 0xde, 0xe0, 0x00, 0x00, 0xde, 0xf4, + 0x00, 0x00, 0xdf, 0x20, 0x00, 0x00, 0xdf, 0x68, 0x00, 0x00, 0xdf, 0xa4, 0x00, 0x00, 0xdf, 0xd0, + 0x00, 0x00, 0xdf, 0xe0, 0x00, 0x00, 0xdf, 0xf0, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 0xe0, 0x10, + 0x00, 0x00, 0xe0, 0x20, 0x00, 0x00, 0xe0, 0x30, 0x00, 0x00, 0xe0, 0x40, 0x00, 0x00, 0xe0, 0x50, + 0x00, 0x00, 0xe0, 0x60, 0x00, 0x00, 0xe0, 0x70, 0x00, 0x00, 0xe0, 0x80, 0x00, 0x00, 0xe0, 0x90, + 0x00, 0x00, 0xe0, 0xa0, 0x00, 0x00, 0xe0, 0xb0, 0x00, 0x00, 0xe0, 0xc0, 0x00, 0x00, 0xe0, 0xd4, + 0x00, 0x00, 0xe0, 0xe4, 0x00, 0x00, 0xe0, 0xf4, 0x00, 0x00, 0xe1, 0x08, 0x00, 0x00, 0xe1, 0xe8, + 0x00, 0x00, 0xe2, 0xd4, 0x00, 0x00, 0xe3, 0x8c, 0x00, 0x00, 0xe4, 0x54, 0x00, 0x00, 0xe5, 0x04, + 0x00, 0x00, 0xe5, 0xa4, 0x00, 0x00, 0xe6, 0x34, 0x00, 0x00, 0xe7, 0x00, 0x00, 0x00, 0xe7, 0xac, + 0x00, 0x00, 0xe7, 0xbc, 0x00, 0x00, 0xe8, 0x8c, 0x00, 0x00, 0xe9, 0x28, 0x00, 0x00, 0xe9, 0xbc, + 0x00, 0x00, 0xea, 0xc0, 0x00, 0x00, 0xeb, 0x3c, 0x00, 0x00, 0xec, 0x08, 0x00, 0x00, 0xed, 0x14, + 0x00, 0x00, 0xed, 0x8c, 0x00, 0x00, 0xee, 0x50, 0x00, 0x00, 0xef, 0x40, 0x00, 0x00, 0xf0, 0x1c, + 0x00, 0x00, 0xf0, 0xa0, 0x00, 0x00, 0xf1, 0x48, 0x00, 0x00, 0xf2, 0x00, 0x00, 0x00, 0xf2, 0xd0, + 0x00, 0x00, 0xf3, 0x68, 0x00, 0x00, 0xf4, 0x38, 0x00, 0x00, 0xf5, 0x4c, 0x00, 0x00, 0xf5, 0xfc, + 0x00, 0x00, 0xf6, 0x6c, 0x00, 0x00, 0xf7, 0x4c, 0x00, 0x00, 0xf7, 0xf8, 0x00, 0x00, 0xf8, 0xac, + 0x00, 0x00, 0xf9, 0x94, 0x00, 0x00, 0xfa, 0x90, 0x00, 0x00, 0xfb, 0x48, 0x00, 0x00, 0xfb, 0xf8, + 0x00, 0x00, 0xfc, 0xb4, 0x00, 0x00, 0xfd, 0x88, 0x00, 0x00, 0xfe, 0x8c, 0x00, 0x00, 0xfe, 0x9c, + 0x00, 0x00, 0xff, 0x70, 0x00, 0x01, 0x00, 0x40, 0x00, 0x01, 0x00, 0xa0, 0x00, 0x01, 0x01, 0x58, + 0x00, 0x01, 0x01, 0xd0, 0x00, 0x01, 0x02, 0x6c, 0x00, 0x01, 0x03, 0x04, 0x00, 0x01, 0x03, 0xb4, + 0x00, 0x01, 0x04, 0x64, 0x00, 0x01, 0x05, 0x3c, 0x00, 0x01, 0x06, 0x30, 0x00, 0x01, 0x07, 0x2c, + 0x00, 0x01, 0x08, 0x50, 0x00, 0x01, 0x09, 0x14, 0x00, 0x01, 0x09, 0xf4, 0x00, 0x01, 0x0a, 0xb4, + 0x00, 0x01, 0x0b, 0x8c, 0x00, 0x01, 0x0c, 0x7c, 0x00, 0x01, 0x0d, 0x38, 0x00, 0x01, 0x0d, 0xfc, + 0x00, 0x01, 0x0e, 0xe4, 0x00, 0x01, 0x0f, 0x74, 0x00, 0x01, 0x0f, 0x84, 0x00, 0x01, 0x0f, 0x9c, + 0x00, 0x01, 0x10, 0x3c, 0x00, 0x01, 0x10, 0x4c, 0x00, 0x01, 0x11, 0x80, 0x00, 0x01, 0x12, 0xb8, + 0x00, 0x01, 0x14, 0x08, 0x00, 0x01, 0x14, 0x9c, 0x00, 0x01, 0x15, 0x7c, 0x00, 0x01, 0x16, 0x9c, + 0x00, 0x01, 0x17, 0x48, 0x00, 0x01, 0x18, 0x64, 0x00, 0x01, 0x19, 0xa8, 0x00, 0x01, 0x19, 0xd4, + 0x00, 0x01, 0x19, 0xfc, 0x00, 0x01, 0x1a, 0x28, 0x00, 0x01, 0x1a, 0x54, 0x00, 0x01, 0x1a, 0x80, + 0x00, 0x01, 0x1a, 0xa8, 0x00, 0x01, 0x1a, 0xd4, 0x00, 0x01, 0x1a, 0xfc, 0x00, 0x01, 0x1c, 0x10, + 0x00, 0x01, 0x1c, 0x48, 0x00, 0x01, 0x1d, 0x50, 0x00, 0x01, 0x1d, 0x88, 0x00, 0x01, 0x1e, 0xd8, + 0x00, 0x01, 0x1f, 0x10, 0x00, 0x01, 0x20, 0x48, 0x00, 0x01, 0x20, 0x80, 0x00, 0x01, 0x21, 0x6c, + 0x00, 0x01, 0x23, 0x6c, 0x00, 0x01, 0x23, 0xa4, 0x00, 0x01, 0x24, 0xd0, 0x00, 0x01, 0x25, 0x00, + 0x00, 0x01, 0x25, 0x2c, 0x00, 0x01, 0x25, 0x54, 0x00, 0x01, 0x26, 0x48, 0x00, 0x01, 0x27, 0x58, + 0x00, 0x01, 0x27, 0x84, 0x00, 0x01, 0x27, 0xac, 0x00, 0x01, 0x27, 0xdc, 0x00, 0x01, 0x28, 0xa0, + 0x00, 0x01, 0x29, 0x70, 0x00, 0x01, 0x2a, 0x40, 0x00, 0x01, 0x2a, 0x6c, 0x00, 0x01, 0x2a, 0x94, + 0x00, 0x01, 0x2a, 0xc4, 0x00, 0x01, 0x2a, 0xec, 0x00, 0x01, 0x2b, 0x14, 0x00, 0x01, 0x2c, 0x04, + 0x00, 0x01, 0x2d, 0x10, 0x00, 0x01, 0x2e, 0x0c, 0x00, 0x01, 0x2e, 0x38, 0x00, 0x01, 0x2e, 0x60, + 0x00, 0x01, 0x2f, 0x34, 0x00, 0x01, 0x2f, 0xc0, 0x00, 0x01, 0x2f, 0xf0, 0x00, 0x01, 0x30, 0x1c, + 0x00, 0x01, 0x31, 0x64, 0x00, 0x01, 0x31, 0x8c, 0x00, 0x01, 0x31, 0xb8, 0x00, 0x01, 0x31, 0xe0, + 0x00, 0x01, 0x32, 0x04, 0x00, 0x01, 0x32, 0x30, 0x00, 0x01, 0x32, 0x64, 0x00, 0x01, 0x32, 0x94, + 0x00, 0x01, 0x32, 0xc0, 0x00, 0x01, 0x32, 0xe8, 0x00, 0x01, 0x33, 0x1c, 0x00, 0x01, 0x33, 0x50, + 0x00, 0x01, 0x33, 0x80, 0x00, 0x01, 0x33, 0xa8, 0x00, 0x01, 0x33, 0xdc, 0x00, 0x01, 0x34, 0x10, + 0x00, 0x01, 0x34, 0x3c, 0x00, 0x01, 0x34, 0x68, 0x00, 0x01, 0x34, 0x9c, 0x00, 0x01, 0x34, 0xd0, + 0x00, 0x01, 0x34, 0xfc, 0x00, 0x01, 0x35, 0x24, 0x00, 0x01, 0x35, 0x58, 0x00, 0x01, 0x35, 0x8c, + 0x00, 0x01, 0x35, 0xbc, 0x00, 0x01, 0x35, 0xe4, 0x00, 0x01, 0x36, 0x18, 0x00, 0x01, 0x36, 0x4c, + 0x00, 0x01, 0x36, 0x78, 0x00, 0x01, 0x36, 0xa0, 0x00, 0x01, 0x37, 0x80, 0x00, 0x01, 0x38, 0x44, + 0x00, 0x01, 0x38, 0x70, 0x00, 0x01, 0x39, 0x14, 0x00, 0x01, 0x39, 0x84, 0x00, 0x01, 0x3a, 0x8c, + 0x00, 0x01, 0x3b, 0x9c, 0x00, 0x01, 0x3c, 0xb0, 0x00, 0x01, 0x3d, 0x70, 0x00, 0x01, 0x3e, 0x1c, + 0x00, 0x01, 0x3e, 0x48, 0x00, 0x01, 0x3e, 0x70, 0x00, 0x01, 0x3f, 0x44, 0x00, 0x01, 0x40, 0x40, + 0x00, 0x01, 0x42, 0x10, 0x00, 0x01, 0x42, 0x48, 0x00, 0x01, 0x43, 0xa4, 0x00, 0x01, 0x43, 0xd4, + 0x00, 0x01, 0x44, 0x00, 0x00, 0x01, 0x44, 0x28, 0x00, 0x01, 0x45, 0x4c, 0x00, 0x01, 0x45, 0x7c, + 0x00, 0x01, 0x45, 0xa8, 0x00, 0x01, 0x45, 0xd0, 0x00, 0x01, 0x46, 0x8c, 0x00, 0x01, 0x47, 0xa8, + 0x00, 0x01, 0x48, 0xb4, 0x00, 0x01, 0x49, 0xb8, 0x00, 0x01, 0x4a, 0xb8, 0x00, 0x01, 0x4b, 0x70, + 0x00, 0x01, 0x4c, 0x74, 0x00, 0x01, 0x4d, 0x68, 0x00, 0x01, 0x4d, 0xcc, 0x00, 0x01, 0x4e, 0x50, + 0x00, 0x01, 0x4f, 0x5c, 0x00, 0x01, 0x50, 0x00, 0x00, 0x01, 0x50, 0x8c, 0x00, 0x01, 0x51, 0x20, + 0x00, 0x01, 0x52, 0x38, 0x00, 0x01, 0x53, 0x38, 0x00, 0x01, 0x53, 0x48, 0x00, 0x01, 0x53, 0xf0, + 0x00, 0x01, 0x55, 0x14, 0x00, 0x01, 0x55, 0xa0, 0x00, 0x01, 0x56, 0x88, 0x00, 0x01, 0x57, 0x40, + 0x00, 0x01, 0x57, 0xec, 0x00, 0x01, 0x58, 0xa8, 0x00, 0x01, 0x59, 0x30, 0x00, 0x01, 0x5a, 0x4c, + 0x00, 0x01, 0x5b, 0x64, 0x00, 0x01, 0x5c, 0x10, 0x00, 0x01, 0x5c, 0x6c, 0x00, 0x01, 0x5c, 0xb0, + 0x00, 0x01, 0x5d, 0x4c, 0x00, 0x01, 0x5d, 0xe4, 0x00, 0x01, 0x5e, 0x38, 0x00, 0x01, 0x5e, 0xc0, + 0x00, 0x01, 0x5f, 0x54, 0x00, 0x01, 0x60, 0x00, 0x00, 0x01, 0x60, 0xa0, 0x00, 0x01, 0x60, 0xcc, + 0x00, 0x01, 0x61, 0x04, 0x00, 0x01, 0x61, 0x3c, 0x00, 0x01, 0x61, 0xdc, 0x00, 0x01, 0x62, 0x80, + 0x00, 0x01, 0x63, 0x4c, 0x00, 0x01, 0x63, 0x78, 0x00, 0x01, 0x63, 0xac, 0x00, 0x01, 0x64, 0x70, + 0x00, 0x01, 0x64, 0x9c, 0x00, 0x01, 0x65, 0x38, 0x00, 0x01, 0x65, 0x48, 0x00, 0x01, 0x65, 0x58, + 0x00, 0x01, 0x65, 0x8c, 0x00, 0x01, 0x65, 0x9c, 0x00, 0x01, 0x66, 0x6c, 0x00, 0x01, 0x67, 0x3c, + 0x00, 0x01, 0x67, 0xc4, 0x00, 0x01, 0x67, 0xf4, 0x00, 0x01, 0x68, 0x20, 0x00, 0x01, 0x68, 0x4c, + 0x00, 0x01, 0x68, 0xb8, 0x00, 0x01, 0x68, 0xc8, 0x00, 0x01, 0x69, 0x64, 0x00, 0x01, 0x69, 0x74, + 0x00, 0x01, 0x69, 0xd0, 0x00, 0x01, 0x6a, 0xc4, 0x00, 0x01, 0x6a, 0xd4, 0x00, 0x01, 0x6b, 0xc0, + 0x00, 0x01, 0x6c, 0xf4, 0x00, 0x01, 0x6d, 0x68, 0x00, 0x01, 0x6d, 0x94, 0x00, 0x01, 0x6d, 0xa4, + 0x00, 0x01, 0x6e, 0x14, 0x00, 0x01, 0x6e, 0x24, 0x00, 0x01, 0x6e, 0x34, 0x00, 0x01, 0x6e, 0x44, + 0x00, 0x01, 0x6e, 0xa0, 0x00, 0x01, 0x6e, 0xb0, 0x00, 0x01, 0x6e, 0xc0, 0x00, 0x01, 0x6e, 0xd0, + 0x00, 0x01, 0x6f, 0x80, 0x00, 0x01, 0x70, 0x5c, 0x00, 0x01, 0x70, 0x6c, 0x00, 0x01, 0x70, 0xf8, + 0x00, 0x01, 0x71, 0x88, 0x00, 0x01, 0x71, 0xf0, 0x00, 0x01, 0x72, 0x84, 0x00, 0x01, 0x73, 0x14, + 0x00, 0x01, 0x73, 0xe0, 0x00, 0x01, 0x74, 0x70, 0x00, 0x01, 0x75, 0x14, 0x00, 0x01, 0x76, 0x00, + 0x00, 0x01, 0x76, 0xac, 0x00, 0x01, 0x76, 0xbc, 0x00, 0x01, 0x77, 0xa8, 0x00, 0x01, 0x78, 0xc4, + 0x00, 0x01, 0x79, 0x0c, 0x00, 0x01, 0x79, 0xb4, 0x00, 0x01, 0x79, 0xc4, 0x00, 0x01, 0x7a, 0xb8, + 0x00, 0x01, 0x7b, 0x94, 0x00, 0x01, 0x7c, 0x08, 0x00, 0x01, 0x7c, 0x30, 0x00, 0x01, 0x7c, 0xdc, + 0x00, 0x01, 0x7d, 0x48, 0x00, 0x01, 0x7e, 0x2c, 0x00, 0x01, 0x7e, 0x90, 0x00, 0x01, 0x7e, 0xa0, + 0x00, 0x01, 0x7f, 0x08, 0x00, 0x01, 0x7f, 0x18, 0x00, 0x01, 0x7f, 0x28, 0x00, 0x01, 0x7f, 0x78, + 0x00, 0x01, 0x7f, 0x88, 0x00, 0x01, 0x80, 0x74, 0x00, 0x01, 0x80, 0x84, 0x00, 0x01, 0x80, 0xe8, + 0x00, 0x01, 0x81, 0x5c, 0x00, 0x01, 0x81, 0xdc, 0x00, 0x01, 0x82, 0x90, 0x00, 0x01, 0x83, 0x40, + 0x00, 0x01, 0x84, 0x0c, 0x00, 0x01, 0x84, 0xb4, 0x00, 0x01, 0x85, 0x68, 0x00, 0x01, 0x86, 0x50, + 0x00, 0x01, 0x86, 0xfc, 0x00, 0x01, 0x87, 0x28, 0x00, 0x01, 0x87, 0x58, 0x00, 0x01, 0x88, 0x34, + 0x00, 0x01, 0x88, 0x5c, 0x00, 0x01, 0x89, 0x10, 0x00, 0x01, 0x89, 0x20, 0x00, 0x01, 0x89, 0x30, + 0x00, 0x01, 0x89, 0x64, 0x00, 0x01, 0x89, 0x74, 0x00, 0x01, 0x8a, 0x48, 0x00, 0x01, 0x8b, 0x28, + 0x00, 0x01, 0x8b, 0x38, 0x00, 0x01, 0x8b, 0x64, 0x00, 0x01, 0x8b, 0x90, 0x00, 0x01, 0x8b, 0xb8, + 0x00, 0x01, 0x8c, 0x2c, 0x00, 0x01, 0x8d, 0x18, 0x00, 0x01, 0x8d, 0xc8, 0x00, 0x01, 0x8e, 0x90, + 0x00, 0x01, 0x8f, 0x90, 0x00, 0x01, 0x90, 0x78, 0x00, 0x01, 0x91, 0x30, 0x00, 0x01, 0x91, 0xcc, + 0x00, 0x01, 0x92, 0xb8, 0x00, 0x01, 0x93, 0xa4, 0x00, 0x01, 0x94, 0x6c, 0x00, 0x01, 0x95, 0x58, + 0x00, 0x01, 0x96, 0x24, 0x00, 0x01, 0x96, 0xe0, 0x00, 0x01, 0x97, 0x3c, 0x00, 0x01, 0x97, 0x90, + 0x00, 0x01, 0x98, 0x08, 0x00, 0x01, 0x98, 0x68, 0x00, 0x01, 0x99, 0x1c, 0x00, 0x01, 0x99, 0xcc, + 0x00, 0x01, 0x9a, 0xcc, 0x00, 0x01, 0x9b, 0xb4, 0x00, 0x01, 0x9d, 0x0c, 0x00, 0x01, 0x9e, 0x34, + 0x00, 0x01, 0x9e, 0xd4, 0x00, 0x01, 0x9f, 0x78, 0x00, 0x01, 0xa0, 0x70, 0x00, 0x01, 0xa1, 0x5c, + 0x00, 0x01, 0xa2, 0x18, 0x00, 0x01, 0xa2, 0xd4, 0x00, 0x01, 0xa3, 0x64, 0x00, 0x01, 0xa3, 0xfc, + 0x00, 0x01, 0xa4, 0x7c, 0x00, 0x01, 0xa5, 0x18, 0x00, 0x01, 0xa5, 0xd4, 0x00, 0x01, 0xa6, 0x54, + 0x00, 0x01, 0xa7, 0x24, 0x00, 0x01, 0xa7, 0xf0, 0x00, 0x01, 0xa9, 0x50, 0x00, 0x01, 0xaa, 0x88, + 0x00, 0x01, 0xaa, 0x98, 0x00, 0x01, 0xaa, 0xa8, 0x00, 0x01, 0xab, 0x08, 0x00, 0x01, 0xab, 0x64, + 0x00, 0x01, 0xab, 0x74, 0x00, 0x01, 0xab, 0xf8, 0x00, 0x01, 0xac, 0xd4, 0x00, 0x01, 0xad, 0x9c, + 0x00, 0x01, 0xae, 0x40, 0x00, 0x01, 0xae, 0xe4, 0x00, 0x01, 0xaf, 0x64, 0x00, 0x01, 0xaf, 0xe0, + 0x00, 0x01, 0xb0, 0x78, 0x00, 0x01, 0xb1, 0x40, 0x00, 0x01, 0xb1, 0xdc, 0x00, 0x01, 0xb2, 0x98, + 0x00, 0x01, 0xb3, 0x20, 0x00, 0x01, 0xb3, 0x30, 0x00, 0x01, 0xb4, 0x38, 0x00, 0x01, 0xb5, 0x40, + 0x00, 0x01, 0xb6, 0x3c, 0x00, 0x01, 0xb7, 0x40, 0x00, 0x01, 0xb7, 0x50, 0x00, 0x01, 0xb7, 0x7c, + 0x00, 0x01, 0xb7, 0xa4, 0x00, 0x01, 0xb8, 0x68, 0x00, 0x01, 0xb9, 0x2c, 0x00, 0x01, 0xb9, 0xd4, + 0x00, 0x01, 0xba, 0x78, 0x00, 0x01, 0xbb, 0x18, 0x00, 0x01, 0xbb, 0xac, 0x00, 0x01, 0xbc, 0x5c, + 0x00, 0x01, 0xbd, 0x04, 0x00, 0x01, 0xbd, 0xa4, 0x00, 0x01, 0xbe, 0x44, 0x00, 0x01, 0xbf, 0x50, + 0x00, 0x01, 0xc0, 0x1c, 0x00, 0x01, 0xc0, 0x74, 0x00, 0x01, 0xc0, 0xa0, 0x00, 0x01, 0xc0, 0xc8, + 0x00, 0x01, 0xc0, 0xfc, 0x00, 0x01, 0xc1, 0x2c, 0x00, 0x01, 0xc1, 0x3c, 0x00, 0x01, 0xc1, 0x4c, + 0x00, 0x01, 0xc1, 0x78, 0x00, 0x01, 0xc1, 0xa0, 0x00, 0x01, 0xc1, 0xb0, 0x00, 0x01, 0xc2, 0x6c, + 0x00, 0x01, 0xc2, 0xa0, 0x00, 0x01, 0xc2, 0xd4, 0x00, 0x01, 0xc3, 0x08, 0x00, 0x01, 0xc3, 0x38, + 0x00, 0x01, 0xc3, 0x6c, 0x00, 0x01, 0xc3, 0x9c, 0x00, 0x01, 0xc3, 0xac, 0x00, 0x01, 0xc3, 0xbc, + 0x00, 0x01, 0xc3, 0xe8, 0x00, 0x01, 0xc4, 0x10, 0x00, 0x01, 0xc4, 0x44, 0x00, 0x01, 0xc4, 0x74, + 0x00, 0x01, 0xc4, 0xa8, 0x00, 0x01, 0xc4, 0xd8, 0x00, 0x01, 0xc5, 0x78, 0x00, 0x01, 0xc6, 0x24, + 0x00, 0x01, 0xc6, 0x58, 0x00, 0x01, 0xc6, 0x88, 0x00, 0x01, 0xc6, 0xbc, 0x00, 0x01, 0xc6, 0xec, + 0x00, 0x01, 0xc7, 0x18, 0x00, 0x01, 0xc7, 0x40, 0x00, 0x01, 0xc7, 0x74, 0x00, 0x01, 0xc7, 0xa4, + 0x00, 0x01, 0xc7, 0xd8, 0x00, 0x01, 0xc8, 0x08, 0x00, 0x01, 0xc8, 0x3c, 0x00, 0x01, 0xc8, 0x6c, + 0x00, 0x01, 0xc8, 0xe0, 0x00, 0x01, 0xc9, 0x34, 0x00, 0x01, 0xc9, 0x68, 0x00, 0x01, 0xc9, 0x98, + 0x00, 0x01, 0xca, 0xd8, 0x00, 0x01, 0xcb, 0x04, 0x00, 0x01, 0xcc, 0x0c, 0x00, 0x01, 0xcc, 0xd4, + 0x00, 0x01, 0xcd, 0x78, 0x00, 0x01, 0xce, 0x54, 0x00, 0x01, 0xce, 0xac, 0x00, 0x01, 0xce, 0xbc, + 0x00, 0x01, 0xce, 0xcc, 0x00, 0x01, 0xce, 0xdc, 0x00, 0x01, 0xce, 0xec, 0x00, 0x01, 0xce, 0xfc, + 0x00, 0x01, 0xcf, 0x0c, 0x00, 0x01, 0xcf, 0x1c, 0x00, 0x01, 0xcf, 0xc4, 0x00, 0x01, 0xcf, 0xd4, + 0x00, 0x01, 0xcf, 0xe4, 0x00, 0x01, 0xd0, 0x4c, 0x00, 0x01, 0xd0, 0x5c, 0x00, 0x01, 0xd0, 0x6c, + 0x00, 0x01, 0xd0, 0xcc, 0x00, 0x01, 0xd0, 0xdc, 0x00, 0x01, 0xd0, 0xec, 0x00, 0x01, 0xd0, 0xfc, + 0x00, 0x01, 0xd1, 0xd0, 0x00, 0x01, 0xd1, 0xe0, 0x00, 0x01, 0xd1, 0xf0, 0x00, 0x01, 0xd2, 0x00, + 0x00, 0x01, 0xd2, 0x10, 0x00, 0x01, 0xd3, 0x14, 0x00, 0x01, 0xd3, 0xd8, 0x00, 0x01, 0xd4, 0x98, + 0x00, 0x01, 0xd5, 0x90, 0x00, 0x01, 0xd6, 0x40, 0x00, 0x01, 0xd7, 0x38, 0x00, 0x01, 0xd8, 0x48, + 0x00, 0x01, 0xd8, 0xf4, 0x00, 0x01, 0xd9, 0x68, 0x00, 0x01, 0xda, 0x00, 0x00, 0x01, 0xda, 0x70, + 0x00, 0x01, 0xdb, 0x10, 0x00, 0x01, 0xdb, 0xb0, 0x00, 0x01, 0xdb, 0xc0, 0x00, 0x01, 0xdb, 0xd0, + 0x00, 0x01, 0xdc, 0xd8, 0x00, 0x01, 0xdc, 0xe8, 0x00, 0x01, 0xdc, 0xf8, 0x00, 0x01, 0xdd, 0x8c, + 0x00, 0x01, 0xde, 0x48, 0x00, 0x01, 0xde, 0xfc, 0x00, 0x01, 0xdf, 0x88, 0x00, 0x01, 0xdf, 0xf0, + 0x00, 0x01, 0xe0, 0xd4, 0x00, 0x01, 0xe0, 0xe4, 0x00, 0x01, 0xe1, 0x9c, 0x00, 0x01, 0xe2, 0x98, + 0x00, 0x01, 0xe2, 0xc0, 0x00, 0x01, 0xe2, 0xd8, 0x00, 0x01, 0xe3, 0x00, 0x00, 0x01, 0xe3, 0x28, + 0x00, 0x01, 0xe3, 0x5c, 0x00, 0x01, 0xe3, 0x84, 0x00, 0x01, 0xe3, 0xac, 0x00, 0x01, 0xe3, 0xe0, + 0x00, 0x01, 0xe4, 0x08, 0x00, 0x01, 0xe4, 0x30, 0x00, 0x01, 0xe4, 0x58, 0x00, 0x01, 0xe4, 0x80, + 0x00, 0x01, 0xe4, 0xac, 0x00, 0x01, 0xe4, 0xdc, 0x00, 0x01, 0xe5, 0x18, 0x00, 0x01, 0xe5, 0x40, + 0x00, 0x01, 0xe5, 0x70, 0x00, 0x01, 0xe5, 0x98, 0x00, 0x01, 0xe5, 0xd0, 0x00, 0x01, 0xe5, 0xf8, + 0x00, 0x01, 0xe6, 0x24, 0x00, 0x01, 0xe6, 0x50, 0x00, 0x01, 0xe6, 0xdc, 0x00, 0x01, 0xe7, 0x08, + 0x00, 0x01, 0xe7, 0x34, 0x00, 0x01, 0xe7, 0x64, 0x00, 0x01, 0xe7, 0x98, 0x00, 0x01, 0xe7, 0xc8, + 0x00, 0x01, 0xe7, 0xf8, 0x00, 0x01, 0xe8, 0x2c, 0x00, 0x01, 0xe8, 0x60, 0x00, 0x01, 0xe8, 0x88, + 0x00, 0x01, 0xe8, 0xb0, 0x00, 0x01, 0xe8, 0xdc, 0x00, 0x01, 0xe9, 0x08, 0x00, 0x01, 0xe9, 0x34, + 0x00, 0x01, 0xe9, 0x60, 0x00, 0x01, 0xe9, 0x8c, 0x00, 0x01, 0xe9, 0xb8, 0x00, 0x01, 0xe9, 0xe0, + 0x00, 0x01, 0xea, 0x0c, 0x00, 0x01, 0xea, 0x3c, 0x00, 0x01, 0xea, 0x70, 0x00, 0x01, 0xea, 0xa0, + 0x00, 0x01, 0xea, 0xd0, 0x00, 0x01, 0xea, 0xf8, 0x00, 0x01, 0xeb, 0x20, 0x00, 0x01, 0xeb, 0x4c, + 0x00, 0x01, 0xeb, 0x78, 0x00, 0x01, 0xeb, 0xa4, 0x00, 0x01, 0xeb, 0xd0, 0x00, 0x01, 0xeb, 0xfc, + 0x00, 0x01, 0xec, 0x28, 0x00, 0x01, 0xec, 0x58, 0x00, 0x01, 0xec, 0x8c, 0x00, 0x01, 0xec, 0xbc, + 0x00, 0x01, 0xec, 0xec, 0x00, 0x01, 0xed, 0x20, 0x00, 0x01, 0xed, 0x54, 0x00, 0x01, 0xed, 0x7c, + 0x00, 0x01, 0xed, 0xa4, 0x00, 0x01, 0xed, 0xd0, 0x00, 0x01, 0xed, 0xfc, 0x00, 0x01, 0xee, 0x28, + 0x00, 0x01, 0xee, 0x54, 0x00, 0x01, 0xee, 0x80, 0x00, 0x01, 0xee, 0xac, 0x00, 0x01, 0xee, 0xd8, + 0x00, 0x01, 0xef, 0x04, 0x00, 0x01, 0xef, 0x34, 0x00, 0x01, 0xef, 0x68, 0x00, 0x01, 0xef, 0x98, + 0x00, 0x01, 0xef, 0xc8, 0x00, 0x01, 0xef, 0xfc, 0x00, 0x01, 0xf0, 0x30, 0x00, 0x01, 0xf0, 0x58, + 0x00, 0x01, 0xf0, 0x80, 0x00, 0x01, 0xf0, 0xac, 0x00, 0x01, 0xf0, 0xd8, 0x00, 0x01, 0xf1, 0x04, + 0x00, 0x01, 0xf1, 0x30, 0x00, 0x01, 0xf1, 0x5c, 0x00, 0x01, 0xf1, 0x88, 0x00, 0x01, 0xf1, 0xb0, + 0x00, 0x01, 0xf1, 0xd8, 0x00, 0x01, 0xf2, 0x08, 0x00, 0x01, 0xf2, 0x38, 0x00, 0x01, 0xf2, 0x68, + 0x00, 0x01, 0xf2, 0x98, 0x00, 0x01, 0xf2, 0xc0, 0x00, 0x01, 0xf2, 0xe8, 0x00, 0x01, 0xf3, 0x14, + 0x00, 0x01, 0xf3, 0x40, 0x00, 0x01, 0xf3, 0x6c, 0x00, 0x01, 0xf3, 0x98, 0x00, 0x01, 0xf3, 0xc0, + 0x00, 0x01, 0xf3, 0xe8, 0x00, 0x01, 0xf4, 0x18, 0x00, 0x01, 0xf4, 0x48, 0x00, 0x01, 0xf4, 0x78, + 0x00, 0x01, 0xf4, 0xa8, 0x00, 0x01, 0xf4, 0xd8, 0x00, 0x01, 0xf5, 0x08, 0x00, 0x01, 0xf5, 0x30, + 0x00, 0x01, 0xf5, 0x5c, 0x00, 0x01, 0xf5, 0x88, 0x00, 0x01, 0xf5, 0xb4, 0x00, 0x01, 0xf5, 0xe0, + 0x00, 0x01, 0xf6, 0x0c, 0x00, 0x01, 0xf6, 0x3c, 0x00, 0x01, 0xf6, 0x70, 0x00, 0x01, 0xf6, 0xa0, + 0x00, 0x01, 0xf6, 0xd0, 0x00, 0x01, 0xf7, 0x04, 0x00, 0x01, 0xf7, 0x38, 0x00, 0x01, 0xf7, 0x60, + 0x00, 0x01, 0xf7, 0x88, 0x00, 0x01, 0xf7, 0xb4, 0x00, 0x01, 0xf7, 0xe0, 0x00, 0x01, 0xf8, 0x0c, + 0x00, 0x01, 0xf8, 0x38, 0x00, 0x01, 0xf8, 0x64, 0x00, 0x01, 0xf8, 0x90, 0x00, 0x01, 0xf8, 0xb8, + 0x00, 0x01, 0xf8, 0xe0, 0x00, 0x01, 0xf9, 0x08, 0x00, 0x01, 0xf9, 0x30, 0x00, 0x01, 0xf9, 0x58, + 0x00, 0x01, 0xf9, 0x80, 0x00, 0x01, 0xf9, 0xa8, 0x00, 0x01, 0xf9, 0xd0, 0x00, 0x01, 0xf9, 0xf8, + 0x00, 0x01, 0xfa, 0x20, 0x00, 0x01, 0xfa, 0x48, 0x00, 0x01, 0xfa, 0x70, 0x00, 0x01, 0xfa, 0x98, + 0x00, 0x01, 0xfa, 0xc0, 0x00, 0x01, 0xfa, 0xf0, 0x00, 0x01, 0xfb, 0x20, 0x00, 0x01, 0xfb, 0x50, + 0x00, 0x01, 0xfb, 0x80, 0x00, 0x01, 0xfb, 0xb0, 0x00, 0x01, 0xfb, 0xe0, 0x00, 0x01, 0xfc, 0x10, + 0x00, 0x01, 0xfc, 0x40, 0x00, 0x01, 0xfc, 0x58, 0x00, 0x01, 0xfc, 0x70, 0x00, 0x01, 0xfc, 0x88, + 0x00, 0x01, 0xfc, 0xa0, 0x00, 0x01, 0xfc, 0xb8, 0x00, 0x01, 0xfc, 0xd0, 0x00, 0x01, 0xfc, 0xe8, + 0x00, 0x01, 0xfd, 0x00, 0x00, 0x01, 0xfd, 0x30, 0x00, 0x01, 0xfd, 0x60, 0x00, 0x01, 0xfd, 0x90, + 0x00, 0x01, 0xfd, 0xc0, 0x00, 0x01, 0xfd, 0xf0, 0x00, 0x01, 0xfe, 0x20, 0x00, 0x01, 0xfe, 0x50, + 0x00, 0x01, 0xfe, 0x80, 0x00, 0x01, 0xfe, 0x98, 0x00, 0x01, 0xfe, 0xb0, 0x00, 0x01, 0xfe, 0xc8, + 0x00, 0x01, 0xfe, 0xe0, 0x00, 0x01, 0xfe, 0xf8, 0x00, 0x01, 0xff, 0x10, 0x00, 0x01, 0xff, 0x28, + 0x00, 0x01, 0xff, 0x40, 0x00, 0x01, 0xff, 0x6c, 0x00, 0x01, 0xff, 0x98, 0x00, 0x01, 0xff, 0xc8, + 0x00, 0x01, 0xff, 0xf8, 0x00, 0x02, 0x00, 0x28, 0x00, 0x02, 0x00, 0x58, 0x00, 0x02, 0x00, 0x88, + 0x00, 0x02, 0x00, 0xb8, 0x00, 0x02, 0x00, 0xe0, 0x00, 0x02, 0x01, 0x08, 0x00, 0x02, 0x01, 0x34, + 0x00, 0x02, 0x01, 0x60, 0x00, 0x02, 0x01, 0x8c, 0x00, 0x02, 0x01, 0xb8, 0x00, 0x02, 0x01, 0xe4, + 0x00, 0x02, 0x02, 0x10, 0x00, 0x02, 0x02, 0x3c, 0x00, 0x02, 0x02, 0x68, 0x00, 0x02, 0x02, 0x94, + 0x00, 0x02, 0x02, 0xbc, 0x00, 0x02, 0x02, 0xe8, 0x00, 0x02, 0x03, 0x10, 0x00, 0x02, 0x03, 0x3c, + 0x00, 0x02, 0x03, 0x68, 0x00, 0x02, 0x03, 0x94, 0x00, 0x02, 0x03, 0xbc, 0x00, 0x02, 0x03, 0xe4, + 0x00, 0x02, 0x04, 0x8c, 0x00, 0x02, 0x04, 0x9c, 0x00, 0x02, 0x04, 0xe4, 0x00, 0x02, 0x05, 0x30, + 0x00, 0x02, 0x05, 0x8c, 0x00, 0x02, 0x06, 0x5c, 0x00, 0x02, 0x06, 0x8c, 0x00, 0x02, 0x06, 0xb4, + 0x00, 0x02, 0x06, 0xe4, 0x00, 0x02, 0x07, 0x10, 0x00, 0x02, 0x07, 0x40, 0x00, 0x02, 0x07, 0x68, + 0x00, 0x02, 0x07, 0x90, 0x00, 0x02, 0x07, 0xb8, 0x00, 0x02, 0x07, 0xe0, 0x00, 0x02, 0x08, 0xa4, + 0x00, 0x02, 0x09, 0x10, 0x00, 0x02, 0x09, 0x7c, 0x00, 0x02, 0x0a, 0x2c, 0x00, 0x02, 0x0a, 0x58, + 0x00, 0x02, 0x0a, 0x84, 0x00, 0x02, 0x0a, 0xc0, 0x00, 0x02, 0x0a, 0xfc, 0x00, 0x02, 0x0b, 0x28, + 0x00, 0x02, 0x0b, 0x60, 0x00, 0x02, 0x0b, 0x8c, 0x00, 0x02, 0x0b, 0xb8, 0x00, 0x02, 0x0b, 0xe0, + 0x00, 0x02, 0x0c, 0x08, 0x00, 0x02, 0x0c, 0x6c, 0x00, 0x02, 0x0c, 0xd0, 0x00, 0x02, 0x0d, 0x74, + 0x00, 0x02, 0x0d, 0x9c, 0x00, 0x02, 0x0d, 0xc4, 0x00, 0x02, 0x0d, 0xfc, 0x00, 0x02, 0x0e, 0x34, + 0x00, 0x02, 0x0e, 0x60, 0x00, 0x02, 0x0e, 0x8c, 0x00, 0x02, 0x0e, 0xb4, 0x00, 0x02, 0x0e, 0xe8, + 0x00, 0x02, 0x0f, 0x14, 0x00, 0x02, 0x0f, 0x40, 0x00, 0x02, 0x0f, 0x68, 0x00, 0x02, 0x0f, 0x90, + 0x00, 0x02, 0x0f, 0xb8, 0x00, 0x02, 0x10, 0x3c, 0x00, 0x02, 0x10, 0x4c, 0x00, 0x02, 0x10, 0x78, + 0x00, 0x02, 0x10, 0xa8, 0x00, 0x02, 0x10, 0xcc, 0x00, 0x02, 0x10, 0xf8, 0x00, 0x02, 0x11, 0x24, + 0x00, 0x02, 0x11, 0x54, 0x00, 0x02, 0x11, 0x7c, 0x00, 0x02, 0x11, 0xa4, 0x00, 0x02, 0x11, 0xcc, + 0x00, 0x02, 0x11, 0xf4, 0x00, 0x02, 0x13, 0xc0, 0x00, 0x02, 0x13, 0xec, 0x00, 0x02, 0x14, 0x38, + 0x00, 0x02, 0x14, 0x68, 0x00, 0x02, 0x14, 0x98, 0x00, 0x02, 0x14, 0xcc, 0x00, 0x02, 0x15, 0x00, + 0x00, 0x02, 0x15, 0x34, 0x00, 0x02, 0x15, 0x68, 0x00, 0x02, 0x15, 0x9c, 0x00, 0x02, 0x15, 0xd0, + 0x00, 0x02, 0x16, 0x00, 0x00, 0x02, 0x16, 0x30, 0x00, 0x02, 0x16, 0x64, 0x00, 0x02, 0x16, 0x98, + 0x00, 0x02, 0x16, 0xcc, 0x00, 0x02, 0x17, 0x00, 0x00, 0x02, 0x17, 0x34, 0x00, 0x02, 0x17, 0x68, + 0x00, 0x02, 0x17, 0x98, 0x00, 0x02, 0x17, 0xc8, 0x00, 0x02, 0x17, 0xfc, 0x00, 0x02, 0x18, 0x30, + 0x00, 0x02, 0x18, 0x64, 0x00, 0x02, 0x18, 0x98, 0x00, 0x02, 0x18, 0xcc, 0x00, 0x02, 0x19, 0x00, + 0x00, 0x02, 0x19, 0x24, 0x00, 0x02, 0x19, 0x48, 0x00, 0x02, 0x19, 0x6c, 0x00, 0x02, 0x1a, 0x58, + 0x00, 0x02, 0x1b, 0xcc, 0x00, 0x02, 0x24, 0x4c, 0x00, 0x02, 0x25, 0xb0, 0x00, 0x02, 0x25, 0xd4, + 0x00, 0x02, 0x26, 0x0c, 0x00, 0x02, 0x26, 0x44, 0x00, 0x02, 0x26, 0x7c, 0x00, 0x02, 0x26, 0xa8, + 0x00, 0x02, 0x26, 0xd4, 0x00, 0x02, 0x27, 0x14, 0x00, 0x02, 0x27, 0x6c, 0x00, 0x02, 0x27, 0xc0, + 0x00, 0x02, 0x28, 0x0c, 0x00, 0x02, 0x28, 0x78, 0x00, 0x02, 0x29, 0x04, 0x00, 0x02, 0x29, 0x84, + 0x00, 0x02, 0x29, 0xbc, 0x00, 0x02, 0x2a, 0x48, 0x00, 0x02, 0x2a, 0xb4, 0x00, 0x02, 0x2b, 0x20, + 0x00, 0x02, 0x2b, 0x88, 0x00, 0x02, 0x2b, 0xf0, 0x00, 0x02, 0x2c, 0x60, 0x00, 0x02, 0x2c, 0xc0, + 0x00, 0x02, 0x2d, 0x28, 0x00, 0x02, 0x2d, 0x68, 0x00, 0x02, 0x2e, 0x30, 0x00, 0x02, 0x2e, 0xb4, + 0x00, 0x02, 0x2f, 0x54, 0x00, 0x02, 0x2f, 0xd0, 0x00, 0x02, 0x30, 0x3c, 0x00, 0x02, 0x30, 0xb0, + 0x00, 0x02, 0x31, 0x4c, 0x00, 0x02, 0x31, 0xf0, 0x00, 0x02, 0x32, 0x84, 0x00, 0x02, 0x32, 0xc8, + 0x00, 0x02, 0x33, 0x20, 0x00, 0x02, 0x33, 0x78, 0x00, 0x02, 0x33, 0xec, 0x00, 0x02, 0x34, 0x54, + 0x00, 0x02, 0x34, 0xbc, 0x00, 0x02, 0x35, 0x28, 0x00, 0x02, 0x35, 0x98, 0x00, 0x02, 0x36, 0x08, + 0x00, 0x02, 0x36, 0x34, 0x00, 0x02, 0x38, 0x3c, 0x00, 0x02, 0x3b, 0xfc, 0x00, 0x02, 0x3f, 0x64, + 0x00, 0x02, 0x3f, 0xfc, 0x00, 0x02, 0x40, 0x6c, 0x00, 0x02, 0x00, 0x32, 0x00, 0x00, 0x01, 0xc2, + 0x02, 0xee, 0x00, 0x03, 0x00, 0x07, 0x00, 0x32, 0x40, 0x21, 0x00, 0x03, 0x30, 0x03, 0x40, 0x03, + 0x03, 0x03, 0x82, 0x04, 0x07, 0x82, 0x10, 0x00, 0x20, 0x00, 0x30, 0x00, 0x60, 0x00, 0x70, 0x00, + 0x05, 0x00, 0x08, 0x06, 0x81, 0x01, 0xb8, 0x07, 0x81, 0x00, 0x08, 0x00, 0x3f, 0xed, 0x3f, 0xed, + 0x01, 0x10, 0xd6, 0x5d, 0xfd, 0xd6, 0xed, 0x5d, 0x31, 0x30, 0x33, 0x11, 0x21, 0x11, 0x27, 0x11, + 0x21, 0x11, 0x32, 0x01, 0x90, 0x32, 0xfe, 0xd4, 0x02, 0xee, 0xfd, 0x12, 0x32, 0x02, 0x8a, 0xfd, + 0x76, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0xa7, 0xff, 0xf4, 0x01, 0x4d, 0x02, 0x6b, 0x00, 0x0d, + 0x00, 0x19, 0x00, 0x1d, 0x40, 0x0e, 0x0e, 0x71, 0x14, 0x00, 0x6f, 0x0b, 0x1a, 0x06, 0x17, 0x75, + 0x11, 0x10, 0x0c, 0x02, 0x00, 0x3f, 0x3f, 0xfd, 0xce, 0x01, 0x10, 0xd6, 0xed, 0xd4, 0xed, 0x31, + 0x30, 0x01, 0x14, 0x0e, 0x02, 0x07, 0x23, 0x2e, 0x03, 0x35, 0x35, 0x33, 0x13, 0x14, 0x06, 0x23, + 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x01, 0x41, 0x03, 0x05, 0x07, 0x04, 0x66, 0x05, + 0x07, 0x06, 0x03, 0x8e, 0x0c, 0x33, 0x20, 0x20, 0x33, 0x33, 0x20, 0x20, 0x33, 0x01, 0xc7, 0x24, + 0x39, 0x35, 0x34, 0x20, 0x20, 0x35, 0x34, 0x39, 0x24, 0xa4, 0xfd, 0xdc, 0x27, 0x2c, 0x2c, 0x27, + 0x26, 0x2c, 0x2c, 0x00, 0x00, 0x02, 0x00, 0x57, 0x01, 0x8e, 0x01, 0x9f, 0x02, 0xa7, 0x00, 0x0d, + 0x00, 0x1b, 0x00, 0x36, 0x40, 0x11, 0x01, 0x6e, 0x0d, 0x0f, 0x6e, 0x40, 0x1b, 0x01, 0x02, 0x90, + 0x1b, 0xa0, 0x1b, 0xb0, 0x1b, 0x03, 0x1b, 0xb8, 0xff, 0xc0, 0x40, 0x0c, 0x09, 0x0f, 0x48, 0x1b, + 0x1c, 0x1b, 0x15, 0x0e, 0xa0, 0x06, 0x0d, 0xa0, 0x00, 0x3f, 0xc5, 0x3f, 0xc5, 0x2f, 0x01, 0x10, + 0xd6, 0x2b, 0x5d, 0x5f, 0x71, 0xfd, 0xde, 0xed, 0x31, 0x30, 0x01, 0x15, 0x14, 0x0e, 0x02, 0x07, + 0x23, 0x2e, 0x03, 0x35, 0x35, 0x23, 0x15, 0x14, 0x0e, 0x02, 0x07, 0x23, 0x2e, 0x03, 0x35, 0x35, + 0x01, 0x9f, 0x05, 0x09, 0x0a, 0x05, 0x48, 0x05, 0x0a, 0x09, 0x06, 0x42, 0x05, 0x09, 0x0b, 0x05, + 0x47, 0x05, 0x0a, 0x09, 0x06, 0x02, 0xa7, 0x31, 0x19, 0x3b, 0x3e, 0x3c, 0x1a, 0x1a, 0x3c, 0x3e, + 0x3c, 0x19, 0x30, 0x31, 0x19, 0x3b, 0x3e, 0x3c, 0x1a, 0x1a, 0x3c, 0x3e, 0x3c, 0x19, 0x30, 0x00, + 0x00, 0x02, 0x00, 0x12, 0x00, 0x00, 0x01, 0xe3, 0x02, 0x6b, 0x00, 0x1b, 0x00, 0x1f, 0x01, 0x6a, + 0xb9, 0x00, 0x1f, 0xff, 0xc0, 0xb3, 0x10, 0x00, 0x4d, 0x1c, 0xb8, 0xff, 0xc0, 0xb7, 0x0f, 0x10, + 0x00, 0x4c, 0x4f, 0x17, 0x01, 0x15, 0xb8, 0xff, 0xc0, 0xb3, 0x09, 0x00, 0x4d, 0x14, 0xb8, 0xff, + 0xc0, 0xb4, 0x09, 0x0a, 0x00, 0x4c, 0x13, 0xb8, 0xff, 0xc0, 0xb3, 0x0f, 0x00, 0x4d, 0x13, 0xb8, + 0xff, 0xc0, 0xb7, 0x09, 0x0a, 0x00, 0x4c, 0x70, 0x13, 0x01, 0x12, 0xb8, 0xff, 0x80, 0xb3, 0x10, + 0x00, 0x4d, 0x12, 0xb8, 0xff, 0xc0, 0xb3, 0x09, 0x00, 0x4d, 0x11, 0xb8, 0xff, 0xf8, 0x40, 0x09, + 0x10, 0x00, 0x4d, 0x11, 0x40, 0x0f, 0x00, 0x4d, 0x11, 0xb8, 0xff, 0xc0, 0xb3, 0x09, 0x00, 0x4d, + 0x10, 0xb8, 0xff, 0xd0, 0xb3, 0x10, 0x00, 0x4d, 0x10, 0xb8, 0xff, 0xc0, 0xb7, 0x09, 0x0a, 0x00, + 0x4c, 0x7c, 0x10, 0x01, 0x0f, 0xb8, 0xff, 0xc0, 0xb4, 0x09, 0x0a, 0x00, 0x4c, 0x0e, 0xb8, 0xff, + 0xc0, 0xb3, 0x09, 0x00, 0x4d, 0x0d, 0xb8, 0xff, 0xc0, 0xb6, 0x0a, 0x00, 0x4d, 0x40, 0x0c, 0x01, + 0x09, 0xb8, 0xff, 0xc0, 0xb3, 0x0a, 0x00, 0x4d, 0x03, 0xb8, 0xff, 0xc0, 0xb3, 0x10, 0x00, 0x4d, + 0x02, 0xb8, 0xff, 0xc0, 0xb4, 0x0f, 0x10, 0x00, 0x4c, 0x0c, 0xb8, 0xff, 0xc0, 0x40, 0x65, 0x0d, + 0x00, 0x4d, 0x11, 0x1d, 0x1e, 0x04, 0x04, 0x05, 0x10, 0x79, 0x0f, 0x07, 0x01, 0x0e, 0x0b, 0x0a, + 0x07, 0x04, 0x0f, 0x0f, 0x01, 0x0f, 0x06, 0x0c, 0x10, 0x08, 0x01, 0x08, 0x0f, 0x05, 0x01, 0x05, + 0x79, 0x1f, 0x06, 0x01, 0x00, 0x06, 0x01, 0x06, 0x21, 0x1a, 0x16, 0x0f, 0x03, 0x01, 0x00, 0x1f, + 0x01, 0x12, 0x1c, 0x1f, 0x03, 0x04, 0x02, 0x13, 0x79, 0x14, 0x02, 0x79, 0x01, 0x19, 0x01, 0x15, + 0x18, 0x19, 0x00, 0x04, 0x01, 0x14, 0x20, 0x1c, 0x0b, 0x18, 0x72, 0x11, 0x0e, 0x15, 0x13, 0x08, + 0x0f, 0x08, 0x19, 0x1e, 0x1e, 0x0a, 0x72, 0x04, 0x07, 0x03, 0x03, 0x00, 0x1f, 0x04, 0x01, 0x04, + 0x06, 0x02, 0x01, 0x02, 0x00, 0x3f, 0x3f, 0xcd, 0x5d, 0x32, 0x32, 0x2f, 0x32, 0x10, 0xed, 0x32, + 0x11, 0x33, 0x3f, 0x3f, 0xdd, 0x32, 0x32, 0xed, 0x32, 0x32, 0x01, 0x10, 0xde, 0xdd, 0x17, 0x39, + 0x5d, 0xed, 0x10, 0xed, 0x11, 0x17, 0x39, 0x5d, 0x5d, 0xde, 0xc0, 0x10, 0xd4, 0x5d, 0x5d, 0xed, + 0x5d, 0xde, 0x5d, 0xc0, 0x10, 0xdc, 0x5d, 0x17, 0x39, 0x5d, 0xed, 0x11, 0x17, 0x39, 0x31, 0x30, + 0x00, 0x2b, 0x01, 0x2b, 0x2b, 0x2b, 0x5d, 0x2b, 0x2b, 0x2b, 0x5d, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, + 0x2b, 0x2b, 0x5d, 0x2b, 0x2b, 0x2b, 0x2b, 0x5d, 0x2b, 0x2b, 0x13, 0x37, 0x33, 0x07, 0x33, 0x37, + 0x33, 0x07, 0x33, 0x15, 0x23, 0x07, 0x33, 0x15, 0x23, 0x07, 0x23, 0x37, 0x23, 0x07, 0x23, 0x37, + 0x23, 0x35, 0x33, 0x37, 0x23, 0x35, 0x17, 0x33, 0x37, 0x23, 0x8a, 0x1d, 0x66, 0x1e, 0x50, 0x1d, + 0x66, 0x1d, 0x3e, 0x52, 0x15, 0x67, 0x7a, 0x1d, 0x66, 0x1d, 0x50, 0x1c, 0x66, 0x1d, 0x3c, 0x4f, + 0x15, 0x64, 0xb5, 0x50, 0x14, 0x4f, 0x01, 0xd3, 0x98, 0x98, 0x98, 0x98, 0x66, 0x6e, 0x66, 0x99, + 0x99, 0x99, 0x99, 0x66, 0x6e, 0x66, 0xd4, 0x6e, 0x00, 0x01, 0x00, 0x22, 0xff, 0x9f, 0x01, 0xd3, + 0x02, 0xb5, 0x00, 0x37, 0x00, 0x3f, 0x40, 0x21, 0x1f, 0x0a, 0x63, 0x30, 0x39, 0x26, 0x63, 0x14, + 0x03, 0x38, 0x1a, 0x1a, 0x00, 0x61, 0x36, 0x19, 0x61, 0x1b, 0x0f, 0x67, 0x2b, 0x2b, 0x19, 0x07, + 0x67, 0x00, 0x36, 0x87, 0x23, 0x67, 0x19, 0x1b, 0x10, 0x00, 0x3f, 0xdd, 0xed, 0x3f, 0xdd, 0xed, + 0x11, 0x39, 0x10, 0xed, 0x01, 0x2f, 0xed, 0x2f, 0xed, 0x32, 0x2f, 0x10, 0xd6, 0xd6, 0xed, 0x10, + 0xde, 0xed, 0xc4, 0x31, 0x30, 0x37, 0x26, 0x26, 0x27, 0x37, 0x16, 0x16, 0x33, 0x32, 0x36, 0x35, + 0x34, 0x2e, 0x02, 0x27, 0x2e, 0x03, 0x35, 0x34, 0x3e, 0x02, 0x37, 0x35, 0x33, 0x15, 0x16, 0x16, + 0x17, 0x07, 0x26, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x1e, 0x02, 0x17, 0x1e, 0x03, 0x15, 0x14, + 0x0e, 0x02, 0x07, 0x15, 0x23, 0xc1, 0x3f, 0x4d, 0x13, 0x26, 0x20, 0x56, 0x30, 0x38, 0x2c, 0x11, + 0x21, 0x30, 0x1e, 0x1d, 0x38, 0x2c, 0x1b, 0x0f, 0x21, 0x36, 0x27, 0x72, 0x2e, 0x47, 0x14, 0x1c, + 0x1d, 0x4f, 0x2a, 0x30, 0x25, 0x0d, 0x1b, 0x26, 0x1a, 0x27, 0x42, 0x30, 0x1b, 0x10, 0x25, 0x3d, + 0x2e, 0x72, 0x09, 0x06, 0x1c, 0x0b, 0x62, 0x0f, 0x19, 0x1d, 0x1f, 0x12, 0x1a, 0x15, 0x11, 0x0b, + 0x0a, 0x1a, 0x25, 0x35, 0x27, 0x1c, 0x34, 0x2c, 0x21, 0x09, 0x61, 0x5c, 0x04, 0x14, 0x08, 0x67, + 0x0c, 0x13, 0x22, 0x17, 0x10, 0x15, 0x10, 0x0f, 0x09, 0x0f, 0x21, 0x2b, 0x3a, 0x27, 0x1b, 0x35, + 0x2d, 0x21, 0x07, 0x6b, 0x00, 0x05, 0x00, 0x02, 0xff, 0xf3, 0x01, 0xf2, 0x02, 0x79, 0x00, 0x03, + 0x00, 0x0f, 0x00, 0x1b, 0x00, 0x27, 0x00, 0x33, 0x00, 0xef, 0xb5, 0x27, 0x10, 0x0b, 0x00, 0x4d, + 0x22, 0xb8, 0xff, 0xc0, 0xb3, 0x0a, 0x00, 0x4d, 0x20, 0xb8, 0xff, 0xf0, 0xb6, 0x0b, 0x00, 0x4d, + 0x1f, 0x16, 0x01, 0x08, 0xb8, 0xff, 0xe0, 0x40, 0x09, 0x0b, 0x00, 0x4d, 0x06, 0x20, 0x0b, 0x00, + 0x4d, 0x1f, 0xb8, 0xff, 0xc0, 0xb3, 0x19, 0x00, 0x4d, 0x1f, 0xb8, 0xff, 0xe0, 0xb3, 0x18, 0x00, + 0x4d, 0x1f, 0xb8, 0xff, 0xf0, 0x40, 0x42, 0x17, 0x00, 0x4d, 0x10, 0x22, 0xa0, 0x22, 0xb0, 0x22, + 0x03, 0x22, 0x7c, 0x28, 0x1f, 0x04, 0xaf, 0x04, 0xbf, 0x04, 0x03, 0x04, 0x7c, 0x16, 0x00, 0x28, + 0x01, 0x0f, 0x16, 0x01, 0x28, 0x16, 0x28, 0x16, 0x1c, 0xaf, 0x10, 0xbf, 0x10, 0x02, 0x10, 0x7c, + 0x60, 0x0a, 0x70, 0x0a, 0x80, 0x0a, 0x03, 0x0a, 0x35, 0x02, 0x03, 0x35, 0xa0, 0x2e, 0xb0, 0x2e, + 0x02, 0x2e, 0x7c, 0x1c, 0x34, 0x00, 0x01, 0x34, 0x2b, 0xb8, 0xff, 0xc0, 0x40, 0x2c, 0x13, 0x16, + 0x48, 0x2b, 0x7d, 0x1f, 0x05, 0xaf, 0x19, 0xbf, 0x19, 0xcf, 0x19, 0x03, 0x19, 0x7d, 0x0d, 0x0d, + 0x70, 0x07, 0x01, 0x07, 0x7d, 0x13, 0x25, 0x7d, 0x31, 0xc0, 0x13, 0x01, 0xb7, 0x13, 0x01, 0xcf, + 0x31, 0x01, 0x13, 0x31, 0x13, 0x31, 0x03, 0x02, 0x00, 0x10, 0x00, 0x3f, 0x3f, 0x39, 0x39, 0x2f, + 0x2f, 0x5d, 0x5d, 0x5d, 0x10, 0xed, 0x10, 0xed, 0x5d, 0x3f, 0xed, 0x5d, 0x3f, 0xed, 0x2b, 0x01, + 0x10, 0xd6, 0xcd, 0x10, 0xd6, 0xed, 0x5d, 0x10, 0xde, 0xcd, 0x10, 0xd6, 0x5d, 0xed, 0x5d, 0x12, + 0x39, 0x39, 0x2f, 0x2f, 0x5d, 0x5d, 0x10, 0xed, 0x5d, 0x10, 0xed, 0x5d, 0x31, 0x30, 0x00, 0x2b, + 0x2b, 0x2b, 0x01, 0x2b, 0x2b, 0x5d, 0x2b, 0x2b, 0x2b, 0x33, 0x23, 0x01, 0x33, 0x03, 0x34, 0x36, + 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x37, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, + 0x14, 0x16, 0x33, 0x32, 0x36, 0x01, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, + 0x26, 0x37, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x5b, 0x59, 0x01, + 0x97, 0x59, 0xe9, 0x3c, 0x34, 0x35, 0x3c, 0x3c, 0x35, 0x34, 0x3c, 0x91, 0x14, 0x0e, 0x0e, 0x11, + 0x11, 0x0e, 0x0e, 0x14, 0xfe, 0x70, 0x3c, 0x33, 0x36, 0x3c, 0x3c, 0x36, 0x33, 0x3c, 0x90, 0x14, + 0x0d, 0x0e, 0x12, 0x12, 0x0e, 0x0d, 0x14, 0x02, 0x6b, 0xfe, 0x23, 0x4c, 0x4f, 0x4f, 0x4c, 0x4c, + 0x4f, 0x4f, 0x4c, 0x2a, 0x24, 0x24, 0x2a, 0x2a, 0x22, 0x22, 0x01, 0x7a, 0x4c, 0x4f, 0x4f, 0x4c, + 0x4c, 0x50, 0x50, 0x4c, 0x2a, 0x23, 0x23, 0x2a, 0x2a, 0x22, 0x22, 0x00, 0x00, 0x03, 0x00, 0x15, + 0xff, 0xf8, 0x01, 0xe2, 0x02, 0x79, 0x00, 0x29, 0x00, 0x35, 0x00, 0x41, 0x00, 0xc2, 0xb9, 0x00, + 0x3f, 0xff, 0xf8, 0x40, 0x0e, 0x0b, 0x00, 0x4d, 0x25, 0x40, 0x0a, 0x00, 0x4d, 0x22, 0x40, 0x0d, + 0x00, 0x4d, 0x1b, 0xb8, 0xff, 0xc0, 0xb3, 0x0b, 0x00, 0x4d, 0x0d, 0xb8, 0xff, 0xc0, 0x40, 0x09, + 0x0d, 0x00, 0x4d, 0x39, 0x40, 0x0c, 0x00, 0x4d, 0x2e, 0xb8, 0xff, 0x80, 0xb3, 0x0b, 0x00, 0x4d, + 0x2e, 0xb8, 0xff, 0xc0, 0xb3, 0x09, 0x00, 0x4d, 0x2d, 0xb8, 0xff, 0xc0, 0x40, 0x1d, 0x09, 0x0a, + 0x00, 0x4c, 0x1d, 0x39, 0x2d, 0x0d, 0x04, 0x0a, 0x26, 0x43, 0x22, 0x22, 0x79, 0x23, 0x43, 0x3f, + 0x3c, 0x5f, 0x3c, 0x02, 0x3c, 0x64, 0x1a, 0x00, 0x79, 0x43, 0x36, 0xb8, 0xff, 0xc0, 0x40, 0x2d, + 0x0d, 0x00, 0x4d, 0x20, 0x36, 0x30, 0x36, 0x50, 0x36, 0x03, 0x36, 0x64, 0x2f, 0x10, 0x01, 0x10, + 0x3f, 0x30, 0x4f, 0x30, 0x5f, 0x30, 0x03, 0x30, 0x79, 0x0a, 0x42, 0x0d, 0x1d, 0x2d, 0x39, 0x2d, + 0x39, 0x2d, 0x33, 0x3f, 0x74, 0x15, 0x03, 0x33, 0x74, 0x05, 0x10, 0x00, 0x10, 0x00, 0x3f, 0x3f, + 0xed, 0x3f, 0xed, 0x12, 0x39, 0x39, 0x2f, 0x2f, 0x12, 0x39, 0x39, 0x01, 0x10, 0xd6, 0xed, 0x5d, + 0xd4, 0x5d, 0xed, 0x5d, 0x2b, 0x10, 0xec, 0xd4, 0xed, 0x5d, 0x10, 0xd2, 0xe9, 0x2f, 0x10, 0xc4, + 0x11, 0x17, 0x39, 0x31, 0x30, 0x00, 0x2b, 0x2b, 0x2b, 0x2b, 0x01, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, + 0x21, 0x26, 0x27, 0x06, 0x06, 0x23, 0x22, 0x2e, 0x02, 0x35, 0x34, 0x36, 0x37, 0x26, 0x26, 0x35, + 0x34, 0x3e, 0x02, 0x33, 0x32, 0x1e, 0x02, 0x15, 0x14, 0x06, 0x07, 0x16, 0x16, 0x17, 0x36, 0x37, + 0x17, 0x06, 0x06, 0x07, 0x16, 0x16, 0x17, 0x27, 0x26, 0x26, 0x27, 0x06, 0x06, 0x15, 0x14, 0x16, + 0x33, 0x32, 0x36, 0x03, 0x14, 0x16, 0x17, 0x36, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x01, + 0x6d, 0x0b, 0x0d, 0x22, 0x48, 0x23, 0x2d, 0x43, 0x2d, 0x16, 0x31, 0x31, 0x18, 0x1f, 0x1c, 0x2e, + 0x39, 0x1e, 0x1c, 0x36, 0x2a, 0x1a, 0x3a, 0x3e, 0x14, 0x2c, 0x17, 0x0e, 0x01, 0x66, 0x01, 0x1b, + 0x15, 0x18, 0x26, 0x0a, 0xbe, 0x1c, 0x3c, 0x1d, 0x16, 0x1b, 0x23, 0x2a, 0x17, 0x2e, 0x66, 0x12, + 0x10, 0x20, 0x22, 0x19, 0x14, 0x19, 0x1e, 0x1d, 0x18, 0x1e, 0x1f, 0x1c, 0x2f, 0x3e, 0x22, 0x30, + 0x57, 0x1e, 0x21, 0x48, 0x27, 0x28, 0x3d, 0x28, 0x14, 0x12, 0x23, 0x35, 0x23, 0x30, 0x5b, 0x20, + 0x18, 0x32, 0x1a, 0x33, 0x46, 0x0d, 0x38, 0x60, 0x27, 0x21, 0x46, 0x23, 0x7d, 0x23, 0x42, 0x20, + 0x0f, 0x2b, 0x1f, 0x22, 0x32, 0x12, 0x01, 0x77, 0x16, 0x2d, 0x18, 0x12, 0x3b, 0x1b, 0x1a, 0x1b, + 0x22, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xba, 0x01, 0x7c, 0x01, 0x3d, 0x02, 0xa7, 0x00, 0x0d, + 0x00, 0x3d, 0xb6, 0x00, 0x6e, 0x52, 0x0d, 0x01, 0x01, 0x0d, 0xb8, 0xff, 0x80, 0x40, 0x0c, 0x1a, + 0x1d, 0x48, 0x00, 0x0d, 0x01, 0xe0, 0x0d, 0xf0, 0x0d, 0x02, 0x0d, 0xb8, 0xff, 0x80, 0xb3, 0x0e, + 0x16, 0x48, 0x0d, 0xb8, 0xff, 0xc0, 0xb7, 0x09, 0x0d, 0x48, 0x0d, 0x0e, 0x07, 0x00, 0xa0, 0x00, + 0x3f, 0xc5, 0x01, 0x10, 0xd6, 0x2b, 0x2b, 0x5d, 0x71, 0x2b, 0x5f, 0x71, 0xed, 0x31, 0x30, 0x01, + 0x15, 0x14, 0x0e, 0x02, 0x07, 0x23, 0x2e, 0x03, 0x35, 0x35, 0x01, 0x3d, 0x05, 0x09, 0x0a, 0x05, + 0x48, 0x05, 0x0a, 0x09, 0x06, 0x02, 0xa7, 0x42, 0x19, 0x3b, 0x3e, 0x3d, 0x1a, 0x1a, 0x3d, 0x3e, + 0x3b, 0x19, 0x42, 0x00, 0x00, 0x01, 0x00, 0x5e, 0xff, 0x56, 0x01, 0xa1, 0x02, 0xc6, 0x00, 0x0d, + 0x00, 0x1b, 0x40, 0x0c, 0x0b, 0x03, 0x0f, 0x00, 0x70, 0x07, 0x0e, 0x0b, 0x0a, 0x8a, 0x04, 0x12, + 0x00, 0x3f, 0x3f, 0xc5, 0x01, 0x10, 0xd6, 0xed, 0x10, 0xde, 0xc6, 0x31, 0x30, 0x13, 0x14, 0x16, + 0x17, 0x07, 0x26, 0x26, 0x35, 0x34, 0x36, 0x37, 0x17, 0x06, 0x06, 0xd0, 0x6d, 0x60, 0x39, 0x88, + 0x7e, 0x82, 0x88, 0x39, 0x60, 0x71, 0x01, 0x0a, 0x7b, 0xb5, 0x38, 0x4c, 0x4b, 0xe0, 0x89, 0x8a, + 0xe7, 0x4b, 0x4c, 0x38, 0xbc, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x55, 0xff, 0x56, 0x01, 0x98, + 0x02, 0xc6, 0x00, 0x0d, 0x00, 0x1b, 0x40, 0x0c, 0x00, 0x70, 0x07, 0x0f, 0x0b, 0x03, 0x0e, 0x0a, + 0x12, 0x03, 0x04, 0x8a, 0x00, 0x3f, 0xc5, 0x3f, 0x01, 0x10, 0xc6, 0x32, 0x10, 0xde, 0xed, 0x31, + 0x30, 0x01, 0x34, 0x26, 0x27, 0x37, 0x16, 0x16, 0x15, 0x14, 0x06, 0x07, 0x27, 0x36, 0x36, 0x01, + 0x26, 0x71, 0x60, 0x39, 0x88, 0x82, 0x7e, 0x88, 0x39, 0x60, 0x6d, 0x01, 0x0a, 0x7c, 0xbc, 0x38, + 0x4c, 0x4b, 0xe7, 0x8a, 0x89, 0xe0, 0x4b, 0x4c, 0x38, 0xb5, 0x00, 0x00, 0x00, 0x01, 0x00, 0x2e, + 0x00, 0xe4, 0x01, 0xca, 0x02, 0x6b, 0x00, 0x40, 0x00, 0x59, 0x40, 0x11, 0x3c, 0x40, 0x0e, 0x00, + 0x4d, 0x3c, 0x3a, 0x2e, 0x27, 0x00, 0x00, 0x1a, 0x34, 0x22, 0x27, 0x1a, 0x05, 0xb8, 0xff, 0xc0, + 0x40, 0x19, 0x0e, 0x00, 0x4d, 0x05, 0x07, 0x13, 0x1f, 0x0d, 0x1a, 0x1a, 0x41, 0x42, 0x2f, 0x2d, + 0x12, 0x14, 0x1a, 0x3b, 0x06, 0x34, 0x0d, 0x27, 0x1a, 0x20, 0x02, 0x00, 0x3f, 0xdd, 0xc0, 0xdd, + 0xc5, 0xdd, 0xc6, 0x10, 0xd5, 0xcd, 0xd4, 0xcd, 0x01, 0x11, 0x12, 0x39, 0x2f, 0xc5, 0xc5, 0xdd, + 0xc6, 0x32, 0x2b, 0x10, 0xdd, 0xc5, 0xc5, 0x12, 0x39, 0x3d, 0x2f, 0x18, 0x10, 0xdd, 0xc6, 0x32, + 0x2b, 0x31, 0x30, 0x13, 0x0e, 0x03, 0x07, 0x07, 0x27, 0x37, 0x3e, 0x03, 0x37, 0x22, 0x22, 0x26, + 0x26, 0x27, 0x27, 0x37, 0x17, 0x1e, 0x03, 0x17, 0x2e, 0x03, 0x35, 0x35, 0x33, 0x15, 0x14, 0x0e, + 0x02, 0x07, 0x3e, 0x03, 0x37, 0x37, 0x17, 0x07, 0x0e, 0x02, 0x22, 0x23, 0x1e, 0x03, 0x17, 0x17, + 0x07, 0x27, 0x2e, 0x03, 0xfc, 0x03, 0x0c, 0x0d, 0x0f, 0x07, 0x13, 0x5e, 0x13, 0x07, 0x19, 0x1b, + 0x1c, 0x0a, 0x0d, 0x23, 0x24, 0x22, 0x0b, 0x1e, 0x25, 0x1e, 0x0b, 0x1e, 0x1e, 0x1d, 0x0a, 0x04, + 0x0a, 0x09, 0x06, 0x74, 0x06, 0x09, 0x0b, 0x04, 0x0a, 0x1e, 0x1f, 0x1e, 0x0c, 0x1d, 0x24, 0x1e, + 0x0c, 0x22, 0x24, 0x23, 0x0d, 0x0b, 0x1c, 0x1c, 0x18, 0x07, 0x13, 0x5e, 0x12, 0x07, 0x0f, 0x0e, + 0x0b, 0x01, 0x76, 0x0c, 0x22, 0x22, 0x1e, 0x0a, 0x19, 0x43, 0x19, 0x0a, 0x18, 0x18, 0x15, 0x07, + 0x03, 0x06, 0x04, 0x0a, 0x6d, 0x09, 0x04, 0x11, 0x14, 0x14, 0x08, 0x0c, 0x21, 0x24, 0x22, 0x0c, + 0x1f, 0x1f, 0x0c, 0x22, 0x24, 0x21, 0x0c, 0x07, 0x14, 0x13, 0x10, 0x04, 0x0a, 0x6f, 0x09, 0x04, + 0x04, 0x03, 0x07, 0x15, 0x17, 0x18, 0x0a, 0x19, 0x44, 0x19, 0x0a, 0x1e, 0x23, 0x21, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x28, 0x00, 0x26, 0x01, 0xcc, 0x01, 0xe7, 0x00, 0x0b, 0x00, 0x8f, 0xb9, 0x00, + 0x08, 0xff, 0xc0, 0xb3, 0x0b, 0x00, 0x4d, 0x07, 0xb8, 0xff, 0xc0, 0x40, 0x13, 0x0b, 0x00, 0x4d, + 0x06, 0x40, 0x0f, 0x00, 0x4d, 0x05, 0x40, 0x0f, 0x00, 0x4d, 0x05, 0x40, 0x09, 0x00, 0x4d, 0x04, + 0xb8, 0xff, 0xc0, 0xb3, 0x0b, 0x00, 0x4d, 0x03, 0xb8, 0xff, 0xc0, 0xb3, 0x0b, 0x00, 0x4d, 0x00, + 0xb8, 0xff, 0xc0, 0x40, 0x34, 0x09, 0x00, 0x4d, 0x05, 0x40, 0x15, 0x00, 0x4d, 0x04, 0x40, 0x15, + 0x00, 0x4d, 0x20, 0x06, 0x01, 0x06, 0x04, 0x07, 0x52, 0x01, 0x60, 0x00, 0x01, 0x00, 0x40, 0x0a, + 0x50, 0x0a, 0x80, 0x0a, 0x90, 0x0a, 0x04, 0x0a, 0x0a, 0x0d, 0x0c, 0x0a, 0xcf, 0x08, 0x01, 0x08, + 0x07, 0x55, 0xcf, 0x01, 0x01, 0x01, 0x04, 0x03, 0x0a, 0x00, 0x3f, 0xdd, 0xc0, 0x5d, 0xfd, 0xcd, + 0x5d, 0xc0, 0x01, 0x11, 0x12, 0x39, 0x2f, 0x5d, 0xcd, 0x5d, 0x33, 0xfd, 0x32, 0xcd, 0x5d, 0x31, + 0x30, 0x00, 0x2b, 0x2b, 0x01, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x13, 0x33, 0x35, + 0x33, 0x15, 0x33, 0x15, 0x23, 0x15, 0x23, 0x35, 0x23, 0x28, 0x9d, 0x6a, 0x9d, 0x9d, 0x6a, 0x9d, + 0x01, 0x39, 0xae, 0xae, 0x65, 0xae, 0xae, 0x00, 0x00, 0x01, 0x00, 0x7e, 0xff, 0x67, 0x01, 0x5b, + 0x00, 0xa7, 0x00, 0x13, 0x00, 0x1e, 0x40, 0x0e, 0x0e, 0x7a, 0x08, 0x14, 0x05, 0x00, 0x14, 0x00, + 0x13, 0x0f, 0x0b, 0x7b, 0x05, 0x07, 0x00, 0x3f, 0xed, 0x3f, 0xc5, 0x01, 0x10, 0xde, 0xce, 0x10, + 0xd6, 0xed, 0x31, 0x30, 0x17, 0x3e, 0x03, 0x37, 0x26, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, + 0x15, 0x14, 0x0e, 0x02, 0x07, 0x7e, 0x12, 0x25, 0x21, 0x1a, 0x08, 0x26, 0x2a, 0x33, 0x27, 0x2a, + 0x2f, 0x16, 0x31, 0x4e, 0x38, 0x49, 0x04, 0x06, 0x0c, 0x16, 0x13, 0x04, 0x34, 0x20, 0x27, 0x32, + 0x38, 0x30, 0x23, 0x46, 0x3c, 0x2c, 0x07, 0x00, 0x00, 0x01, 0x00, 0x71, 0x00, 0xc4, 0x01, 0x83, + 0x01, 0x3d, 0x00, 0x03, 0x00, 0x10, 0xb5, 0x01, 0x03, 0x04, 0x03, 0x01, 0xa1, 0x00, 0x3f, 0xc5, + 0x01, 0x10, 0xd6, 0xcd, 0x31, 0x30, 0x13, 0x21, 0x15, 0x21, 0x71, 0x01, 0x12, 0xfe, 0xee, 0x01, + 0x3d, 0x79, 0x00, 0x00, 0x00, 0x01, 0x00, 0xa1, 0xff, 0xf5, 0x01, 0x54, 0x00, 0xa7, 0x00, 0x0f, + 0x00, 0x5f, 0xb9, 0x00, 0x0f, 0xff, 0xe0, 0xb3, 0x0e, 0x00, 0x4d, 0x0f, 0xb8, 0xff, 0xe0, 0x40, + 0x1f, 0x10, 0x13, 0x48, 0x65, 0x0f, 0x01, 0x0a, 0x20, 0x0e, 0x0f, 0x00, 0x4c, 0x0a, 0x20, 0x10, + 0x13, 0x48, 0x06, 0x20, 0x0e, 0x00, 0x4d, 0x06, 0x20, 0x10, 0x13, 0x48, 0x6a, 0x06, 0x01, 0x01, + 0xb8, 0xff, 0xe0, 0xb3, 0x0e, 0x00, 0x4d, 0x01, 0xb8, 0xff, 0xe0, 0x40, 0x0f, 0x10, 0x13, 0x48, + 0x65, 0x01, 0x01, 0x11, 0x00, 0x7a, 0x08, 0x10, 0x0d, 0x7b, 0x03, 0x07, 0x00, 0x3f, 0xed, 0x01, + 0x10, 0xd6, 0xfd, 0xce, 0x31, 0x30, 0x5d, 0x2b, 0x2b, 0x5d, 0x2b, 0x2b, 0x2b, 0x2b, 0x5d, 0x2b, + 0x2b, 0x25, 0x14, 0x06, 0x23, 0x22, 0x2e, 0x02, 0x35, 0x34, 0x3e, 0x02, 0x33, 0x32, 0x16, 0x01, + 0x54, 0x36, 0x23, 0x12, 0x20, 0x19, 0x0f, 0x0f, 0x19, 0x20, 0x12, 0x23, 0x36, 0x4f, 0x2c, 0x2e, + 0x0c, 0x17, 0x21, 0x16, 0x15, 0x21, 0x16, 0x0c, 0x2e, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x2f, + 0xff, 0x5b, 0x01, 0xc5, 0x02, 0xbb, 0x00, 0x03, 0x00, 0x2d, 0x40, 0x15, 0x02, 0x01, 0x00, 0x03, + 0x02, 0x03, 0x00, 0x76, 0x01, 0x02, 0x14, 0x01, 0x02, 0x00, 0x01, 0x04, 0x03, 0x03, 0x10, 0x01, + 0x12, 0x00, 0x3f, 0x3f, 0x01, 0x2f, 0x10, 0xd2, 0x00, 0xc1, 0x87, 0x05, 0x2b, 0x10, 0x00, 0xc1, + 0x87, 0x05, 0x7d, 0x10, 0xc4, 0x31, 0x30, 0x17, 0x23, 0x01, 0x33, 0xaf, 0x80, 0x01, 0x18, 0x7e, + 0xa5, 0x03, 0x60, 0x00, 0x00, 0x03, 0x00, 0x23, 0xff, 0xf3, 0x01, 0xd1, 0x02, 0x79, 0x00, 0x0b, + 0x00, 0x17, 0x00, 0x23, 0x00, 0x55, 0x40, 0x34, 0xef, 0x1e, 0xff, 0x1e, 0x02, 0xd1, 0x1e, 0x01, + 0xc0, 0x1e, 0x01, 0x8f, 0x1e, 0x9f, 0x1e, 0x02, 0x1e, 0x64, 0x18, 0x18, 0x06, 0x00, 0x0c, 0x0c, + 0x64, 0x00, 0x25, 0x12, 0x64, 0x06, 0x24, 0xb1, 0x21, 0x01, 0xa0, 0x21, 0x01, 0x21, 0x40, 0x1b, + 0x01, 0x1b, 0x1b, 0x15, 0x0f, 0x65, 0x09, 0x05, 0x15, 0x65, 0x03, 0x0d, 0x00, 0x3f, 0xed, 0x3f, + 0xed, 0x12, 0x39, 0x2f, 0x5d, 0xcd, 0x5d, 0x5d, 0x01, 0x10, 0xd6, 0xed, 0x10, 0xda, 0xe9, 0x2f, + 0x11, 0x12, 0x39, 0x2f, 0xed, 0x5d, 0x5d, 0x5d, 0x5d, 0x31, 0x30, 0x01, 0x14, 0x06, 0x23, 0x22, + 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x07, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, + 0x33, 0x32, 0x36, 0x27, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x01, + 0xd1, 0x6e, 0x69, 0x69, 0x6e, 0x70, 0x67, 0x69, 0x6e, 0x6f, 0x35, 0x33, 0x32, 0x36, 0x36, 0x32, + 0x33, 0x35, 0x30, 0x1f, 0x18, 0x1a, 0x1e, 0x1e, 0x1a, 0x18, 0x1f, 0x01, 0x37, 0xa4, 0xa0, 0xa0, + 0xa4, 0xa2, 0xa0, 0x9f, 0xa3, 0x6a, 0x6f, 0x6f, 0x6a, 0x6b, 0x6f, 0x6f, 0x75, 0x1b, 0x27, 0x27, + 0x1b, 0x1b, 0x28, 0x28, 0x00, 0x01, 0x00, 0x30, 0x00, 0x00, 0x01, 0xcb, 0x02, 0x6b, 0x00, 0x10, + 0x00, 0x2f, 0x40, 0x1a, 0x0e, 0x40, 0x0c, 0x00, 0x4d, 0x10, 0x0a, 0x05, 0x01, 0x61, 0x0c, 0x0d, + 0x12, 0x04, 0x01, 0x05, 0x03, 0x0a, 0x0c, 0x65, 0x00, 0x65, 0x0e, 0x0c, 0x0a, 0x04, 0x00, 0x3f, + 0x3f, 0xed, 0xed, 0x11, 0x17, 0x39, 0x01, 0x10, 0xde, 0xdd, 0xfd, 0xcd, 0x33, 0xce, 0x31, 0x30, + 0x2b, 0x37, 0x11, 0x06, 0x06, 0x07, 0x27, 0x3e, 0x03, 0x37, 0x33, 0x11, 0x33, 0x15, 0x21, 0x35, + 0xd5, 0x1c, 0x48, 0x19, 0x28, 0x18, 0x38, 0x38, 0x32, 0x12, 0x54, 0x7b, 0xfe, 0x88, 0x66, 0x01, + 0x5a, 0x14, 0x1f, 0x09, 0x66, 0x09, 0x1c, 0x22, 0x26, 0x14, 0xfd, 0xfb, 0x66, 0x66, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x2b, 0x00, 0x00, 0x01, 0xce, 0x02, 0x79, 0x00, 0x25, 0x00, 0x26, 0x40, 0x13, + 0x17, 0x63, 0x00, 0x0b, 0x27, 0x1e, 0x0a, 0x63, 0x10, 0x26, 0x1d, 0x1a, 0x67, 0x21, 0x05, 0x0a, + 0x65, 0x0c, 0x0c, 0x00, 0x3f, 0xed, 0x3f, 0xed, 0x32, 0x01, 0x10, 0xd6, 0xed, 0xc6, 0x10, 0xde, + 0xd6, 0xed, 0x31, 0x30, 0x01, 0x14, 0x0e, 0x02, 0x07, 0x0e, 0x03, 0x15, 0x21, 0x15, 0x21, 0x26, + 0x36, 0x35, 0x34, 0x3e, 0x04, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x27, 0x36, 0x36, 0x33, + 0x32, 0x1e, 0x02, 0x01, 0xb2, 0x18, 0x28, 0x32, 0x1a, 0x0d, 0x22, 0x1e, 0x15, 0x01, 0x0a, 0xfe, + 0x6c, 0x03, 0x01, 0x25, 0x39, 0x41, 0x39, 0x25, 0x2e, 0x23, 0x1d, 0x40, 0x1f, 0x3d, 0x28, 0x69, + 0x34, 0x26, 0x46, 0x36, 0x20, 0x01, 0xc8, 0x20, 0x3b, 0x38, 0x34, 0x18, 0x0c, 0x21, 0x23, 0x24, + 0x0f, 0x66, 0x0a, 0x1e, 0x06, 0x32, 0x54, 0x47, 0x3d, 0x38, 0x34, 0x1b, 0x26, 0x29, 0x1c, 0x21, + 0x56, 0x2a, 0x28, 0x16, 0x2c, 0x43, 0x00, 0x00, 0x00, 0x01, 0x00, 0x29, 0xff, 0xf3, 0x01, 0xc3, + 0x02, 0x79, 0x00, 0x30, 0x00, 0x80, 0xb9, 0x00, 0x2d, 0xff, 0xc0, 0xb3, 0x0a, 0x00, 0x4d, 0x2c, + 0xb8, 0xff, 0xc0, 0xb3, 0x0a, 0x00, 0x4d, 0x2b, 0xb8, 0xff, 0xc0, 0xb3, 0x0a, 0x00, 0x4d, 0x11, + 0xb8, 0xff, 0xc0, 0xb3, 0x0a, 0x00, 0x4d, 0x0c, 0xb8, 0xff, 0xc0, 0xb3, 0x0a, 0x00, 0x4d, 0x0b, + 0xb8, 0xff, 0xc0, 0x40, 0x2a, 0x0a, 0x00, 0x4d, 0x1d, 0x20, 0x0d, 0x0f, 0x00, 0x4c, 0x29, 0x17, + 0x63, 0x26, 0x2c, 0x10, 0x0c, 0x63, 0x00, 0x2c, 0x01, 0x2c, 0x32, 0x1e, 0x05, 0x31, 0x1d, 0x1a, + 0x67, 0x21, 0x29, 0x29, 0x0f, 0x65, 0x12, 0x12, 0x21, 0x05, 0x06, 0x09, 0x67, 0x00, 0x0d, 0x00, + 0x3f, 0xed, 0x32, 0x3f, 0x39, 0x2f, 0xed, 0x39, 0x3d, 0x2f, 0x18, 0x10, 0xed, 0x32, 0x01, 0x10, + 0xd6, 0xc6, 0x10, 0xd6, 0x5d, 0xfd, 0xce, 0x10, 0xd4, 0xed, 0x33, 0x31, 0x30, 0x00, 0x2b, 0x01, + 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x17, 0x22, 0x2e, 0x02, 0x27, 0x37, 0x16, 0x16, 0x33, 0x32, + 0x36, 0x35, 0x34, 0x26, 0x23, 0x23, 0x35, 0x33, 0x32, 0x3e, 0x02, 0x35, 0x34, 0x26, 0x23, 0x22, + 0x06, 0x07, 0x27, 0x36, 0x36, 0x33, 0x32, 0x1e, 0x02, 0x15, 0x14, 0x06, 0x07, 0x16, 0x16, 0x15, + 0x14, 0x0e, 0x02, 0xd5, 0x17, 0x33, 0x2f, 0x28, 0x0b, 0x18, 0x17, 0x49, 0x33, 0x3f, 0x33, 0x4e, + 0x3c, 0x26, 0x2e, 0x13, 0x26, 0x1e, 0x13, 0x29, 0x24, 0x23, 0x45, 0x19, 0x2c, 0x1b, 0x59, 0x38, + 0x34, 0x4d, 0x32, 0x18, 0x2a, 0x23, 0x30, 0x35, 0x1c, 0x3a, 0x5a, 0x0d, 0x07, 0x0a, 0x0c, 0x05, + 0x67, 0x0a, 0x16, 0x36, 0x28, 0x31, 0x27, 0x66, 0x08, 0x12, 0x1e, 0x17, 0x22, 0x27, 0x17, 0x11, + 0x5a, 0x12, 0x25, 0x1a, 0x2f, 0x40, 0x25, 0x25, 0x44, 0x12, 0x14, 0x4e, 0x36, 0x2b, 0x48, 0x35, + 0x1d, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1b, 0x00, 0x00, 0x01, 0xdb, 0x02, 0x6b, 0x00, 0x06, + 0x00, 0x15, 0x00, 0x30, 0x40, 0x17, 0x0b, 0x09, 0x08, 0x61, 0x15, 0x0e, 0x06, 0x05, 0x0f, 0x16, + 0x10, 0x06, 0x08, 0x65, 0x0e, 0x00, 0x0b, 0x0b, 0x07, 0x0d, 0x0c, 0x07, 0x04, 0x00, 0x3f, 0x3f, + 0x12, 0x39, 0x2f, 0x39, 0x33, 0xed, 0x32, 0x32, 0x01, 0x10, 0xd6, 0x32, 0xdd, 0x32, 0x32, 0xfd, + 0xcd, 0x33, 0x31, 0x30, 0x01, 0x0e, 0x03, 0x07, 0x33, 0x13, 0x11, 0x33, 0x15, 0x23, 0x15, 0x23, + 0x35, 0x21, 0x35, 0x3e, 0x03, 0x37, 0x01, 0x1d, 0x12, 0x26, 0x25, 0x22, 0x0d, 0x8c, 0x7b, 0x43, + 0x43, 0x7b, 0xfe, 0xfe, 0x13, 0x3c, 0x48, 0x50, 0x28, 0x01, 0xd1, 0x17, 0x34, 0x39, 0x3a, 0x1c, + 0x01, 0x74, 0xfe, 0x8c, 0x65, 0x92, 0x92, 0x5a, 0x27, 0x63, 0x68, 0x65, 0x28, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x23, 0xff, 0xf3, 0x01, 0xbf, 0x02, 0x6b, 0x00, 0x23, 0x00, 0x3c, 0x40, 0x22, + 0x0b, 0x40, 0x0d, 0x00, 0x4d, 0x0a, 0x40, 0x0d, 0x00, 0x4d, 0x0a, 0x00, 0x63, 0x11, 0x25, 0x0b, + 0x61, 0x05, 0x1b, 0x24, 0x1c, 0x1f, 0x67, 0x16, 0x0e, 0x65, 0x05, 0x05, 0x16, 0x0d, 0x0b, 0x65, + 0x09, 0x04, 0x00, 0x3f, 0xed, 0x3f, 0x39, 0x2f, 0xed, 0x10, 0xed, 0x32, 0x01, 0x10, 0xd6, 0xd6, + 0xed, 0x10, 0xde, 0xed, 0xc4, 0x31, 0x30, 0x00, 0x2b, 0x2b, 0x25, 0x34, 0x2e, 0x02, 0x23, 0x36, + 0x36, 0x37, 0x21, 0x15, 0x23, 0x06, 0x06, 0x07, 0x16, 0x16, 0x15, 0x14, 0x0e, 0x02, 0x23, 0x22, + 0x2e, 0x02, 0x27, 0x37, 0x16, 0x16, 0x33, 0x32, 0x3e, 0x02, 0x01, 0x41, 0x11, 0x33, 0x5e, 0x4c, + 0x0a, 0x0c, 0x03, 0x01, 0x3c, 0xd5, 0x02, 0x06, 0x02, 0x7c, 0x7a, 0x1e, 0x3e, 0x5c, 0x3d, 0x18, + 0x32, 0x2e, 0x25, 0x0a, 0x19, 0x16, 0x44, 0x33, 0x24, 0x2f, 0x1b, 0x0a, 0xb6, 0x1a, 0x2b, 0x1f, + 0x11, 0x54, 0xa1, 0x4b, 0x66, 0x20, 0x46, 0x16, 0x08, 0x68, 0x5e, 0x2b, 0x49, 0x36, 0x1e, 0x06, + 0x09, 0x0c, 0x05, 0x66, 0x0b, 0x12, 0x10, 0x19, 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x2e, + 0xff, 0xf3, 0x01, 0xc7, 0x02, 0x6f, 0x00, 0x12, 0x00, 0x2d, 0x00, 0x3e, 0x40, 0x0f, 0x26, 0x10, + 0x63, 0x60, 0x18, 0x70, 0x18, 0x02, 0x18, 0x2f, 0x2b, 0x63, 0x03, 0x63, 0x20, 0xb8, 0xff, 0xc0, + 0x40, 0x12, 0x0b, 0x10, 0x48, 0x20, 0x2e, 0x00, 0x65, 0x13, 0x13, 0x1d, 0x26, 0x67, 0x25, 0x04, + 0x0b, 0x67, 0x1d, 0x0d, 0x00, 0x3f, 0xed, 0x3f, 0xed, 0x12, 0x39, 0x10, 0xed, 0x01, 0x10, 0xd6, + 0x2b, 0xed, 0xed, 0x10, 0xde, 0x5d, 0xed, 0xc4, 0x31, 0x30, 0x13, 0x22, 0x06, 0x07, 0x06, 0x06, + 0x15, 0x14, 0x1e, 0x02, 0x33, 0x32, 0x3e, 0x02, 0x35, 0x34, 0x26, 0x27, 0x32, 0x1e, 0x02, 0x15, + 0x14, 0x0e, 0x02, 0x23, 0x22, 0x26, 0x35, 0x34, 0x3e, 0x02, 0x33, 0x17, 0x0e, 0x03, 0x07, 0x36, + 0x36, 0xf1, 0x13, 0x28, 0x0d, 0x01, 0x01, 0x08, 0x14, 0x23, 0x1a, 0x15, 0x1e, 0x13, 0x09, 0x2a, + 0x24, 0x36, 0x4b, 0x30, 0x15, 0x17, 0x30, 0x4a, 0x33, 0x68, 0x6d, 0x35, 0x62, 0x8a, 0x54, 0x07, + 0x28, 0x4c, 0x40, 0x2f, 0x0b, 0x13, 0x24, 0x01, 0x26, 0x08, 0x07, 0x09, 0x12, 0x0a, 0x1d, 0x35, + 0x2a, 0x19, 0x14, 0x1e, 0x24, 0x11, 0x2f, 0x33, 0x66, 0x20, 0x36, 0x48, 0x28, 0x24, 0x4a, 0x3e, + 0x27, 0x81, 0x89, 0x5a, 0x8a, 0x5e, 0x30, 0x69, 0x01, 0x0e, 0x21, 0x34, 0x27, 0x08, 0x09, 0x00, + 0x00, 0x01, 0x00, 0x31, 0x00, 0x00, 0x01, 0xc5, 0x02, 0x6b, 0x00, 0x0e, 0x00, 0x29, 0xb6, 0x00, + 0x61, 0x0e, 0x09, 0x63, 0x05, 0x07, 0xb8, 0xff, 0xc0, 0x40, 0x0d, 0x0b, 0x10, 0x48, 0x07, 0x0f, + 0x09, 0x65, 0x05, 0x65, 0x08, 0x04, 0x00, 0x0c, 0x00, 0x3f, 0x3f, 0xed, 0xed, 0x01, 0x10, 0xd6, + 0x2b, 0xdd, 0xfd, 0xde, 0xed, 0x31, 0x30, 0x33, 0x3e, 0x03, 0x37, 0x21, 0x35, 0x21, 0x15, 0x0e, + 0x03, 0x07, 0x84, 0x03, 0x24, 0x33, 0x3c, 0x1b, 0xfe, 0xfc, 0x01, 0x94, 0x1b, 0x40, 0x39, 0x2b, + 0x05, 0x40, 0x8f, 0x8c, 0x7d, 0x2d, 0x66, 0x5d, 0x1f, 0x70, 0x8e, 0xa1, 0x50, 0x00, 0x00, 0x00, + 0x00, 0x03, 0x00, 0x26, 0xff, 0xf3, 0x01, 0xcf, 0x02, 0x7a, 0x00, 0x1d, 0x00, 0x2b, 0x00, 0x37, + 0x00, 0xfd, 0xb5, 0x36, 0x40, 0x0c, 0x00, 0x4d, 0x34, 0xb8, 0xff, 0x80, 0xb3, 0x0c, 0x00, 0x4d, + 0x32, 0xb8, 0xff, 0xc0, 0x40, 0x09, 0x0b, 0x00, 0x4d, 0x30, 0x40, 0x0c, 0x00, 0x4d, 0x2f, 0xb8, + 0xff, 0xc0, 0xb3, 0x0c, 0x00, 0x4d, 0x2f, 0xb8, 0xff, 0xe0, 0xb3, 0x0b, 0x00, 0x4d, 0x2e, 0xb8, + 0xff, 0xc0, 0xb4, 0x0b, 0x0c, 0x00, 0x4c, 0x2c, 0xb8, 0xff, 0xc0, 0xb6, 0x0b, 0x00, 0x4d, 0x20, + 0x2c, 0x01, 0x19, 0xb8, 0xff, 0xc0, 0xb3, 0x0a, 0x00, 0x4d, 0x18, 0xb8, 0xff, 0xe0, 0x40, 0x0e, + 0x09, 0x00, 0x4d, 0x09, 0x40, 0x0a, 0x00, 0x4d, 0x09, 0x20, 0x09, 0x00, 0x4d, 0x35, 0xb8, 0xff, + 0xc0, 0xb3, 0x0c, 0x00, 0x4d, 0x2f, 0xb8, 0xff, 0xc0, 0xb4, 0x0b, 0x0c, 0x00, 0x4c, 0x23, 0xb8, + 0xff, 0xc0, 0xb3, 0x10, 0x00, 0x4d, 0x23, 0xb8, 0xff, 0xc0, 0xb6, 0x0a, 0x00, 0x4d, 0x00, 0x23, + 0x01, 0x22, 0xb8, 0xff, 0xc0, 0x40, 0x0f, 0x0a, 0x00, 0x4d, 0x00, 0x22, 0x01, 0x03, 0x32, 0x23, + 0x13, 0x04, 0x10, 0x1e, 0x64, 0x06, 0xb8, 0xff, 0xc0, 0xb3, 0x09, 0x00, 0x4d, 0x06, 0xb8, 0xff, + 0xc0, 0x40, 0x26, 0x0a, 0x0d, 0x48, 0x06, 0x39, 0x35, 0x64, 0x00, 0x00, 0x01, 0x00, 0x39, 0x2f, + 0x2f, 0x64, 0x16, 0x26, 0x64, 0x50, 0x10, 0x01, 0x10, 0x38, 0x32, 0x03, 0x13, 0x03, 0x23, 0x23, + 0x29, 0x2c, 0x67, 0x1b, 0x05, 0x29, 0x67, 0x0b, 0x0d, 0x00, 0x3f, 0xed, 0x3f, 0xed, 0x11, 0x39, + 0x2f, 0x17, 0x39, 0x01, 0x10, 0xd6, 0x5d, 0xed, 0xd0, 0xe9, 0x2f, 0x10, 0xd6, 0x5d, 0xed, 0x10, + 0xd6, 0x2b, 0x2b, 0xed, 0x12, 0x17, 0x39, 0x31, 0x30, 0x00, 0x5d, 0x2b, 0x5d, 0x2b, 0x2b, 0x2b, + 0x2b, 0x01, 0x2b, 0x2b, 0x2b, 0x2b, 0x5d, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x01, + 0x14, 0x06, 0x07, 0x16, 0x16, 0x15, 0x14, 0x0e, 0x02, 0x23, 0x22, 0x2e, 0x02, 0x35, 0x34, 0x36, + 0x37, 0x26, 0x26, 0x35, 0x34, 0x3e, 0x02, 0x33, 0x32, 0x16, 0x03, 0x34, 0x2e, 0x02, 0x27, 0x06, + 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x03, 0x22, 0x06, 0x15, 0x14, 0x16, 0x17, 0x36, 0x36, + 0x35, 0x34, 0x26, 0x01, 0xbe, 0x2a, 0x2d, 0x39, 0x2f, 0x17, 0x33, 0x52, 0x3c, 0x2f, 0x4d, 0x37, + 0x1e, 0x2c, 0x2f, 0x2c, 0x20, 0x15, 0x2e, 0x4c, 0x38, 0x59, 0x69, 0x63, 0x0f, 0x21, 0x34, 0x24, + 0x1c, 0x1e, 0x39, 0x27, 0x2d, 0x35, 0x61, 0x20, 0x31, 0x2e, 0x3a, 0x1f, 0x1a, 0x2f, 0x01, 0xd8, + 0x2b, 0x53, 0x1c, 0x21, 0x4e, 0x2f, 0x1e, 0x3e, 0x31, 0x20, 0x17, 0x2b, 0x3f, 0x27, 0x2f, 0x53, + 0x20, 0x1e, 0x44, 0x26, 0x1e, 0x41, 0x34, 0x22, 0x58, 0xfe, 0x80, 0x14, 0x1e, 0x19, 0x19, 0x0e, + 0x17, 0x39, 0x1a, 0x28, 0x29, 0x2b, 0x01, 0x90, 0x24, 0x23, 0x23, 0x2c, 0x18, 0x17, 0x37, 0x1a, + 0x23, 0x23, 0x00, 0x00, 0x00, 0x02, 0x00, 0x2d, 0xff, 0xfe, 0x01, 0xc9, 0x02, 0x7b, 0x00, 0x12, + 0x00, 0x2a, 0x00, 0x40, 0x40, 0x25, 0x29, 0x29, 0x63, 0x20, 0x03, 0x03, 0x63, 0x40, 0x20, 0x01, + 0x20, 0x2c, 0x26, 0x10, 0x63, 0x20, 0x18, 0x30, 0x18, 0x40, 0x18, 0x03, 0x18, 0x2b, 0x00, 0x65, + 0x13, 0x13, 0x1d, 0x26, 0x67, 0x25, 0x0c, 0x0b, 0x67, 0x1d, 0x05, 0x00, 0x3f, 0xed, 0x3f, 0xed, + 0x12, 0x39, 0x10, 0xed, 0x01, 0x10, 0xd6, 0x5d, 0xed, 0xc4, 0x10, 0xda, 0x5d, 0xe9, 0x2f, 0x10, + 0xe9, 0x2f, 0x31, 0x30, 0x01, 0x32, 0x36, 0x37, 0x36, 0x36, 0x35, 0x34, 0x2e, 0x02, 0x23, 0x22, + 0x0e, 0x02, 0x15, 0x14, 0x16, 0x17, 0x22, 0x2e, 0x02, 0x35, 0x34, 0x3e, 0x02, 0x33, 0x32, 0x16, + 0x15, 0x14, 0x0e, 0x02, 0x23, 0x27, 0x36, 0x36, 0x37, 0x06, 0x01, 0x05, 0x13, 0x2a, 0x0d, 0x01, + 0x01, 0x09, 0x15, 0x23, 0x1a, 0x16, 0x1f, 0x13, 0x09, 0x2c, 0x24, 0x36, 0x4c, 0x30, 0x16, 0x19, + 0x31, 0x4a, 0x32, 0x68, 0x6e, 0x34, 0x61, 0x89, 0x54, 0x04, 0x50, 0x7e, 0x1a, 0x27, 0x01, 0x49, + 0x08, 0x07, 0x08, 0x17, 0x0b, 0x19, 0x33, 0x2a, 0x1a, 0x11, 0x1c, 0x26, 0x15, 0x2f, 0x32, 0x66, + 0x1f, 0x36, 0x47, 0x29, 0x24, 0x4b, 0x3d, 0x27, 0x8c, 0x7d, 0x5a, 0x8b, 0x5e, 0x31, 0x6a, 0x01, + 0x43, 0x48, 0x11, 0x00, 0xff, 0xff, 0x00, 0xa1, 0xff, 0xf5, 0x01, 0x54, 0x01, 0xd6, 0x02, 0x26, + 0x00, 0x11, 0x00, 0x00, 0x01, 0x07, 0x00, 0x11, 0x00, 0x00, 0x01, 0x2f, 0x00, 0x10, 0x40, 0x0b, + 0x01, 0x00, 0x17, 0x10, 0x07, 0x00, 0x50, 0x01, 0x0c, 0x12, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x76, 0xff, 0x67, 0x01, 0x54, 0x01, 0xd6, 0x02, 0x36, 0x00, 0x0f, 0xf8, 0x00, + 0x00, 0x07, 0x00, 0x11, 0x00, 0x00, 0x01, 0x2f, 0x00, 0x01, 0x00, 0x2d, 0x00, 0x28, 0x01, 0xcf, + 0x01, 0xda, 0x00, 0x06, 0x00, 0x2a, 0x40, 0x12, 0x03, 0x06, 0x02, 0x04, 0x08, 0x06, 0x07, 0x06, + 0x05, 0x00, 0x02, 0x03, 0x03, 0x01, 0x05, 0x10, 0x01, 0x10, 0x00, 0x3f, 0x3f, 0x12, 0x39, 0x3d, + 0x2f, 0x39, 0x39, 0x12, 0x39, 0x01, 0x10, 0xc2, 0x18, 0x10, 0xde, 0xc0, 0x12, 0x39, 0x31, 0x30, + 0x13, 0x25, 0x17, 0x05, 0x05, 0x07, 0x25, 0x2d, 0x01, 0x80, 0x22, 0xfe, 0xe8, 0x01, 0x18, 0x22, + 0xfe, 0x80, 0x01, 0x39, 0xa1, 0x6c, 0x6d, 0x6d, 0x6c, 0xa2, 0x00, 0x00, 0x00, 0x02, 0x00, 0x28, + 0x00, 0x72, 0x01, 0xcc, 0x01, 0x9b, 0x00, 0x03, 0x00, 0x07, 0x00, 0x21, 0x40, 0x0f, 0x02, 0x01, + 0x06, 0x05, 0x09, 0x03, 0x07, 0x08, 0x07, 0x55, 0x04, 0x03, 0x55, 0x00, 0xa3, 0x00, 0x3f, 0xfd, + 0xd6, 0xed, 0x01, 0x10, 0xd6, 0xc0, 0x10, 0xde, 0x32, 0xc0, 0x32, 0x31, 0x30, 0x13, 0x21, 0x15, + 0x21, 0x15, 0x21, 0x15, 0x21, 0x28, 0x01, 0xa4, 0xfe, 0x5c, 0x01, 0xa4, 0xfe, 0x5c, 0x01, 0x9b, + 0x66, 0x5d, 0x66, 0x00, 0x00, 0x01, 0x00, 0x28, 0x00, 0x27, 0x01, 0xcb, 0x01, 0xd9, 0x00, 0x06, + 0x00, 0x2e, 0x40, 0x14, 0x03, 0x02, 0x00, 0x08, 0x04, 0x02, 0x07, 0x02, 0x00, 0x01, 0x06, 0x04, + 0x05, 0x03, 0x03, 0x01, 0x05, 0x10, 0x01, 0x10, 0x00, 0x3f, 0x3f, 0x12, 0x39, 0x3d, 0x2f, 0x12, + 0x39, 0x39, 0x12, 0x39, 0x39, 0x01, 0x18, 0x10, 0xd6, 0xc0, 0x10, 0xce, 0x11, 0x39, 0x31, 0x30, + 0x25, 0x05, 0x27, 0x25, 0x25, 0x37, 0x05, 0x01, 0xcb, 0xfe, 0x80, 0x23, 0x01, 0x19, 0xfe, 0xe7, + 0x23, 0x01, 0x80, 0xc9, 0xa2, 0x6c, 0x6d, 0x6d, 0x6c, 0xa1, 0x00, 0x00, 0x00, 0x02, 0x00, 0x45, + 0xff, 0xf4, 0x01, 0xb2, 0x02, 0x79, 0x00, 0x1e, 0x00, 0x30, 0x00, 0x31, 0x40, 0x1a, 0x00, 0x1e, + 0x32, 0x08, 0x17, 0x32, 0x1f, 0x71, 0x0f, 0x27, 0x1f, 0x27, 0x02, 0x27, 0x0f, 0x31, 0x1e, 0x2c, + 0x75, 0x22, 0x07, 0x0e, 0x0b, 0x67, 0x12, 0x03, 0x00, 0x3f, 0xfd, 0xc2, 0x3f, 0xfd, 0xc6, 0x01, + 0x10, 0xc6, 0xde, 0x5d, 0xed, 0x10, 0xde, 0xc5, 0x10, 0xde, 0xcd, 0x31, 0x30, 0x37, 0x26, 0x35, + 0x34, 0x36, 0x37, 0x36, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x27, 0x36, 0x36, 0x33, + 0x32, 0x1e, 0x02, 0x15, 0x14, 0x0e, 0x04, 0x15, 0x17, 0x14, 0x06, 0x23, 0x22, 0x2e, 0x02, 0x35, + 0x34, 0x3e, 0x02, 0x33, 0x32, 0x1e, 0x02, 0xa6, 0x01, 0x2a, 0x22, 0x17, 0x28, 0x2a, 0x20, 0x20, + 0x3c, 0x23, 0x22, 0x23, 0x5e, 0x2e, 0x39, 0x4a, 0x2a, 0x11, 0x17, 0x23, 0x28, 0x23, 0x17, 0x23, + 0x33, 0x20, 0x10, 0x1e, 0x18, 0x0e, 0x0e, 0x18, 0x1e, 0x10, 0x10, 0x1e, 0x17, 0x0e, 0xe1, 0x05, + 0x0a, 0x28, 0x49, 0x1c, 0x13, 0x2b, 0x19, 0x1e, 0x1f, 0x13, 0x11, 0x5e, 0x16, 0x18, 0x1f, 0x2e, + 0x37, 0x19, 0x1d, 0x30, 0x2a, 0x25, 0x24, 0x26, 0x15, 0x9a, 0x27, 0x2c, 0x0b, 0x16, 0x1e, 0x14, + 0x13, 0x1f, 0x15, 0x0b, 0x0b, 0x15, 0x1f, 0x00, 0x00, 0x02, 0x00, 0x12, 0xff, 0x79, 0x01, 0xd4, + 0x02, 0x79, 0x00, 0x35, 0x00, 0x45, 0x01, 0x5a, 0xb9, 0x00, 0x3e, 0xff, 0xc0, 0xb3, 0x0e, 0x00, + 0x4d, 0x38, 0xb8, 0xff, 0xc0, 0x40, 0x13, 0x0f, 0x00, 0x4d, 0x21, 0x40, 0x0e, 0x00, 0x4d, 0x21, + 0x38, 0x0d, 0x00, 0x4d, 0x20, 0x40, 0x0d, 0x00, 0x4d, 0x1b, 0xb8, 0xff, 0xe0, 0xb3, 0x0a, 0x00, + 0x4d, 0x11, 0xb8, 0xff, 0xc0, 0x40, 0x0e, 0x0e, 0x00, 0x4d, 0x3a, 0x20, 0x0a, 0x00, 0x4d, 0x3a, + 0x40, 0x09, 0x00, 0x4d, 0x20, 0xb8, 0xff, 0xc0, 0x40, 0x1b, 0x09, 0x00, 0x4d, 0x9f, 0x20, 0x01, + 0x1f, 0x40, 0x12, 0x00, 0x4d, 0x1e, 0x40, 0x12, 0x00, 0x4d, 0x1d, 0x40, 0x12, 0x00, 0x4d, 0x1c, + 0x20, 0x12, 0x00, 0x4d, 0x1a, 0xb8, 0xff, 0xc0, 0xb3, 0x11, 0x00, 0x4d, 0x1a, 0xb8, 0xff, 0xc0, + 0x40, 0x0a, 0x09, 0x00, 0x4d, 0x16, 0x40, 0x09, 0x0a, 0x00, 0x4c, 0x15, 0xb8, 0xff, 0xe0, 0xb4, + 0x11, 0x12, 0x00, 0x4c, 0x15, 0xb8, 0xff, 0xc0, 0xb3, 0x10, 0x00, 0x4d, 0x14, 0xb8, 0xff, 0xc0, + 0xb3, 0x10, 0x00, 0x4d, 0x13, 0xb8, 0xff, 0xc0, 0xb4, 0x10, 0x12, 0x00, 0x4c, 0x12, 0xb8, 0xff, + 0xe0, 0x40, 0x72, 0x10, 0x12, 0x00, 0x4c, 0x05, 0x40, 0x09, 0x00, 0x4d, 0x04, 0x40, 0x09, 0x00, + 0x4d, 0x03, 0x40, 0x09, 0x00, 0x4d, 0x02, 0x40, 0x09, 0x00, 0x4d, 0x01, 0x20, 0x09, 0x00, 0x4d, + 0x00, 0x20, 0x09, 0x00, 0x4d, 0x50, 0x3d, 0x01, 0x3d, 0x0f, 0x40, 0x3e, 0x01, 0x3e, 0x79, 0x20, + 0x35, 0x30, 0x35, 0x60, 0x35, 0x03, 0x35, 0x47, 0x4f, 0x36, 0x5f, 0x36, 0x02, 0x36, 0x79, 0x08, + 0x08, 0x2b, 0x21, 0x47, 0x8f, 0x18, 0x9f, 0x18, 0x02, 0x18, 0x7c, 0x2b, 0x46, 0x40, 0x03, 0x50, + 0x03, 0x02, 0x1f, 0x03, 0x01, 0x03, 0x79, 0x3d, 0x40, 0x41, 0x50, 0x41, 0x02, 0x41, 0x79, 0x0d, + 0x00, 0x26, 0x3e, 0x0f, 0x0d, 0x3d, 0x0d, 0x3d, 0x0d, 0x26, 0x13, 0x7d, 0x30, 0x03, 0x20, 0x8f, + 0x1d, 0x01, 0x1d, 0x7d, 0x26, 0x00, 0x2f, 0xfd, 0x5d, 0xc6, 0x3f, 0xed, 0x11, 0x39, 0x39, 0x2f, + 0x2f, 0x12, 0x39, 0x39, 0x12, 0x39, 0x10, 0xed, 0x5d, 0x10, 0xed, 0x5d, 0x5d, 0x01, 0x10, 0xd6, + 0xed, 0x5d, 0x10, 0xc6, 0x12, 0x39, 0x2f, 0xed, 0x5d, 0x10, 0xd6, 0x5d, 0xed, 0x5d, 0x32, 0x32, + 0x5d, 0x31, 0x30, 0x00, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, + 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x5d, 0x2b, 0x2b, 0x2b, 0x01, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, + 0x2b, 0x2b, 0x25, 0x06, 0x06, 0x23, 0x22, 0x2e, 0x02, 0x35, 0x34, 0x3e, 0x02, 0x33, 0x32, 0x17, + 0x35, 0x34, 0x26, 0x23, 0x22, 0x0e, 0x02, 0x15, 0x14, 0x1e, 0x02, 0x33, 0x32, 0x36, 0x37, 0x17, + 0x0e, 0x03, 0x23, 0x22, 0x2e, 0x02, 0x35, 0x34, 0x3e, 0x02, 0x33, 0x32, 0x1e, 0x02, 0x15, 0x07, + 0x14, 0x1e, 0x02, 0x33, 0x32, 0x37, 0x35, 0x26, 0x26, 0x23, 0x22, 0x0e, 0x02, 0x01, 0xd4, 0x1b, + 0x47, 0x1a, 0x26, 0x41, 0x30, 0x1b, 0x0f, 0x24, 0x39, 0x2a, 0x13, 0x1c, 0x30, 0x2e, 0x21, 0x3b, + 0x2b, 0x19, 0x15, 0x33, 0x55, 0x3f, 0x2f, 0x36, 0x08, 0x0b, 0x11, 0x1c, 0x1c, 0x1d, 0x12, 0x42, + 0x72, 0x53, 0x30, 0x29, 0x46, 0x5a, 0x32, 0x29, 0x48, 0x36, 0x20, 0xc5, 0x05, 0x0e, 0x19, 0x14, + 0x0d, 0x0f, 0x08, 0x0e, 0x07, 0x13, 0x18, 0x0e, 0x06, 0x37, 0x0b, 0x0b, 0x17, 0x31, 0x4f, 0x39, + 0x2a, 0x4a, 0x37, 0x20, 0x05, 0x10, 0x26, 0x35, 0x1c, 0x46, 0x75, 0x59, 0x46, 0x6c, 0x49, 0x26, + 0x0a, 0x03, 0x57, 0x04, 0x05, 0x03, 0x02, 0x24, 0x59, 0x93, 0x6f, 0x6c, 0x93, 0x5b, 0x27, 0x19, + 0x36, 0x57, 0x3e, 0x9e, 0x13, 0x28, 0x20, 0x15, 0x03, 0xc8, 0x02, 0x02, 0x11, 0x1b, 0x22, 0x00, + 0x00, 0x02, 0x00, 0x09, 0x00, 0x00, 0x01, 0xeb, 0x02, 0x6b, 0x00, 0x0b, 0x00, 0x16, 0x00, 0x44, + 0xb9, 0x00, 0x0a, 0xff, 0xe0, 0x40, 0x27, 0x09, 0x0a, 0x00, 0x4c, 0x05, 0x20, 0x09, 0x0a, 0x00, + 0x4c, 0x00, 0x01, 0x08, 0x12, 0x0c, 0x11, 0x07, 0x02, 0x03, 0x09, 0x17, 0x0b, 0x18, 0x04, 0x17, + 0x12, 0x48, 0x0c, 0x08, 0x01, 0x01, 0x08, 0x02, 0x07, 0x02, 0x03, 0x08, 0x00, 0x08, 0x00, 0x3f, + 0x3f, 0x3f, 0x3f, 0x39, 0x2f, 0x12, 0x39, 0xed, 0x01, 0x10, 0xc6, 0x10, 0xc6, 0x11, 0x17, 0x39, + 0x31, 0x30, 0x2b, 0x2b, 0x21, 0x27, 0x23, 0x07, 0x23, 0x36, 0x12, 0x37, 0x33, 0x16, 0x12, 0x17, + 0x03, 0x0e, 0x03, 0x07, 0x33, 0x2e, 0x03, 0x01, 0x67, 0x1d, 0xa5, 0x1c, 0x80, 0x2c, 0x5a, 0x2a, + 0x86, 0x2c, 0x57, 0x29, 0xf2, 0x0a, 0x11, 0x0f, 0x0d, 0x06, 0x79, 0x06, 0x0c, 0x0f, 0x11, 0x8f, + 0x8f, 0xb7, 0x01, 0x2d, 0x87, 0x88, 0xfe, 0xcf, 0xb2, 0x01, 0xf3, 0x23, 0x3f, 0x3d, 0x3e, 0x21, + 0x21, 0x3e, 0x3d, 0x3f, 0x00, 0x03, 0x00, 0x36, 0xff, 0xf8, 0x01, 0xd5, 0x02, 0x72, 0x00, 0x16, + 0x00, 0x23, 0x00, 0x30, 0x00, 0x54, 0x40, 0x15, 0x27, 0x46, 0x11, 0x20, 0x46, 0x70, 0x00, 0x80, + 0x00, 0x02, 0x0f, 0x00, 0x1f, 0x00, 0x02, 0x00, 0x32, 0x17, 0x30, 0x44, 0x09, 0xb8, 0xff, 0xc0, + 0x40, 0x1a, 0x0a, 0x10, 0x48, 0x0f, 0x09, 0x1f, 0x09, 0x02, 0x08, 0x09, 0x31, 0x14, 0x14, 0x23, + 0x48, 0x24, 0x24, 0x1b, 0x2c, 0x4a, 0x0c, 0x03, 0x1b, 0x4a, 0x05, 0x09, 0x00, 0x3f, 0xed, 0x3f, + 0xed, 0x12, 0x39, 0x2f, 0xed, 0x39, 0x3d, 0x2f, 0x01, 0x18, 0x10, 0xd6, 0x5e, 0x5d, 0x2b, 0xed, + 0x32, 0x10, 0xde, 0x5d, 0x5d, 0xed, 0xd4, 0xed, 0x31, 0x30, 0x25, 0x14, 0x0e, 0x02, 0x23, 0x22, + 0x26, 0x27, 0x11, 0x36, 0x36, 0x33, 0x32, 0x1e, 0x02, 0x15, 0x14, 0x06, 0x07, 0x16, 0x16, 0x25, + 0x15, 0x16, 0x16, 0x33, 0x32, 0x3e, 0x02, 0x35, 0x34, 0x26, 0x23, 0x27, 0x32, 0x36, 0x35, 0x34, + 0x2e, 0x02, 0x23, 0x22, 0x06, 0x07, 0x15, 0x01, 0xd5, 0x26, 0x41, 0x59, 0x33, 0x29, 0x58, 0x2b, + 0x23, 0x54, 0x29, 0x46, 0x58, 0x32, 0x12, 0x2b, 0x24, 0x3f, 0x2d, 0xfe, 0xdc, 0x0d, 0x1f, 0x0f, + 0x15, 0x28, 0x1f, 0x14, 0x39, 0x30, 0x12, 0x2f, 0x30, 0x0e, 0x18, 0x20, 0x11, 0x0e, 0x1e, 0x0c, + 0xbb, 0x38, 0x4b, 0x2d, 0x13, 0x09, 0x09, 0x02, 0x59, 0x06, 0x09, 0x1d, 0x2f, 0x3a, 0x1d, 0x2c, + 0x44, 0x14, 0x17, 0x4e, 0x29, 0xa8, 0x02, 0x02, 0x07, 0x13, 0x23, 0x1b, 0x2d, 0x27, 0x66, 0x29, + 0x24, 0x16, 0x1b, 0x0f, 0x05, 0x02, 0x02, 0x8e, 0x00, 0x01, 0x00, 0x1b, 0xff, 0xf3, 0x01, 0xd5, + 0x02, 0x79, 0x00, 0x1f, 0x00, 0x3a, 0xb6, 0x0e, 0x60, 0x0d, 0x01, 0x0d, 0x1c, 0x1d, 0xb8, 0xff, + 0xc0, 0x40, 0x17, 0x08, 0x0f, 0x48, 0x1d, 0x21, 0x16, 0x46, 0x03, 0x20, 0x0e, 0x4a, 0x0d, 0x11, + 0x4a, 0x08, 0x03, 0x1c, 0x4a, 0x1d, 0x19, 0x4a, 0x00, 0x09, 0x00, 0x3f, 0xed, 0xd5, 0xed, 0x3f, + 0xed, 0xd5, 0xed, 0x01, 0x10, 0xd6, 0xed, 0x10, 0xd6, 0x2b, 0x32, 0xc6, 0x5d, 0x32, 0x31, 0x30, + 0x05, 0x22, 0x26, 0x35, 0x34, 0x3e, 0x02, 0x33, 0x32, 0x1e, 0x02, 0x17, 0x07, 0x26, 0x26, 0x23, + 0x22, 0x0e, 0x02, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x17, 0x06, 0x06, 0x01, 0x28, 0x83, + 0x8a, 0x2a, 0x4b, 0x67, 0x3d, 0x21, 0x35, 0x28, 0x1b, 0x07, 0x20, 0x17, 0x41, 0x2a, 0x1d, 0x37, + 0x2b, 0x1b, 0x49, 0x53, 0x30, 0x3f, 0x13, 0x1f, 0x1a, 0x59, 0x0d, 0xa8, 0x9b, 0x4d, 0x78, 0x53, + 0x2b, 0x0b, 0x0e, 0x10, 0x04, 0x62, 0x0f, 0x15, 0x15, 0x31, 0x52, 0x3d, 0x6a, 0x71, 0x16, 0x0b, + 0x61, 0x10, 0x1b, 0x00, 0x00, 0x02, 0x00, 0x36, 0xff, 0xf8, 0x01, 0xd9, 0x02, 0x72, 0x00, 0x10, + 0x00, 0x21, 0x00, 0x36, 0x40, 0x0a, 0x08, 0x46, 0x0f, 0x11, 0x01, 0x11, 0x23, 0x10, 0x44, 0x1a, + 0xb8, 0xff, 0xc0, 0x40, 0x11, 0x0a, 0x10, 0x48, 0x0f, 0x1a, 0x01, 0x08, 0x1a, 0x22, 0x0d, 0x48, + 0x1d, 0x02, 0x03, 0x48, 0x16, 0x09, 0x00, 0x3f, 0xed, 0x3f, 0xed, 0x01, 0x10, 0xd6, 0x5e, 0x5d, + 0x2b, 0xed, 0x7d, 0x2f, 0x18, 0xde, 0x5d, 0xed, 0x31, 0x30, 0x37, 0x16, 0x32, 0x33, 0x32, 0x3e, + 0x02, 0x35, 0x34, 0x2e, 0x02, 0x23, 0x22, 0x06, 0x07, 0x05, 0x14, 0x0e, 0x02, 0x23, 0x22, 0x26, + 0x27, 0x11, 0x36, 0x36, 0x33, 0x32, 0x1e, 0x02, 0xb1, 0x05, 0x0c, 0x05, 0x2a, 0x39, 0x23, 0x0f, + 0x0c, 0x1e, 0x34, 0x29, 0x08, 0x14, 0x08, 0x01, 0x28, 0x2b, 0x4c, 0x69, 0x3f, 0x21, 0x3f, 0x24, + 0x2a, 0x4a, 0x20, 0x3d, 0x65, 0x46, 0x27, 0x64, 0x01, 0x20, 0x38, 0x4d, 0x2e, 0x28, 0x4c, 0x3a, + 0x23, 0x01, 0x02, 0xce, 0x56, 0x79, 0x4c, 0x23, 0x07, 0x08, 0x02, 0x5c, 0x09, 0x06, 0x24, 0x4d, + 0x77, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x3f, 0x00, 0x00, 0x01, 0xcc, 0x02, 0x6b, 0x00, 0x0b, + 0x00, 0x51, 0x40, 0x1b, 0x07, 0x02, 0x20, 0x0a, 0x30, 0x0a, 0x02, 0x0a, 0x0d, 0x09, 0x04, 0x44, + 0x20, 0x01, 0x30, 0x01, 0x02, 0x01, 0x0c, 0x06, 0x48, 0x08, 0x40, 0x18, 0x00, 0x4d, 0x08, 0xb8, + 0xff, 0xc0, 0xb3, 0x10, 0x00, 0x4d, 0x08, 0xb8, 0xff, 0xc0, 0x40, 0x0e, 0x0d, 0x00, 0x4d, 0x08, + 0x08, 0x09, 0x04, 0x48, 0x01, 0x02, 0x09, 0x48, 0x00, 0x08, 0x00, 0x3f, 0xed, 0x3f, 0xed, 0x12, + 0x39, 0x2f, 0x2b, 0x2b, 0x2b, 0xed, 0x01, 0x10, 0xd6, 0x5d, 0xed, 0x32, 0x10, 0xd6, 0x5d, 0xc6, + 0xc6, 0x31, 0x30, 0x33, 0x11, 0x21, 0x15, 0x23, 0x15, 0x33, 0x15, 0x23, 0x15, 0x21, 0x15, 0x3f, + 0x01, 0x77, 0xfc, 0xdb, 0xdb, 0x01, 0x12, 0x02, 0x6b, 0x66, 0x8b, 0x66, 0xae, 0x66, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x3f, 0x00, 0x00, 0x01, 0xba, 0x02, 0x6b, 0x00, 0x09, 0x00, 0x4a, 0x40, 0x2f, + 0x02, 0x07, 0x40, 0x09, 0x00, 0x4d, 0x10, 0x07, 0x40, 0x07, 0x80, 0x07, 0x03, 0x0f, 0x07, 0x01, + 0x08, 0x07, 0x0b, 0x08, 0x04, 0x44, 0x01, 0x40, 0x09, 0x00, 0x4d, 0x00, 0x01, 0x30, 0x01, 0x02, + 0x01, 0x0a, 0x08, 0x48, 0x06, 0x06, 0x02, 0x09, 0x08, 0x02, 0x02, 0x03, 0x48, 0x01, 0x02, 0x00, + 0x3f, 0xed, 0x3f, 0x3f, 0x12, 0x39, 0x2f, 0xed, 0x01, 0x10, 0xd6, 0x5d, 0x2b, 0xed, 0x32, 0x10, + 0xd6, 0x5e, 0x5d, 0x5d, 0x2b, 0xc4, 0x31, 0x30, 0x33, 0x11, 0x21, 0x15, 0x21, 0x15, 0x33, 0x15, + 0x23, 0x11, 0x3f, 0x01, 0x7b, 0xff, 0x00, 0xe0, 0xe0, 0x02, 0x6b, 0x66, 0x96, 0x66, 0xfe, 0xf7, + 0x00, 0x01, 0x00, 0x1b, 0xff, 0xf3, 0x01, 0xd0, 0x02, 0x79, 0x00, 0x23, 0x00, 0x34, 0x40, 0x1c, + 0x20, 0x25, 0x05, 0x46, 0x16, 0x24, 0x0c, 0x44, 0x30, 0x0e, 0x01, 0x0e, 0x0c, 0x0c, 0x0e, 0x20, + 0x02, 0x21, 0x00, 0x4a, 0x1b, 0x03, 0x08, 0x4a, 0x11, 0x09, 0x0e, 0x08, 0x00, 0x3f, 0x3f, 0xed, + 0x3f, 0xfd, 0xc6, 0x3f, 0x12, 0x39, 0x2f, 0x01, 0x2f, 0x5d, 0xed, 0x10, 0xd6, 0xed, 0x10, 0xce, + 0x31, 0x30, 0x01, 0x22, 0x0e, 0x02, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x35, 0x33, 0x11, + 0x06, 0x06, 0x23, 0x22, 0x2e, 0x02, 0x35, 0x34, 0x3e, 0x02, 0x33, 0x32, 0x1e, 0x02, 0x17, 0x07, + 0x26, 0x26, 0x01, 0x38, 0x2c, 0x3c, 0x27, 0x11, 0x46, 0x44, 0x0b, 0x1a, 0x0b, 0x7b, 0x16, 0x5d, + 0x42, 0x3a, 0x5d, 0x42, 0x24, 0x2a, 0x48, 0x62, 0x38, 0x24, 0x39, 0x2a, 0x1b, 0x07, 0x20, 0x16, + 0x40, 0x02, 0x0e, 0x20, 0x39, 0x4f, 0x30, 0x6f, 0x69, 0x02, 0x02, 0xe2, 0xfe, 0xcb, 0x08, 0x14, + 0x29, 0x51, 0x79, 0x50, 0x4f, 0x79, 0x52, 0x29, 0x0b, 0x0e, 0x10, 0x04, 0x62, 0x0e, 0x16, 0x00, + 0x00, 0x01, 0x00, 0x2d, 0x00, 0x00, 0x01, 0xc7, 0x02, 0x6b, 0x00, 0x0b, 0x00, 0x3b, 0x40, 0x09, + 0x02, 0x0a, 0x44, 0x00, 0x0d, 0x05, 0x09, 0x44, 0x07, 0xb8, 0xff, 0xc0, 0x40, 0x15, 0x0b, 0x11, + 0x48, 0x07, 0x0c, 0x0b, 0x02, 0x09, 0x48, 0x40, 0x03, 0x01, 0x03, 0x03, 0x02, 0x08, 0x02, 0x05, + 0x08, 0x02, 0x08, 0x00, 0x3f, 0x3f, 0x3f, 0x12, 0x39, 0x2f, 0x5d, 0xed, 0x3f, 0x01, 0x10, 0xd6, + 0x2b, 0xed, 0x32, 0x10, 0xde, 0xed, 0x32, 0x31, 0x30, 0x01, 0x11, 0x23, 0x11, 0x23, 0x11, 0x23, + 0x11, 0x33, 0x15, 0x33, 0x35, 0x01, 0xc7, 0x7b, 0xa4, 0x7b, 0x7b, 0xa4, 0x02, 0x6b, 0xfd, 0x95, + 0x01, 0x11, 0xfe, 0xef, 0x02, 0x6b, 0xf4, 0xf4, 0x00, 0x01, 0x00, 0x36, 0x00, 0x00, 0x01, 0xbf, + 0x02, 0x6b, 0x00, 0x0b, 0x00, 0x2e, 0xb6, 0x0b, 0x06, 0x09, 0x44, 0x03, 0x01, 0x05, 0xb8, 0xff, + 0xc0, 0x40, 0x0f, 0x0a, 0x10, 0x48, 0x05, 0x0c, 0x09, 0x02, 0x48, 0x0b, 0x08, 0x03, 0x08, 0x48, + 0x06, 0x02, 0x00, 0x3f, 0xed, 0x32, 0x3f, 0xed, 0x32, 0x01, 0x10, 0xd6, 0x2b, 0xc0, 0xdd, 0xfd, + 0xdc, 0xc0, 0x31, 0x30, 0x33, 0x35, 0x33, 0x11, 0x23, 0x35, 0x21, 0x15, 0x23, 0x11, 0x33, 0x15, + 0x36, 0x87, 0x87, 0x01, 0x89, 0x86, 0x86, 0x66, 0x01, 0x9f, 0x66, 0x66, 0xfe, 0x61, 0x66, 0x00, + 0x00, 0x01, 0x00, 0x2a, 0xff, 0xf3, 0x01, 0xb6, 0x02, 0x6b, 0x00, 0x13, 0x00, 0x2e, 0x40, 0x19, + 0x12, 0x10, 0x44, 0x0f, 0x00, 0x01, 0x00, 0x15, 0x0f, 0x08, 0x01, 0x08, 0x08, 0x14, 0x13, 0x02, + 0x10, 0x48, 0x12, 0x02, 0x09, 0x0c, 0x4a, 0x05, 0x09, 0x00, 0x3f, 0xfd, 0xc6, 0x3f, 0xed, 0x3f, + 0x01, 0x10, 0xc6, 0x5e, 0x5d, 0x10, 0xde, 0x5d, 0xfd, 0xcd, 0x31, 0x30, 0x25, 0x14, 0x0e, 0x02, + 0x23, 0x22, 0x26, 0x27, 0x37, 0x16, 0x16, 0x33, 0x32, 0x36, 0x35, 0x11, 0x23, 0x35, 0x21, 0x01, + 0xb6, 0x17, 0x35, 0x54, 0x3c, 0x3f, 0x54, 0x1d, 0x2f, 0x19, 0x3d, 0x20, 0x30, 0x3b, 0xcf, 0x01, + 0x4b, 0xcf, 0x2d, 0x50, 0x3c, 0x23, 0x20, 0x17, 0x62, 0x10, 0x1e, 0x33, 0x45, 0x01, 0x2f, 0x66, + 0x00, 0x01, 0x00, 0x2d, 0x00, 0x00, 0x01, 0xe9, 0x02, 0x6b, 0x00, 0x1a, 0x00, 0x2f, 0x40, 0x19, + 0x0f, 0x44, 0x10, 0x00, 0x44, 0x1a, 0x1c, 0x15, 0x05, 0x0a, 0x44, 0x08, 0x1b, 0x0f, 0x02, 0x0a, + 0x15, 0x05, 0x03, 0x09, 0x02, 0x06, 0x08, 0x00, 0x08, 0x00, 0x3f, 0x3f, 0x3f, 0x17, 0x39, 0x3f, + 0x01, 0x10, 0xd6, 0xfd, 0xc0, 0x33, 0x10, 0xd6, 0xed, 0xd6, 0xed, 0x31, 0x30, 0x21, 0x2e, 0x03, + 0x27, 0x11, 0x23, 0x11, 0x33, 0x11, 0x3e, 0x03, 0x37, 0x33, 0x0e, 0x03, 0x07, 0x1e, 0x03, 0x17, + 0x01, 0x5e, 0x0b, 0x29, 0x32, 0x37, 0x19, 0x7b, 0x7b, 0x16, 0x30, 0x2b, 0x24, 0x0c, 0x8b, 0x0e, + 0x27, 0x32, 0x39, 0x1f, 0x1f, 0x40, 0x39, 0x2e, 0x0e, 0x23, 0x51, 0x4d, 0x43, 0x17, 0xfe, 0xe5, + 0x02, 0x6b, 0xfe, 0xff, 0x1c, 0x44, 0x44, 0x42, 0x1b, 0x1b, 0x45, 0x4b, 0x4e, 0x24, 0x1e, 0x4e, + 0x59, 0x5d, 0x2c, 0x00, 0x00, 0x01, 0x00, 0x47, 0x00, 0x00, 0x01, 0xcc, 0x02, 0x6b, 0x00, 0x05, + 0x00, 0x2c, 0xb9, 0x00, 0x05, 0xff, 0xc0, 0xb7, 0x09, 0x0f, 0x48, 0x05, 0x07, 0x04, 0x44, 0x02, + 0xb8, 0xff, 0xc0, 0x40, 0x0b, 0x09, 0x0f, 0x48, 0x02, 0x06, 0x02, 0x02, 0x04, 0x48, 0x01, 0x08, + 0x00, 0x3f, 0xed, 0x3f, 0x01, 0x10, 0xde, 0x2b, 0xed, 0x10, 0xc6, 0x2b, 0x31, 0x30, 0x21, 0x21, + 0x11, 0x33, 0x11, 0x21, 0x01, 0xcc, 0xfe, 0x7b, 0x7c, 0x01, 0x09, 0x02, 0x6b, 0xfd, 0xfb, 0x00, + 0x00, 0x01, 0x00, 0x17, 0x00, 0x00, 0x01, 0xdd, 0x02, 0x6b, 0x00, 0x1c, 0x01, 0x6f, 0xb5, 0x1c, + 0x20, 0x0f, 0x00, 0x4d, 0x16, 0xb8, 0xff, 0xc0, 0x40, 0x0c, 0x0b, 0x00, 0x4d, 0x30, 0x16, 0x01, + 0x14, 0x20, 0x0b, 0x00, 0x4d, 0x13, 0xb8, 0xff, 0xe0, 0x40, 0x5b, 0x0b, 0x00, 0x4d, 0x12, 0x40, + 0x09, 0x0a, 0x00, 0x4c, 0x3f, 0x12, 0x01, 0x04, 0x12, 0x01, 0x11, 0x40, 0x0b, 0x00, 0x4d, 0x3f, + 0x11, 0x01, 0x0d, 0x20, 0x0e, 0x00, 0x4d, 0x0d, 0x20, 0x09, 0x00, 0x4d, 0x0c, 0x20, 0x0e, 0x12, + 0x00, 0x4c, 0x0c, 0x40, 0x0d, 0x00, 0x4d, 0x0c, 0x20, 0x0c, 0x00, 0x4d, 0x0c, 0x40, 0x0b, 0x00, + 0x4d, 0x0b, 0x40, 0x0d, 0x0e, 0x00, 0x4c, 0x0b, 0x40, 0x09, 0x0b, 0x00, 0x4c, 0x3f, 0x0b, 0x01, + 0x0a, 0x40, 0x0f, 0x00, 0x4d, 0x07, 0x20, 0x11, 0x12, 0x00, 0x4c, 0x07, 0x20, 0x0e, 0x00, 0x4d, + 0x06, 0x20, 0x11, 0x00, 0x4d, 0x03, 0xb8, 0xff, 0xe0, 0x40, 0x1a, 0x0e, 0x00, 0x4d, 0x02, 0x40, + 0x0a, 0x00, 0x4d, 0x02, 0x20, 0x09, 0x00, 0x4d, 0x01, 0x20, 0x0f, 0x12, 0x00, 0x4c, 0x00, 0x40, + 0x09, 0x0a, 0x00, 0x4c, 0x15, 0xb8, 0xff, 0xc0, 0x40, 0x19, 0x0b, 0x00, 0x4d, 0x10, 0x15, 0x01, + 0x14, 0x40, 0x0c, 0x00, 0x4d, 0x14, 0x20, 0x0b, 0x00, 0x4d, 0x13, 0x20, 0x0b, 0x00, 0x4d, 0x3f, + 0x13, 0x01, 0x12, 0xb8, 0xff, 0x80, 0xb3, 0x0d, 0x00, 0x4d, 0x12, 0xb8, 0xff, 0xc0, 0x40, 0x31, + 0x0b, 0x00, 0x4d, 0x0f, 0x12, 0x01, 0x06, 0x40, 0x0a, 0x00, 0x4d, 0x05, 0x40, 0x0a, 0x00, 0x4d, + 0x2f, 0x05, 0x3f, 0x05, 0x02, 0x04, 0x40, 0x0a, 0x00, 0x4d, 0x0a, 0x0a, 0x0b, 0x10, 0x15, 0x14, + 0x17, 0x13, 0x12, 0x10, 0x05, 0x05, 0x17, 0x11, 0x44, 0x10, 0x1e, 0x00, 0x00, 0x1c, 0x16, 0x44, + 0x17, 0xb8, 0xff, 0xc0, 0x40, 0x1e, 0x0f, 0x00, 0x4d, 0x6f, 0x17, 0x01, 0x00, 0x17, 0x10, 0x17, + 0x02, 0x17, 0x1d, 0x15, 0x1c, 0x14, 0x14, 0x16, 0x1c, 0x02, 0x16, 0x08, 0x12, 0x13, 0x13, 0x0b, + 0x11, 0x08, 0x0b, 0x02, 0x00, 0x3f, 0x3f, 0x12, 0x39, 0x2f, 0x39, 0x3f, 0x3f, 0x12, 0x39, 0x2f, + 0x12, 0x39, 0x01, 0x7c, 0x10, 0xde, 0x5d, 0x5d, 0x2b, 0x18, 0xed, 0xd1, 0xc9, 0x2f, 0x10, 0xd6, + 0xed, 0x12, 0x39, 0x3d, 0x2f, 0x12, 0x39, 0x39, 0x12, 0x39, 0x39, 0x10, 0xd9, 0xc9, 0x18, 0x2f, + 0x31, 0x30, 0x00, 0x2b, 0x5d, 0x2b, 0x2b, 0x5d, 0x2b, 0x2b, 0x5d, 0x2b, 0x2b, 0x2b, 0x5d, 0x2b, + 0x01, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x5d, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, + 0x2b, 0x2b, 0x2b, 0x5d, 0x2b, 0x5d, 0x5d, 0x2b, 0x2b, 0x2b, 0x5d, 0x2b, 0x2b, 0x13, 0x1e, 0x03, + 0x17, 0x3e, 0x03, 0x37, 0x33, 0x1e, 0x03, 0x17, 0x23, 0x13, 0x03, 0x23, 0x03, 0x13, 0x23, 0x3e, + 0x03, 0x37, 0xa1, 0x07, 0x15, 0x18, 0x18, 0x0b, 0x0c, 0x1a, 0x18, 0x14, 0x08, 0x66, 0x07, 0x0d, + 0x09, 0x06, 0x02, 0x71, 0x06, 0x4c, 0x5a, 0x49, 0x05, 0x71, 0x03, 0x07, 0x08, 0x0b, 0x07, 0x02, + 0x6b, 0x15, 0x42, 0x4c, 0x4e, 0x21, 0x25, 0x4f, 0x49, 0x40, 0x15, 0x51, 0x9a, 0x97, 0x99, 0x50, + 0x01, 0xe1, 0xfe, 0xfa, 0x01, 0x06, 0xfe, 0x1f, 0x4c, 0xa4, 0xa2, 0x98, 0x41, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x2e, 0x00, 0x00, 0x01, 0xc6, 0x02, 0x6b, 0x00, 0x0f, 0x00, 0x53, 0x40, 0x09, + 0x0d, 0x40, 0x0b, 0x00, 0x4d, 0x20, 0x0d, 0x01, 0x04, 0xb8, 0xff, 0xc0, 0x40, 0x14, 0x0c, 0x00, + 0x4d, 0x3f, 0x04, 0x01, 0x00, 0x2f, 0x0c, 0x3f, 0x0c, 0x02, 0x0c, 0x44, 0x0e, 0x11, 0x07, 0x03, + 0x44, 0x06, 0xb8, 0xff, 0xc0, 0x40, 0x10, 0x0b, 0x10, 0x48, 0x06, 0x10, 0x03, 0x0c, 0x04, 0x0d, + 0x02, 0x07, 0x02, 0x04, 0x08, 0x00, 0x08, 0x00, 0x3f, 0x3f, 0x3f, 0x3f, 0x12, 0x39, 0x39, 0x01, + 0x10, 0xd6, 0x2b, 0xed, 0x32, 0x10, 0xde, 0xed, 0x5d, 0x32, 0x31, 0x30, 0x00, 0x5d, 0x2b, 0x5d, + 0x2b, 0x21, 0x26, 0x26, 0x27, 0x11, 0x23, 0x11, 0x33, 0x1e, 0x03, 0x17, 0x11, 0x33, 0x11, 0x01, + 0x63, 0x2a, 0x63, 0x39, 0x6f, 0x63, 0x1c, 0x38, 0x35, 0x2d, 0x10, 0x6f, 0x67, 0xcd, 0x67, 0xfe, + 0x65, 0x02, 0x6b, 0x2c, 0x67, 0x66, 0x60, 0x24, 0x01, 0x7d, 0xfd, 0x95, 0x00, 0x02, 0x00, 0x1b, + 0xff, 0xf3, 0x01, 0xd9, 0x02, 0x79, 0x00, 0x13, 0x00, 0x1f, 0x00, 0x2c, 0x40, 0x19, 0xe7, 0x18, + 0x01, 0xd6, 0x16, 0x01, 0x0a, 0x46, 0x1f, 0x1a, 0x01, 0x1a, 0x21, 0x00, 0x46, 0x14, 0x20, 0x05, + 0x4a, 0x1d, 0x09, 0x0f, 0x4a, 0x17, 0x03, 0x00, 0x3f, 0xed, 0x3f, 0xed, 0x01, 0x10, 0xd6, 0xed, + 0x10, 0xde, 0x5d, 0xed, 0x31, 0x30, 0x5d, 0x5d, 0x13, 0x14, 0x1e, 0x02, 0x33, 0x32, 0x3e, 0x02, + 0x35, 0x34, 0x2e, 0x02, 0x23, 0x22, 0x0e, 0x02, 0x07, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, + 0x06, 0x23, 0x22, 0x26, 0x98, 0x07, 0x15, 0x26, 0x20, 0x1f, 0x27, 0x15, 0x07, 0x07, 0x15, 0x26, + 0x20, 0x20, 0x26, 0x15, 0x07, 0x7d, 0x76, 0x69, 0x6d, 0x72, 0x74, 0x6a, 0x6d, 0x73, 0x01, 0x36, + 0x2d, 0x4f, 0x3a, 0x22, 0x22, 0x3b, 0x4e, 0x2d, 0x2d, 0x4f, 0x3a, 0x22, 0x22, 0x3b, 0x4e, 0x2d, + 0xa0, 0xa3, 0xa3, 0xa0, 0xa0, 0xa3, 0xa3, 0x00, 0x00, 0x02, 0x00, 0x36, 0x00, 0x00, 0x01, 0xd8, + 0x02, 0x72, 0x00, 0x0e, 0x00, 0x19, 0x00, 0x3f, 0x40, 0x0b, 0x17, 0x46, 0x60, 0x03, 0x01, 0x03, + 0x1b, 0x07, 0x13, 0x44, 0x0a, 0xb8, 0xff, 0xc0, 0x40, 0x15, 0x0a, 0x10, 0x48, 0x0a, 0x1a, 0x0a, + 0x02, 0x14, 0x48, 0x06, 0x13, 0x06, 0x13, 0x06, 0x00, 0x08, 0x08, 0x0f, 0x4a, 0x00, 0x03, 0x00, + 0x3f, 0xed, 0x3f, 0x12, 0x39, 0x39, 0x2f, 0x2f, 0x10, 0xed, 0x3f, 0x01, 0x10, 0xd6, 0x2b, 0xed, + 0x32, 0x10, 0xde, 0x5d, 0xed, 0x31, 0x30, 0x13, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x23, 0x15, + 0x23, 0x11, 0x3e, 0x03, 0x17, 0x22, 0x06, 0x07, 0x15, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0xe0, + 0x76, 0x82, 0x83, 0x78, 0x2c, 0x7b, 0x12, 0x2d, 0x2e, 0x2c, 0x1f, 0x0b, 0x27, 0x0b, 0x32, 0x3b, + 0x3c, 0x3b, 0x02, 0x72, 0x61, 0x6e, 0x6f, 0x63, 0xd1, 0x02, 0x63, 0x04, 0x06, 0x03, 0x02, 0x6b, + 0x01, 0x02, 0xc8, 0x2f, 0x39, 0x36, 0x2d, 0x00, 0x00, 0x02, 0x00, 0x1b, 0xff, 0x56, 0x01, 0xd9, + 0x02, 0x76, 0x00, 0x12, 0x00, 0x26, 0x00, 0x2f, 0x40, 0x18, 0x18, 0x00, 0x1d, 0x1d, 0x46, 0x0c, + 0x06, 0x28, 0x13, 0x46, 0x00, 0x27, 0x0c, 0x4a, 0x0d, 0x18, 0x4a, 0x09, 0x10, 0x09, 0x22, 0x4a, + 0x03, 0x03, 0x00, 0x3f, 0xed, 0x3f, 0x33, 0xed, 0xdd, 0xed, 0x01, 0x10, 0xd6, 0xed, 0x10, 0xda, + 0x32, 0xe9, 0x2f, 0x11, 0x39, 0x31, 0x30, 0x13, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, + 0x07, 0x16, 0x16, 0x17, 0x07, 0x26, 0x26, 0x27, 0x26, 0x26, 0x37, 0x14, 0x1e, 0x02, 0x33, 0x32, + 0x3e, 0x02, 0x35, 0x34, 0x2e, 0x02, 0x23, 0x22, 0x0e, 0x02, 0x1b, 0x76, 0x69, 0x6d, 0x72, 0x5a, + 0x55, 0x0b, 0x55, 0x4a, 0x1a, 0x75, 0x77, 0x0b, 0x51, 0x57, 0x7d, 0x07, 0x15, 0x26, 0x20, 0x1f, + 0x27, 0x15, 0x07, 0x07, 0x15, 0x26, 0x20, 0x20, 0x26, 0x15, 0x07, 0x01, 0x33, 0xa0, 0xa3, 0xa3, + 0xa0, 0x8c, 0xa1, 0x11, 0x19, 0x21, 0x0d, 0x58, 0x10, 0x4b, 0x46, 0x14, 0x9f, 0x89, 0x2d, 0x4e, + 0x3b, 0x22, 0x22, 0x3b, 0x4e, 0x2d, 0x2d, 0x4f, 0x3a, 0x22, 0x22, 0x3b, 0x4e, 0x00, 0x00, 0x00, + 0x00, 0x02, 0x00, 0x36, 0x00, 0x00, 0x01, 0xe9, 0x02, 0x72, 0x00, 0x19, 0x00, 0x24, 0x00, 0x59, + 0x40, 0x1d, 0x11, 0x0e, 0x44, 0x08, 0x60, 0x0d, 0x70, 0x0d, 0x80, 0x0d, 0x03, 0x0d, 0x26, 0x1a, + 0x46, 0x60, 0x05, 0x70, 0x05, 0x80, 0x05, 0x03, 0x05, 0x26, 0x21, 0x44, 0x12, 0x44, 0x15, 0xb8, + 0xff, 0xc0, 0x40, 0x17, 0x0a, 0x11, 0x48, 0x15, 0x25, 0x08, 0x12, 0x48, 0x21, 0x21, 0x0d, 0x15, + 0x02, 0x13, 0x08, 0x0e, 0x08, 0x0d, 0x08, 0x1d, 0x4a, 0x00, 0x03, 0x00, 0x3f, 0xed, 0x3f, 0x3f, + 0x3f, 0x3f, 0x12, 0x39, 0x2f, 0xed, 0x32, 0x01, 0x10, 0xd6, 0x2b, 0xed, 0xed, 0x10, 0xde, 0x5d, + 0xed, 0x10, 0xde, 0x5d, 0x32, 0xed, 0x32, 0x31, 0x30, 0x13, 0x32, 0x1e, 0x02, 0x15, 0x14, 0x06, + 0x07, 0x1e, 0x03, 0x17, 0x23, 0x26, 0x26, 0x27, 0x23, 0x15, 0x23, 0x11, 0x3e, 0x03, 0x17, 0x34, + 0x26, 0x23, 0x22, 0x06, 0x07, 0x15, 0x33, 0x32, 0x36, 0xd6, 0x35, 0x56, 0x3e, 0x21, 0x2c, 0x33, + 0x11, 0x26, 0x24, 0x21, 0x0c, 0x81, 0x17, 0x3d, 0x23, 0x40, 0x7b, 0x12, 0x2b, 0x2c, 0x28, 0x7c, + 0x3c, 0x31, 0x07, 0x14, 0x0a, 0x1b, 0x3f, 0x38, 0x02, 0x72, 0x18, 0x32, 0x4d, 0x34, 0x36, 0x58, + 0x17, 0x1a, 0x3f, 0x45, 0x45, 0x1f, 0x3c, 0x6f, 0x39, 0xe4, 0x02, 0x62, 0x04, 0x07, 0x03, 0x02, + 0xca, 0x31, 0x2e, 0x01, 0x02, 0xba, 0x31, 0x00, 0x00, 0x01, 0x00, 0x28, 0xff, 0xf3, 0x01, 0xcc, + 0x02, 0x79, 0x00, 0x2e, 0x00, 0x5a, 0xb9, 0x00, 0x2c, 0xff, 0xc0, 0x40, 0x15, 0x0d, 0x00, 0x4d, + 0x05, 0x46, 0x60, 0x25, 0x70, 0x25, 0x02, 0x25, 0x60, 0x15, 0x70, 0x15, 0x02, 0x15, 0x30, 0x1b, + 0x46, 0x0f, 0xb8, 0xff, 0xc0, 0xb4, 0x0b, 0x10, 0x48, 0x0f, 0x2b, 0xb8, 0xff, 0xc0, 0x40, 0x14, + 0x0d, 0x10, 0x48, 0x2b, 0x2f, 0x0a, 0x4a, 0x20, 0x20, 0x12, 0x2c, 0x00, 0x4a, 0x28, 0x09, 0x16, + 0x19, 0x4a, 0x12, 0x03, 0x00, 0x3f, 0xfd, 0xc6, 0x3f, 0xfd, 0xc6, 0x12, 0x39, 0x10, 0xed, 0x01, + 0x10, 0xc6, 0x2b, 0xd6, 0x2b, 0xed, 0x10, 0xce, 0x5d, 0xde, 0x5d, 0xed, 0x31, 0x30, 0x00, 0x2b, + 0x37, 0x32, 0x3e, 0x02, 0x35, 0x34, 0x2e, 0x02, 0x27, 0x2e, 0x03, 0x35, 0x34, 0x36, 0x33, 0x32, + 0x16, 0x17, 0x07, 0x26, 0x26, 0x23, 0x22, 0x15, 0x14, 0x1e, 0x02, 0x17, 0x1e, 0x03, 0x15, 0x14, + 0x06, 0x23, 0x22, 0x26, 0x27, 0x37, 0x16, 0x16, 0xe8, 0x1f, 0x29, 0x18, 0x09, 0x16, 0x22, 0x2a, + 0x15, 0x1c, 0x3c, 0x31, 0x20, 0x71, 0x63, 0x39, 0x55, 0x1d, 0x24, 0x19, 0x3d, 0x28, 0x62, 0x14, + 0x1f, 0x27, 0x13, 0x1d, 0x3f, 0x35, 0x22, 0x71, 0x73, 0x4d, 0x5c, 0x17, 0x24, 0x1b, 0x4b, 0x5a, + 0x0d, 0x17, 0x1d, 0x0f, 0x13, 0x1e, 0x17, 0x13, 0x08, 0x0a, 0x1a, 0x28, 0x3b, 0x2c, 0x57, 0x62, + 0x1a, 0x10, 0x5f, 0x0e, 0x14, 0x47, 0x12, 0x1b, 0x15, 0x10, 0x07, 0x0b, 0x1b, 0x2d, 0x43, 0x33, + 0x57, 0x5f, 0x21, 0x0e, 0x64, 0x10, 0x1c, 0x00, 0x00, 0x01, 0x00, 0x19, 0x00, 0x00, 0x01, 0xdb, + 0x02, 0x6b, 0x00, 0x07, 0x00, 0x1f, 0x40, 0x0f, 0x01, 0x02, 0x44, 0x05, 0x07, 0x08, 0x02, 0x05, + 0x48, 0x07, 0x02, 0x03, 0x08, 0x00, 0x02, 0x00, 0x3f, 0x3f, 0x3f, 0xed, 0x32, 0x01, 0x10, 0xd6, + 0xdd, 0xfd, 0xcd, 0x31, 0x30, 0x01, 0x15, 0x23, 0x11, 0x23, 0x11, 0x23, 0x35, 0x01, 0xdb, 0xa3, + 0x7c, 0xa3, 0x02, 0x6b, 0x66, 0xfd, 0xfb, 0x02, 0x05, 0x66, 0x00, 0x00, 0x00, 0x01, 0x00, 0x27, + 0xff, 0xf3, 0x01, 0xcd, 0x02, 0x6b, 0x00, 0x19, 0x00, 0x2f, 0x40, 0x0c, 0x12, 0x44, 0x60, 0x14, + 0x70, 0x14, 0x02, 0x14, 0x1b, 0x08, 0x44, 0x06, 0xb8, 0xff, 0xc0, 0x40, 0x0c, 0x0d, 0x10, 0x48, + 0x06, 0x1a, 0x13, 0x07, 0x02, 0x0d, 0x4a, 0x00, 0x09, 0x00, 0x3f, 0xed, 0x3f, 0x33, 0x01, 0x10, + 0xd6, 0x2b, 0xed, 0x10, 0xde, 0x5d, 0xed, 0x31, 0x30, 0x17, 0x22, 0x2e, 0x02, 0x35, 0x11, 0x33, + 0x11, 0x14, 0x1e, 0x02, 0x33, 0x32, 0x3e, 0x02, 0x35, 0x11, 0x33, 0x11, 0x14, 0x0e, 0x02, 0xf8, + 0x3c, 0x51, 0x30, 0x14, 0x7c, 0x08, 0x13, 0x22, 0x1a, 0x1a, 0x22, 0x14, 0x08, 0x7b, 0x14, 0x32, + 0x52, 0x0d, 0x21, 0x3e, 0x58, 0x36, 0x01, 0x8b, 0xfe, 0x7d, 0x27, 0x35, 0x20, 0x0e, 0x0e, 0x21, + 0x35, 0x27, 0x01, 0x82, 0xfe, 0x75, 0x36, 0x58, 0x3e, 0x21, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0d, + 0x00, 0x00, 0x01, 0xe8, 0x02, 0x6b, 0x00, 0x16, 0x00, 0x83, 0x40, 0x0e, 0x13, 0x20, 0x10, 0x00, + 0x4d, 0x13, 0x10, 0x0f, 0x00, 0x4d, 0x48, 0x13, 0x01, 0x10, 0xb8, 0xff, 0xe0, 0x40, 0x0f, 0x0c, + 0x00, 0x4d, 0x24, 0x10, 0x01, 0x06, 0x20, 0x0c, 0x00, 0x4d, 0x2b, 0x06, 0x01, 0x03, 0xb8, 0xff, + 0xe0, 0xb3, 0x10, 0x00, 0x4d, 0x03, 0xb8, 0xff, 0xf8, 0x40, 0x30, 0x0e, 0x0f, 0x00, 0x4c, 0x47, + 0x03, 0x01, 0x0b, 0x40, 0x0c, 0x00, 0x4d, 0x06, 0x00, 0x0b, 0x16, 0x10, 0x05, 0x05, 0x0f, 0x11, + 0x1f, 0x11, 0x02, 0x11, 0x18, 0x05, 0x17, 0x0f, 0x0b, 0x1f, 0x0b, 0x2f, 0x0b, 0x03, 0x0b, 0x10, + 0x16, 0x08, 0x11, 0x02, 0x06, 0x10, 0x02, 0x05, 0x02, 0x00, 0x08, 0x00, 0x3f, 0x3f, 0x3f, 0x33, + 0x3f, 0x3f, 0x12, 0x39, 0x5d, 0x01, 0x10, 0xc6, 0x10, 0xce, 0x5d, 0x11, 0x17, 0x39, 0x31, 0x30, + 0x00, 0x2b, 0x01, 0x5d, 0x2b, 0x2b, 0x5d, 0x2b, 0x5d, 0x2b, 0x5d, 0x2b, 0x2b, 0x33, 0x2e, 0x03, + 0x27, 0x33, 0x1e, 0x03, 0x17, 0x3e, 0x03, 0x37, 0x33, 0x0e, 0x03, 0x07, 0xba, 0x18, 0x36, 0x30, + 0x26, 0x09, 0x82, 0x06, 0x18, 0x1d, 0x21, 0x10, 0x10, 0x20, 0x1c, 0x18, 0x08, 0x81, 0x0c, 0x23, + 0x2d, 0x36, 0x1d, 0x45, 0xae, 0xad, 0x9a, 0x31, 0x30, 0x7f, 0x87, 0x83, 0x34, 0x33, 0x83, 0x87, + 0x80, 0x30, 0x3c, 0x94, 0xa3, 0xa9, 0x4f, 0x00, 0x00, 0x01, 0x00, 0x17, 0x00, 0x00, 0x01, 0xdd, + 0x02, 0x6b, 0x00, 0x28, 0x01, 0x73, 0x40, 0x16, 0x25, 0x40, 0x09, 0x0a, 0x00, 0x4c, 0x23, 0x40, + 0x0e, 0x00, 0x4d, 0x23, 0x20, 0x0d, 0x00, 0x4d, 0x21, 0x40, 0x0e, 0x00, 0x4d, 0x20, 0xb8, 0xff, + 0xe0, 0xb3, 0x0b, 0x00, 0x4d, 0x1f, 0xb8, 0xff, 0xc0, 0xb3, 0x0b, 0x00, 0x4d, 0x18, 0xb8, 0xff, + 0xe0, 0x40, 0x09, 0x0f, 0x00, 0x4d, 0x17, 0x40, 0x10, 0x00, 0x4d, 0x17, 0xb8, 0xff, 0xc0, 0xb3, + 0x0e, 0x00, 0x4d, 0x11, 0xb8, 0xff, 0xc8, 0x40, 0x09, 0x10, 0x00, 0x4d, 0x11, 0x40, 0x0e, 0x00, + 0x4d, 0x10, 0xb8, 0xff, 0xe0, 0xb3, 0x10, 0x00, 0x4d, 0x0b, 0xb8, 0xff, 0xe0, 0x40, 0x13, 0x0b, + 0x00, 0x4d, 0x0a, 0x80, 0x0b, 0x00, 0x4d, 0x09, 0x80, 0x0b, 0x00, 0x4d, 0x08, 0x40, 0x0b, 0x00, + 0x4d, 0x05, 0xb8, 0xff, 0xe0, 0x40, 0x0a, 0x0d, 0x00, 0x4d, 0x03, 0x40, 0x11, 0x12, 0x00, 0x4c, + 0x02, 0xb8, 0xff, 0xc0, 0x40, 0x09, 0x0b, 0x00, 0x4d, 0x01, 0x40, 0x0b, 0x00, 0x4d, 0x00, 0xb8, + 0xff, 0xe0, 0xb3, 0x0b, 0x00, 0x4d, 0x28, 0xb8, 0xff, 0xc0, 0xb3, 0x10, 0x00, 0x4d, 0x28, 0xb8, + 0xff, 0xc0, 0x40, 0x0a, 0x0d, 0x0e, 0x00, 0x4c, 0x23, 0x40, 0x0e, 0x00, 0x4d, 0x1e, 0xb8, 0xff, + 0xc0, 0x40, 0x09, 0x0b, 0x00, 0x4d, 0x16, 0x40, 0x0f, 0x00, 0x4d, 0x16, 0xb8, 0xff, 0xc0, 0xb3, + 0x0e, 0x00, 0x4d, 0x14, 0xb8, 0xff, 0xc0, 0x40, 0x0a, 0x0f, 0x10, 0x00, 0x4c, 0x12, 0x40, 0x0f, + 0x00, 0x4d, 0x12, 0xb8, 0xff, 0xc0, 0xb3, 0x0e, 0x00, 0x4d, 0x0a, 0xb8, 0xff, 0x80, 0xb3, 0x0b, + 0x00, 0x4d, 0x09, 0xb8, 0xff, 0x80, 0xb3, 0x0b, 0x00, 0x4d, 0x08, 0xb8, 0xff, 0xc0, 0x40, 0x09, + 0x0b, 0x00, 0x4d, 0x05, 0x40, 0x0e, 0x00, 0x4d, 0x00, 0xb8, 0xff, 0xc0, 0x40, 0x36, 0x0d, 0x10, + 0x00, 0x4c, 0x00, 0x11, 0x05, 0x10, 0x04, 0x0b, 0x18, 0x23, 0x17, 0x28, 0x04, 0x1d, 0x14, 0x14, + 0x0b, 0x1d, 0x3f, 0x0a, 0x01, 0x0a, 0x0a, 0x44, 0x0f, 0x0b, 0x1f, 0x0b, 0x02, 0x0b, 0x2a, 0x30, + 0x1e, 0x01, 0x1e, 0x44, 0x1d, 0x29, 0x23, 0x05, 0x14, 0x28, 0x04, 0x10, 0x1d, 0x02, 0x18, 0x08, + 0x10, 0x08, 0x0b, 0x02, 0x00, 0x3f, 0x3f, 0x3f, 0x3f, 0x12, 0x17, 0x39, 0x01, 0x10, 0xd6, 0xed, + 0x5d, 0x10, 0xda, 0x5d, 0xe9, 0x2f, 0x5d, 0x11, 0x12, 0x39, 0x3d, 0x2f, 0x12, 0x17, 0x39, 0x12, + 0x17, 0x39, 0x31, 0x30, 0x00, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, + 0x2b, 0x2b, 0x2b, 0x01, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, + 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x01, 0x1e, 0x03, 0x17, 0x34, 0x2e, 0x02, + 0x35, 0x33, 0x0e, 0x03, 0x07, 0x23, 0x26, 0x26, 0x27, 0x06, 0x06, 0x07, 0x23, 0x2e, 0x03, 0x27, + 0x33, 0x0e, 0x03, 0x15, 0x3e, 0x03, 0x37, 0x01, 0x28, 0x04, 0x10, 0x13, 0x17, 0x0b, 0x02, 0x02, + 0x02, 0x72, 0x03, 0x06, 0x08, 0x0b, 0x07, 0x66, 0x16, 0x2c, 0x16, 0x16, 0x30, 0x14, 0x66, 0x08, + 0x0c, 0x09, 0x06, 0x02, 0x72, 0x01, 0x02, 0x02, 0x02, 0x09, 0x17, 0x15, 0x12, 0x05, 0x01, 0x90, + 0x13, 0x38, 0x44, 0x4e, 0x29, 0x34, 0x77, 0x7c, 0x7f, 0x3b, 0x4c, 0xa1, 0x9f, 0x9a, 0x45, 0x3f, + 0x91, 0x42, 0x3f, 0x94, 0x3f, 0x45, 0x9b, 0x9f, 0xa1, 0x4b, 0x3b, 0x7e, 0x7d, 0x77, 0x34, 0x20, + 0x4c, 0x4a, 0x3e, 0x12, 0x00, 0x01, 0x00, 0x0b, 0x00, 0x00, 0x01, 0xe9, 0x02, 0x6b, 0x00, 0x17, + 0x00, 0x66, 0xb5, 0x12, 0x20, 0x0f, 0x00, 0x4d, 0x0e, 0xb8, 0xff, 0xe0, 0xb3, 0x10, 0x00, 0x4d, + 0x0e, 0xb8, 0xff, 0xe0, 0xb3, 0x0d, 0x00, 0x4d, 0x0c, 0xb8, 0xff, 0xe0, 0x40, 0x27, 0x0f, 0x00, + 0x4d, 0x0d, 0x18, 0x0c, 0x0e, 0x06, 0x03, 0x07, 0x03, 0x00, 0x10, 0x12, 0x03, 0x0f, 0x17, 0x03, + 0x0f, 0x03, 0x0f, 0x07, 0x11, 0x17, 0x07, 0x17, 0x08, 0x11, 0x02, 0x03, 0x0c, 0x12, 0x0f, 0x04, + 0x06, 0x0d, 0x02, 0x06, 0x08, 0x00, 0x3f, 0x3f, 0x12, 0x17, 0x39, 0x3f, 0x3f, 0x01, 0x2f, 0x2f, + 0xc6, 0x12, 0x39, 0x39, 0x3d, 0x2f, 0x2f, 0x11, 0x12, 0x17, 0x39, 0x11, 0x12, 0x17, 0x39, 0x18, + 0x10, 0xc6, 0x31, 0x30, 0x2b, 0x2b, 0x2b, 0x2b, 0x21, 0x26, 0x26, 0x27, 0x06, 0x06, 0x07, 0x23, + 0x3e, 0x03, 0x37, 0x03, 0x33, 0x17, 0x37, 0x33, 0x03, 0x1e, 0x03, 0x17, 0x01, 0x64, 0x13, 0x37, + 0x1e, 0x1d, 0x3a, 0x15, 0x85, 0x0a, 0x27, 0x2f, 0x34, 0x18, 0xa2, 0x85, 0x62, 0x67, 0x7c, 0x9e, + 0x1b, 0x34, 0x2d, 0x22, 0x0a, 0x33, 0x7c, 0x3e, 0x3b, 0x7f, 0x33, 0x1b, 0x4c, 0x58, 0x5d, 0x2b, + 0x01, 0x24, 0xc6, 0xc6, 0xfe, 0xdf, 0x2b, 0x5e, 0x59, 0x4d, 0x1b, 0x00, 0x00, 0x01, 0x00, 0x0d, + 0x00, 0x00, 0x01, 0xe8, 0x02, 0x6b, 0x00, 0x14, 0x00, 0x3e, 0x40, 0x21, 0x12, 0x11, 0x0e, 0x00, + 0x00, 0x0e, 0x44, 0x05, 0x06, 0x80, 0x0c, 0x90, 0x0c, 0x02, 0x0c, 0x0c, 0x15, 0x16, 0x11, 0x02, + 0x0d, 0x08, 0x0e, 0x0b, 0x00, 0x03, 0x05, 0x0c, 0x08, 0x06, 0x02, 0x05, 0x02, 0x00, 0x3f, 0x3f, + 0x3f, 0x12, 0x17, 0x39, 0x3f, 0x3f, 0x01, 0x11, 0x12, 0x39, 0x2f, 0x5d, 0xce, 0x32, 0xed, 0x39, + 0x3d, 0x2f, 0x18, 0x10, 0xcd, 0x32, 0x31, 0x30, 0x13, 0x3e, 0x03, 0x37, 0x33, 0x0e, 0x03, 0x07, + 0x15, 0x23, 0x35, 0x26, 0x26, 0x27, 0x33, 0x16, 0x16, 0xfe, 0x0b, 0x1d, 0x1d, 0x1b, 0x0b, 0x7f, + 0x13, 0x26, 0x2a, 0x30, 0x1c, 0x7c, 0x37, 0x53, 0x26, 0x84, 0x17, 0x38, 0x01, 0x50, 0x17, 0x46, + 0x4e, 0x50, 0x20, 0x33, 0x60, 0x5e, 0x5d, 0x31, 0xec, 0xeb, 0x61, 0xb9, 0x66, 0x48, 0x95, 0x00, + 0x00, 0x01, 0x00, 0x2e, 0x00, 0x00, 0x01, 0xc6, 0x02, 0x6b, 0x00, 0x11, 0x00, 0x66, 0xb5, 0x0e, + 0x40, 0x0a, 0x00, 0x4d, 0x04, 0xb8, 0xff, 0xe0, 0xb6, 0x0a, 0x00, 0x4d, 0x00, 0x07, 0x01, 0x07, + 0xb8, 0xff, 0xc0, 0x40, 0x09, 0x0d, 0x10, 0x48, 0x07, 0x13, 0x05, 0x0e, 0x11, 0x10, 0xb8, 0xff, + 0xc0, 0xb4, 0x09, 0x10, 0x48, 0x10, 0x09, 0xb8, 0xff, 0xc0, 0x40, 0x09, 0x0b, 0x10, 0x48, 0x09, + 0x12, 0x00, 0x11, 0x01, 0x11, 0xb8, 0xff, 0xc0, 0x40, 0x0f, 0x0d, 0x10, 0x48, 0x11, 0x00, 0x11, + 0x02, 0x0f, 0x48, 0x10, 0x02, 0x06, 0x48, 0x07, 0x08, 0x00, 0x3f, 0xed, 0x3f, 0xed, 0x3f, 0xcd, + 0x01, 0x2f, 0x2b, 0x5d, 0x10, 0xc6, 0x2b, 0xc6, 0x2b, 0x11, 0x39, 0x39, 0x10, 0xce, 0x2b, 0x5d, + 0x31, 0x30, 0x2b, 0x2b, 0x01, 0x0e, 0x03, 0x07, 0x21, 0x15, 0x21, 0x35, 0x3e, 0x03, 0x37, 0x23, + 0x35, 0x21, 0x01, 0xbd, 0x2b, 0x48, 0x3e, 0x37, 0x19, 0x01, 0x0a, 0xfe, 0x68, 0x16, 0x32, 0x3e, + 0x49, 0x2c, 0xee, 0x01, 0x82, 0x02, 0x15, 0x42, 0x74, 0x69, 0x61, 0x2f, 0x66, 0x47, 0x2b, 0x5f, + 0x6c, 0x7e, 0x4a, 0x66, 0x00, 0x01, 0x00, 0x71, 0xff, 0x5b, 0x01, 0x86, 0x02, 0xbb, 0x00, 0x07, + 0x00, 0x2f, 0x40, 0x1b, 0x5f, 0x06, 0x01, 0x40, 0x06, 0x01, 0x06, 0x5f, 0x01, 0x01, 0x40, 0x01, + 0x01, 0x01, 0x09, 0x03, 0x6e, 0x00, 0x08, 0x05, 0x72, 0x06, 0x12, 0x02, 0x72, 0x00, 0x10, 0x00, + 0x3f, 0xed, 0x3f, 0xed, 0x01, 0x10, 0xd6, 0xed, 0x10, 0xce, 0x5d, 0x5d, 0xce, 0x5d, 0x5d, 0x31, + 0x30, 0x13, 0x21, 0x15, 0x23, 0x11, 0x33, 0x15, 0x21, 0x71, 0x01, 0x15, 0xa0, 0xa0, 0xfe, 0xeb, + 0x02, 0xbb, 0x60, 0xfd, 0x60, 0x60, 0x00, 0x00, 0x00, 0x01, 0x00, 0x31, 0xff, 0x5b, 0x01, 0xc7, + 0x02, 0xbb, 0x00, 0x03, 0x00, 0x2a, 0x40, 0x15, 0x01, 0x03, 0x00, 0x03, 0x76, 0x02, 0x01, 0x14, + 0x02, 0x01, 0x03, 0x02, 0x00, 0x04, 0x02, 0x02, 0x12, 0x01, 0x10, 0x00, 0x10, 0x00, 0x3f, 0x3f, + 0x3f, 0x01, 0x2f, 0x10, 0xc6, 0x10, 0x00, 0xc1, 0x87, 0x05, 0x2b, 0x87, 0x7d, 0xc4, 0x31, 0x30, + 0x13, 0x33, 0x01, 0x23, 0x31, 0x7e, 0x01, 0x18, 0x7f, 0x02, 0xbb, 0xfc, 0xa0, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x6d, 0xff, 0x5b, 0x01, 0x83, 0x02, 0xbb, 0x00, 0x07, 0x00, 0x2f, 0x40, 0x1a, + 0x04, 0x03, 0x6e, 0x40, 0x00, 0x01, 0x00, 0x40, 0x07, 0x01, 0x07, 0x09, 0x01, 0x50, 0x06, 0x01, + 0x06, 0x08, 0x05, 0x72, 0x07, 0x10, 0x02, 0x72, 0x00, 0x12, 0x00, 0x3f, 0xed, 0x3f, 0xed, 0x01, + 0x10, 0xd6, 0x5d, 0xc0, 0x10, 0xce, 0x5d, 0xde, 0x5d, 0xed, 0x32, 0x31, 0x30, 0x05, 0x21, 0x35, + 0x33, 0x11, 0x23, 0x35, 0x21, 0x01, 0x83, 0xfe, 0xea, 0xa0, 0xa0, 0x01, 0x16, 0xa5, 0x60, 0x02, + 0xa0, 0x60, 0x00, 0x00, 0x00, 0x01, 0x00, 0x10, 0x00, 0xff, 0x01, 0xeb, 0x02, 0x6b, 0x00, 0x06, + 0x00, 0x29, 0x40, 0x14, 0x05, 0x03, 0x04, 0x03, 0x07, 0x00, 0x01, 0x06, 0x03, 0x08, 0x02, 0x02, + 0x07, 0x08, 0x01, 0x03, 0x02, 0x72, 0x06, 0x02, 0x00, 0x3f, 0xfd, 0xcd, 0x32, 0x01, 0x11, 0x12, + 0x39, 0x3d, 0x2f, 0x12, 0x17, 0x39, 0x12, 0x17, 0x39, 0x31, 0x30, 0x01, 0x07, 0x27, 0x07, 0x27, + 0x13, 0x33, 0x01, 0xeb, 0x6f, 0x7e, 0x7e, 0x70, 0xb9, 0x69, 0x01, 0x35, 0x36, 0xda, 0xda, 0x36, + 0x01, 0x36, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0xff, 0x5b, 0x01, 0xec, 0xff, 0xc6, 0x00, 0x03, + 0x00, 0x17, 0x40, 0x0a, 0x02, 0x05, 0x03, 0x04, 0x00, 0x55, 0x03, 0x12, 0x02, 0x12, 0x00, 0x3f, + 0x3f, 0xed, 0x01, 0x10, 0xc6, 0x10, 0xc6, 0x31, 0x30, 0x17, 0x21, 0x15, 0x21, 0x08, 0x01, 0xe4, + 0xfe, 0x1c, 0x3a, 0x6b, 0x00, 0x01, 0x00, 0x98, 0x02, 0x01, 0x01, 0x73, 0x02, 0xb3, 0x00, 0x03, + 0x00, 0x10, 0xb5, 0x01, 0x03, 0x04, 0x02, 0x00, 0x7d, 0x00, 0x3f, 0xc5, 0x01, 0x10, 0xd6, 0xc5, + 0x31, 0x30, 0x13, 0x17, 0x07, 0x27, 0xd5, 0x9e, 0x2d, 0xae, 0x02, 0xb3, 0x6f, 0x43, 0x54, 0x00, + 0x00, 0x02, 0x00, 0x2c, 0xff, 0xf5, 0x01, 0xb9, 0x01, 0xe2, 0x00, 0x0e, 0x00, 0x2e, 0x00, 0x53, + 0x40, 0x0d, 0x04, 0x1f, 0x01, 0x24, 0x51, 0x04, 0x53, 0x14, 0x30, 0x2c, 0x0c, 0x53, 0x1d, 0xb8, + 0xff, 0xc0, 0x40, 0x24, 0x0c, 0x10, 0x48, 0x1d, 0x2f, 0x5f, 0x07, 0x6f, 0x07, 0x02, 0x07, 0x57, + 0x50, 0x22, 0x60, 0x22, 0x02, 0x22, 0x22, 0x0f, 0x40, 0x00, 0x01, 0x00, 0x57, 0x18, 0x07, 0x28, + 0x40, 0x0d, 0x00, 0x4d, 0x28, 0x57, 0x0f, 0x0b, 0x00, 0x3f, 0xed, 0x2b, 0x3f, 0xed, 0x5d, 0x11, + 0x39, 0x2f, 0x5d, 0xed, 0x5d, 0x01, 0x10, 0xd6, 0x2b, 0xed, 0xc4, 0x10, 0xde, 0xed, 0xed, 0x31, + 0x30, 0x00, 0x5d, 0x37, 0x32, 0x36, 0x37, 0x35, 0x26, 0x26, 0x23, 0x22, 0x0e, 0x02, 0x15, 0x14, + 0x16, 0x13, 0x32, 0x1e, 0x02, 0x15, 0x11, 0x06, 0x06, 0x23, 0x22, 0x2e, 0x02, 0x35, 0x34, 0x3e, + 0x02, 0x33, 0x32, 0x17, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x27, 0x36, 0x36, 0xfb, 0x14, + 0x26, 0x0e, 0x0c, 0x22, 0x0e, 0x13, 0x24, 0x1b, 0x10, 0x30, 0x1b, 0x3a, 0x4d, 0x2e, 0x14, 0x1b, + 0x6a, 0x42, 0x2d, 0x49, 0x34, 0x1c, 0x20, 0x36, 0x46, 0x26, 0x30, 0x25, 0x2c, 0x36, 0x23, 0x41, + 0x14, 0x11, 0x17, 0x54, 0x58, 0x01, 0x02, 0x6c, 0x02, 0x03, 0x05, 0x0c, 0x16, 0x12, 0x20, 0x1b, + 0x01, 0x8a, 0x1b, 0x31, 0x47, 0x2c, 0xfe, 0xe8, 0x06, 0x10, 0x10, 0x25, 0x3b, 0x2b, 0x29, 0x38, + 0x22, 0x0f, 0x08, 0x0f, 0x23, 0x2f, 0x0a, 0x07, 0x63, 0x08, 0x0d, 0x00, 0x00, 0x02, 0x00, 0x3e, + 0xff, 0xf5, 0x01, 0xd6, 0x02, 0xb6, 0x00, 0x0c, 0x00, 0x1f, 0x00, 0x5b, 0x40, 0x10, 0x0a, 0x40, + 0x0c, 0x00, 0x4d, 0x09, 0x40, 0x0c, 0x00, 0x4d, 0x08, 0x40, 0x0c, 0x00, 0x4d, 0x03, 0xb8, 0xff, + 0xc0, 0x40, 0x11, 0x0c, 0x00, 0x4d, 0x00, 0x53, 0x60, 0x0d, 0x70, 0x0d, 0x02, 0x0d, 0x21, 0x18, + 0x51, 0x07, 0x51, 0x16, 0xb8, 0xff, 0xc0, 0x40, 0x14, 0x09, 0x10, 0x48, 0x16, 0x20, 0x06, 0x55, + 0x18, 0x03, 0x57, 0x1b, 0x0b, 0x17, 0x01, 0x16, 0x00, 0x07, 0x57, 0x12, 0x07, 0x00, 0x3f, 0xed, + 0x3f, 0x3f, 0x3f, 0xed, 0xd5, 0xed, 0x01, 0x10, 0xd6, 0x2b, 0xed, 0xed, 0x10, 0xde, 0x5d, 0xed, + 0x31, 0x30, 0x00, 0x2b, 0x2b, 0x2b, 0x2b, 0x25, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x15, 0x16, + 0x16, 0x33, 0x32, 0x36, 0x37, 0x14, 0x0e, 0x02, 0x23, 0x22, 0x26, 0x27, 0x11, 0x37, 0x15, 0x36, + 0x36, 0x33, 0x32, 0x1e, 0x02, 0x01, 0x59, 0x2b, 0x2c, 0x14, 0x27, 0x0e, 0x0e, 0x1f, 0x0b, 0x30, + 0x38, 0x7d, 0x1e, 0x3a, 0x54, 0x36, 0x30, 0x64, 0x22, 0x7b, 0x1a, 0x30, 0x18, 0x2e, 0x46, 0x2f, + 0x18, 0xee, 0x42, 0x46, 0x0b, 0x08, 0xff, 0x03, 0x02, 0x41, 0x4b, 0x38, 0x5b, 0x40, 0x23, 0x0e, + 0x0b, 0x02, 0x93, 0x15, 0xeb, 0x0c, 0x09, 0x23, 0x41, 0x5a, 0x00, 0x00, 0x00, 0x01, 0x00, 0x2c, + 0xff, 0xf5, 0x01, 0xd2, 0x01, 0xe2, 0x00, 0x1f, 0x00, 0x35, 0x40, 0x10, 0x30, 0x11, 0x01, 0x08, + 0x40, 0x18, 0x60, 0x18, 0x70, 0x18, 0x03, 0x18, 0x21, 0x11, 0x53, 0x00, 0xb8, 0xff, 0xc0, 0x40, + 0x0d, 0x0c, 0x10, 0x48, 0x00, 0x20, 0x14, 0x57, 0x1b, 0x07, 0x0c, 0x57, 0x05, 0x0b, 0x00, 0x3f, + 0xed, 0x3f, 0xed, 0x01, 0x10, 0xd6, 0x2b, 0xed, 0x10, 0xde, 0x5d, 0xc6, 0x31, 0x30, 0x5d, 0x37, + 0x34, 0x3e, 0x02, 0x33, 0x32, 0x16, 0x17, 0x07, 0x26, 0x26, 0x23, 0x22, 0x0e, 0x02, 0x15, 0x14, + 0x16, 0x33, 0x32, 0x36, 0x37, 0x17, 0x06, 0x06, 0x23, 0x22, 0x2e, 0x02, 0x2c, 0x20, 0x42, 0x65, + 0x46, 0x2a, 0x44, 0x23, 0x1b, 0x14, 0x31, 0x26, 0x2c, 0x3b, 0x24, 0x10, 0x49, 0x58, 0x1d, 0x3f, + 0x1a, 0x12, 0x1a, 0x4a, 0x32, 0x48, 0x67, 0x42, 0x1f, 0xeb, 0x33, 0x5a, 0x43, 0x27, 0x0c, 0x0e, + 0x63, 0x07, 0x0b, 0x15, 0x25, 0x34, 0x1e, 0x41, 0x4a, 0x08, 0x09, 0x65, 0x0a, 0x0d, 0x26, 0x42, + 0x5a, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1c, 0xff, 0xf5, 0x01, 0xae, 0x02, 0xb6, 0x00, 0x0c, + 0x00, 0x1b, 0x00, 0x60, 0x40, 0x13, 0x40, 0x1b, 0x01, 0xc4, 0x1b, 0x01, 0x40, 0x1a, 0x01, 0xc0, + 0x1a, 0x01, 0x40, 0x19, 0x01, 0xc0, 0x19, 0x01, 0x0a, 0xb8, 0xff, 0xc0, 0xb3, 0x0c, 0x00, 0x4d, + 0x08, 0xb8, 0xff, 0xc0, 0x40, 0x20, 0x0c, 0x00, 0x4d, 0x03, 0x40, 0x0c, 0x00, 0x4d, 0x06, 0x19, + 0x51, 0x1b, 0x1d, 0x00, 0x53, 0x13, 0x1c, 0x1b, 0x01, 0x1a, 0x00, 0x07, 0x55, 0x19, 0x0a, 0x57, + 0x16, 0x0b, 0x03, 0x57, 0x10, 0x07, 0x00, 0x3f, 0xed, 0x3f, 0xed, 0xd5, 0xed, 0x3f, 0x3f, 0x01, + 0x10, 0xd6, 0xed, 0x10, 0xde, 0xed, 0x32, 0x31, 0x30, 0x00, 0x2b, 0x2b, 0x2b, 0x01, 0x5d, 0x71, + 0x5d, 0x71, 0x5d, 0x71, 0x37, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x11, 0x26, 0x26, 0x23, 0x22, + 0x06, 0x01, 0x06, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x17, 0x35, 0x37, + 0x99, 0x2f, 0x34, 0x0f, 0x1a, 0x0e, 0x0e, 0x24, 0x14, 0x2c, 0x28, 0x01, 0x15, 0x22, 0x62, 0x2f, + 0x6e, 0x71, 0x5f, 0x5d, 0x19, 0x30, 0x12, 0x7b, 0xee, 0x3f, 0x50, 0x02, 0x02, 0x01, 0x00, 0x08, + 0x0b, 0x46, 0xfe, 0xde, 0x0b, 0x0e, 0x82, 0x71, 0x73, 0x85, 0x0b, 0x0a, 0xd6, 0x15, 0x00, 0x00, + 0x00, 0x02, 0x00, 0x1f, 0xff, 0xf5, 0x01, 0xd1, 0x01, 0xe2, 0x00, 0x1a, 0x00, 0x25, 0x00, 0x5c, + 0xb9, 0x00, 0x12, 0xff, 0xc0, 0x40, 0x37, 0x19, 0x1a, 0x00, 0x4c, 0x1b, 0x53, 0x13, 0x1f, 0x0b, + 0x3f, 0x0b, 0x02, 0x0b, 0x27, 0x25, 0x0c, 0x53, 0x70, 0x00, 0x01, 0x00, 0x26, 0x0c, 0x40, 0x0f, + 0x00, 0x4d, 0x4f, 0x0c, 0x5f, 0x0c, 0x02, 0x0c, 0x55, 0x0f, 0x1b, 0x01, 0x1b, 0x1b, 0x05, 0x12, + 0x40, 0x0f, 0x01, 0x0f, 0x57, 0x16, 0x07, 0x30, 0x20, 0x01, 0x20, 0x57, 0x05, 0x0b, 0x00, 0x3f, + 0xed, 0x5d, 0x3f, 0xfd, 0x5d, 0xc6, 0x12, 0x39, 0x2f, 0x5d, 0xed, 0x5d, 0x2b, 0x01, 0x10, 0xd6, + 0x5d, 0xed, 0x32, 0x10, 0xde, 0x5d, 0xc6, 0xed, 0x31, 0x30, 0x00, 0x2b, 0x37, 0x34, 0x3e, 0x02, + 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x07, 0x21, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x17, 0x06, + 0x06, 0x23, 0x22, 0x2e, 0x02, 0x25, 0x34, 0x2e, 0x02, 0x23, 0x22, 0x0e, 0x02, 0x07, 0x1f, 0x26, + 0x3e, 0x50, 0x2a, 0x68, 0x6c, 0x01, 0x01, 0xfe, 0xcf, 0x4c, 0x3c, 0x25, 0x43, 0x17, 0x11, 0x20, + 0x48, 0x2d, 0x3c, 0x5f, 0x43, 0x24, 0x01, 0x3b, 0x0a, 0x16, 0x22, 0x19, 0x18, 0x23, 0x17, 0x0d, + 0x02, 0xe7, 0x3e, 0x5e, 0x3f, 0x20, 0x7b, 0x76, 0x0c, 0x1a, 0x08, 0x2e, 0x35, 0x10, 0x08, 0x69, + 0x0b, 0x0f, 0x1f, 0x3d, 0x5a, 0x6d, 0x13, 0x23, 0x1c, 0x11, 0x10, 0x1c, 0x24, 0x13, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x24, 0x00, 0x00, 0x01, 0xec, 0x02, 0xb5, 0x00, 0x1b, 0x00, 0x56, 0xb9, 0x00, + 0x03, 0xff, 0xc0, 0xb6, 0x0d, 0x00, 0x4d, 0x50, 0x03, 0x01, 0x02, 0xb8, 0xff, 0xc0, 0x40, 0x29, + 0x0d, 0x00, 0x4d, 0x50, 0x02, 0x01, 0x19, 0x00, 0x0d, 0x01, 0x0d, 0x1d, 0x1a, 0x17, 0x51, 0x01, + 0x04, 0x60, 0x03, 0x70, 0x03, 0x02, 0x4f, 0x03, 0x01, 0x03, 0x1c, 0x1b, 0x06, 0x19, 0x55, 0x18, + 0x0a, 0x11, 0x57, 0x0a, 0x01, 0x02, 0x55, 0x03, 0x0a, 0x00, 0x3f, 0xed, 0x3f, 0xed, 0x3f, 0xed, + 0x3f, 0x01, 0x10, 0xd6, 0x5d, 0x5d, 0xdd, 0x32, 0xed, 0x32, 0x10, 0xc6, 0x5d, 0xce, 0x31, 0x30, + 0x5d, 0x2b, 0x5d, 0x2b, 0x33, 0x11, 0x23, 0x35, 0x33, 0x35, 0x34, 0x3e, 0x02, 0x33, 0x32, 0x16, + 0x17, 0x07, 0x26, 0x26, 0x23, 0x22, 0x0e, 0x02, 0x15, 0x15, 0x33, 0x15, 0x23, 0x11, 0x8b, 0x67, + 0x67, 0x21, 0x38, 0x48, 0x26, 0x27, 0x52, 0x21, 0x15, 0x17, 0x45, 0x1f, 0x11, 0x1f, 0x17, 0x0e, + 0xc1, 0xc1, 0x01, 0x70, 0x66, 0x1b, 0x39, 0x4b, 0x2d, 0x13, 0x0e, 0x10, 0x64, 0x08, 0x11, 0x06, + 0x14, 0x25, 0x1e, 0x19, 0x66, 0xfe, 0x90, 0x00, 0x00, 0x02, 0x00, 0x21, 0xff, 0x58, 0x01, 0xb6, + 0x01, 0xe0, 0x00, 0x0b, 0x00, 0x27, 0x00, 0x47, 0xb9, 0x00, 0x13, 0xff, 0xc0, 0x40, 0x27, 0x11, + 0x12, 0x00, 0x4c, 0x1c, 0x51, 0x06, 0x51, 0x60, 0x0c, 0x01, 0x0c, 0x29, 0x00, 0x53, 0x60, 0x22, + 0x70, 0x22, 0x02, 0x22, 0x28, 0x03, 0x57, 0x1f, 0x1f, 0x0f, 0x0a, 0x57, 0x25, 0x0b, 0x13, 0x40, + 0x16, 0x01, 0x16, 0x57, 0x0f, 0x0f, 0x00, 0x3f, 0xfd, 0x5d, 0xc6, 0x3f, 0xed, 0x12, 0x39, 0x2f, + 0xed, 0x01, 0x10, 0xd6, 0x5d, 0xed, 0x10, 0xd6, 0x5d, 0xed, 0xed, 0x31, 0x30, 0x00, 0x2b, 0x37, + 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x35, 0x26, 0x26, 0x23, 0x22, 0x01, 0x14, 0x06, 0x23, 0x22, + 0x26, 0x27, 0x37, 0x16, 0x16, 0x33, 0x32, 0x3e, 0x02, 0x35, 0x35, 0x06, 0x06, 0x23, 0x22, 0x26, + 0x35, 0x34, 0x36, 0x33, 0x32, 0x17, 0x9e, 0x2a, 0x2d, 0x14, 0x23, 0x0e, 0x0e, 0x16, 0x0c, 0x6c, + 0x01, 0x18, 0x6f, 0x7b, 0x2c, 0x51, 0x25, 0x17, 0x1d, 0x40, 0x30, 0x20, 0x2a, 0x18, 0x0a, 0x1a, + 0x2b, 0x19, 0x5c, 0x5f, 0x80, 0x6e, 0x4d, 0x5a, 0xfa, 0x3a, 0x3d, 0x0a, 0x08, 0xe2, 0x03, 0x02, + 0xfe, 0xbd, 0x73, 0x6e, 0x12, 0x0c, 0x68, 0x0b, 0x13, 0x0f, 0x1a, 0x23, 0x14, 0x13, 0x0a, 0x0a, + 0x74, 0x67, 0x74, 0x72, 0x19, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x3f, 0x00, 0x00, 0x01, 0xb9, + 0x02, 0xb6, 0x00, 0x15, 0x00, 0x42, 0x40, 0x11, 0x0e, 0x51, 0x40, 0x0b, 0x60, 0x0b, 0x70, 0x0b, + 0x03, 0x0b, 0x17, 0x14, 0x51, 0x00, 0x03, 0x51, 0x01, 0xb8, 0xff, 0xc0, 0x40, 0x13, 0x09, 0x10, + 0x48, 0x01, 0x16, 0x15, 0x06, 0x0d, 0x06, 0x11, 0x57, 0x06, 0x0b, 0x02, 0x01, 0x01, 0x00, 0x00, + 0x06, 0x00, 0x3f, 0x3f, 0x3f, 0x3f, 0xed, 0x3f, 0x3f, 0x01, 0x7d, 0x2f, 0x18, 0xd6, 0x2b, 0xed, + 0xd0, 0xed, 0x10, 0xde, 0x5d, 0xed, 0x31, 0x30, 0x33, 0x11, 0x37, 0x15, 0x36, 0x36, 0x33, 0x32, + 0x1e, 0x02, 0x15, 0x11, 0x23, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x11, 0x3f, 0x7b, 0x0f, + 0x2a, 0x10, 0x34, 0x46, 0x2a, 0x12, 0x7b, 0x1e, 0x2a, 0x11, 0x21, 0x0a, 0x02, 0xa1, 0x15, 0xe4, + 0x05, 0x09, 0x1f, 0x39, 0x4f, 0x30, 0xfe, 0xf7, 0xf9, 0x42, 0x3a, 0x08, 0x03, 0xfe, 0x96, 0x00, + 0x00, 0x02, 0x00, 0x24, 0xff, 0xf5, 0x01, 0xd3, 0x02, 0xac, 0x00, 0x0b, 0x00, 0x1f, 0x00, 0x4c, + 0xb9, 0x00, 0x06, 0xff, 0xf8, 0x40, 0x2e, 0x09, 0x00, 0x4d, 0x17, 0x15, 0x51, 0x70, 0x18, 0x01, + 0x3f, 0x18, 0x01, 0x00, 0x18, 0x01, 0x18, 0x21, 0x10, 0x21, 0x20, 0x21, 0x60, 0x21, 0x03, 0x00, + 0x54, 0x20, 0x06, 0x60, 0x06, 0x70, 0x06, 0x03, 0x06, 0x1f, 0x1c, 0x57, 0x0f, 0x07, 0x15, 0x55, + 0x18, 0x03, 0x58, 0x09, 0x00, 0x00, 0x3f, 0xfd, 0xde, 0xed, 0x3f, 0xfd, 0xc6, 0x01, 0x2f, 0x5d, + 0xed, 0x5d, 0x10, 0xdc, 0x5d, 0x5d, 0x5d, 0xfd, 0xcd, 0x31, 0x30, 0x2b, 0x01, 0x14, 0x06, 0x23, + 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x13, 0x06, 0x06, 0x23, 0x22, 0x2e, 0x02, 0x35, + 0x35, 0x23, 0x35, 0x33, 0x11, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x01, 0x1c, 0x2e, 0x20, 0x20, + 0x2d, 0x2d, 0x20, 0x20, 0x2e, 0xb7, 0x26, 0x43, 0x1c, 0x30, 0x41, 0x27, 0x10, 0x82, 0xfd, 0x1f, + 0x24, 0x11, 0x30, 0x1e, 0x02, 0x5d, 0x24, 0x2a, 0x2a, 0x24, 0x25, 0x2a, 0x2a, 0xfd, 0x92, 0x12, + 0x0d, 0x1c, 0x35, 0x4c, 0x31, 0xad, 0x66, 0xfe, 0xdd, 0x2a, 0x29, 0x09, 0x0e, 0x00, 0x00, 0x00, + 0x00, 0x02, 0x00, 0x31, 0xff, 0x56, 0x01, 0x90, 0x02, 0xac, 0x00, 0x13, 0x00, 0x1f, 0x00, 0x4d, + 0x40, 0x0f, 0x08, 0x18, 0x0c, 0x00, 0x4d, 0x12, 0x10, 0x0f, 0x51, 0x00, 0x00, 0x20, 0x00, 0x02, + 0x00, 0xb8, 0xff, 0xc0, 0x40, 0x21, 0x0d, 0x10, 0x48, 0x00, 0x21, 0x14, 0x54, 0x00, 0x1a, 0x10, + 0x1a, 0x20, 0x1a, 0x40, 0x1a, 0x50, 0x1a, 0x70, 0x1a, 0x06, 0x1a, 0x10, 0x55, 0x13, 0x17, 0x58, + 0x1d, 0x00, 0x09, 0x0c, 0x57, 0x05, 0x0f, 0x00, 0x3f, 0xfd, 0xc6, 0x3f, 0xfd, 0xde, 0xed, 0x01, + 0x2f, 0x5d, 0xed, 0x10, 0xde, 0x2b, 0x5d, 0xfd, 0xd0, 0xcd, 0x31, 0x30, 0x2b, 0x25, 0x14, 0x0e, + 0x02, 0x23, 0x22, 0x26, 0x27, 0x37, 0x16, 0x16, 0x33, 0x32, 0x36, 0x35, 0x11, 0x23, 0x35, 0x21, + 0x27, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x01, 0x90, 0x1c, 0x31, + 0x43, 0x27, 0x30, 0x52, 0x26, 0x26, 0x19, 0x47, 0x1d, 0x1f, 0x22, 0xbe, 0x01, 0x39, 0x0f, 0x2e, + 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x20, 0x2e, 0x1f, 0x39, 0x4d, 0x2f, 0x14, 0x18, 0x13, 0x68, 0x0e, + 0x19, 0x25, 0x32, 0x01, 0x57, 0x66, 0x87, 0x24, 0x2a, 0x2a, 0x24, 0x25, 0x2a, 0x2a, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x3f, 0x00, 0x00, 0x01, 0xe7, 0x02, 0xb6, 0x00, 0x1a, 0x00, 0x51, 0x40, 0x16, + 0x05, 0x00, 0x06, 0x10, 0x06, 0x20, 0x06, 0x40, 0x06, 0x60, 0x06, 0x05, 0x06, 0x1c, 0x30, 0x1c, + 0x01, 0x16, 0x0b, 0x00, 0x51, 0x19, 0xb8, 0xff, 0xc0, 0x40, 0x1b, 0x09, 0x10, 0x48, 0x19, 0x1b, + 0x11, 0x10, 0x10, 0x30, 0x10, 0x70, 0x10, 0x03, 0x10, 0x1a, 0x01, 0x19, 0x00, 0x00, 0x0b, 0x16, + 0x03, 0x05, 0x17, 0x06, 0x05, 0x0a, 0x00, 0x3f, 0x3f, 0x12, 0x17, 0x39, 0x3f, 0x3f, 0x01, 0x2f, + 0x5d, 0x33, 0x10, 0xd6, 0x2b, 0xed, 0x32, 0x32, 0x5d, 0x10, 0xc6, 0x5d, 0x32, 0x31, 0x30, 0x13, + 0x3e, 0x03, 0x37, 0x33, 0x0e, 0x03, 0x07, 0x1e, 0x03, 0x17, 0x23, 0x2e, 0x03, 0x27, 0x15, 0x23, + 0x11, 0x37, 0xbb, 0x12, 0x25, 0x23, 0x20, 0x0c, 0x94, 0x12, 0x2e, 0x31, 0x31, 0x14, 0x19, 0x3a, + 0x38, 0x2f, 0x0e, 0x8d, 0x0c, 0x27, 0x2c, 0x2d, 0x13, 0x7c, 0x7c, 0x01, 0x1c, 0x15, 0x2f, 0x32, + 0x2f, 0x15, 0x17, 0x36, 0x38, 0x34, 0x16, 0x18, 0x43, 0x48, 0x48, 0x1c, 0x19, 0x3f, 0x3d, 0x37, + 0x12, 0xde, 0x02, 0xa1, 0x15, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x24, 0xff, 0xf5, 0x01, 0xd3, + 0x02, 0xb0, 0x00, 0x13, 0x00, 0x36, 0x40, 0x21, 0x60, 0x00, 0x70, 0x00, 0x02, 0x3f, 0x00, 0x01, + 0x00, 0x15, 0x0d, 0x51, 0x09, 0x50, 0x0a, 0x60, 0x0a, 0x70, 0x0a, 0x03, 0x0a, 0x14, 0x0c, 0x00, + 0x0a, 0x55, 0x0b, 0x00, 0x13, 0x10, 0x57, 0x05, 0x07, 0x00, 0x3f, 0xfd, 0xc6, 0x3f, 0xed, 0x3f, + 0x01, 0x10, 0xd6, 0x5d, 0xd5, 0xed, 0x10, 0xce, 0x5d, 0x5d, 0x31, 0x30, 0x25, 0x0e, 0x03, 0x23, + 0x22, 0x26, 0x35, 0x11, 0x23, 0x35, 0x33, 0x11, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x01, 0xd3, + 0x03, 0x15, 0x22, 0x31, 0x1f, 0x55, 0x4e, 0x82, 0xfd, 0x26, 0x1d, 0x25, 0x32, 0x08, 0x14, 0x02, + 0x0a, 0x0b, 0x08, 0x65, 0x61, 0x01, 0x8f, 0x66, 0xfe, 0x02, 0x30, 0x22, 0x14, 0x03, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x1d, 0x00, 0x00, 0x01, 0xd7, 0x01, 0xdb, 0x00, 0x27, 0x00, 0x84, 0x40, 0x5e, + 0x2b, 0x1c, 0x01, 0x7f, 0x13, 0x01, 0x02, 0x15, 0x40, 0x15, 0x00, 0x4d, 0x15, 0x40, 0x0f, 0x00, + 0x4d, 0x2f, 0x15, 0x3f, 0x15, 0x5f, 0x15, 0x7f, 0x15, 0x9f, 0x15, 0xdf, 0x15, 0xef, 0x15, 0xff, + 0x15, 0x08, 0x15, 0x52, 0x14, 0x14, 0x1f, 0x07, 0x40, 0x16, 0x00, 0x4d, 0x2f, 0x07, 0x3f, 0x07, + 0x4f, 0x07, 0xcf, 0x07, 0x04, 0x07, 0x52, 0x0f, 0x05, 0x1f, 0x05, 0x5f, 0x05, 0x03, 0x05, 0x29, + 0x20, 0x1d, 0x30, 0x1d, 0x40, 0x1d, 0x03, 0x1d, 0x52, 0x80, 0x1f, 0x01, 0x1f, 0x28, 0x19, 0x57, + 0x22, 0x0b, 0x14, 0x14, 0x00, 0x1d, 0x06, 0x06, 0x06, 0x25, 0x0d, 0x57, 0x00, 0x0b, 0x00, 0x3f, + 0xed, 0x33, 0x3f, 0x3f, 0x12, 0x39, 0x2f, 0x3f, 0xed, 0x01, 0x10, 0xd6, 0x5d, 0xed, 0x5d, 0x10, + 0xde, 0x5d, 0xed, 0x5d, 0x2b, 0x12, 0x39, 0x2f, 0xed, 0x5d, 0x2b, 0x2b, 0x31, 0x30, 0x00, 0x5f, + 0x5d, 0x5d, 0x01, 0x32, 0x1e, 0x02, 0x15, 0x11, 0x23, 0x11, 0x34, 0x2e, 0x02, 0x23, 0x22, 0x06, + 0x07, 0x16, 0x16, 0x15, 0x15, 0x23, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x11, 0x23, 0x11, + 0x36, 0x36, 0x33, 0x32, 0x16, 0x17, 0x36, 0x36, 0x01, 0x57, 0x27, 0x32, 0x1d, 0x0a, 0x64, 0x07, + 0x0b, 0x0f, 0x08, 0x09, 0x14, 0x08, 0x03, 0x04, 0x64, 0x13, 0x15, 0x06, 0x11, 0x08, 0x64, 0x27, + 0x4c, 0x1d, 0x1a, 0x29, 0x0f, 0x11, 0x2e, 0x01, 0xdb, 0x18, 0x30, 0x49, 0x31, 0xfe, 0xe7, 0x01, + 0x1f, 0x1c, 0x22, 0x12, 0x06, 0x03, 0x04, 0x13, 0x2e, 0x1c, 0x5e, 0x6c, 0x30, 0x26, 0x02, 0x02, + 0xfe, 0x8f, 0x01, 0xc4, 0x0b, 0x0c, 0x0d, 0x0f, 0x0b, 0x11, 0x00, 0x00, 0x00, 0x01, 0x00, 0x3f, + 0x00, 0x00, 0x01, 0xb9, 0x01, 0xe0, 0x00, 0x13, 0x00, 0x2d, 0xb6, 0x0b, 0x51, 0x08, 0x15, 0x12, + 0x51, 0x00, 0xb8, 0xff, 0xc0, 0x40, 0x10, 0x09, 0x10, 0x48, 0x00, 0x14, 0x13, 0x06, 0x0a, 0x06, + 0x30, 0x0e, 0x01, 0x0e, 0x57, 0x03, 0x0b, 0x00, 0x3f, 0xed, 0x5d, 0x3f, 0x3f, 0x01, 0x10, 0xd6, + 0x2b, 0xed, 0x10, 0xde, 0xed, 0x31, 0x30, 0x13, 0x36, 0x36, 0x33, 0x32, 0x1e, 0x02, 0x15, 0x11, + 0x23, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x11, 0x23, 0x3f, 0x21, 0x61, 0x39, 0x38, 0x4a, + 0x2b, 0x12, 0x7b, 0x1e, 0x2e, 0x0e, 0x1b, 0x0f, 0x7b, 0x01, 0xc7, 0x09, 0x10, 0x1f, 0x39, 0x4f, + 0x30, 0xfe, 0xf7, 0xf9, 0x42, 0x3a, 0x02, 0x02, 0xfe, 0x8f, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1d, + 0xff, 0xf3, 0x01, 0xd8, 0x01, 0xe2, 0x00, 0x13, 0x00, 0x1f, 0x00, 0x26, 0x40, 0x15, 0x1a, 0x53, + 0x00, 0x40, 0x0c, 0x00, 0x4d, 0x00, 0x21, 0x14, 0x53, 0x0a, 0x20, 0x1d, 0x57, 0x0f, 0x0b, 0x17, + 0x57, 0x05, 0x07, 0x00, 0x3f, 0xed, 0x3f, 0xed, 0x01, 0x10, 0xd6, 0xed, 0x10, 0xde, 0x2b, 0xed, + 0x31, 0x30, 0x25, 0x14, 0x0e, 0x02, 0x23, 0x22, 0x2e, 0x02, 0x35, 0x34, 0x3e, 0x02, 0x33, 0x32, + 0x1e, 0x02, 0x05, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x01, 0xd8, + 0x20, 0x3a, 0x51, 0x32, 0x32, 0x51, 0x3b, 0x20, 0x21, 0x3b, 0x52, 0x30, 0x31, 0x51, 0x3b, 0x20, + 0xfe, 0xc2, 0x2d, 0x32, 0x30, 0x31, 0x2d, 0x32, 0x30, 0x31, 0xec, 0x38, 0x5b, 0x42, 0x24, 0x24, + 0x42, 0x5b, 0x38, 0x37, 0x5b, 0x41, 0x23, 0x23, 0x41, 0x5b, 0x38, 0x3f, 0x4e, 0x4e, 0x3f, 0x3f, + 0x4d, 0x4d, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3f, 0xff, 0x5b, 0x01, 0xd5, 0x01, 0xe0, 0x00, 0x0c, + 0x00, 0x1c, 0x00, 0x36, 0x40, 0x0e, 0x00, 0x53, 0x60, 0x0d, 0x70, 0x0d, 0x02, 0x0d, 0x1e, 0x14, + 0x51, 0x07, 0x51, 0x17, 0xb8, 0xff, 0xc0, 0x40, 0x0f, 0x09, 0x10, 0x48, 0x17, 0x1d, 0x03, 0x57, + 0x1a, 0x0b, 0x16, 0x0e, 0x0a, 0x57, 0x12, 0x07, 0x00, 0x3f, 0xed, 0x3f, 0x3f, 0xed, 0x01, 0x10, + 0xd6, 0x2b, 0xed, 0xed, 0x10, 0xde, 0x5d, 0xed, 0x31, 0x30, 0x25, 0x34, 0x26, 0x23, 0x22, 0x06, + 0x07, 0x11, 0x16, 0x16, 0x33, 0x32, 0x36, 0x37, 0x14, 0x0e, 0x02, 0x23, 0x22, 0x27, 0x15, 0x23, + 0x11, 0x36, 0x36, 0x33, 0x32, 0x16, 0x01, 0x58, 0x32, 0x33, 0x0e, 0x20, 0x0b, 0x0c, 0x28, 0x14, + 0x2c, 0x2a, 0x7d, 0x18, 0x2e, 0x46, 0x2e, 0x2f, 0x32, 0x7b, 0x22, 0x63, 0x30, 0x6d, 0x74, 0xe7, + 0x3f, 0x51, 0x03, 0x01, 0xfe, 0xfe, 0x08, 0x0a, 0x47, 0x45, 0x36, 0x5b, 0x41, 0x24, 0x17, 0xb1, + 0x02, 0x6c, 0x0b, 0x0e, 0x84, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1f, 0xff, 0x5b, 0x01, 0xb6, + 0x01, 0xe0, 0x00, 0x0c, 0x00, 0x21, 0x00, 0x35, 0x40, 0x1f, 0x19, 0x51, 0x07, 0x51, 0x60, 0x17, + 0x70, 0x17, 0x02, 0x17, 0x23, 0x00, 0x53, 0x70, 0x0d, 0x01, 0x0d, 0x22, 0x1a, 0x55, 0x06, 0x03, + 0x57, 0x1d, 0x07, 0x18, 0x0e, 0x0a, 0x57, 0x12, 0x0b, 0x00, 0x3f, 0xed, 0x3f, 0x3f, 0xfd, 0xd6, + 0xed, 0x01, 0x10, 0xd6, 0x5d, 0xed, 0x10, 0xde, 0x5d, 0xed, 0xed, 0x31, 0x30, 0x37, 0x14, 0x16, + 0x33, 0x32, 0x36, 0x37, 0x11, 0x26, 0x26, 0x23, 0x22, 0x06, 0x07, 0x34, 0x3e, 0x02, 0x33, 0x32, + 0x1e, 0x02, 0x17, 0x11, 0x23, 0x35, 0x06, 0x06, 0x23, 0x22, 0x2e, 0x02, 0x9c, 0x2b, 0x2c, 0x15, + 0x25, 0x0e, 0x09, 0x1f, 0x11, 0x33, 0x33, 0x7d, 0x1e, 0x39, 0x55, 0x36, 0x17, 0x33, 0x30, 0x2b, + 0x10, 0x7b, 0x17, 0x33, 0x17, 0x2e, 0x46, 0x2f, 0x18, 0xe7, 0x41, 0x47, 0x0a, 0x08, 0x01, 0x02, + 0x01, 0x03, 0x51, 0x3b, 0x36, 0x5b, 0x40, 0x24, 0x04, 0x07, 0x09, 0x05, 0xfd, 0x94, 0xb2, 0x0b, + 0x0d, 0x23, 0x40, 0x5b, 0x00, 0x01, 0x00, 0x59, 0x00, 0x00, 0x01, 0xcb, 0x01, 0xdf, 0x00, 0x13, + 0x00, 0x21, 0xb3, 0x13, 0x08, 0x51, 0x0b, 0xb8, 0xff, 0xc0, 0x40, 0x0b, 0x09, 0x10, 0x48, 0x0b, + 0x14, 0x05, 0x57, 0x0e, 0x0b, 0x09, 0x06, 0x00, 0x3f, 0x3f, 0xed, 0x01, 0x10, 0xd6, 0x2b, 0xfd, + 0xcd, 0x31, 0x30, 0x01, 0x2e, 0x03, 0x23, 0x22, 0x06, 0x07, 0x11, 0x23, 0x11, 0x36, 0x36, 0x33, + 0x32, 0x1e, 0x02, 0x17, 0x01, 0xb5, 0x0c, 0x21, 0x22, 0x20, 0x0b, 0x1a, 0x32, 0x1a, 0x7c, 0x31, + 0x67, 0x45, 0x0a, 0x25, 0x2a, 0x2b, 0x11, 0x01, 0x59, 0x03, 0x06, 0x05, 0x02, 0x05, 0x07, 0xfe, + 0xa3, 0x01, 0xb7, 0x12, 0x16, 0x02, 0x05, 0x07, 0x06, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x36, + 0xff, 0xf5, 0x01, 0xba, 0x01, 0xe2, 0x00, 0x31, 0x00, 0x4c, 0xb9, 0x00, 0x2f, 0xff, 0xc0, 0x40, + 0x0a, 0x0d, 0x00, 0x4d, 0x15, 0x03, 0x53, 0x20, 0x26, 0x01, 0x26, 0xb8, 0xff, 0xc0, 0x40, 0x09, + 0x0d, 0x10, 0x48, 0x26, 0x33, 0x1c, 0x53, 0x0d, 0x2e, 0xb8, 0xff, 0xc0, 0x40, 0x10, 0x0a, 0x10, + 0x48, 0x2e, 0x32, 0x21, 0x08, 0x19, 0x00, 0x57, 0x2b, 0x07, 0x19, 0x57, 0x12, 0x0b, 0x00, 0x3f, + 0xed, 0x3f, 0xed, 0x11, 0x39, 0x39, 0x01, 0x10, 0xd6, 0x2b, 0xd6, 0xed, 0x10, 0xde, 0x2b, 0x5d, + 0xed, 0xc4, 0x31, 0x30, 0x00, 0x2b, 0x37, 0x32, 0x36, 0x35, 0x34, 0x2e, 0x02, 0x27, 0x2e, 0x03, + 0x35, 0x34, 0x3e, 0x02, 0x33, 0x32, 0x16, 0x17, 0x07, 0x26, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, + 0x1e, 0x02, 0x17, 0x1e, 0x03, 0x15, 0x14, 0x0e, 0x02, 0x23, 0x22, 0x26, 0x27, 0x37, 0x16, 0x16, + 0xe4, 0x2d, 0x30, 0x0f, 0x1b, 0x23, 0x13, 0x1b, 0x38, 0x2e, 0x1e, 0x17, 0x31, 0x4c, 0x35, 0x2e, + 0x4f, 0x1d, 0x13, 0x11, 0x48, 0x2d, 0x2f, 0x21, 0x0f, 0x19, 0x21, 0x13, 0x1b, 0x3a, 0x2f, 0x1e, + 0x16, 0x33, 0x52, 0x3c, 0x3d, 0x56, 0x1a, 0x13, 0x23, 0x4f, 0x5d, 0x0d, 0x14, 0x0d, 0x12, 0x0d, + 0x0c, 0x06, 0x08, 0x15, 0x20, 0x31, 0x25, 0x1e, 0x35, 0x29, 0x17, 0x0e, 0x0d, 0x68, 0x05, 0x17, + 0x17, 0x0d, 0x0b, 0x11, 0x0e, 0x0d, 0x06, 0x09, 0x16, 0x21, 0x33, 0x25, 0x1d, 0x34, 0x26, 0x16, + 0x1c, 0x0b, 0x67, 0x0e, 0x18, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x24, 0xff, 0xf5, 0x01, 0xd8, + 0x02, 0x60, 0x00, 0x1d, 0x00, 0x66, 0xb9, 0x00, 0x15, 0xff, 0xc0, 0x40, 0x40, 0x0d, 0x00, 0x4d, + 0x10, 0x15, 0x20, 0x15, 0x30, 0x15, 0x80, 0x15, 0x90, 0x15, 0x05, 0x15, 0x07, 0x40, 0x0f, 0x00, + 0x4d, 0x07, 0x40, 0x0c, 0x00, 0x4d, 0x6f, 0x07, 0x01, 0x0d, 0x07, 0x01, 0x08, 0x07, 0x1f, 0x60, + 0x1f, 0x01, 0x09, 0x06, 0x51, 0x00, 0x03, 0x50, 0x02, 0x60, 0x02, 0x70, 0x02, 0x03, 0x02, 0x1e, + 0x0f, 0x57, 0x18, 0x07, 0x00, 0x09, 0x55, 0x06, 0x04, 0x05, 0x03, 0x06, 0x0a, 0x00, 0x3f, 0x33, + 0xdd, 0xc5, 0x10, 0xed, 0x32, 0x3f, 0xed, 0x01, 0x10, 0xd6, 0x5d, 0xdd, 0x32, 0xed, 0x32, 0x5d, + 0x10, 0xce, 0x5e, 0x5d, 0x5d, 0x2b, 0x2b, 0xc6, 0x5d, 0x2b, 0x31, 0x30, 0x13, 0x23, 0x35, 0x33, + 0x35, 0x37, 0x15, 0x33, 0x15, 0x23, 0x15, 0x14, 0x1e, 0x02, 0x33, 0x32, 0x3e, 0x02, 0x37, 0x17, + 0x06, 0x06, 0x23, 0x22, 0x2e, 0x02, 0x35, 0x8f, 0x6b, 0x6b, 0x7b, 0xc5, 0xc5, 0x0a, 0x12, 0x1a, + 0x10, 0x11, 0x1d, 0x1b, 0x1d, 0x11, 0x11, 0x22, 0x4f, 0x25, 0x2b, 0x42, 0x2e, 0x18, 0x01, 0x70, + 0x66, 0x76, 0x14, 0x8a, 0x66, 0xbe, 0x1a, 0x20, 0x12, 0x06, 0x02, 0x05, 0x0a, 0x08, 0x6a, 0x0e, + 0x0c, 0x0e, 0x28, 0x49, 0x3b, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x3b, 0xff, 0xf5, 0x01, 0xb6, + 0x01, 0xd6, 0x00, 0x12, 0x00, 0x32, 0x40, 0x0a, 0x11, 0x51, 0x1f, 0x12, 0x01, 0x12, 0x14, 0x0a, + 0x51, 0x09, 0xb8, 0xff, 0xc0, 0x40, 0x10, 0x0a, 0x10, 0x48, 0x01, 0x09, 0x01, 0x09, 0x13, 0x12, + 0x0a, 0x09, 0x0a, 0x0e, 0x57, 0x03, 0x07, 0x00, 0x3f, 0xed, 0x3f, 0x3f, 0x01, 0x10, 0xd6, 0x5d, + 0x2b, 0xed, 0x10, 0xde, 0x5d, 0xed, 0x31, 0x30, 0x25, 0x06, 0x06, 0x23, 0x22, 0x2e, 0x02, 0x35, + 0x11, 0x33, 0x15, 0x14, 0x16, 0x33, 0x32, 0x37, 0x11, 0x33, 0x01, 0xb6, 0x22, 0x61, 0x39, 0x3a, + 0x4a, 0x2b, 0x10, 0x7b, 0x1f, 0x2d, 0x1c, 0x1c, 0x7c, 0x10, 0x09, 0x12, 0x20, 0x3b, 0x50, 0x30, + 0x01, 0x06, 0xf6, 0x41, 0x3f, 0x05, 0x01, 0x71, 0x00, 0x01, 0x00, 0x0e, 0x00, 0x00, 0x01, 0xe6, + 0x01, 0xd6, 0x00, 0x12, 0x00, 0x50, 0xb9, 0x00, 0x12, 0xff, 0xe0, 0xb3, 0x0f, 0x00, 0x4d, 0x0e, + 0xb8, 0xff, 0xc0, 0xb3, 0x0b, 0x00, 0x4d, 0x0d, 0xb8, 0xff, 0xe0, 0xb3, 0x0c, 0x00, 0x4d, 0x06, + 0xb8, 0xff, 0xe0, 0xb4, 0x09, 0x0a, 0x00, 0x4c, 0x02, 0xb8, 0xff, 0xe0, 0x40, 0x15, 0x0b, 0x10, + 0x00, 0x4c, 0x0e, 0x12, 0x09, 0x00, 0x04, 0x05, 0x03, 0x0f, 0x14, 0x03, 0x13, 0x0f, 0x0a, 0x03, + 0x0a, 0x00, 0x06, 0x00, 0x3f, 0x3f, 0x3f, 0x01, 0x10, 0xc2, 0x10, 0xce, 0x11, 0x17, 0x39, 0x31, + 0x30, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x33, 0x26, 0x26, 0x27, 0x33, 0x1e, 0x03, 0x17, 0x3e, 0x03, + 0x37, 0x33, 0x06, 0x06, 0x07, 0xc2, 0x2d, 0x5d, 0x2a, 0x81, 0x09, 0x19, 0x1c, 0x1d, 0x0d, 0x0d, + 0x20, 0x1f, 0x1d, 0x09, 0x7d, 0x2a, 0x66, 0x2d, 0x59, 0xef, 0x8e, 0x26, 0x56, 0x57, 0x52, 0x22, + 0x22, 0x52, 0x57, 0x56, 0x26, 0x8e, 0xef, 0x59, 0x00, 0x01, 0x00, 0x0b, 0x00, 0x00, 0x01, 0xe9, + 0x01, 0xd6, 0x00, 0x28, 0x01, 0x40, 0xb9, 0x00, 0x28, 0xff, 0xd0, 0xb6, 0x0c, 0x00, 0x4d, 0x60, + 0x28, 0x01, 0x27, 0xb8, 0xff, 0xc0, 0xb3, 0x0f, 0x00, 0x4d, 0x27, 0xb8, 0xff, 0xd0, 0xb3, 0x0c, + 0x00, 0x4d, 0x21, 0xb8, 0xff, 0xc0, 0x40, 0x09, 0x0f, 0x00, 0x4d, 0x1d, 0x40, 0x10, 0x00, 0x4d, + 0x1d, 0xb8, 0xff, 0xc0, 0xb3, 0x0f, 0x00, 0x4d, 0x1d, 0xb8, 0xff, 0xc0, 0xb3, 0x0a, 0x00, 0x4d, + 0x1c, 0xb8, 0xff, 0xc0, 0x40, 0x09, 0x0f, 0x00, 0x4d, 0x1b, 0x40, 0x10, 0x00, 0x4d, 0x12, 0xb8, + 0xff, 0xc0, 0xb3, 0x0b, 0x00, 0x4d, 0x11, 0xb8, 0xff, 0xc0, 0x40, 0x09, 0x0b, 0x00, 0x4d, 0x0d, + 0x08, 0x1b, 0x00, 0x4d, 0x0d, 0xb8, 0xff, 0xc0, 0xb3, 0x0b, 0x00, 0x4d, 0x0c, 0xb8, 0xff, 0xc0, + 0xb3, 0x0b, 0x00, 0x4d, 0x0b, 0xb8, 0xff, 0xc0, 0xb3, 0x0f, 0x00, 0x4d, 0x0b, 0xb8, 0xff, 0xc0, + 0x40, 0x09, 0x0b, 0x00, 0x4d, 0x03, 0x40, 0x10, 0x00, 0x4d, 0x02, 0xb8, 0xff, 0xc0, 0xb3, 0x0f, + 0x00, 0x4d, 0x01, 0xb8, 0xff, 0xc0, 0xb3, 0x0f, 0x00, 0x4d, 0x00, 0xb8, 0xff, 0xa0, 0xb3, 0x0f, + 0x00, 0x4d, 0x1a, 0xb8, 0xff, 0xc0, 0xb4, 0x0d, 0x0f, 0x00, 0x4c, 0x19, 0xb8, 0xff, 0xc0, 0xb4, + 0x0d, 0x0f, 0x00, 0x4c, 0x05, 0xb8, 0xff, 0xc0, 0xb3, 0x0f, 0x00, 0x4d, 0x05, 0xb8, 0xff, 0xc0, + 0x40, 0x3e, 0x0d, 0x00, 0x4d, 0x28, 0x60, 0x24, 0x01, 0x24, 0x1f, 0x00, 0x1f, 0x1a, 0x19, 0x05, + 0x11, 0x14, 0x0b, 0x0a, 0x14, 0x20, 0x1f, 0x01, 0x1f, 0x14, 0x05, 0x14, 0x05, 0x1f, 0x03, 0x29, + 0x20, 0x25, 0x60, 0x25, 0x02, 0x25, 0x2a, 0x10, 0x40, 0x0c, 0x00, 0x4d, 0x30, 0x10, 0x01, 0x10, + 0x29, 0x28, 0x06, 0x25, 0x0a, 0x14, 0x1f, 0x05, 0x03, 0x19, 0x19, 0x0b, 0x10, 0x0a, 0x0b, 0x06, + 0x00, 0x3f, 0x3f, 0x12, 0x39, 0x2f, 0x17, 0x39, 0x3f, 0x3f, 0x01, 0x10, 0xc6, 0x5d, 0x2b, 0x10, + 0xc6, 0x5d, 0x12, 0x17, 0x39, 0x19, 0x2f, 0x18, 0x2f, 0x2f, 0x71, 0x11, 0x33, 0x33, 0x10, 0xc6, + 0x11, 0x33, 0x33, 0x11, 0x33, 0x10, 0xc6, 0x5d, 0x33, 0x31, 0x30, 0x00, 0x2b, 0x2b, 0x2b, 0x2b, + 0x01, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, + 0x2b, 0x2b, 0x2b, 0x2b, 0x5d, 0x2b, 0x21, 0x2e, 0x03, 0x27, 0x0e, 0x03, 0x07, 0x23, 0x2e, 0x03, + 0x27, 0x33, 0x16, 0x16, 0x17, 0x3e, 0x03, 0x37, 0x33, 0x1e, 0x03, 0x17, 0x3e, 0x03, 0x37, 0x33, + 0x06, 0x06, 0x07, 0x01, 0x42, 0x0b, 0x13, 0x11, 0x11, 0x09, 0x0a, 0x10, 0x11, 0x12, 0x0d, 0x5d, + 0x0c, 0x15, 0x12, 0x0e, 0x06, 0x69, 0x04, 0x09, 0x0c, 0x0d, 0x13, 0x0f, 0x0d, 0x07, 0x59, 0x06, + 0x0d, 0x0f, 0x11, 0x0c, 0x06, 0x08, 0x05, 0x03, 0x02, 0x69, 0x0b, 0x27, 0x18, 0x1f, 0x34, 0x31, + 0x35, 0x20, 0x20, 0x33, 0x32, 0x34, 0x20, 0x2c, 0x6b, 0x79, 0x82, 0x44, 0x57, 0xa6, 0x58, 0x26, + 0x41, 0x3b, 0x37, 0x1d, 0x1d, 0x37, 0x3b, 0x41, 0x26, 0x2e, 0x54, 0x53, 0x53, 0x2d, 0x89, 0xf2, + 0x5b, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x14, 0x00, 0x00, 0x01, 0xe1, 0x01, 0xd6, 0x00, 0x17, + 0x00, 0x29, 0x40, 0x17, 0x09, 0x01, 0x03, 0x00, 0x0c, 0x15, 0x17, 0x0f, 0x08, 0x18, 0x08, 0x16, + 0x10, 0x02, 0x08, 0x17, 0x0a, 0x0f, 0x06, 0x09, 0x06, 0x01, 0x0a, 0x00, 0x3f, 0x3f, 0x3f, 0x3f, + 0x01, 0x2f, 0xc6, 0x2f, 0xc6, 0x11, 0x12, 0x17, 0x39, 0x31, 0x30, 0x13, 0x37, 0x33, 0x07, 0x1e, + 0x03, 0x17, 0x23, 0x26, 0x26, 0x27, 0x06, 0x06, 0x07, 0x23, 0x3e, 0x03, 0x37, 0x27, 0x33, 0xfe, + 0x60, 0x7d, 0x98, 0x18, 0x2e, 0x2a, 0x22, 0x0c, 0x80, 0x1b, 0x36, 0x18, 0x1e, 0x30, 0x19, 0x7d, + 0x0f, 0x27, 0x2b, 0x2f, 0x16, 0xa5, 0x81, 0x01, 0x43, 0x93, 0xe2, 0x1d, 0x41, 0x42, 0x3c, 0x18, + 0x33, 0x50, 0x20, 0x28, 0x4c, 0x2f, 0x1c, 0x3d, 0x3f, 0x3e, 0x1c, 0xe4, 0x00, 0x01, 0x00, 0x14, + 0xff, 0x58, 0x01, 0xd8, 0x01, 0xd6, 0x00, 0x22, 0x00, 0x2f, 0x40, 0x19, 0x1f, 0x14, 0x01, 0x05, + 0x1d, 0x14, 0x03, 0x18, 0x22, 0x51, 0x00, 0x24, 0x0d, 0x23, 0x18, 0x51, 0x17, 0x17, 0x0a, 0x0e, + 0x11, 0x0a, 0x0f, 0x00, 0x0a, 0x00, 0x3f, 0x3f, 0xdd, 0xc6, 0x3f, 0x01, 0x2f, 0xed, 0x10, 0xc6, + 0x10, 0xd6, 0xed, 0x11, 0x17, 0x39, 0x5d, 0x31, 0x30, 0x01, 0x0e, 0x03, 0x07, 0x0e, 0x03, 0x23, + 0x22, 0x26, 0x27, 0x37, 0x16, 0x16, 0x33, 0x32, 0x36, 0x37, 0x26, 0x26, 0x27, 0x33, 0x1e, 0x03, + 0x17, 0x3e, 0x03, 0x37, 0x01, 0xd8, 0x13, 0x23, 0x26, 0x2b, 0x19, 0x13, 0x25, 0x2d, 0x37, 0x25, + 0x1f, 0x33, 0x11, 0x17, 0x14, 0x1f, 0x12, 0x24, 0x2c, 0x0d, 0x2c, 0x58, 0x24, 0x80, 0x09, 0x17, + 0x1a, 0x1d, 0x0f, 0x0a, 0x16, 0x14, 0x13, 0x08, 0x01, 0xd6, 0x42, 0x7f, 0x79, 0x74, 0x37, 0x28, + 0x3a, 0x25, 0x12, 0x0a, 0x08, 0x67, 0x09, 0x07, 0x30, 0x21, 0x58, 0xe3, 0x89, 0x25, 0x54, 0x54, + 0x51, 0x23, 0x23, 0x51, 0x53, 0x54, 0x26, 0x00, 0x00, 0x01, 0x00, 0x43, 0x00, 0x00, 0x01, 0xb4, + 0x01, 0xd6, 0x00, 0x11, 0x00, 0x57, 0xb5, 0x00, 0x07, 0x10, 0x07, 0x02, 0x07, 0xb8, 0xff, 0xc0, + 0xb5, 0x0d, 0x10, 0x48, 0x07, 0x13, 0x08, 0xb8, 0xff, 0xc0, 0xb7, 0x09, 0x10, 0x48, 0x08, 0x12, + 0x05, 0x0e, 0x0f, 0xb8, 0xff, 0xc0, 0x40, 0x1d, 0x09, 0x10, 0x48, 0x0f, 0x00, 0x00, 0x10, 0x00, + 0x40, 0x00, 0x50, 0x00, 0x70, 0x00, 0x05, 0x00, 0x00, 0x11, 0x0a, 0x0f, 0x55, 0x10, 0x0a, 0x08, + 0x06, 0x06, 0x55, 0x07, 0x06, 0x00, 0x3f, 0xed, 0x3f, 0x3f, 0xed, 0x3f, 0xcd, 0x01, 0x2f, 0x5d, + 0x2f, 0x2b, 0x39, 0x39, 0x10, 0xc6, 0x2b, 0x10, 0xce, 0x2b, 0x5d, 0x31, 0x30, 0x01, 0x0e, 0x03, + 0x07, 0x33, 0x15, 0x21, 0x35, 0x3e, 0x03, 0x37, 0x23, 0x35, 0x21, 0x01, 0xaa, 0x0e, 0x34, 0x3d, + 0x3d, 0x18, 0xde, 0xfe, 0x8f, 0x17, 0x36, 0x36, 0x34, 0x15, 0xc2, 0x01, 0x5d, 0x01, 0x7c, 0x10, + 0x3f, 0x4e, 0x55, 0x24, 0x66, 0x4b, 0x26, 0x50, 0x4d, 0x46, 0x1c, 0x66, 0x00, 0x01, 0x00, 0x3f, + 0xff, 0x5b, 0x01, 0xb5, 0x02, 0xbb, 0x00, 0x24, 0x00, 0x37, 0x40, 0x1b, 0x22, 0x6e, 0x17, 0x0e, + 0x1c, 0x09, 0x03, 0x6e, 0x0e, 0x00, 0x12, 0x25, 0x00, 0x00, 0x13, 0x72, 0x12, 0x12, 0x09, 0x1d, + 0x72, 0x1c, 0x10, 0x08, 0x72, 0x09, 0x12, 0x00, 0x3f, 0xed, 0x3f, 0xed, 0x12, 0x39, 0x2f, 0xed, + 0x39, 0x3d, 0x2f, 0x01, 0x18, 0x10, 0xde, 0x32, 0xde, 0xfd, 0xdc, 0xc0, 0x10, 0xd0, 0xed, 0x31, + 0x30, 0x13, 0x16, 0x16, 0x15, 0x15, 0x14, 0x16, 0x33, 0x33, 0x15, 0x23, 0x22, 0x26, 0x35, 0x35, + 0x34, 0x26, 0x23, 0x23, 0x35, 0x33, 0x32, 0x36, 0x35, 0x35, 0x34, 0x36, 0x33, 0x33, 0x15, 0x23, + 0x22, 0x06, 0x15, 0x15, 0x14, 0x06, 0xbb, 0x36, 0x2f, 0x18, 0x20, 0x5d, 0x68, 0x5a, 0x45, 0x1a, + 0x1f, 0x36, 0x36, 0x1f, 0x1a, 0x45, 0x5a, 0x68, 0x5d, 0x20, 0x18, 0x2f, 0x01, 0x0a, 0x0a, 0x44, + 0x40, 0x71, 0x2a, 0x26, 0x60, 0x4e, 0x4a, 0x93, 0x2a, 0x2b, 0x60, 0x2b, 0x29, 0x94, 0x4a, 0x4e, + 0x60, 0x25, 0x2b, 0x71, 0x40, 0x44, 0x00, 0x00, 0x00, 0x01, 0x00, 0xbd, 0xff, 0x5b, 0x01, 0x39, + 0x02, 0xbb, 0x00, 0x03, 0x00, 0x28, 0x40, 0x18, 0x02, 0x80, 0x01, 0x90, 0x01, 0xe0, 0x01, 0x03, + 0x5f, 0x01, 0x01, 0x20, 0x01, 0x40, 0x01, 0x02, 0x01, 0x05, 0x00, 0x04, 0x02, 0x12, 0x00, 0x10, + 0x00, 0x3f, 0x3f, 0x01, 0x10, 0xc6, 0x10, 0xc6, 0x5d, 0x5d, 0x5d, 0x32, 0x31, 0x30, 0x13, 0x33, + 0x11, 0x23, 0xbd, 0x7c, 0x7c, 0x02, 0xbb, 0xfc, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x3f, + 0xff, 0x5b, 0x01, 0xb5, 0x02, 0xbb, 0x00, 0x28, 0x00, 0x43, 0x40, 0x25, 0x28, 0x40, 0x0d, 0x00, + 0x4d, 0x01, 0x40, 0x0d, 0x00, 0x4d, 0x10, 0x6e, 0x03, 0x26, 0x6e, 0x19, 0x00, 0x15, 0x2a, 0x20, + 0x09, 0x29, 0x00, 0x00, 0x14, 0x72, 0x15, 0x15, 0x09, 0x21, 0x72, 0x20, 0x12, 0x08, 0x72, 0x09, + 0x10, 0x00, 0x3f, 0xed, 0x3f, 0xed, 0x12, 0x39, 0x2f, 0xed, 0x39, 0x3d, 0x2f, 0x01, 0x18, 0x10, + 0xc6, 0xc6, 0x10, 0xde, 0x32, 0xd6, 0xfd, 0xd0, 0xed, 0x31, 0x30, 0x2b, 0x2b, 0x01, 0x26, 0x26, + 0x35, 0x35, 0x34, 0x26, 0x23, 0x23, 0x35, 0x33, 0x32, 0x1e, 0x02, 0x15, 0x15, 0x14, 0x16, 0x33, + 0x33, 0x15, 0x23, 0x22, 0x06, 0x15, 0x15, 0x14, 0x0e, 0x02, 0x23, 0x23, 0x35, 0x33, 0x32, 0x36, + 0x35, 0x35, 0x34, 0x36, 0x01, 0x39, 0x36, 0x30, 0x18, 0x20, 0x5c, 0x67, 0x2d, 0x3d, 0x25, 0x10, + 0x1a, 0x1f, 0x37, 0x37, 0x1f, 0x1a, 0x10, 0x25, 0x3d, 0x2d, 0x67, 0x5c, 0x20, 0x18, 0x30, 0x01, + 0x0c, 0x0a, 0x44, 0x40, 0x71, 0x2a, 0x26, 0x60, 0x14, 0x26, 0x39, 0x25, 0x93, 0x2a, 0x2b, 0x60, + 0x2b, 0x29, 0x94, 0x25, 0x39, 0x26, 0x14, 0x60, 0x25, 0x2b, 0x71, 0x40, 0x44, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x15, 0x00, 0xab, 0x01, 0xe7, 0x01, 0x64, 0x00, 0x1f, 0x00, 0x1f, 0x40, 0x0e, + 0x0f, 0x1b, 0x01, 0x1b, 0x0b, 0x20, 0x00, 0x15, 0x10, 0x0a, 0x05, 0x1a, 0x10, 0x83, 0x00, 0x3f, + 0xc4, 0xdd, 0xce, 0x10, 0xd4, 0xc5, 0x01, 0x10, 0xd6, 0xc4, 0x5d, 0x31, 0x30, 0x25, 0x22, 0x2e, + 0x02, 0x23, 0x22, 0x0e, 0x02, 0x07, 0x27, 0x3e, 0x03, 0x33, 0x32, 0x1e, 0x02, 0x33, 0x32, 0x3e, + 0x02, 0x37, 0x17, 0x0e, 0x03, 0x01, 0x59, 0x1b, 0x2f, 0x2c, 0x29, 0x13, 0x08, 0x0f, 0x0e, 0x0c, + 0x06, 0x5b, 0x04, 0x14, 0x21, 0x32, 0x23, 0x1a, 0x2f, 0x2c, 0x28, 0x14, 0x08, 0x0f, 0x0e, 0x0d, + 0x06, 0x5b, 0x05, 0x13, 0x22, 0x31, 0xab, 0x15, 0x1a, 0x15, 0x04, 0x0d, 0x1a, 0x16, 0x19, 0x19, + 0x37, 0x2e, 0x1f, 0x15, 0x1a, 0x15, 0x04, 0x0e, 0x1a, 0x16, 0x19, 0x19, 0x37, 0x2f, 0x1f, 0x00, + 0x00, 0x01, 0x00, 0x1f, 0xff, 0xf4, 0x01, 0xde, 0x02, 0x77, 0x00, 0x2e, 0x00, 0x76, 0xb9, 0x00, + 0x1e, 0xff, 0xc0, 0xb3, 0x0d, 0x00, 0x4d, 0x1d, 0xb8, 0xff, 0xc0, 0xb3, 0x0d, 0x00, 0x4d, 0x1c, + 0xb8, 0xff, 0xc0, 0xb3, 0x0d, 0x00, 0x4d, 0x1b, 0xb8, 0xff, 0xa0, 0x40, 0x2d, 0x0d, 0x00, 0x4d, + 0x20, 0x06, 0x30, 0x2d, 0x29, 0x2b, 0x18, 0x17, 0x17, 0x0f, 0x0e, 0x19, 0x0d, 0x16, 0x63, 0x28, + 0x00, 0x2b, 0x2f, 0x1f, 0x1c, 0x4a, 0x23, 0x09, 0x29, 0x18, 0x73, 0x2a, 0x17, 0x2d, 0x0f, 0x73, + 0x2e, 0x9f, 0x0e, 0x01, 0x0e, 0x07, 0x0a, 0x4a, 0x03, 0x02, 0x00, 0x3f, 0xfd, 0xc6, 0xd6, 0x5d, + 0x32, 0xfd, 0x32, 0xd6, 0x32, 0xed, 0x32, 0x3f, 0xfd, 0xc6, 0x01, 0x10, 0xd4, 0x32, 0x32, 0xfd, + 0x32, 0x32, 0xcc, 0x32, 0x32, 0x11, 0x33, 0x10, 0xcd, 0x32, 0x10, 0xce, 0xce, 0x31, 0x30, 0x00, + 0x2b, 0x2b, 0x2b, 0x2b, 0x13, 0x36, 0x36, 0x33, 0x32, 0x16, 0x17, 0x07, 0x26, 0x26, 0x23, 0x22, + 0x06, 0x07, 0x33, 0x07, 0x23, 0x06, 0x06, 0x15, 0x14, 0x16, 0x17, 0x33, 0x07, 0x23, 0x16, 0x16, + 0x33, 0x32, 0x36, 0x37, 0x17, 0x06, 0x06, 0x23, 0x22, 0x2e, 0x02, 0x27, 0x23, 0x35, 0x33, 0x35, + 0x23, 0x35, 0x64, 0x17, 0x7c, 0x59, 0x1d, 0x40, 0x22, 0x1b, 0x12, 0x2f, 0x1d, 0x33, 0x34, 0x0b, + 0xb6, 0x11, 0xb1, 0x01, 0x01, 0x01, 0x01, 0xa6, 0x11, 0x89, 0x0c, 0x3c, 0x25, 0x1a, 0x3e, 0x1b, + 0x1a, 0x1f, 0x4b, 0x26, 0x2a, 0x4e, 0x3f, 0x2d, 0x0a, 0x41, 0x39, 0x39, 0x01, 0xab, 0x67, 0x65, + 0x08, 0x0e, 0x66, 0x08, 0x09, 0x34, 0x2d, 0x54, 0x08, 0x0f, 0x08, 0x08, 0x10, 0x08, 0x54, 0x35, + 0x2f, 0x0a, 0x0d, 0x63, 0x0f, 0x11, 0x17, 0x31, 0x4f, 0x39, 0x54, 0x3f, 0x54, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x7e, 0xff, 0x67, 0x01, 0x5b, 0x00, 0xa7, 0x00, 0x13, 0x00, 0x18, 0x40, 0x0a, + 0x0e, 0x7a, 0x08, 0x05, 0x00, 0x14, 0x0b, 0x00, 0x13, 0x0f, 0x00, 0x3f, 0xc5, 0xc4, 0x01, 0x10, + 0xd6, 0xce, 0xd6, 0xed, 0x31, 0x30, 0x17, 0x3e, 0x03, 0x37, 0x26, 0x26, 0x35, 0x34, 0x36, 0x33, + 0x32, 0x16, 0x15, 0x14, 0x0e, 0x02, 0x07, 0x7e, 0x12, 0x25, 0x21, 0x1a, 0x08, 0x26, 0x2a, 0x33, + 0x27, 0x2a, 0x2f, 0x16, 0x31, 0x4e, 0x38, 0x49, 0x04, 0x06, 0x0c, 0x16, 0x13, 0x04, 0x34, 0x20, + 0x27, 0x32, 0x38, 0x30, 0x23, 0x46, 0x3c, 0x2c, 0x07, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, + 0xff, 0x56, 0x01, 0xec, 0x02, 0xb5, 0x00, 0x29, 0x00, 0x33, 0x40, 0x1a, 0x28, 0x1c, 0x2b, 0x26, + 0x29, 0x51, 0x13, 0x10, 0x52, 0x11, 0x08, 0x2a, 0x10, 0x28, 0x55, 0x12, 0x27, 0x20, 0x57, 0x19, + 0x01, 0x09, 0x0c, 0x55, 0x05, 0x0f, 0x00, 0x3f, 0xfd, 0xc6, 0x3f, 0xfd, 0xd6, 0x32, 0xed, 0x32, + 0x01, 0x10, 0xc6, 0xd6, 0xfd, 0x32, 0xed, 0x32, 0x10, 0xc6, 0xce, 0x31, 0x30, 0x25, 0x14, 0x0e, + 0x02, 0x23, 0x22, 0x26, 0x27, 0x37, 0x16, 0x16, 0x33, 0x32, 0x36, 0x35, 0x11, 0x23, 0x35, 0x33, + 0x35, 0x34, 0x3e, 0x02, 0x33, 0x32, 0x16, 0x17, 0x07, 0x26, 0x26, 0x23, 0x22, 0x0e, 0x02, 0x15, + 0x15, 0x33, 0x15, 0x23, 0x01, 0x07, 0x1c, 0x32, 0x43, 0x27, 0x1d, 0x22, 0x11, 0x1c, 0x08, 0x13, + 0x14, 0x1f, 0x22, 0x67, 0x67, 0x21, 0x38, 0x48, 0x26, 0x27, 0x52, 0x21, 0x15, 0x17, 0x45, 0x1f, + 0x11, 0x1f, 0x17, 0x0e, 0xc1, 0xc1, 0x1f, 0x39, 0x4d, 0x2f, 0x14, 0x08, 0x05, 0x66, 0x02, 0x05, + 0x25, 0x32, 0x01, 0x57, 0x66, 0x1b, 0x39, 0x4b, 0x2d, 0x13, 0x0e, 0x10, 0x64, 0x08, 0x11, 0x06, + 0x14, 0x25, 0x1e, 0x19, 0x66, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0c, 0xff, 0x70, 0x01, 0xc3, + 0x00, 0x83, 0x00, 0x13, 0x00, 0x27, 0x00, 0x22, 0x40, 0x0f, 0x22, 0x19, 0x1c, 0x27, 0x0e, 0x05, + 0x08, 0x00, 0x28, 0x14, 0x27, 0x0f, 0x00, 0x13, 0x0f, 0x00, 0x3f, 0xc5, 0x3f, 0xc5, 0x01, 0x10, + 0xd6, 0xd6, 0xcd, 0xdd, 0xc4, 0xd6, 0xcd, 0xcd, 0x31, 0x30, 0x17, 0x3e, 0x03, 0x37, 0x26, 0x26, + 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x0e, 0x02, 0x07, 0x37, 0x3e, 0x03, 0x37, 0x26, + 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x0e, 0x02, 0x07, 0x0c, 0x13, 0x25, 0x1f, + 0x19, 0x07, 0x21, 0x21, 0x2e, 0x1b, 0x27, 0x26, 0x18, 0x2e, 0x46, 0x2e, 0xda, 0x13, 0x25, 0x20, + 0x19, 0x07, 0x22, 0x20, 0x2e, 0x1b, 0x27, 0x26, 0x18, 0x2e, 0x46, 0x2e, 0x4d, 0x04, 0x08, 0x0d, + 0x17, 0x12, 0x03, 0x2b, 0x1a, 0x23, 0x23, 0x33, 0x24, 0x1d, 0x40, 0x36, 0x26, 0x03, 0x43, 0x04, + 0x08, 0x0d, 0x17, 0x12, 0x03, 0x2b, 0x1a, 0x23, 0x23, 0x33, 0x24, 0x1d, 0x40, 0x36, 0x26, 0x03, + 0x00, 0x03, 0x00, 0x1c, 0xff, 0xf4, 0x01, 0xdb, 0x00, 0x77, 0x00, 0x0b, 0x00, 0x17, 0x00, 0x23, + 0x00, 0x49, 0x40, 0x2f, 0x09, 0x40, 0x0e, 0x00, 0x4d, 0x4f, 0x09, 0x01, 0x09, 0x79, 0x0f, 0x03, + 0x1f, 0x03, 0x02, 0x03, 0x4f, 0x15, 0x5f, 0x15, 0x02, 0x15, 0x79, 0x0f, 0x0f, 0x01, 0x0f, 0x4f, + 0x21, 0x5f, 0x21, 0x02, 0x21, 0x79, 0x1b, 0x24, 0x06, 0x12, 0x12, 0x1e, 0x74, 0x18, 0x09, 0x0c, + 0x09, 0x00, 0x09, 0x00, 0x3f, 0x3f, 0x3f, 0xed, 0x32, 0x11, 0x33, 0x01, 0x10, 0xd6, 0xfd, 0x5d, + 0xd6, 0x5d, 0xfd, 0x5d, 0xd6, 0x5d, 0xed, 0x5d, 0x2b, 0x31, 0x30, 0x05, 0x22, 0x26, 0x35, 0x34, + 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, + 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x01, + 0xa1, 0x1c, 0x1e, 0x1e, 0x1c, 0x1c, 0x1e, 0x1d, 0xc2, 0x1d, 0x1d, 0x1d, 0x1d, 0x1b, 0x1f, 0x1e, + 0xc2, 0x1d, 0x1d, 0x1d, 0x1d, 0x1b, 0x1f, 0x1e, 0x0c, 0x29, 0x19, 0x19, 0x28, 0x29, 0x18, 0x19, + 0x29, 0x29, 0x19, 0x19, 0x28, 0x29, 0x18, 0x19, 0x29, 0x29, 0x19, 0x19, 0x28, 0x29, 0x18, 0x19, + 0x29, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x3e, 0xff, 0x7f, 0x01, 0xb8, 0x02, 0x6b, 0x00, 0x11, + 0x00, 0x3a, 0x40, 0x20, 0x10, 0x0f, 0x00, 0x52, 0x0c, 0x0b, 0x40, 0x09, 0x50, 0x09, 0x80, 0x09, + 0x90, 0x09, 0x04, 0x09, 0x09, 0x13, 0x12, 0x00, 0x09, 0x55, 0x0f, 0x0c, 0x0c, 0x0d, 0x04, 0x13, + 0x0d, 0x02, 0x05, 0x88, 0x00, 0x3f, 0x3f, 0x10, 0xce, 0x11, 0x39, 0x2f, 0xc0, 0xfd, 0xc0, 0x01, + 0x11, 0x12, 0x39, 0x2f, 0x5d, 0xcd, 0x33, 0xfd, 0x32, 0xcd, 0x31, 0x30, 0x01, 0x15, 0x14, 0x06, + 0x07, 0x23, 0x26, 0x26, 0x35, 0x35, 0x23, 0x35, 0x33, 0x35, 0x33, 0x15, 0x33, 0x15, 0x01, 0x31, + 0x08, 0x09, 0x4b, 0x08, 0x09, 0x86, 0x86, 0x6d, 0x87, 0x01, 0x50, 0xcc, 0x48, 0x7b, 0x42, 0x41, + 0x7c, 0x48, 0xcc, 0x66, 0xb5, 0xb5, 0x66, 0x00, 0x00, 0x01, 0x00, 0x3a, 0xff, 0x7f, 0x01, 0xb5, + 0x02, 0x6b, 0x00, 0x17, 0x00, 0x6c, 0xb9, 0x00, 0x17, 0xff, 0xc0, 0xb3, 0x1a, 0x00, 0x4d, 0x16, + 0xb8, 0xff, 0xc0, 0xb3, 0x1a, 0x00, 0x4d, 0x13, 0xb8, 0xff, 0xc0, 0xb3, 0x1a, 0x00, 0x4d, 0x12, + 0xb8, 0xff, 0xc0, 0x40, 0x2c, 0x1a, 0x00, 0x4d, 0x19, 0x13, 0x17, 0x15, 0x11, 0x00, 0x52, 0x0e, + 0x0b, 0x0a, 0x07, 0x0c, 0x30, 0x08, 0x40, 0x08, 0x50, 0x08, 0x03, 0x08, 0x18, 0x00, 0x07, 0x72, + 0x15, 0x0a, 0x14, 0x0b, 0x72, 0x11, 0x5f, 0x0e, 0x6f, 0x0e, 0x02, 0x0e, 0x7b, 0x0f, 0x02, 0x03, + 0x88, 0x00, 0x3f, 0x3f, 0xfd, 0x5d, 0x32, 0xfd, 0x32, 0xd6, 0x32, 0xed, 0x32, 0x01, 0x10, 0xd6, + 0x5d, 0x32, 0xd5, 0x32, 0x32, 0x32, 0xfd, 0x32, 0x32, 0xd5, 0x32, 0xc6, 0x31, 0x30, 0x2b, 0x2b, + 0x2b, 0x2b, 0x25, 0x06, 0x06, 0x07, 0x23, 0x26, 0x26, 0x27, 0x23, 0x35, 0x33, 0x35, 0x23, 0x35, + 0x33, 0x35, 0x33, 0x15, 0x33, 0x15, 0x23, 0x15, 0x33, 0x15, 0x01, 0x2e, 0x02, 0x08, 0x08, 0x4a, + 0x08, 0x09, 0x01, 0x86, 0x86, 0x86, 0x86, 0x6e, 0x87, 0x87, 0x87, 0x62, 0x3d, 0x6c, 0x3a, 0x39, + 0x6d, 0x3d, 0x67, 0x87, 0x66, 0xb5, 0xb5, 0x66, 0x87, 0x67, 0x00, 0x00, 0x00, 0x01, 0x00, 0x70, + 0x01, 0xfe, 0x01, 0x86, 0x02, 0xb3, 0x00, 0x05, 0x00, 0x40, 0x40, 0x22, 0x02, 0x40, 0x0d, 0x00, + 0x4d, 0x02, 0x20, 0x0c, 0x00, 0x4d, 0x2b, 0x02, 0x01, 0x04, 0x03, 0x06, 0x02, 0x01, 0x00, 0x05, + 0x07, 0x02, 0x05, 0x02, 0x05, 0x06, 0x07, 0x02, 0x72, 0x05, 0x03, 0x03, 0x01, 0x7e, 0x00, 0x3f, + 0x33, 0x10, 0xdd, 0xed, 0x01, 0x11, 0x12, 0x39, 0x39, 0x3d, 0x2f, 0x2f, 0x11, 0x12, 0x39, 0x39, + 0x11, 0x12, 0x39, 0x39, 0x31, 0x30, 0x00, 0x5d, 0x2b, 0x2b, 0x01, 0x07, 0x27, 0x07, 0x27, 0x37, + 0x01, 0x86, 0x31, 0x59, 0x59, 0x33, 0x8c, 0x02, 0x39, 0x3b, 0x45, 0x45, 0x3b, 0x7a, 0x00, 0x00, + 0x00, 0x07, 0x00, 0x09, 0xff, 0xf3, 0x01, 0xeb, 0x02, 0x79, 0x00, 0x0b, 0x00, 0x17, 0x00, 0x23, + 0x00, 0x27, 0x00, 0x33, 0x00, 0x3f, 0x00, 0x4b, 0x01, 0x15, 0xb9, 0x00, 0x3e, 0xff, 0xc0, 0x40, + 0x13, 0x18, 0x00, 0x4d, 0x3c, 0x40, 0x18, 0x00, 0x4d, 0x38, 0x20, 0x18, 0x00, 0x4d, 0x38, 0x58, + 0x16, 0x00, 0x4d, 0x36, 0xb8, 0xff, 0xe0, 0xb3, 0x18, 0x00, 0x4d, 0x36, 0xb8, 0xff, 0xc0, 0xb3, + 0x16, 0x00, 0x4d, 0x22, 0xb8, 0xff, 0xc0, 0x40, 0x17, 0x18, 0x00, 0x4d, 0xc4, 0x22, 0x01, 0x20, + 0x40, 0x18, 0x00, 0x4d, 0xcc, 0x20, 0x01, 0x1c, 0x20, 0x18, 0x00, 0x4d, 0xcb, 0x1c, 0x01, 0x1a, + 0xb8, 0xff, 0xc0, 0xb6, 0x18, 0x00, 0x4d, 0xc4, 0x1a, 0x01, 0x0a, 0xb8, 0xff, 0xc0, 0x40, 0x17, + 0x18, 0x00, 0x4d, 0xc4, 0x0a, 0x01, 0x08, 0x40, 0x18, 0x00, 0x4d, 0xcb, 0x08, 0x01, 0x04, 0x40, + 0x18, 0x00, 0x4d, 0xcb, 0x04, 0x01, 0x02, 0xb8, 0xff, 0xc0, 0xb6, 0x18, 0x00, 0x4d, 0xc4, 0x02, + 0x01, 0x24, 0xb8, 0xff, 0xe0, 0x40, 0x4b, 0x0e, 0x10, 0x00, 0x4c, 0x0f, 0x00, 0x1f, 0x00, 0x02, + 0x00, 0x7f, 0x12, 0x0c, 0x7f, 0x06, 0x18, 0x7f, 0x1f, 0x2e, 0x01, 0x2e, 0x28, 0x7f, 0x1e, 0x26, + 0x27, 0x4d, 0x10, 0x3a, 0x01, 0x3a, 0x7f, 0x40, 0x46, 0x7f, 0x34, 0x25, 0x4c, 0x2b, 0x80, 0x27, + 0x26, 0x37, 0x1b, 0x1b, 0x21, 0x37, 0x3d, 0x80, 0x49, 0x0f, 0x80, 0x03, 0x49, 0x37, 0x25, 0x24, + 0x03, 0x25, 0x03, 0x25, 0x03, 0x09, 0x43, 0x80, 0x37, 0x03, 0x31, 0x80, 0x21, 0x07, 0x15, 0x80, + 0x09, 0x07, 0x00, 0x3f, 0xed, 0x3f, 0xed, 0x3f, 0xed, 0x12, 0x39, 0x39, 0x2f, 0x2f, 0x11, 0x39, + 0x11, 0x12, 0x39, 0x10, 0xed, 0x10, 0xed, 0x11, 0x12, 0x39, 0x2f, 0x12, 0x39, 0x39, 0xed, 0x01, + 0x10, 0xd6, 0xd6, 0xfd, 0xd6, 0xed, 0x5d, 0x10, 0xd6, 0xc5, 0xd6, 0xfd, 0xd6, 0x5d, 0xfd, 0xd6, + 0xfd, 0xd6, 0xed, 0x5d, 0x31, 0x30, 0x00, 0x2b, 0x01, 0x5d, 0x2b, 0x5d, 0x2b, 0x5d, 0x2b, 0x5d, + 0x2b, 0x5d, 0x2b, 0x5d, 0x2b, 0x5d, 0x2b, 0x5d, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x37, + 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x37, 0x34, 0x26, 0x23, 0x22, + 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, + 0x23, 0x22, 0x26, 0x25, 0x27, 0x25, 0x17, 0x03, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, + 0x33, 0x32, 0x36, 0x01, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x37, + 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x4f, 0x30, 0x2e, 0x30, 0x30, + 0x30, 0x30, 0x2e, 0x30, 0x7b, 0x0e, 0x0f, 0x0e, 0x0d, 0x0d, 0x0e, 0x0f, 0x0e, 0x5f, 0x30, 0x2f, + 0x30, 0x30, 0x30, 0x30, 0x2f, 0x30, 0xfe, 0xf9, 0x19, 0x01, 0xc9, 0x19, 0x46, 0x0e, 0x0f, 0x0f, + 0x0d, 0x0d, 0x0f, 0x0f, 0x0e, 0xfe, 0x68, 0x30, 0x2e, 0x30, 0x30, 0x30, 0x30, 0x2e, 0x30, 0x7b, + 0x0e, 0x0f, 0x0e, 0x0e, 0x0e, 0x0e, 0x0f, 0x0e, 0x7c, 0x43, 0x47, 0x47, 0x43, 0x43, 0x46, 0x46, + 0x43, 0x24, 0x20, 0x20, 0x24, 0x24, 0x20, 0x20, 0x24, 0x43, 0x47, 0x47, 0x43, 0x43, 0x46, 0x46, + 0xaf, 0x2c, 0xe5, 0x2d, 0xfe, 0xb0, 0x24, 0x20, 0x20, 0x24, 0x24, 0x20, 0x20, 0x01, 0x98, 0x43, + 0x46, 0x46, 0x43, 0x44, 0x46, 0x46, 0x44, 0x24, 0x1f, 0x1f, 0x24, 0x25, 0x1f, 0x1f, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x28, 0xff, 0xf3, 0x01, 0xcc, 0x03, 0x3e, 0x02, 0x26, 0x00, 0x36, 0x00, 0x00, + 0x01, 0x07, 0x01, 0x5f, 0x00, 0x00, 0x00, 0x8b, 0x00, 0x10, 0x40, 0x0b, 0x01, 0x01, 0x2f, 0x33, + 0x2b, 0x24, 0x50, 0x01, 0x11, 0x34, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0x00, 0x00, 0x01, 0x00, 0x84, + 0x00, 0x27, 0x01, 0x7c, 0x01, 0xd4, 0x00, 0x05, 0x00, 0x38, 0xb9, 0x00, 0x00, 0xff, 0xc0, 0xb3, + 0x10, 0x00, 0x4d, 0x00, 0xb8, 0xff, 0xc0, 0x40, 0x13, 0x0a, 0x00, 0x4d, 0x05, 0x01, 0x00, 0x03, + 0x06, 0x05, 0x04, 0x00, 0x01, 0x03, 0x03, 0x02, 0x04, 0x0b, 0x02, 0x07, 0x00, 0x3f, 0x3f, 0x12, + 0x39, 0x3d, 0x2f, 0x39, 0x39, 0x12, 0x39, 0x01, 0x18, 0x10, 0xde, 0xdd, 0xdd, 0xc0, 0x31, 0x30, + 0x2b, 0x2b, 0x25, 0x17, 0x07, 0x27, 0x37, 0x17, 0x01, 0x21, 0x5b, 0x65, 0x93, 0x93, 0x65, 0xfe, + 0xa7, 0x30, 0xd7, 0xd6, 0x2f, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x12, 0xff, 0xfb, 0x01, 0xeb, + 0x02, 0x71, 0x00, 0x16, 0x00, 0x25, 0x00, 0x6e, 0x40, 0x4b, 0x12, 0x40, 0x0c, 0x00, 0x4d, 0x10, + 0x40, 0x0c, 0x00, 0x4d, 0x0f, 0x10, 0x19, 0x44, 0x2f, 0x14, 0x3f, 0x14, 0x02, 0x14, 0x44, 0x0f, + 0x12, 0x1f, 0x12, 0x2f, 0x12, 0x03, 0x12, 0x3f, 0x15, 0x4f, 0x15, 0x5f, 0x15, 0x03, 0x15, 0x3f, + 0x0d, 0x4f, 0x0d, 0x5f, 0x0d, 0x03, 0x0d, 0x27, 0x20, 0x21, 0x01, 0x21, 0x53, 0x06, 0x26, 0x14, + 0x48, 0x16, 0x08, 0x13, 0x48, 0x4f, 0x11, 0x01, 0x11, 0x0f, 0x48, 0x0d, 0x02, 0x1c, 0x4a, 0x09, + 0x02, 0x17, 0x4a, 0x03, 0x09, 0x00, 0x3f, 0xed, 0x3f, 0xed, 0x3f, 0xfd, 0xd6, 0x5d, 0xed, 0x3f, + 0xed, 0x01, 0x10, 0xd6, 0xed, 0x5d, 0x10, 0xce, 0x5d, 0xde, 0x5d, 0xce, 0x5d, 0xfd, 0x5d, 0xed, + 0xd0, 0xc0, 0x31, 0x30, 0x2b, 0x2b, 0x21, 0x06, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, + 0x32, 0x16, 0x17, 0x33, 0x15, 0x23, 0x15, 0x33, 0x15, 0x23, 0x15, 0x33, 0x15, 0x25, 0x32, 0x37, + 0x11, 0x26, 0x23, 0x22, 0x0e, 0x02, 0x15, 0x14, 0x1e, 0x02, 0x01, 0x13, 0x0c, 0x19, 0x0e, 0x65, + 0x69, 0x6b, 0x62, 0x0f, 0x1c, 0x0e, 0xc6, 0x6f, 0x58, 0x58, 0x7c, 0xfe, 0xf4, 0x11, 0x0f, 0x0f, + 0x11, 0x1c, 0x23, 0x13, 0x07, 0x06, 0x14, 0x22, 0x03, 0x02, 0x95, 0xa6, 0xa5, 0x96, 0x04, 0x02, + 0x66, 0x8a, 0x66, 0xaf, 0x66, 0x66, 0x05, 0x01, 0x96, 0x05, 0x1d, 0x36, 0x4d, 0x30, 0x30, 0x4d, + 0x36, 0x1d, 0x00, 0x00, 0x00, 0x01, 0x00, 0x90, 0x01, 0x8f, 0x01, 0x6d, 0x02, 0xcf, 0x00, 0x13, + 0x00, 0x16, 0x40, 0x09, 0x05, 0x00, 0x08, 0x7a, 0x0e, 0x14, 0x0b, 0x13, 0x8a, 0x00, 0x3f, 0xc4, + 0x01, 0x10, 0xd6, 0xed, 0xd4, 0xce, 0x31, 0x30, 0x01, 0x0e, 0x03, 0x07, 0x16, 0x16, 0x15, 0x14, + 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x3e, 0x02, 0x37, 0x01, 0x6d, 0x12, 0x24, 0x21, 0x1b, 0x08, + 0x26, 0x2a, 0x33, 0x27, 0x2a, 0x2f, 0x16, 0x31, 0x4e, 0x38, 0x02, 0x7f, 0x03, 0x07, 0x0c, 0x16, + 0x13, 0x03, 0x35, 0x20, 0x27, 0x32, 0x38, 0x30, 0x22, 0x47, 0x3c, 0x2c, 0x07, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x90, 0x01, 0x9f, 0x01, 0x6d, 0x02, 0xdf, 0x00, 0x13, 0x00, 0x20, 0x40, 0x12, + 0x07, 0x40, 0x0b, 0x00, 0x4d, 0x07, 0x40, 0x09, 0x00, 0x4d, 0x0e, 0x7a, 0x08, 0x00, 0x14, 0x0b, + 0x13, 0xa3, 0x00, 0x3f, 0xc4, 0x01, 0x10, 0xd6, 0xd6, 0xed, 0x31, 0x30, 0x2b, 0x2b, 0x13, 0x3e, + 0x03, 0x37, 0x26, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x0e, 0x02, 0x07, 0x90, + 0x12, 0x25, 0x21, 0x1a, 0x08, 0x26, 0x2a, 0x33, 0x27, 0x2a, 0x2f, 0x16, 0x31, 0x4e, 0x38, 0x01, + 0xef, 0x04, 0x06, 0x0c, 0x16, 0x13, 0x04, 0x34, 0x20, 0x27, 0x32, 0x38, 0x30, 0x23, 0x46, 0x3c, + 0x2c, 0x07, 0x00, 0x00, 0x00, 0x02, 0x00, 0x29, 0x01, 0x9d, 0x01, 0xe0, 0x02, 0xb1, 0x00, 0x13, + 0x00, 0x27, 0x00, 0x26, 0x40, 0x12, 0x05, 0x00, 0x08, 0x0f, 0x0e, 0x01, 0x0e, 0x19, 0x14, 0x1c, + 0x22, 0x28, 0x27, 0x1f, 0xa3, 0x13, 0x0b, 0xa3, 0x00, 0x3f, 0xc4, 0x3f, 0xc4, 0x01, 0x10, 0xd6, + 0xdd, 0xd6, 0xce, 0xd6, 0x5d, 0xdd, 0xd6, 0xce, 0x31, 0x30, 0x01, 0x0e, 0x03, 0x07, 0x16, 0x16, + 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x3e, 0x02, 0x37, 0x07, 0x0e, 0x03, 0x07, 0x16, + 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x3e, 0x02, 0x37, 0x01, 0xe0, 0x13, 0x24, + 0x20, 0x19, 0x07, 0x21, 0x21, 0x2e, 0x1b, 0x27, 0x26, 0x18, 0x2e, 0x46, 0x2e, 0xda, 0x13, 0x25, + 0x20, 0x19, 0x07, 0x22, 0x20, 0x2e, 0x1b, 0x27, 0x26, 0x18, 0x2e, 0x46, 0x2e, 0x02, 0x6e, 0x04, + 0x08, 0x0d, 0x17, 0x13, 0x02, 0x2b, 0x1a, 0x23, 0x24, 0x34, 0x24, 0x1d, 0x40, 0x36, 0x26, 0x03, + 0x43, 0x04, 0x08, 0x0d, 0x17, 0x13, 0x02, 0x2b, 0x1a, 0x23, 0x24, 0x34, 0x24, 0x1d, 0x40, 0x36, + 0x26, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1d, 0x01, 0xbf, 0x01, 0xd5, 0x02, 0xd2, 0x00, 0x13, + 0x00, 0x27, 0x00, 0x2e, 0x40, 0x19, 0x22, 0x95, 0x19, 0x1c, 0x20, 0x14, 0x30, 0x14, 0x02, 0x14, + 0x0e, 0x95, 0x05, 0x08, 0x90, 0x00, 0x01, 0x00, 0x28, 0x27, 0x1f, 0x8a, 0x13, 0x0b, 0x8a, 0x00, + 0x3f, 0xc4, 0x3f, 0xc4, 0x01, 0x10, 0xd6, 0x5d, 0xd6, 0xcd, 0xfd, 0xde, 0x5d, 0xd6, 0xcd, 0xed, + 0x31, 0x30, 0x13, 0x3e, 0x03, 0x37, 0x26, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, + 0x0e, 0x02, 0x07, 0x37, 0x3e, 0x03, 0x37, 0x26, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, + 0x14, 0x0e, 0x02, 0x07, 0x1d, 0x13, 0x25, 0x20, 0x19, 0x07, 0x22, 0x20, 0x2e, 0x1b, 0x27, 0x26, + 0x18, 0x2e, 0x46, 0x2e, 0xda, 0x13, 0x25, 0x20, 0x19, 0x07, 0x22, 0x20, 0x2d, 0x1c, 0x27, 0x26, + 0x18, 0x2f, 0x45, 0x2e, 0x02, 0x01, 0x04, 0x08, 0x0d, 0x17, 0x13, 0x02, 0x2b, 0x1a, 0x23, 0x24, + 0x34, 0x24, 0x1d, 0x40, 0x36, 0x25, 0x03, 0x42, 0x04, 0x08, 0x0d, 0x17, 0x13, 0x02, 0x2b, 0x1a, + 0x23, 0x24, 0x34, 0x24, 0x1d, 0x40, 0x36, 0x25, 0x03, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x72, + 0x00, 0xab, 0x01, 0x82, 0x01, 0xc9, 0x00, 0x13, 0x00, 0x15, 0x40, 0x09, 0x0f, 0x00, 0x01, 0x00, + 0x0a, 0x14, 0x05, 0x0f, 0x0b, 0x00, 0x3f, 0xc5, 0x01, 0x10, 0xd6, 0xc5, 0x5d, 0x31, 0x30, 0x01, + 0x14, 0x0e, 0x02, 0x23, 0x22, 0x2e, 0x02, 0x35, 0x34, 0x3e, 0x02, 0x33, 0x32, 0x1e, 0x02, 0x01, + 0x82, 0x13, 0x23, 0x33, 0x1f, 0x20, 0x32, 0x23, 0x13, 0x13, 0x23, 0x32, 0x20, 0x1f, 0x33, 0x23, + 0x13, 0x01, 0x3a, 0x1d, 0x33, 0x28, 0x17, 0x17, 0x28, 0x33, 0x1d, 0x1c, 0x34, 0x28, 0x17, 0x17, + 0x28, 0x34, 0x00, 0x00, 0x00, 0x01, 0x00, 0x36, 0x00, 0xdd, 0x01, 0xbf, 0x01, 0x39, 0x00, 0x03, + 0x00, 0x10, 0xb5, 0x01, 0x03, 0x04, 0x03, 0x00, 0x94, 0x00, 0x3f, 0xc5, 0x01, 0x10, 0xd6, 0xcd, + 0x31, 0x30, 0x13, 0x21, 0x15, 0x21, 0x36, 0x01, 0x89, 0xfe, 0x77, 0x01, 0x39, 0x5c, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0xdd, 0x01, 0xf4, 0x01, 0x39, 0x00, 0x03, 0x00, 0x12, 0xb6, 0x02, + 0x05, 0x03, 0x04, 0x02, 0x00, 0x94, 0x00, 0x3f, 0xc5, 0x01, 0x10, 0xc0, 0x10, 0xc0, 0x31, 0x30, + 0x11, 0x21, 0x15, 0x21, 0x01, 0xf4, 0xfe, 0x0c, 0x01, 0x39, 0x5c, 0x00, 0x00, 0x01, 0x00, 0x5a, + 0x02, 0x17, 0x01, 0x9e, 0x02, 0xa0, 0x00, 0x1b, 0x00, 0x9d, 0xb9, 0x00, 0x11, 0xff, 0xc0, 0xb3, + 0x0b, 0x00, 0x4d, 0x10, 0xb8, 0xff, 0xe0, 0xb3, 0x0c, 0x00, 0x4d, 0x10, 0xb8, 0xff, 0xc0, 0xb3, + 0x0b, 0x00, 0x4d, 0x10, 0xb8, 0xff, 0xe0, 0xb4, 0x09, 0x0a, 0x00, 0x4c, 0x0f, 0xb8, 0xff, 0xe0, + 0xb4, 0x09, 0x0a, 0x00, 0x4c, 0x0e, 0xb8, 0xff, 0xc0, 0xb3, 0x0c, 0x00, 0x4d, 0x0e, 0xb8, 0xff, + 0xa0, 0xb3, 0x0b, 0x00, 0x4d, 0x0e, 0xb8, 0xff, 0xc0, 0xb4, 0x09, 0x0a, 0x00, 0x4c, 0x0d, 0xb8, + 0xff, 0xc0, 0xb3, 0x0a, 0x00, 0x4d, 0x0d, 0xb8, 0xff, 0xe0, 0x40, 0x25, 0x09, 0x00, 0x4d, 0x0a, + 0x18, 0x13, 0x05, 0x0d, 0x13, 0x05, 0x1b, 0x1b, 0x05, 0x13, 0x0d, 0x04, 0x1c, 0x00, 0x1d, 0x00, + 0x0e, 0x10, 0x0e, 0x30, 0x0e, 0x03, 0x0e, 0x1c, 0x1b, 0x82, 0x05, 0x18, 0x13, 0x0d, 0x0a, 0x13, + 0x82, 0x00, 0x3f, 0xd5, 0xc6, 0x10, 0xdc, 0xc5, 0x3f, 0x01, 0x10, 0xc6, 0x5d, 0x10, 0xce, 0x12, + 0x17, 0x39, 0x2f, 0x2f, 0x2f, 0x2f, 0x11, 0x12, 0x39, 0x39, 0x31, 0x30, 0x00, 0x2b, 0x2b, 0x2b, + 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x01, 0x0e, 0x03, 0x23, 0x22, 0x2e, 0x02, 0x23, 0x22, + 0x06, 0x07, 0x27, 0x3e, 0x03, 0x33, 0x32, 0x1e, 0x02, 0x33, 0x32, 0x36, 0x37, 0x01, 0x9e, 0x05, + 0x13, 0x1b, 0x22, 0x14, 0x10, 0x1b, 0x1b, 0x1b, 0x0f, 0x11, 0x17, 0x08, 0x3b, 0x05, 0x13, 0x1b, + 0x22, 0x15, 0x10, 0x1b, 0x1b, 0x1a, 0x0f, 0x11, 0x18, 0x07, 0x02, 0x79, 0x0e, 0x1f, 0x1c, 0x12, + 0x0a, 0x0b, 0x0a, 0x17, 0x0f, 0x27, 0x0e, 0x20, 0x1c, 0x12, 0x0a, 0x0b, 0x0a, 0x16, 0x0f, 0x00, + 0x00, 0x02, 0x00, 0x12, 0x01, 0x65, 0x01, 0xdc, 0x02, 0x6b, 0x00, 0x07, 0x00, 0x24, 0x00, 0x8e, + 0x40, 0x56, 0x10, 0x0e, 0x01, 0x0c, 0x24, 0x01, 0x23, 0x24, 0x1d, 0x08, 0x09, 0x0f, 0x0f, 0x16, + 0x01, 0x16, 0x16, 0x1d, 0x0f, 0x0e, 0x01, 0x0e, 0x82, 0x0f, 0x0f, 0x01, 0x0f, 0x0f, 0x01, 0x01, + 0x01, 0x82, 0x02, 0x82, 0x00, 0x06, 0x01, 0x06, 0x82, 0x04, 0x25, 0x1e, 0x82, 0x2f, 0x1d, 0x01, + 0x1f, 0x1d, 0x01, 0x00, 0x1d, 0x01, 0x2f, 0x1d, 0x01, 0x1d, 0x23, 0x24, 0x24, 0x18, 0x10, 0x1d, + 0x01, 0x1d, 0x83, 0x18, 0x02, 0x09, 0x14, 0x08, 0x08, 0x0e, 0x14, 0x02, 0x0e, 0x83, 0x10, 0x03, + 0x01, 0x03, 0x83, 0x06, 0x02, 0x81, 0x00, 0x02, 0x00, 0x3f, 0xed, 0x32, 0x3f, 0x5d, 0x3f, 0x3f, + 0x12, 0x39, 0x2f, 0x12, 0x39, 0x3f, 0x3f, 0x5d, 0x12, 0x39, 0x2f, 0x39, 0x01, 0x2f, 0x5d, 0x71, + 0x71, 0x72, 0xed, 0x10, 0xde, 0xee, 0x71, 0xfd, 0xfd, 0x71, 0xd6, 0x71, 0xed, 0x5d, 0x12, 0x39, + 0x3d, 0x2f, 0x5d, 0x12, 0x39, 0x39, 0x12, 0x39, 0x39, 0x5d, 0x31, 0x30, 0x00, 0x5d, 0x13, 0x15, + 0x23, 0x15, 0x23, 0x35, 0x23, 0x35, 0x05, 0x27, 0x0e, 0x03, 0x15, 0x23, 0x3e, 0x03, 0x37, 0x33, + 0x17, 0x37, 0x33, 0x1e, 0x03, 0x17, 0x23, 0x34, 0x2e, 0x02, 0x27, 0x07, 0xcc, 0x40, 0x3a, 0x40, + 0x01, 0x34, 0x27, 0x02, 0x02, 0x01, 0x01, 0x3a, 0x03, 0x06, 0x07, 0x07, 0x05, 0x36, 0x2c, 0x2f, + 0x36, 0x05, 0x07, 0x06, 0x05, 0x03, 0x3a, 0x01, 0x01, 0x02, 0x01, 0x2a, 0x02, 0x6b, 0x32, 0xd4, + 0xd4, 0x32, 0xc1, 0x74, 0x14, 0x3c, 0x39, 0x2c, 0x04, 0x32, 0x4a, 0x3c, 0x33, 0x1b, 0x88, 0x88, + 0x1b, 0x34, 0x3c, 0x4a, 0x31, 0x04, 0x2c, 0x39, 0x3c, 0x14, 0x74, 0x00, 0xff, 0xff, 0x00, 0x36, + 0xff, 0xf5, 0x01, 0xba, 0x02, 0xb3, 0x02, 0x26, 0x00, 0x56, 0x00, 0x00, 0x01, 0x06, 0x01, 0x5f, + 0x00, 0x00, 0x00, 0x10, 0x40, 0x0b, 0x01, 0x03, 0x32, 0x36, 0x2e, 0x25, 0x50, 0x01, 0x11, 0x37, + 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0x01, 0x00, 0x9b, 0x00, 0x27, 0x01, 0x93, 0x01, 0xd4, 0x00, 0x05, + 0x00, 0x5c, 0xb5, 0x04, 0x28, 0x10, 0x00, 0x4d, 0x03, 0xb8, 0xff, 0xf8, 0xb3, 0x0b, 0x00, 0x4d, + 0x04, 0xb8, 0xff, 0xe0, 0xb3, 0x09, 0x00, 0x4d, 0x03, 0xb8, 0xff, 0xd8, 0x40, 0x1e, 0x0b, 0x00, + 0x4d, 0x00, 0x20, 0x0f, 0x00, 0x4d, 0x00, 0x04, 0x05, 0x02, 0x07, 0x01, 0x03, 0x06, 0x07, 0x04, + 0x03, 0x02, 0x00, 0x05, 0x01, 0x03, 0x05, 0x03, 0x05, 0x07, 0x01, 0x7e, 0x00, 0x3f, 0x12, 0x39, + 0x39, 0x3d, 0x2f, 0x18, 0x2f, 0x11, 0x12, 0x39, 0x39, 0x11, 0x39, 0x01, 0x11, 0x12, 0x39, 0x39, + 0x10, 0xd6, 0xdd, 0xdd, 0xc0, 0x31, 0x30, 0x00, 0x2b, 0x2b, 0x2b, 0x01, 0x2b, 0x2b, 0x13, 0x37, + 0x17, 0x07, 0x27, 0x37, 0x9b, 0x65, 0x93, 0x93, 0x65, 0x5b, 0x01, 0xa5, 0x2f, 0xd6, 0xd7, 0x30, + 0xa7, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x16, 0xff, 0xf5, 0x01, 0xe8, 0x01, 0xe2, 0x00, 0x26, + 0x00, 0x32, 0x00, 0x3d, 0x00, 0x70, 0xb9, 0x00, 0x0f, 0xff, 0xc0, 0xb3, 0x09, 0x00, 0x4d, 0x0e, + 0xb8, 0xff, 0xc0, 0x40, 0x3b, 0x09, 0x00, 0x4d, 0x35, 0x40, 0x0d, 0x00, 0x4d, 0x20, 0x2d, 0x30, + 0x2d, 0x02, 0x27, 0x2d, 0x12, 0x38, 0x39, 0x39, 0x38, 0x12, 0x2d, 0x27, 0x05, 0x3e, 0x1b, 0x0e, + 0x3f, 0x00, 0x3e, 0x2a, 0x57, 0x24, 0x07, 0x70, 0x12, 0x80, 0x12, 0x02, 0x12, 0x39, 0x39, 0x09, + 0x1a, 0x17, 0x57, 0x1e, 0x07, 0x30, 0x33, 0x01, 0x33, 0x57, 0x09, 0x0b, 0x30, 0x57, 0x03, 0x0b, + 0x00, 0x3f, 0xed, 0x3f, 0xed, 0x5d, 0x3f, 0xfd, 0xc6, 0x12, 0x39, 0x2f, 0xc5, 0x5d, 0x3f, 0xed, + 0x01, 0x10, 0xc6, 0x10, 0xc6, 0xc6, 0x12, 0x17, 0x39, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x5d, 0x31, + 0x30, 0x00, 0x2b, 0x01, 0x2b, 0x2b, 0x37, 0x34, 0x36, 0x33, 0x32, 0x16, 0x17, 0x36, 0x36, 0x33, + 0x32, 0x1e, 0x02, 0x15, 0x14, 0x06, 0x07, 0x23, 0x1e, 0x03, 0x33, 0x32, 0x36, 0x37, 0x17, 0x06, + 0x06, 0x23, 0x22, 0x26, 0x27, 0x06, 0x06, 0x23, 0x22, 0x26, 0x37, 0x14, 0x16, 0x33, 0x32, 0x36, + 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x37, 0x22, 0x0e, 0x02, 0x15, 0x33, 0x34, 0x2e, 0x02, 0x16, + 0x4d, 0x42, 0x1c, 0x35, 0x11, 0x13, 0x2e, 0x1a, 0x1d, 0x31, 0x24, 0x14, 0x01, 0x01, 0xb3, 0x01, + 0x0e, 0x16, 0x1c, 0x10, 0x12, 0x23, 0x0e, 0x12, 0x17, 0x2d, 0x1e, 0x29, 0x36, 0x11, 0x0f, 0x30, + 0x23, 0x49, 0x46, 0x5e, 0x1d, 0x14, 0x14, 0x1c, 0x1d, 0x14, 0x14, 0x1c, 0xee, 0x0d, 0x11, 0x0b, + 0x05, 0x58, 0x04, 0x09, 0x10, 0xec, 0x7e, 0x78, 0x21, 0x20, 0x1f, 0x22, 0x18, 0x36, 0x58, 0x40, + 0x0c, 0x25, 0x08, 0x1c, 0x27, 0x19, 0x0b, 0x09, 0x08, 0x61, 0x0c, 0x0b, 0x25, 0x1a, 0x1a, 0x25, + 0x7e, 0x79, 0x50, 0x40, 0x3f, 0x51, 0x50, 0x40, 0x3f, 0x43, 0x13, 0x1e, 0x25, 0x12, 0x13, 0x26, + 0x1d, 0x12, 0x00, 0x00, 0xff, 0xff, 0x00, 0x0d, 0x00, 0x00, 0x01, 0xe8, 0x03, 0x2c, 0x02, 0x26, + 0x00, 0x3c, 0x00, 0x00, 0x01, 0x07, 0x00, 0x83, 0x00, 0x00, 0x00, 0x8b, 0x00, 0x17, 0x40, 0x10, + 0x02, 0x01, 0x01, 0x17, 0x29, 0x11, 0x06, 0x50, 0x02, 0x05, 0x21, 0x4f, 0x01, 0x05, 0x15, 0x4f, + 0x2b, 0x2b, 0x2b, 0x34, 0x34, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0xa7, 0xff, 0x5b, 0x01, 0x4d, + 0x01, 0xd1, 0x00, 0x0d, 0x00, 0x19, 0x00, 0x23, 0x40, 0x12, 0x14, 0x71, 0x0e, 0x0b, 0x6f, 0x00, + 0x1a, 0x06, 0x17, 0x75, 0x0d, 0x11, 0x01, 0x01, 0x11, 0x7f, 0x0c, 0x12, 0x00, 0x3f, 0x3f, 0x5f, + 0x5d, 0xfd, 0xce, 0x01, 0x10, 0xd6, 0xed, 0xd4, 0xed, 0x31, 0x30, 0x17, 0x34, 0x3e, 0x02, 0x37, + 0x33, 0x1e, 0x03, 0x15, 0x15, 0x23, 0x03, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, + 0x22, 0x26, 0xb3, 0x03, 0x05, 0x07, 0x04, 0x66, 0x04, 0x08, 0x06, 0x03, 0x8e, 0x0c, 0x33, 0x20, + 0x20, 0x33, 0x33, 0x20, 0x20, 0x33, 0x01, 0x24, 0x39, 0x34, 0x34, 0x20, 0x20, 0x34, 0x34, 0x39, + 0x24, 0xa4, 0x02, 0x24, 0x27, 0x2b, 0x2b, 0x27, 0x27, 0x2b, 0x2b, 0x00, 0x00, 0x01, 0x00, 0x2e, + 0xff, 0x9f, 0x01, 0xc7, 0x02, 0x6a, 0x00, 0x21, 0x00, 0x5b, 0xb9, 0x00, 0x1d, 0xff, 0xc0, 0x40, + 0x32, 0x0b, 0x00, 0x4d, 0x09, 0x00, 0x17, 0x01, 0x17, 0x23, 0x1f, 0x1b, 0x01, 0x1b, 0x51, 0x1c, + 0x00, 0x1f, 0x06, 0x01, 0x06, 0x51, 0x04, 0x10, 0x53, 0x20, 0x00, 0x30, 0x00, 0x50, 0x00, 0x03, + 0x00, 0x22, 0x1b, 0x1a, 0x1d, 0x57, 0x13, 0x13, 0x22, 0x04, 0x0a, 0x0d, 0x57, 0x06, 0x03, 0x05, + 0x02, 0x04, 0x02, 0x00, 0x3f, 0x3f, 0xdd, 0x32, 0xfd, 0xc6, 0x11, 0x12, 0x39, 0x2f, 0xfd, 0x32, + 0xc5, 0x01, 0x10, 0xd6, 0x5d, 0xed, 0xd4, 0xed, 0x5d, 0x10, 0xd4, 0xed, 0x5d, 0x10, 0xd6, 0x5d, + 0xc6, 0x31, 0x30, 0x00, 0x2b, 0x13, 0x34, 0x36, 0x37, 0x35, 0x33, 0x15, 0x16, 0x16, 0x17, 0x07, + 0x26, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x17, 0x06, 0x06, 0x07, + 0x15, 0x23, 0x35, 0x2e, 0x03, 0x2e, 0x59, 0x60, 0x7c, 0x18, 0x2d, 0x17, 0x1a, 0x13, 0x2f, 0x24, + 0x53, 0x40, 0x45, 0x53, 0x1d, 0x3c, 0x19, 0x11, 0x13, 0x32, 0x1f, 0x7c, 0x30, 0x46, 0x2d, 0x16, + 0x01, 0x06, 0x55, 0x7b, 0x14, 0x80, 0x7b, 0x02, 0x0c, 0x09, 0x68, 0x07, 0x0b, 0x3f, 0x3d, 0x3c, + 0x40, 0x08, 0x08, 0x6a, 0x08, 0x0a, 0x02, 0x7d, 0x82, 0x09, 0x2a, 0x3c, 0x4c, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x26, 0x00, 0x00, 0x01, 0xc7, 0x02, 0x77, 0x00, 0x23, 0x00, 0x59, 0x40, 0x14, + 0x1b, 0x09, 0x01, 0x1a, 0x25, 0x00, 0x03, 0x6e, 0x11, 0x0e, 0x0f, 0x0b, 0x1f, 0x0b, 0x02, 0x0b, + 0x0f, 0x24, 0x1b, 0x1e, 0xb8, 0xff, 0xc0, 0x40, 0x1c, 0x0b, 0x00, 0x4d, 0x30, 0x1e, 0x01, 0x1e, + 0x74, 0x17, 0x0f, 0x02, 0x72, 0x10, 0x4f, 0x01, 0x01, 0x01, 0x01, 0x0b, 0x17, 0x03, 0x0b, 0x08, + 0x08, 0x09, 0x72, 0x0a, 0x08, 0x00, 0x3f, 0xed, 0x32, 0x3f, 0x3f, 0x12, 0x39, 0x2f, 0x5d, 0x33, + 0xed, 0x32, 0x10, 0xfd, 0x5d, 0x2b, 0xce, 0x01, 0x10, 0xd6, 0xd6, 0x5d, 0xd6, 0x32, 0xed, 0x32, + 0x10, 0xde, 0xc6, 0xc6, 0xc5, 0x31, 0x30, 0x13, 0x33, 0x15, 0x23, 0x14, 0x0e, 0x02, 0x07, 0x33, + 0x15, 0x21, 0x36, 0x36, 0x37, 0x23, 0x35, 0x33, 0x35, 0x34, 0x3e, 0x02, 0x33, 0x32, 0x16, 0x17, + 0x07, 0x26, 0x26, 0x27, 0x22, 0x0e, 0x02, 0x15, 0xea, 0x94, 0x94, 0x02, 0x03, 0x04, 0x03, 0xe9, + 0xfe, 0x90, 0x10, 0x0a, 0x02, 0x4d, 0x4d, 0x1d, 0x34, 0x4b, 0x2f, 0x23, 0x3f, 0x1e, 0x21, 0x15, + 0x24, 0x1a, 0x15, 0x24, 0x19, 0x0e, 0x01, 0x5b, 0x65, 0x10, 0x26, 0x27, 0x24, 0x0f, 0x66, 0x48, + 0x7b, 0x33, 0x65, 0x34, 0x43, 0x59, 0x36, 0x16, 0x0e, 0x0d, 0x62, 0x0b, 0x08, 0x01, 0x09, 0x19, + 0x2a, 0x21, 0x00, 0x00, 0x00, 0x02, 0x00, 0x14, 0x00, 0x56, 0x01, 0xe2, 0x02, 0x16, 0x00, 0x1d, + 0x00, 0x29, 0x00, 0xdb, 0xb5, 0x25, 0x40, 0x0e, 0x00, 0x4d, 0x19, 0xb8, 0xff, 0xe0, 0xb3, 0x0e, + 0x00, 0x4d, 0x19, 0xb8, 0xff, 0xc8, 0xb3, 0x0d, 0x00, 0x4d, 0x19, 0xb8, 0xff, 0xc0, 0xb4, 0x0b, + 0x0c, 0x00, 0x4c, 0x15, 0xb8, 0xff, 0xe0, 0xb3, 0x0e, 0x00, 0x4d, 0x15, 0xb8, 0xff, 0xc0, 0x40, + 0x20, 0x0b, 0x0d, 0x00, 0x4c, 0x14, 0x40, 0x0c, 0x00, 0x4d, 0x09, 0x20, 0x0e, 0x00, 0x4d, 0x09, + 0x40, 0x0b, 0x0d, 0x00, 0x4c, 0x05, 0x20, 0x0e, 0x00, 0x4d, 0x05, 0x40, 0x0b, 0x0d, 0x00, 0x4c, + 0x04, 0xb8, 0xff, 0xc0, 0xb3, 0x0c, 0x00, 0x4d, 0x03, 0xb8, 0xff, 0xc0, 0x40, 0x13, 0x0c, 0x00, + 0x4d, 0x1c, 0x40, 0x0d, 0x00, 0x4d, 0x1c, 0x20, 0x0c, 0x00, 0x4d, 0x1c, 0x40, 0x0b, 0x00, 0x4d, + 0x12, 0xb8, 0xff, 0xc0, 0xb4, 0x0b, 0x0d, 0x00, 0x4c, 0x0c, 0xb8, 0xff, 0xc0, 0x40, 0x2f, 0x0b, + 0x0d, 0x00, 0x4c, 0x02, 0x40, 0x0d, 0x00, 0x4d, 0x02, 0x40, 0x0b, 0x00, 0x4d, 0x04, 0x0a, 0x50, + 0x1e, 0x01, 0x1e, 0x84, 0x10, 0x07, 0x01, 0x07, 0x24, 0x84, 0x17, 0x1a, 0x14, 0x17, 0x17, 0x2a, + 0x2b, 0x13, 0x0b, 0x27, 0x84, 0x0f, 0x2a, 0x21, 0x84, 0x00, 0x1b, 0xa7, 0x03, 0xa7, 0x00, 0x3f, + 0x3f, 0xde, 0xed, 0x10, 0xde, 0xed, 0xde, 0xc6, 0x01, 0x11, 0x12, 0x39, 0x2f, 0xde, 0xc0, 0x10, + 0xfd, 0xdc, 0x5d, 0xed, 0x5d, 0xde, 0xc0, 0x31, 0x30, 0x00, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, + 0x2b, 0x01, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x13, + 0x32, 0x17, 0x37, 0x17, 0x07, 0x16, 0x15, 0x14, 0x07, 0x17, 0x07, 0x27, 0x06, 0x06, 0x23, 0x22, + 0x26, 0x27, 0x07, 0x27, 0x37, 0x26, 0x35, 0x34, 0x37, 0x27, 0x37, 0x17, 0x36, 0x17, 0x34, 0x26, + 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0xfb, 0x2c, 0x26, 0x42, 0x53, 0x40, 0x13, + 0x13, 0x40, 0x54, 0x42, 0x13, 0x27, 0x17, 0x17, 0x27, 0x14, 0x42, 0x53, 0x40, 0x13, 0x13, 0x40, + 0x54, 0x42, 0x24, 0x76, 0x2b, 0x1e, 0x1e, 0x2b, 0x2b, 0x1e, 0x1e, 0x2b, 0x01, 0xe6, 0x10, 0x3f, + 0x51, 0x3e, 0x24, 0x2c, 0x2c, 0x24, 0x3e, 0x52, 0x40, 0x09, 0x07, 0x07, 0x09, 0x3f, 0x51, 0x3e, + 0x22, 0x2e, 0x2e, 0x22, 0x3e, 0x52, 0x40, 0x10, 0xb0, 0x26, 0x28, 0x28, 0x26, 0x26, 0x28, 0x28, + 0x00, 0x01, 0x00, 0x0d, 0x00, 0x00, 0x01, 0xe8, 0x02, 0x6b, 0x00, 0x21, 0x00, 0x85, 0xb9, 0x00, + 0x0d, 0xff, 0xe0, 0x40, 0x45, 0x0d, 0x00, 0x4d, 0x16, 0x44, 0x17, 0x23, 0x09, 0x05, 0x1d, 0x1e, + 0x1e, 0x21, 0x21, 0x00, 0x03, 0x04, 0x14, 0x02, 0x01, 0x00, 0x05, 0x08, 0x04, 0x20, 0x1f, 0x01, + 0x00, 0x14, 0x00, 0x01, 0x1f, 0x20, 0x14, 0x04, 0x08, 0x05, 0x08, 0x22, 0x23, 0x11, 0x44, 0x10, + 0x22, 0x17, 0x02, 0x1c, 0x0b, 0x73, 0x08, 0x01, 0x04, 0x73, 0x20, 0x07, 0x1f, 0x14, 0x11, 0x08, + 0x08, 0x03, 0x11, 0x02, 0x10, 0x02, 0x03, 0x08, 0x02, 0x08, 0x00, 0x3f, 0x3f, 0x3f, 0x3f, 0x12, + 0x39, 0x2f, 0x12, 0x39, 0x33, 0xde, 0x32, 0xed, 0x32, 0x10, 0xed, 0x32, 0x3f, 0x01, 0x10, 0xd6, + 0xed, 0x11, 0x12, 0x17, 0x39, 0x3d, 0x2f, 0x18, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x11, + 0x12, 0x39, 0x11, 0x12, 0x39, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x10, 0xd6, 0xed, + 0x31, 0x30, 0x2b, 0x25, 0x23, 0x15, 0x23, 0x35, 0x23, 0x35, 0x33, 0x35, 0x23, 0x35, 0x33, 0x2e, + 0x03, 0x27, 0x33, 0x16, 0x16, 0x17, 0x36, 0x37, 0x33, 0x0e, 0x03, 0x07, 0x33, 0x15, 0x23, 0x15, + 0x33, 0x01, 0xc0, 0x87, 0x7c, 0x88, 0x88, 0x88, 0x65, 0x13, 0x29, 0x26, 0x21, 0x0a, 0x84, 0x15, + 0x33, 0x24, 0x47, 0x25, 0x7f, 0x0b, 0x1e, 0x23, 0x27, 0x13, 0x5e, 0x87, 0x87, 0x68, 0x68, 0x68, + 0x54, 0x3e, 0x54, 0x22, 0x4b, 0x4b, 0x47, 0x1e, 0x40, 0x82, 0x48, 0x8e, 0x7c, 0x1d, 0x47, 0x4c, + 0x4b, 0x22, 0x54, 0x3e, 0x00, 0x02, 0x00, 0xbd, 0xff, 0x5b, 0x01, 0x39, 0x02, 0xbb, 0x00, 0x03, + 0x00, 0x07, 0x00, 0x24, 0x40, 0x11, 0x01, 0x09, 0x02, 0x05, 0x6e, 0x03, 0x04, 0x00, 0x08, 0x07, + 0x05, 0x10, 0x03, 0x12, 0x00, 0x02, 0x12, 0x00, 0x3f, 0xc5, 0x3f, 0x3f, 0xc5, 0x01, 0x10, 0xc6, + 0xd6, 0x32, 0xfd, 0x32, 0xd6, 0xc6, 0x31, 0x30, 0x37, 0x33, 0x11, 0x23, 0x11, 0x33, 0x11, 0x23, + 0xbd, 0x7c, 0x7c, 0x7c, 0x7c, 0xbd, 0xfe, 0x9e, 0x03, 0x60, 0xfe, 0x9e, 0x00, 0x02, 0x00, 0x31, + 0xff, 0x9e, 0x01, 0xc1, 0x02, 0x7a, 0x00, 0x34, 0x00, 0x44, 0x00, 0x84, 0xb5, 0x27, 0x40, 0x0b, + 0x00, 0x4d, 0x0d, 0xb8, 0xff, 0xe0, 0x40, 0x0a, 0x0b, 0x00, 0x4d, 0x3d, 0x40, 0x13, 0x14, 0x00, + 0x4c, 0x35, 0xb8, 0xff, 0xc0, 0x40, 0x3e, 0x13, 0x14, 0x00, 0x4c, 0x08, 0x46, 0x2e, 0x46, 0x35, + 0x3d, 0x10, 0x2f, 0x40, 0x3f, 0x40, 0x02, 0x40, 0x64, 0x00, 0x28, 0x01, 0x28, 0x1c, 0x46, 0x23, + 0x46, 0x16, 0x38, 0x64, 0x00, 0x10, 0x10, 0x10, 0x30, 0x10, 0x03, 0x10, 0x30, 0x34, 0x01, 0x34, + 0x45, 0x26, 0x35, 0x3d, 0x0b, 0x0b, 0x3d, 0x35, 0x26, 0x04, 0x20, 0x00, 0x05, 0x67, 0x31, 0x10, + 0x1d, 0x20, 0x67, 0x19, 0x03, 0x00, 0x3f, 0xfd, 0xc6, 0x3f, 0xfd, 0xc6, 0x12, 0x17, 0x39, 0x2f, + 0x2f, 0x2f, 0x2f, 0x01, 0x10, 0xc6, 0x5d, 0xd6, 0x5d, 0xed, 0xd4, 0xed, 0x10, 0xce, 0xd6, 0x5d, + 0xed, 0x5d, 0x12, 0x39, 0x39, 0x10, 0xde, 0xed, 0x31, 0x30, 0x00, 0x2b, 0x2b, 0x01, 0x2b, 0x2b, + 0x37, 0x1e, 0x03, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x27, 0x2e, 0x03, 0x35, 0x34, 0x36, 0x37, + 0x26, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x17, 0x07, 0x26, 0x26, 0x23, 0x22, 0x06, 0x15, + 0x14, 0x16, 0x17, 0x16, 0x15, 0x14, 0x06, 0x07, 0x16, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, + 0x27, 0x13, 0x06, 0x06, 0x15, 0x14, 0x1e, 0x02, 0x17, 0x36, 0x36, 0x35, 0x34, 0x2e, 0x02, 0x52, + 0x14, 0x24, 0x24, 0x28, 0x18, 0x21, 0x23, 0x25, 0x2d, 0x23, 0x3d, 0x2e, 0x1b, 0x20, 0x26, 0x13, + 0x17, 0x64, 0x5e, 0x28, 0x56, 0x23, 0x21, 0x1c, 0x3d, 0x28, 0x29, 0x16, 0x1d, 0x2a, 0xa5, 0x1f, + 0x20, 0x19, 0x19, 0x64, 0x5b, 0x45, 0x60, 0x1f, 0x9c, 0x12, 0x17, 0x09, 0x1d, 0x35, 0x2d, 0x12, + 0x16, 0x0a, 0x1e, 0x35, 0x28, 0x08, 0x0c, 0x09, 0x04, 0x17, 0x13, 0x10, 0x19, 0x0e, 0x0c, 0x1b, + 0x26, 0x32, 0x23, 0x24, 0x40, 0x24, 0x11, 0x2c, 0x19, 0x45, 0x4d, 0x13, 0x0e, 0x62, 0x0b, 0x0f, + 0x18, 0x0f, 0x12, 0x18, 0x0c, 0x30, 0x71, 0x26, 0x38, 0x1e, 0x17, 0x2d, 0x23, 0x4b, 0x47, 0x18, + 0x10, 0x01, 0x9d, 0x0e, 0x29, 0x0f, 0x11, 0x1a, 0x16, 0x17, 0x0e, 0x0f, 0x28, 0x0f, 0x12, 0x19, + 0x15, 0x17, 0x00, 0x00, 0x00, 0x02, 0x00, 0x53, 0x02, 0x1a, 0x01, 0xa4, 0x02, 0xa1, 0x00, 0x0b, + 0x00, 0x17, 0x00, 0x20, 0x40, 0x10, 0x15, 0x0f, 0x09, 0x20, 0x03, 0x30, 0x03, 0x02, 0x03, 0x18, + 0x0c, 0x12, 0x9f, 0x00, 0x06, 0x9f, 0x00, 0x3f, 0xcd, 0x3f, 0xcd, 0x01, 0x10, 0xd6, 0x5d, 0xdd, + 0xde, 0xcd, 0x31, 0x30, 0x13, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, + 0x33, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x98, 0x1c, 0x29, 0x29, + 0x1c, 0x1b, 0x2a, 0x2a, 0xac, 0x1c, 0x29, 0x29, 0x1c, 0x1c, 0x29, 0x29, 0x02, 0x1a, 0x23, 0x20, + 0x20, 0x24, 0x24, 0x20, 0x20, 0x23, 0x23, 0x20, 0x20, 0x24, 0x24, 0x20, 0x20, 0x23, 0x00, 0x00, + 0x00, 0x03, 0x00, 0x19, 0xff, 0xf3, 0x01, 0xdd, 0x01, 0xdb, 0x00, 0x1d, 0x00, 0x31, 0x00, 0x45, + 0x00, 0x89, 0xb9, 0x00, 0x44, 0xff, 0xe0, 0xb3, 0x0c, 0x00, 0x4d, 0x43, 0xb8, 0xff, 0xe0, 0xb3, + 0x0d, 0x00, 0x4d, 0x3f, 0xb8, 0xff, 0xe0, 0x40, 0x47, 0x0c, 0x0d, 0x00, 0x4c, 0x3a, 0x20, 0x0c, + 0x00, 0x4d, 0x4f, 0x39, 0x01, 0x34, 0x20, 0x0c, 0x00, 0x4d, 0x10, 0x00, 0x1d, 0x11, 0x1d, 0x11, + 0x1d, 0x17, 0x37, 0x7f, 0x3f, 0x28, 0x5f, 0x28, 0x7f, 0x28, 0x03, 0x28, 0x47, 0x17, 0x7f, 0x40, + 0x08, 0x01, 0x08, 0x41, 0x7f, 0x1e, 0x46, 0x14, 0x80, 0x0d, 0x1a, 0x80, 0x03, 0x4f, 0x0d, 0x01, + 0x30, 0x03, 0x01, 0x0d, 0x03, 0x0d, 0x03, 0x3c, 0x32, 0x80, 0x2d, 0x07, 0x3c, 0x80, 0x23, 0x0b, + 0x00, 0x3f, 0xed, 0x3f, 0xed, 0x11, 0x39, 0x39, 0x2f, 0x2f, 0x5d, 0x5d, 0x10, 0xed, 0x10, 0xed, + 0x01, 0x10, 0xd6, 0xfd, 0xd6, 0x5d, 0xed, 0x10, 0xde, 0x5d, 0xed, 0x11, 0x39, 0x39, 0x2f, 0x2f, + 0x11, 0x39, 0x39, 0x31, 0x30, 0x2b, 0x5d, 0x2b, 0x2b, 0x2b, 0x2b, 0x25, 0x06, 0x06, 0x23, 0x22, + 0x2e, 0x02, 0x35, 0x34, 0x3e, 0x02, 0x33, 0x32, 0x16, 0x17, 0x07, 0x26, 0x26, 0x23, 0x22, 0x06, + 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x25, 0x34, 0x3e, 0x02, 0x33, 0x32, 0x1e, 0x02, 0x15, + 0x14, 0x0e, 0x02, 0x23, 0x22, 0x2e, 0x02, 0x17, 0x32, 0x3e, 0x02, 0x35, 0x34, 0x2e, 0x02, 0x23, + 0x22, 0x0e, 0x02, 0x15, 0x14, 0x1e, 0x02, 0x01, 0x47, 0x11, 0x25, 0x11, 0x1d, 0x2b, 0x1c, 0x0e, + 0x0e, 0x1c, 0x2b, 0x1e, 0x10, 0x23, 0x11, 0x14, 0x0b, 0x16, 0x09, 0x20, 0x1b, 0x21, 0x1e, 0x09, + 0x17, 0x0b, 0xfe, 0xe3, 0x26, 0x3f, 0x51, 0x2c, 0x2b, 0x52, 0x3f, 0x26, 0x26, 0x3f, 0x52, 0x2b, + 0x2c, 0x51, 0x3f, 0x26, 0xe1, 0x1e, 0x38, 0x2d, 0x1b, 0x1b, 0x2c, 0x39, 0x1e, 0x1e, 0x38, 0x2d, + 0x1b, 0x1b, 0x2d, 0x38, 0x78, 0x08, 0x08, 0x15, 0x23, 0x2d, 0x18, 0x18, 0x2e, 0x24, 0x16, 0x05, + 0x08, 0x36, 0x05, 0x03, 0x28, 0x19, 0x20, 0x25, 0x04, 0x05, 0x3a, 0x3d, 0x5c, 0x3d, 0x1e, 0x1e, + 0x3d, 0x5c, 0x3d, 0x3d, 0x5b, 0x3d, 0x1f, 0x1f, 0x3d, 0x5b, 0x77, 0x17, 0x2e, 0x44, 0x2c, 0x2b, + 0x43, 0x2e, 0x18, 0x18, 0x2e, 0x43, 0x2b, 0x2c, 0x44, 0x2e, 0x17, 0x00, 0x00, 0x02, 0x00, 0x68, + 0x01, 0x13, 0x01, 0x95, 0x02, 0x78, 0x00, 0x0c, 0x00, 0x2b, 0x00, 0x6c, 0x40, 0x0b, 0x29, 0x40, + 0x0e, 0x00, 0x4d, 0x0a, 0x40, 0x0e, 0x00, 0x4d, 0x03, 0xb8, 0xff, 0xc0, 0xb3, 0x0e, 0x00, 0x4d, + 0x1e, 0xb8, 0xff, 0xc0, 0xb3, 0x0d, 0x00, 0x4d, 0x1c, 0xb8, 0xff, 0xc0, 0x40, 0x2a, 0x0d, 0x00, + 0x4d, 0x04, 0x21, 0x85, 0x60, 0x12, 0x01, 0x12, 0x2d, 0x29, 0x0a, 0x84, 0x30, 0x19, 0x60, 0x19, + 0x70, 0x19, 0x03, 0x19, 0x2c, 0x9f, 0x1e, 0x01, 0x1e, 0x81, 0x07, 0x07, 0x0d, 0x00, 0x7d, 0xb0, + 0x16, 0x01, 0x16, 0x28, 0x25, 0x7d, 0x0d, 0x03, 0x00, 0x3f, 0xfd, 0xc2, 0x2f, 0x5d, 0xed, 0x11, + 0x39, 0x10, 0xed, 0x5d, 0x01, 0x10, 0xd6, 0x5d, 0xed, 0xc4, 0x10, 0xde, 0x5d, 0xed, 0x32, 0x31, + 0x30, 0x00, 0x2b, 0x2b, 0x01, 0x2b, 0x2b, 0x2b, 0x01, 0x32, 0x36, 0x37, 0x35, 0x26, 0x26, 0x23, + 0x22, 0x06, 0x15, 0x14, 0x16, 0x13, 0x32, 0x1e, 0x02, 0x15, 0x15, 0x06, 0x06, 0x23, 0x22, 0x26, + 0x35, 0x34, 0x3e, 0x02, 0x33, 0x32, 0x16, 0x17, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x27, + 0x36, 0x36, 0x01, 0x06, 0x0e, 0x1a, 0x08, 0x06, 0x17, 0x0a, 0x1b, 0x28, 0x20, 0x12, 0x2b, 0x3a, + 0x23, 0x0f, 0x14, 0x4e, 0x34, 0x46, 0x51, 0x18, 0x29, 0x36, 0x1e, 0x12, 0x1c, 0x0b, 0x1e, 0x25, + 0x19, 0x32, 0x12, 0x0d, 0x11, 0x43, 0x01, 0x5f, 0x02, 0x01, 0x45, 0x02, 0x03, 0x0f, 0x17, 0x17, + 0x10, 0x01, 0x19, 0x13, 0x23, 0x33, 0x1f, 0xcb, 0x05, 0x0d, 0x33, 0x3e, 0x1e, 0x29, 0x18, 0x0b, + 0x04, 0x02, 0x09, 0x19, 0x1c, 0x07, 0x06, 0x4f, 0x05, 0x0b, 0x00, 0x00, 0x00, 0x02, 0x00, 0x32, + 0x00, 0x2e, 0x01, 0xc3, 0x01, 0xce, 0x00, 0x05, 0x00, 0x0b, 0x00, 0x5b, 0x40, 0x18, 0x03, 0x04, + 0x05, 0x09, 0x0a, 0x0b, 0x07, 0x06, 0x5f, 0x08, 0x01, 0x08, 0x79, 0x0b, 0x52, 0x5f, 0x02, 0x01, + 0x02, 0x79, 0x05, 0x01, 0x00, 0x05, 0xb8, 0xff, 0xc0, 0x40, 0x14, 0x09, 0x10, 0x48, 0x05, 0x0c, + 0x0a, 0x08, 0x08, 0x0a, 0x06, 0x0d, 0x04, 0x02, 0x02, 0x04, 0x0c, 0x06, 0x0a, 0x00, 0x0a, 0x00, + 0x3f, 0x3f, 0x11, 0x39, 0x39, 0x3d, 0x2f, 0x18, 0x2f, 0x11, 0x12, 0x39, 0x39, 0x3d, 0x2f, 0x18, + 0x2f, 0x01, 0x10, 0xde, 0x2b, 0xd1, 0xc9, 0x10, 0xfd, 0x5d, 0xfe, 0xed, 0x5d, 0xd9, 0xc9, 0x10, + 0xd9, 0xc9, 0x10, 0xd1, 0xc9, 0x31, 0x30, 0x13, 0x17, 0x07, 0x17, 0x07, 0x27, 0x25, 0x17, 0x07, + 0x17, 0x07, 0x27, 0xba, 0x41, 0x5e, 0x5e, 0x3f, 0x8a, 0x01, 0x4f, 0x42, 0x5d, 0x5d, 0x40, 0x88, + 0x01, 0xce, 0x28, 0xa7, 0xa7, 0x2a, 0xd1, 0xcf, 0x28, 0xa7, 0xa7, 0x2a, 0xd1, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x2d, 0x00, 0x2a, 0x01, 0xc0, 0x01, 0x6b, 0x00, 0x05, 0x00, 0x17, 0x40, 0x0a, + 0x05, 0x79, 0x02, 0x03, 0x06, 0x00, 0x02, 0x72, 0x04, 0x83, 0x00, 0x3f, 0xfd, 0xc5, 0x01, 0x10, + 0xd6, 0xdd, 0xed, 0x31, 0x30, 0x25, 0x23, 0x35, 0x21, 0x35, 0x21, 0x01, 0xc0, 0x69, 0xfe, 0xd6, + 0x01, 0x93, 0x2a, 0xdb, 0x66, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x71, 0x00, 0xc4, 0x01, 0x83, + 0x01, 0x3d, 0x02, 0x06, 0x00, 0x10, 0x00, 0x00, 0x00, 0x04, 0x00, 0x19, 0xff, 0xf3, 0x01, 0xdd, + 0x01, 0xdb, 0x00, 0x12, 0x00, 0x1d, 0x00, 0x31, 0x00, 0x45, 0x00, 0xf8, 0xb9, 0x00, 0x44, 0xff, + 0xe0, 0xb6, 0x0c, 0x00, 0x4d, 0x44, 0x43, 0x01, 0x3f, 0xb8, 0xff, 0xe0, 0x40, 0x21, 0x0c, 0x0d, + 0x00, 0x4c, 0x3a, 0x40, 0x0d, 0x00, 0x4d, 0x3a, 0x20, 0x0c, 0x00, 0x4d, 0x34, 0x20, 0x0c, 0x00, + 0x4d, 0x4b, 0x34, 0x01, 0x1a, 0x60, 0x1a, 0x00, 0x4d, 0x17, 0x40, 0x1b, 0x00, 0x4d, 0x0e, 0xb8, + 0xff, 0xc0, 0xb3, 0x16, 0x00, 0x4d, 0x1d, 0xb8, 0xff, 0xc0, 0x40, 0x74, 0x1a, 0x00, 0x4d, 0x1b, + 0x40, 0x1a, 0x00, 0x4d, 0x17, 0x40, 0x1b, 0x00, 0x4d, 0x06, 0x40, 0x0a, 0x00, 0x4d, 0x12, 0x12, + 0x0f, 0x0f, 0x82, 0x0e, 0x0b, 0x0b, 0x0e, 0x17, 0x40, 0x19, 0x00, 0x4d, 0x17, 0x7f, 0x5f, 0x09, + 0x01, 0x09, 0x40, 0x19, 0x1c, 0x48, 0xfb, 0x09, 0x01, 0xe4, 0x09, 0x01, 0x3f, 0x09, 0x4f, 0x09, + 0x02, 0x09, 0x37, 0x7f, 0x1f, 0x28, 0x3f, 0x28, 0x5f, 0x28, 0x7f, 0x28, 0x04, 0x28, 0x47, 0x1d, + 0x13, 0x13, 0x01, 0x01, 0x10, 0x00, 0x01, 0x00, 0x82, 0x03, 0x40, 0x10, 0x13, 0x48, 0x03, 0x41, + 0x7f, 0x1e, 0x46, 0x0f, 0x01, 0x00, 0x80, 0x14, 0x01, 0x14, 0x01, 0x14, 0x3c, 0x32, 0x80, 0x2d, + 0x07, 0x1a, 0x80, 0x1f, 0x06, 0x2f, 0x06, 0x3f, 0x06, 0x03, 0x06, 0x81, 0x3c, 0x80, 0x23, 0x0b, + 0x00, 0x3f, 0xfd, 0xfe, 0x71, 0xed, 0x3f, 0xed, 0x12, 0x39, 0x39, 0x2f, 0x2f, 0x10, 0xed, 0x11, + 0x33, 0x01, 0x10, 0xd6, 0xfd, 0xd6, 0x2b, 0xed, 0x71, 0x32, 0x2f, 0x32, 0x11, 0x33, 0x10, 0xde, + 0x5d, 0xfd, 0xde, 0x5d, 0x5d, 0x5d, 0x2b, 0x71, 0xed, 0x2b, 0xc2, 0x32, 0x2f, 0x10, 0xe9, 0x2f, + 0x32, 0x2f, 0x31, 0x30, 0x00, 0x2b, 0x2b, 0x2b, 0x2b, 0x01, 0x2b, 0x2b, 0x2b, 0x5d, 0x2b, 0x2b, + 0x2b, 0x2b, 0x5d, 0x2b, 0x37, 0x15, 0x23, 0x35, 0x36, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x07, + 0x16, 0x16, 0x17, 0x23, 0x26, 0x26, 0x27, 0x27, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, + 0x06, 0x07, 0x07, 0x34, 0x3e, 0x02, 0x33, 0x32, 0x1e, 0x02, 0x15, 0x14, 0x0e, 0x02, 0x23, 0x22, + 0x2e, 0x02, 0x17, 0x32, 0x3e, 0x02, 0x35, 0x34, 0x2e, 0x02, 0x23, 0x22, 0x0e, 0x02, 0x15, 0x14, + 0x1e, 0x02, 0xdc, 0x36, 0x0e, 0x22, 0x13, 0x39, 0x37, 0x28, 0x0c, 0x1a, 0x0d, 0x39, 0x0d, 0x14, + 0x0a, 0x24, 0x12, 0x1b, 0x1a, 0x20, 0x11, 0x06, 0x0b, 0x05, 0xc3, 0x26, 0x3f, 0x51, 0x2c, 0x2b, + 0x52, 0x3f, 0x26, 0x26, 0x3f, 0x52, 0x2b, 0x2c, 0x51, 0x3f, 0x26, 0xe1, 0x1e, 0x38, 0x2d, 0x1b, + 0x1b, 0x2c, 0x39, 0x1e, 0x1e, 0x38, 0x2d, 0x1b, 0x1b, 0x2d, 0x38, 0xbb, 0x4d, 0xee, 0x04, 0x05, + 0x2c, 0x2a, 0x30, 0x17, 0x11, 0x2f, 0x1a, 0x18, 0x25, 0x10, 0x32, 0x0e, 0x17, 0x14, 0x0d, 0x01, + 0x01, 0x4a, 0x3d, 0x5c, 0x3d, 0x1e, 0x1e, 0x3d, 0x5c, 0x3d, 0x3d, 0x5b, 0x3d, 0x1f, 0x1f, 0x3d, + 0x5b, 0x77, 0x17, 0x2e, 0x44, 0x2c, 0x2b, 0x43, 0x2e, 0x18, 0x18, 0x2e, 0x43, 0x2b, 0x2c, 0x44, + 0x2e, 0x17, 0x00, 0x00, 0x00, 0x01, 0x00, 0x6c, 0x02, 0x30, 0x01, 0x8c, 0x02, 0x87, 0x00, 0x03, + 0x00, 0x11, 0xb6, 0x02, 0x00, 0x04, 0x03, 0x73, 0x01, 0x93, 0x00, 0x3f, 0xed, 0x01, 0x10, 0xd6, + 0xcd, 0x31, 0x30, 0x13, 0x21, 0x15, 0x21, 0x6c, 0x01, 0x20, 0xfe, 0xe0, 0x02, 0x87, 0x57, 0x00, + 0x00, 0x02, 0x00, 0x6c, 0x01, 0xa5, 0x01, 0x8c, 0x02, 0xba, 0x00, 0x0f, 0x00, 0x1b, 0x00, 0x1f, + 0x40, 0x0f, 0x1d, 0x05, 0x7c, 0x13, 0x19, 0x7c, 0x0d, 0x1c, 0x0a, 0x7d, 0x10, 0x16, 0x7d, 0x00, + 0x10, 0x00, 0x3f, 0xfd, 0xde, 0xed, 0x01, 0x10, 0xd6, 0xfd, 0xde, 0xfd, 0xc6, 0x31, 0x30, 0x13, + 0x32, 0x1e, 0x02, 0x15, 0x14, 0x0e, 0x02, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x17, 0x32, 0x36, + 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0xfc, 0x1f, 0x35, 0x26, 0x16, 0x16, 0x26, + 0x35, 0x1f, 0x42, 0x4e, 0x50, 0x40, 0x17, 0x1f, 0x1f, 0x17, 0x17, 0x20, 0x20, 0x02, 0xba, 0x13, + 0x24, 0x34, 0x20, 0x20, 0x33, 0x24, 0x13, 0x49, 0x41, 0x41, 0x4a, 0xc1, 0x1b, 0x1c, 0x1c, 0x1a, + 0x1a, 0x1c, 0x1c, 0x1b, 0x00, 0x02, 0x00, 0x28, 0x00, 0x00, 0x01, 0xcc, 0x02, 0x2e, 0x00, 0x03, + 0x00, 0x0f, 0x00, 0x7d, 0xb9, 0x00, 0x01, 0xff, 0xc0, 0xb3, 0x0d, 0x00, 0x4d, 0x00, 0xb8, 0xff, + 0xc0, 0x40, 0x20, 0x0d, 0x00, 0x4d, 0x02, 0x70, 0x0a, 0x80, 0x0a, 0x02, 0x0a, 0x08, 0xe0, 0x0b, + 0x01, 0x0b, 0x52, 0x0e, 0x70, 0x05, 0x80, 0x05, 0x02, 0x05, 0x04, 0x70, 0x00, 0x01, 0x00, 0x10, + 0x03, 0x08, 0x07, 0xb8, 0xff, 0xc0, 0x40, 0x26, 0x0a, 0x00, 0x4d, 0x70, 0x07, 0x80, 0x07, 0x02, + 0x07, 0x05, 0x08, 0x55, 0x0e, 0x70, 0x0b, 0x80, 0x0b, 0x02, 0x0b, 0x0c, 0x40, 0x09, 0x0a, 0x00, + 0x4c, 0x40, 0x0c, 0x01, 0x2f, 0x0c, 0x3f, 0x0c, 0x02, 0x0c, 0x01, 0x55, 0x02, 0x08, 0x00, 0x3f, + 0xfd, 0xd6, 0x5d, 0x5d, 0x2b, 0xdd, 0x5d, 0x32, 0xfd, 0x32, 0xcd, 0x5d, 0x2b, 0x3f, 0x01, 0x10, + 0xd6, 0x5d, 0xd0, 0xdd, 0x5d, 0x32, 0xfd, 0x5d, 0x32, 0xdd, 0x5d, 0xc0, 0x31, 0x30, 0x00, 0x2b, + 0x2b, 0x37, 0x21, 0x15, 0x21, 0x11, 0x33, 0x35, 0x33, 0x15, 0x33, 0x15, 0x23, 0x15, 0x23, 0x35, + 0x23, 0x28, 0x01, 0xa4, 0xfe, 0x5c, 0x9d, 0x6a, 0x9d, 0x9d, 0x6a, 0x9d, 0x66, 0x66, 0x01, 0x92, + 0x9c, 0x9c, 0x66, 0x9d, 0x9d, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x71, 0x01, 0x0e, 0x01, 0x82, + 0x02, 0x79, 0x00, 0x1c, 0x00, 0x37, 0x40, 0x1d, 0x10, 0x84, 0x00, 0x07, 0x1e, 0x17, 0x06, 0x84, + 0x0a, 0x1d, 0x06, 0x07, 0x7c, 0x0d, 0x03, 0xb0, 0x08, 0xc0, 0x08, 0x02, 0x08, 0x08, 0x1a, 0x1e, + 0x16, 0x13, 0x7d, 0x1a, 0x74, 0x00, 0x3f, 0xfd, 0xce, 0x11, 0x12, 0x39, 0x2f, 0x5d, 0x39, 0x39, + 0xed, 0x32, 0x01, 0x10, 0xd6, 0xed, 0xc6, 0x10, 0xde, 0xd6, 0xed, 0x31, 0x30, 0x01, 0x14, 0x06, + 0x07, 0x06, 0x06, 0x07, 0x33, 0x15, 0x21, 0x35, 0x34, 0x36, 0x37, 0x36, 0x36, 0x35, 0x34, 0x26, + 0x23, 0x22, 0x06, 0x07, 0x27, 0x36, 0x36, 0x33, 0x32, 0x16, 0x01, 0x79, 0x2e, 0x1b, 0x10, 0x1f, + 0x0b, 0x8c, 0xfe, 0xff, 0x2f, 0x2d, 0x19, 0x1d, 0x10, 0x0f, 0x1a, 0x2c, 0x0f, 0x2e, 0x17, 0x48, + 0x28, 0x46, 0x3b, 0x02, 0x0b, 0x27, 0x35, 0x17, 0x0d, 0x1e, 0x0e, 0x51, 0x19, 0x2c, 0x46, 0x26, + 0x15, 0x1e, 0x10, 0x0e, 0x10, 0x14, 0x0d, 0x45, 0x14, 0x21, 0x3d, 0x00, 0x00, 0x01, 0x00, 0x71, + 0x01, 0x07, 0x01, 0x80, 0x02, 0x79, 0x00, 0x2a, 0x00, 0xdf, 0x40, 0x0b, 0x22, 0x40, 0x0c, 0x00, + 0x4d, 0x21, 0x40, 0x0b, 0x00, 0x4d, 0x20, 0xb8, 0xff, 0xc0, 0xb3, 0x13, 0x00, 0x4d, 0x1f, 0xb8, + 0xff, 0xc0, 0xb3, 0x15, 0x00, 0x4d, 0x1f, 0xb8, 0xff, 0xc0, 0x40, 0x09, 0x13, 0x00, 0x4d, 0x03, + 0x40, 0x0c, 0x00, 0x4d, 0x28, 0xb8, 0xff, 0xc0, 0xb3, 0x1a, 0x00, 0x4d, 0x28, 0xb8, 0xff, 0xc0, + 0xb3, 0x13, 0x00, 0x4d, 0x28, 0xb8, 0xff, 0xe0, 0xb3, 0x0e, 0x00, 0x4d, 0x28, 0xb8, 0xff, 0xc0, + 0xb3, 0x0d, 0x00, 0x4d, 0x28, 0xb8, 0xff, 0xe0, 0xb3, 0x0c, 0x00, 0x4d, 0x28, 0xb8, 0xff, 0xc0, + 0x40, 0x4f, 0x09, 0x0b, 0x00, 0x4c, 0x10, 0x40, 0x11, 0x12, 0x00, 0x4c, 0x10, 0x40, 0x0f, 0x00, + 0x4d, 0x10, 0x20, 0x0d, 0x0e, 0x00, 0x4c, 0x10, 0x40, 0x09, 0x0c, 0x00, 0x4c, 0x0f, 0x20, 0x0e, + 0x00, 0x4d, 0xaf, 0x06, 0x01, 0x05, 0x40, 0x13, 0x00, 0x4d, 0x0b, 0x84, 0x3f, 0x19, 0x01, 0x19, + 0x19, 0x1f, 0x07, 0x06, 0x03, 0x03, 0x84, 0x1f, 0x2c, 0x11, 0x27, 0x2b, 0x28, 0x24, 0x7d, 0x00, + 0x05, 0x7d, 0x08, 0x00, 0x08, 0x1c, 0x08, 0x1c, 0x00, 0x03, 0x2c, 0x14, 0x10, 0x0d, 0x7d, 0x14, + 0x74, 0x00, 0x3f, 0xfd, 0xce, 0x11, 0x12, 0x17, 0x39, 0x3d, 0x2f, 0x18, 0x2f, 0x2f, 0x10, 0xed, + 0x10, 0xed, 0xce, 0x01, 0x10, 0xd6, 0xc6, 0x10, 0xda, 0xe9, 0x2f, 0xce, 0x32, 0x10, 0xc0, 0x2f, + 0x5d, 0xed, 0x31, 0x30, 0x00, 0x2b, 0x5d, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, + 0x2b, 0x2b, 0x01, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x13, 0x32, 0x36, 0x35, 0x34, 0x23, 0x23, + 0x35, 0x33, 0x32, 0x36, 0x35, 0x34, 0x23, 0x22, 0x06, 0x07, 0x27, 0x36, 0x36, 0x33, 0x32, 0x1e, + 0x02, 0x15, 0x14, 0x06, 0x07, 0x16, 0x16, 0x15, 0x14, 0x0e, 0x02, 0x23, 0x22, 0x26, 0x27, 0x37, + 0x16, 0x16, 0xe7, 0x20, 0x19, 0x3f, 0x25, 0x25, 0x15, 0x1a, 0x27, 0x15, 0x28, 0x13, 0x22, 0x16, + 0x43, 0x20, 0x24, 0x31, 0x1e, 0x0c, 0x11, 0x14, 0x1d, 0x19, 0x10, 0x24, 0x3a, 0x2a, 0x1e, 0x45, + 0x14, 0x15, 0x1e, 0x2a, 0x01, 0x5a, 0x14, 0x0e, 0x24, 0x49, 0x10, 0x11, 0x1c, 0x0e, 0x08, 0x46, + 0x0e, 0x15, 0x10, 0x1b, 0x25, 0x14, 0x13, 0x21, 0x11, 0x0d, 0x2d, 0x1b, 0x19, 0x2a, 0x1f, 0x12, + 0x0d, 0x0b, 0x4f, 0x0d, 0x07, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x98, 0x02, 0x01, 0x01, 0x73, + 0x02, 0xb3, 0x00, 0x03, 0x00, 0x10, 0xb5, 0x00, 0x02, 0x04, 0x01, 0x03, 0x7d, 0x00, 0x3f, 0xcd, + 0x01, 0x10, 0xd6, 0xc5, 0x31, 0x30, 0x01, 0x07, 0x27, 0x37, 0x01, 0x73, 0xae, 0x2d, 0x9e, 0x02, + 0x55, 0x54, 0x43, 0x6f, 0x00, 0x01, 0x00, 0x3b, 0xff, 0x5b, 0x01, 0xb6, 0x01, 0xd6, 0x00, 0x18, + 0x00, 0x37, 0x40, 0x0e, 0x0a, 0x51, 0xa0, 0x0b, 0xb0, 0x0b, 0x02, 0x0b, 0x1a, 0x16, 0x00, 0x51, + 0x17, 0x18, 0xb8, 0xff, 0xc0, 0x40, 0x0f, 0x09, 0x0c, 0x48, 0x18, 0x19, 0x18, 0x0a, 0x16, 0x0e, + 0x06, 0x57, 0x0f, 0x07, 0x0b, 0x0a, 0x00, 0x3f, 0x3f, 0xed, 0x3f, 0x3f, 0x01, 0x10, 0xd6, 0x2b, + 0x32, 0xed, 0x32, 0x10, 0xde, 0x5d, 0xed, 0x31, 0x30, 0x13, 0x11, 0x14, 0x1e, 0x02, 0x33, 0x32, + 0x36, 0x37, 0x11, 0x33, 0x11, 0x06, 0x06, 0x23, 0x22, 0x26, 0x27, 0x16, 0x16, 0x15, 0x15, 0x23, + 0x11, 0xb6, 0x0a, 0x13, 0x1d, 0x13, 0x0e, 0x1d, 0x0c, 0x7c, 0x20, 0x5e, 0x33, 0x10, 0x30, 0x15, + 0x02, 0x04, 0x7b, 0x01, 0xd6, 0xff, 0x00, 0x23, 0x2d, 0x1b, 0x0b, 0x03, 0x02, 0x01, 0x71, 0xfe, + 0x3a, 0x09, 0x12, 0x09, 0x06, 0x15, 0x27, 0x1a, 0x53, 0x02, 0x7b, 0x00, 0x00, 0x01, 0x00, 0x13, + 0xff, 0x5b, 0x01, 0xc7, 0x02, 0x72, 0x00, 0x13, 0x00, 0x3e, 0x40, 0x29, 0x20, 0x0c, 0x30, 0x0c, + 0xc0, 0x0c, 0xd0, 0x0c, 0xe0, 0x0c, 0x05, 0x0c, 0x52, 0x0d, 0x20, 0x12, 0x30, 0x12, 0xc0, 0x12, + 0xd0, 0x12, 0xe0, 0x12, 0x05, 0x12, 0x52, 0x13, 0x03, 0x14, 0x00, 0x00, 0x08, 0x12, 0x12, 0x0d, + 0x12, 0x11, 0x72, 0x08, 0x03, 0x00, 0x3f, 0xed, 0x3f, 0x3f, 0x12, 0x39, 0x2f, 0x01, 0x10, 0xd6, + 0xd4, 0xfd, 0x5d, 0xd6, 0xed, 0x5d, 0x31, 0x30, 0x37, 0x26, 0x26, 0x35, 0x34, 0x3e, 0x02, 0x33, + 0x32, 0x16, 0x17, 0x11, 0x23, 0x11, 0x26, 0x26, 0x07, 0x11, 0x23, 0xac, 0x4c, 0x4d, 0x23, 0x41, + 0x5c, 0x39, 0x30, 0x65, 0x26, 0x65, 0x0a, 0x30, 0x16, 0x66, 0xe8, 0x11, 0x5b, 0x57, 0x30, 0x4a, + 0x33, 0x1a, 0x0b, 0x0a, 0xfc, 0xfe, 0x02, 0xaf, 0x02, 0x02, 0x02, 0xfd, 0x4f, 0x00, 0x00, 0x00, + 0xff, 0xff, 0x00, 0xa1, 0x00, 0xaf, 0x01, 0x54, 0x01, 0x61, 0x02, 0x07, 0x00, 0x11, 0x00, 0x00, + 0x00, 0xba, 0x00, 0x00, 0x00, 0x01, 0x00, 0x9f, 0xff, 0x56, 0x01, 0x67, 0x00, 0x12, 0x00, 0x19, + 0x00, 0x18, 0x40, 0x0a, 0x03, 0x10, 0x0a, 0x1a, 0x16, 0x06, 0x0b, 0x0e, 0x08, 0x12, 0x00, 0x3f, + 0xd5, 0xc6, 0x3f, 0x01, 0x10, 0xd6, 0xdc, 0xc5, 0x31, 0x30, 0x05, 0x16, 0x16, 0x15, 0x14, 0x0e, + 0x02, 0x23, 0x22, 0x27, 0x37, 0x16, 0x16, 0x33, 0x32, 0x35, 0x34, 0x27, 0x27, 0x36, 0x36, 0x37, + 0x33, 0x06, 0x06, 0x01, 0x2c, 0x21, 0x1a, 0x15, 0x21, 0x2c, 0x16, 0x2d, 0x23, 0x0d, 0x06, 0x22, + 0x10, 0x29, 0x24, 0x14, 0x05, 0x11, 0x05, 0x50, 0x05, 0x0a, 0x18, 0x0a, 0x27, 0x12, 0x17, 0x1e, + 0x12, 0x08, 0x0b, 0x3f, 0x02, 0x07, 0x19, 0x13, 0x0c, 0x06, 0x11, 0x24, 0x08, 0x0b, 0x14, 0x00, + 0x00, 0x01, 0x00, 0x81, 0x01, 0x0e, 0x01, 0xa6, 0x02, 0x72, 0x00, 0x0e, 0x00, 0x3b, 0x40, 0x21, + 0x0e, 0x40, 0x12, 0x00, 0x4d, 0x0d, 0x40, 0x10, 0x12, 0x00, 0x4c, 0x0d, 0x0e, 0x0c, 0x79, 0x02, + 0x79, 0x07, 0x00, 0x0f, 0x0e, 0x00, 0x73, 0x01, 0x03, 0x0b, 0x01, 0x02, 0x0d, 0x0d, 0x10, 0x0b, + 0x04, 0x00, 0x3f, 0x12, 0x39, 0x2f, 0x39, 0x39, 0x12, 0x39, 0x10, 0xed, 0x32, 0x01, 0x10, 0xd6, + 0xc6, 0xfd, 0xfd, 0xc5, 0x32, 0x31, 0x30, 0x2b, 0x2b, 0x13, 0x35, 0x33, 0x35, 0x06, 0x06, 0x07, + 0x27, 0x36, 0x36, 0x37, 0x33, 0x11, 0x33, 0x15, 0x8a, 0x64, 0x12, 0x25, 0x1b, 0x1b, 0x26, 0x46, + 0x1a, 0x4d, 0x52, 0x01, 0x0e, 0x51, 0xa0, 0x0b, 0x0f, 0x0b, 0x4e, 0x0f, 0x26, 0x15, 0xfe, 0xed, + 0x51, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x4a, 0x01, 0x11, 0x01, 0xa7, 0x02, 0x79, 0x00, 0x13, + 0x00, 0x1f, 0x00, 0x64, 0xb9, 0x00, 0x0d, 0xff, 0xc0, 0xb3, 0x0e, 0x00, 0x4d, 0x0c, 0xb8, 0xff, + 0xc0, 0xb3, 0x0e, 0x00, 0x4d, 0x0b, 0xb8, 0xff, 0xc0, 0xb3, 0x0e, 0x00, 0x4d, 0x0a, 0xb8, 0xff, + 0xc0, 0xb3, 0x0e, 0x00, 0x4d, 0x09, 0xb8, 0xff, 0xc0, 0xb3, 0x0e, 0x00, 0x4d, 0x08, 0xb8, 0xff, + 0xc0, 0xb3, 0x0e, 0x00, 0x4d, 0x07, 0xb8, 0xff, 0xc0, 0x40, 0x17, 0x0e, 0x00, 0x4d, 0x5f, 0x00, + 0x01, 0x00, 0x84, 0x14, 0x1a, 0x84, 0x40, 0x0a, 0x01, 0x0a, 0x20, 0x05, 0x74, 0x1d, 0x17, 0x74, + 0x0f, 0x9e, 0x00, 0x3f, 0xfd, 0xd6, 0xed, 0x01, 0x10, 0xd6, 0x5d, 0xfd, 0xd6, 0xed, 0x5d, 0x31, + 0x30, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x01, 0x14, 0x0e, 0x02, 0x23, 0x22, 0x2e, 0x02, + 0x35, 0x34, 0x3e, 0x02, 0x33, 0x32, 0x1e, 0x02, 0x07, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, + 0x16, 0x33, 0x32, 0x36, 0x01, 0xa7, 0x19, 0x2e, 0x40, 0x27, 0x27, 0x40, 0x2e, 0x1a, 0x1a, 0x2e, + 0x40, 0x27, 0x27, 0x40, 0x2e, 0x19, 0x66, 0x25, 0x23, 0x22, 0x27, 0x26, 0x23, 0x23, 0x25, 0x01, + 0xc4, 0x2a, 0x42, 0x2e, 0x19, 0x19, 0x2e, 0x42, 0x2a, 0x2a, 0x44, 0x2e, 0x19, 0x19, 0x2e, 0x44, + 0x2a, 0x2b, 0x31, 0x31, 0x2b, 0x29, 0x30, 0x30, 0x00, 0x02, 0x00, 0x32, 0x00, 0x2e, 0x01, 0xc3, + 0x01, 0xce, 0x00, 0x05, 0x00, 0x0b, 0x00, 0x38, 0x40, 0x1c, 0x05, 0x0b, 0x08, 0x08, 0x06, 0x0a, + 0x03, 0x09, 0x03, 0x04, 0x00, 0x01, 0x09, 0x03, 0x01, 0x01, 0x03, 0x09, 0x03, 0x0d, 0x07, 0x0c, + 0x06, 0x0a, 0x0a, 0x00, 0x04, 0x0a, 0x00, 0x3f, 0xc4, 0x3f, 0xc4, 0x01, 0x10, 0xc6, 0x12, 0x17, + 0x39, 0x2f, 0x2f, 0x2f, 0x11, 0x39, 0x39, 0x11, 0x12, 0x17, 0x39, 0x10, 0xd5, 0xc4, 0x31, 0x30, + 0x25, 0x27, 0x37, 0x27, 0x37, 0x17, 0x05, 0x27, 0x37, 0x27, 0x37, 0x17, 0x01, 0x3b, 0x41, 0x5e, + 0x5e, 0x3f, 0x8a, 0xfe, 0xb1, 0x42, 0x5d, 0x5d, 0x40, 0x88, 0x2e, 0x28, 0xa8, 0xa7, 0x29, 0xd0, + 0xd0, 0x28, 0xa8, 0xa7, 0x29, 0xd0, 0x00, 0x00, 0x00, 0x04, 0x00, 0x02, 0x00, 0x00, 0x01, 0xef, + 0x02, 0x72, 0x00, 0x0c, 0x00, 0x17, 0x00, 0x1c, 0x00, 0x20, 0x00, 0xd3, 0xb9, 0x00, 0x1a, 0xff, + 0xc0, 0xb3, 0x0e, 0x00, 0x4d, 0x19, 0xb8, 0xff, 0xc0, 0xb3, 0x0f, 0x00, 0x4d, 0x0a, 0xb8, 0xff, + 0xe0, 0xb3, 0x0f, 0x00, 0x4d, 0x0a, 0xb8, 0xff, 0xc0, 0xb3, 0x0e, 0x00, 0x4d, 0x09, 0xb8, 0xff, + 0xe0, 0xb3, 0x0c, 0x00, 0x4d, 0x17, 0xb8, 0xff, 0xe0, 0xb4, 0x0e, 0x0f, 0x00, 0x4c, 0x17, 0xb8, + 0xff, 0xc0, 0xb3, 0x0d, 0x00, 0x4d, 0x14, 0xb8, 0xff, 0xc0, 0xb3, 0x0f, 0x00, 0x4d, 0x14, 0xb8, + 0xff, 0xc0, 0x40, 0x4c, 0x0d, 0x00, 0x4d, 0x00, 0x40, 0x0c, 0x0d, 0x00, 0x4c, 0x1e, 0x20, 0x1f, + 0x20, 0xaf, 0x1d, 0x1e, 0x14, 0x1d, 0x1e, 0x1d, 0x22, 0x07, 0x1c, 0x8f, 0x04, 0x40, 0x01, 0x01, + 0x01, 0x02, 0x22, 0x1f, 0x21, 0x90, 0x12, 0x01, 0x12, 0x8f, 0x13, 0x0d, 0x21, 0x17, 0x14, 0x21, + 0x0d, 0x14, 0x0d, 0x14, 0x10, 0x21, 0x20, 0x04, 0x1f, 0x0c, 0x1e, 0x0c, 0x1d, 0x04, 0x12, 0x8c, + 0x10, 0x04, 0x18, 0x1c, 0x07, 0x02, 0x03, 0x03, 0x07, 0x06, 0x8e, 0x0c, 0x00, 0x8d, 0x05, 0x8e, + 0x00, 0x3f, 0xed, 0x32, 0x3f, 0xc5, 0x32, 0x10, 0xc5, 0x10, 0xd5, 0xc6, 0x3f, 0xed, 0x3f, 0x3f, + 0x3f, 0x3f, 0x11, 0x12, 0x39, 0x39, 0x2f, 0x2f, 0x11, 0x12, 0x39, 0x01, 0x10, 0xd6, 0xd4, 0xed, + 0x5d, 0x10, 0xc6, 0x10, 0xd6, 0xd5, 0x5d, 0x32, 0xed, 0x32, 0x10, 0xd4, 0x87, 0x2b, 0x87, 0x7d, + 0xc4, 0x31, 0x30, 0x00, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x01, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x25, + 0x15, 0x33, 0x15, 0x23, 0x15, 0x23, 0x35, 0x23, 0x35, 0x36, 0x36, 0x37, 0x01, 0x36, 0x36, 0x37, + 0x33, 0x15, 0x23, 0x35, 0x06, 0x06, 0x07, 0x01, 0x06, 0x06, 0x07, 0x33, 0x13, 0x01, 0x23, 0x01, + 0x01, 0xcb, 0x24, 0x24, 0x50, 0x7c, 0x17, 0x2d, 0x20, 0xfe, 0x9f, 0x22, 0x32, 0x18, 0x3f, 0x55, + 0x14, 0x1c, 0x13, 0x01, 0x66, 0x10, 0x19, 0x0a, 0x33, 0x45, 0xfe, 0xc3, 0x64, 0x01, 0x3d, 0xfa, + 0x94, 0x3f, 0x27, 0x27, 0x2d, 0x2b, 0x4c, 0x2f, 0x01, 0x33, 0x0f, 0x1f, 0x17, 0xfa, 0x96, 0x0b, + 0x0c, 0x05, 0xfe, 0xc8, 0x17, 0x29, 0x14, 0x02, 0x05, 0xfd, 0x95, 0x02, 0x6b, 0x00, 0x00, 0x00, + 0x00, 0x03, 0x00, 0x02, 0x00, 0x00, 0x01, 0xeb, 0x02, 0x72, 0x00, 0x1d, 0x00, 0x28, 0x00, 0x2c, + 0x00, 0x6f, 0x40, 0x41, 0x09, 0x40, 0x14, 0x00, 0x4d, 0x08, 0x20, 0x14, 0x00, 0x4d, 0x2a, 0x29, + 0x2c, 0x2b, 0x2a, 0x2b, 0x2c, 0xaf, 0x29, 0x2a, 0x14, 0x29, 0x2a, 0x29, 0x2e, 0x0c, 0x7c, 0x18, + 0x00, 0x2e, 0x2b, 0x2d, 0x90, 0x23, 0x01, 0x23, 0x8f, 0x24, 0x1e, 0x2d, 0x1e, 0x25, 0x28, 0x03, + 0x2d, 0x22, 0x2c, 0x04, 0x2b, 0x0c, 0x29, 0x04, 0x23, 0x8c, 0x22, 0x04, 0x11, 0x0e, 0x99, 0x15, + 0x9a, 0x1d, 0x81, 0x02, 0x0c, 0x00, 0x3f, 0xed, 0x3f, 0xfd, 0xc6, 0x3f, 0xed, 0x3f, 0x3f, 0x3f, + 0x11, 0x12, 0x17, 0x39, 0x01, 0x10, 0xd6, 0xd4, 0xed, 0x5d, 0x10, 0xc2, 0x10, 0xd6, 0xd6, 0xed, + 0x10, 0xd0, 0x87, 0x2b, 0x10, 0x00, 0xc1, 0x87, 0x05, 0x7d, 0x10, 0xc4, 0x31, 0x30, 0x01, 0x2b, + 0x2b, 0x25, 0x15, 0x23, 0x26, 0x34, 0x35, 0x34, 0x36, 0x37, 0x37, 0x36, 0x36, 0x35, 0x34, 0x23, + 0x22, 0x06, 0x07, 0x27, 0x36, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x0e, 0x02, 0x07, 0x01, 0x36, + 0x36, 0x37, 0x33, 0x15, 0x23, 0x35, 0x06, 0x06, 0x07, 0x25, 0x01, 0x23, 0x01, 0x01, 0xeb, 0xd1, + 0x02, 0x29, 0x1d, 0x16, 0x11, 0x0c, 0x1a, 0x0f, 0x1e, 0x0c, 0x29, 0x13, 0x3a, 0x20, 0x27, 0x3d, + 0x16, 0x20, 0x24, 0x0e, 0xfe, 0x84, 0x22, 0x32, 0x18, 0x3f, 0x55, 0x14, 0x1c, 0x13, 0x01, 0xab, + 0xfe, 0xc3, 0x64, 0x01, 0x3d, 0x3f, 0x3f, 0x06, 0x0c, 0x05, 0x23, 0x26, 0x13, 0x0e, 0x0b, 0x0e, + 0x0d, 0x16, 0x10, 0x0d, 0x35, 0x17, 0x17, 0x28, 0x2a, 0x1b, 0x22, 0x18, 0x13, 0x0a, 0x01, 0xee, + 0x0f, 0x1f, 0x17, 0xfa, 0x96, 0x0b, 0x0c, 0x05, 0x79, 0xfd, 0x95, 0x02, 0x6b, 0x00, 0x00, 0x00, + 0x00, 0x04, 0x00, 0x0c, 0x00, 0x00, 0x01, 0xef, 0x02, 0x79, 0x00, 0x28, 0x00, 0x35, 0x00, 0x3a, + 0x00, 0x3e, 0x00, 0x92, 0x40, 0x55, 0x2b, 0x20, 0x0f, 0x00, 0x4d, 0x28, 0x40, 0x17, 0x00, 0x4d, + 0x15, 0x40, 0x17, 0x00, 0x4d, 0x3c, 0x3e, 0x3d, 0x3e, 0xaf, 0x3b, 0x3c, 0x14, 0x3b, 0x3c, 0x3b, + 0x40, 0x1b, 0x20, 0x7c, 0x06, 0x0e, 0x1e, 0x06, 0x14, 0x09, 0x06, 0x06, 0x09, 0x14, 0x03, 0x40, + 0x3d, 0x3f, 0x28, 0x15, 0x3f, 0x08, 0x80, 0x0b, 0x25, 0x80, 0x03, 0x0b, 0x03, 0x1e, 0x03, 0x1e, + 0x0b, 0x03, 0x18, 0x3f, 0x3e, 0x04, 0x3d, 0x0c, 0x3c, 0x0c, 0x3b, 0x04, 0x36, 0x3a, 0x2c, 0x30, + 0x2f, 0x0c, 0x35, 0x29, 0x8d, 0x2e, 0x0c, 0x11, 0x80, 0x18, 0x05, 0x00, 0x3f, 0xed, 0x3f, 0xed, + 0x32, 0x3f, 0xd5, 0x32, 0xd5, 0xc6, 0x3f, 0x3f, 0x3f, 0x3f, 0x11, 0x12, 0x17, 0x39, 0x3d, 0x2f, + 0x18, 0x2f, 0x2f, 0x10, 0xed, 0x10, 0xed, 0x01, 0x10, 0xd4, 0xc6, 0x10, 0xc2, 0x12, 0x17, 0x39, + 0x2f, 0x2f, 0x2f, 0x11, 0x39, 0x33, 0x10, 0xed, 0x32, 0x10, 0xd0, 0x87, 0x2b, 0x87, 0x7d, 0xc4, + 0x31, 0x30, 0x01, 0x2b, 0x2b, 0x2b, 0x13, 0x16, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x23, 0x23, + 0x35, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x27, 0x36, 0x36, 0x33, 0x32, + 0x16, 0x15, 0x14, 0x06, 0x07, 0x16, 0x15, 0x14, 0x0e, 0x02, 0x23, 0x22, 0x26, 0x27, 0x05, 0x15, + 0x33, 0x15, 0x23, 0x15, 0x23, 0x35, 0x23, 0x35, 0x36, 0x36, 0x37, 0x17, 0x06, 0x06, 0x07, 0x33, + 0x13, 0x01, 0x23, 0x01, 0x1e, 0x0b, 0x27, 0x14, 0x17, 0x17, 0x3b, 0x14, 0x16, 0x1a, 0x13, 0x0f, + 0x0b, 0x11, 0x28, 0x09, 0x16, 0x0e, 0x38, 0x1e, 0x34, 0x30, 0x0d, 0x11, 0x2a, 0x13, 0x22, 0x2d, + 0x1b, 0x1c, 0x33, 0x10, 0x01, 0xbf, 0x24, 0x24, 0x50, 0x7c, 0x17, 0x2d, 0x20, 0x18, 0x10, 0x19, + 0x0a, 0x33, 0x57, 0xfe, 0xc3, 0x64, 0x01, 0x3d, 0x01, 0xbd, 0x05, 0x0a, 0x08, 0x0d, 0x1a, 0x39, + 0x0a, 0x0a, 0x09, 0x08, 0x0c, 0x05, 0x36, 0x0b, 0x0e, 0x29, 0x1a, 0x13, 0x1a, 0x0b, 0x14, 0x2b, + 0x17, 0x1e, 0x13, 0x08, 0x09, 0x08, 0x86, 0x94, 0x3f, 0x27, 0x27, 0x2d, 0x2b, 0x4c, 0x2f, 0x40, + 0x17, 0x29, 0x14, 0x02, 0x05, 0xfd, 0x95, 0x02, 0x6b, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x45, + 0xff, 0x56, 0x01, 0xb2, 0x01, 0xd2, 0x00, 0x20, 0x00, 0x32, 0x00, 0x43, 0xb9, 0x00, 0x11, 0xff, + 0xc0, 0x40, 0x13, 0x0d, 0x10, 0x48, 0x11, 0x34, 0x29, 0x71, 0x50, 0x21, 0x60, 0x21, 0x70, 0x21, + 0x03, 0x21, 0x33, 0x0a, 0x70, 0x19, 0xb8, 0xff, 0xc0, 0x40, 0x0f, 0x0b, 0x10, 0x48, 0x19, 0x33, + 0x00, 0x2e, 0x75, 0x24, 0x0b, 0x10, 0x0d, 0x67, 0x14, 0x12, 0x00, 0x3f, 0xfd, 0xc6, 0x3f, 0xfd, + 0xc6, 0x01, 0x10, 0xd6, 0x2b, 0xed, 0x10, 0xde, 0x5d, 0xed, 0x10, 0xc6, 0x2b, 0x31, 0x30, 0x25, + 0x16, 0x15, 0x14, 0x06, 0x07, 0x0e, 0x03, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x17, 0x06, + 0x06, 0x23, 0x22, 0x2e, 0x02, 0x35, 0x34, 0x3e, 0x04, 0x35, 0x27, 0x34, 0x36, 0x33, 0x32, 0x1e, + 0x02, 0x15, 0x14, 0x0e, 0x02, 0x23, 0x22, 0x2e, 0x02, 0x01, 0x51, 0x01, 0x2a, 0x22, 0x0b, 0x17, + 0x12, 0x0b, 0x2a, 0x20, 0x20, 0x3c, 0x23, 0x22, 0x23, 0x5e, 0x2e, 0x39, 0x4a, 0x2a, 0x11, 0x17, + 0x23, 0x28, 0x23, 0x17, 0x23, 0x33, 0x20, 0x10, 0x1e, 0x18, 0x0e, 0x0e, 0x18, 0x1e, 0x10, 0x10, + 0x1e, 0x17, 0x0e, 0xe5, 0x05, 0x0a, 0x28, 0x49, 0x1c, 0x09, 0x12, 0x12, 0x15, 0x0c, 0x1e, 0x1f, + 0x13, 0x11, 0x5e, 0x16, 0x18, 0x1e, 0x2f, 0x37, 0x19, 0x1d, 0x2f, 0x27, 0x23, 0x22, 0x24, 0x16, + 0x9a, 0x27, 0x2c, 0x0b, 0x16, 0x1f, 0x13, 0x13, 0x1f, 0x15, 0x0b, 0x0b, 0x15, 0x1f, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x09, 0x00, 0x00, 0x01, 0xeb, 0x03, 0x3e, 0x02, 0x26, 0x00, 0x24, 0x00, 0x00, + 0x01, 0x07, 0x00, 0x43, 0xff, 0xf0, 0x00, 0x8b, 0x00, 0x13, 0xb9, 0x00, 0x02, 0xff, 0xfc, 0x40, + 0x09, 0x1a, 0x18, 0x04, 0x0b, 0x50, 0x02, 0x07, 0x19, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x09, 0x00, 0x00, 0x01, 0xeb, 0x03, 0x3e, 0x02, 0x26, 0x00, 0x24, 0x00, 0x00, + 0x01, 0x07, 0x00, 0x8f, 0xff, 0xf4, 0x00, 0x8b, 0x00, 0x10, 0x40, 0x0b, 0x02, 0x00, 0x19, 0x17, + 0x04, 0x0b, 0x50, 0x02, 0x07, 0x18, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0x00, 0xff, 0xff, 0x00, 0x09, + 0x00, 0x00, 0x01, 0xeb, 0x03, 0x3e, 0x02, 0x26, 0x00, 0x24, 0x00, 0x00, 0x01, 0x07, 0x00, 0x69, + 0x00, 0x00, 0x00, 0x8b, 0x00, 0x10, 0x40, 0x0b, 0x02, 0x01, 0x1b, 0x17, 0x04, 0x0b, 0x50, 0x02, + 0x07, 0x18, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0x00, 0xff, 0xff, 0x00, 0x09, 0x00, 0x00, 0x01, 0xeb, + 0x03, 0x2b, 0x02, 0x26, 0x00, 0x24, 0x00, 0x00, 0x01, 0x07, 0x00, 0x75, 0xff, 0xff, 0x00, 0x8b, + 0x00, 0x10, 0x40, 0x0b, 0x02, 0x01, 0x25, 0x17, 0x04, 0x0b, 0x50, 0x02, 0x07, 0x24, 0x4f, 0x2b, + 0x2b, 0x34, 0x00, 0x00, 0xff, 0xff, 0x00, 0x09, 0x00, 0x00, 0x01, 0xeb, 0x03, 0x2c, 0x02, 0x26, + 0x00, 0x24, 0x00, 0x00, 0x01, 0x07, 0x00, 0x83, 0x00, 0x00, 0x00, 0x8b, 0x00, 0x17, 0x40, 0x10, + 0x03, 0x02, 0x01, 0x19, 0x2b, 0x04, 0x0b, 0x50, 0x03, 0x07, 0x23, 0x4f, 0x02, 0x07, 0x17, 0x4f, + 0x2b, 0x2b, 0x2b, 0x34, 0x34, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x09, 0x00, 0x00, 0x01, 0xeb, + 0x03, 0x14, 0x00, 0x18, 0x00, 0x23, 0x00, 0x2f, 0x00, 0xb5, 0xb5, 0x22, 0x38, 0x0c, 0x00, 0x4d, + 0x21, 0xb8, 0xff, 0xc0, 0xb3, 0x0c, 0x00, 0x4d, 0x1e, 0xb8, 0xff, 0xe0, 0xb6, 0x0c, 0x00, 0x4d, + 0x34, 0x1d, 0x01, 0x18, 0xb8, 0xff, 0xc0, 0xb3, 0x0c, 0x00, 0x4d, 0x0e, 0xb8, 0xff, 0xe0, 0xb3, + 0x13, 0x00, 0x4d, 0x0e, 0xb8, 0xff, 0xe0, 0xb3, 0x10, 0x00, 0x4d, 0x0d, 0xb8, 0xff, 0xe0, 0xb3, + 0x0c, 0x00, 0x4d, 0x07, 0xb8, 0xff, 0xe0, 0xb4, 0x0b, 0x0c, 0x00, 0x4c, 0x04, 0xb8, 0xff, 0xf0, + 0xb3, 0x0e, 0x00, 0x4d, 0x04, 0xb8, 0xff, 0xc0, 0xb3, 0x0c, 0x00, 0x4d, 0x00, 0xb8, 0xff, 0xc0, + 0x40, 0x31, 0x0c, 0x00, 0x4d, 0x1e, 0x0e, 0x09, 0x11, 0x0a, 0x05, 0x30, 0x2a, 0x07, 0x00, 0x08, + 0x03, 0x1f, 0x05, 0x24, 0x2a, 0x19, 0x24, 0x24, 0x19, 0x2a, 0x03, 0x30, 0x20, 0x06, 0xc0, 0x06, + 0x02, 0x06, 0x31, 0x0b, 0x30, 0x1e, 0x1f, 0x48, 0x09, 0x09, 0x08, 0x08, 0x07, 0x19, 0x0a, 0x0a, + 0x08, 0x07, 0x08, 0x00, 0x3f, 0x3f, 0x3f, 0x12, 0x39, 0x2f, 0x33, 0x10, 0xed, 0x32, 0x01, 0x10, + 0xc6, 0x10, 0xc6, 0x5d, 0x11, 0x17, 0x39, 0x2f, 0x2f, 0x2f, 0x11, 0x17, 0x39, 0x11, 0x12, 0x17, + 0x39, 0x31, 0x30, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x5d, 0x2b, 0x2b, 0x2b, 0x01, + 0x14, 0x06, 0x07, 0x16, 0x12, 0x17, 0x23, 0x27, 0x23, 0x07, 0x23, 0x36, 0x12, 0x37, 0x26, 0x26, + 0x35, 0x34, 0x3e, 0x02, 0x33, 0x32, 0x16, 0x07, 0x0e, 0x03, 0x07, 0x33, 0x2e, 0x03, 0x37, 0x34, + 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x01, 0x63, 0x12, 0x0f, 0x2b, 0x56, + 0x28, 0x84, 0x1d, 0xa5, 0x1c, 0x80, 0x2b, 0x57, 0x29, 0x10, 0x13, 0x11, 0x1d, 0x26, 0x14, 0x2b, + 0x3f, 0x6a, 0x0a, 0x11, 0x0f, 0x0d, 0x06, 0x79, 0x06, 0x0c, 0x0f, 0x11, 0x1f, 0x18, 0x11, 0x0f, + 0x19, 0x19, 0x0f, 0x11, 0x18, 0x02, 0xad, 0x1a, 0x26, 0x0e, 0x86, 0xfe, 0xd5, 0xae, 0x8f, 0x8f, + 0xb2, 0x01, 0x27, 0x84, 0x0d, 0x28, 0x1b, 0x19, 0x27, 0x1a, 0x0d, 0x34, 0xed, 0x23, 0x3f, 0x3d, + 0x3e, 0x21, 0x21, 0x3e, 0x3d, 0x3f, 0xdd, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x00, 0x00, + 0x00, 0x02, 0x00, 0x09, 0x00, 0x00, 0x01, 0xeb, 0x02, 0x6b, 0x00, 0x13, 0x00, 0x18, 0x00, 0x9c, + 0xb9, 0x00, 0x16, 0xff, 0xc0, 0x40, 0x0a, 0x09, 0x0c, 0x00, 0x4c, 0x12, 0x40, 0x0b, 0x00, 0x4d, + 0x0e, 0xb8, 0xff, 0xc0, 0xb4, 0x0c, 0x0d, 0x00, 0x4c, 0x0d, 0xb8, 0xff, 0xc0, 0x40, 0x49, 0x0c, + 0x0d, 0x00, 0x4c, 0x09, 0x40, 0x0b, 0x00, 0x4d, 0x17, 0x01, 0x02, 0x03, 0x03, 0x14, 0x13, 0x00, + 0x10, 0x0e, 0x0d, 0x0a, 0x14, 0x18, 0x00, 0x10, 0x0f, 0x0c, 0x0b, 0x0d, 0x0a, 0x0a, 0x0d, 0x0b, + 0x0c, 0x0f, 0x10, 0x00, 0x18, 0x14, 0x09, 0x12, 0x08, 0x03, 0x19, 0x0f, 0x12, 0x01, 0x12, 0x18, + 0x48, 0x14, 0x00, 0x00, 0x08, 0x13, 0x08, 0x0e, 0x48, 0x0d, 0x0d, 0x09, 0x11, 0x48, 0x12, 0x08, + 0x0a, 0x48, 0x09, 0x02, 0x08, 0x02, 0x02, 0x08, 0x00, 0x3f, 0x3f, 0x3f, 0xed, 0x3f, 0xed, 0x12, + 0x39, 0x2f, 0xed, 0x3f, 0x12, 0x39, 0x2f, 0x39, 0xed, 0x01, 0x2f, 0x5d, 0x10, 0xd6, 0xc5, 0x12, + 0x17, 0x39, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x11, 0x12, 0x39, 0x11, 0x12, + 0x39, 0x11, 0x12, 0x17, 0x39, 0x31, 0x30, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x37, 0x23, 0x07, 0x23, + 0x3e, 0x03, 0x37, 0x21, 0x15, 0x23, 0x15, 0x33, 0x15, 0x23, 0x15, 0x33, 0x15, 0x23, 0x11, 0x06, + 0x06, 0x07, 0x33, 0xff, 0x5b, 0x1b, 0x80, 0x1a, 0x2c, 0x2c, 0x2e, 0x1d, 0x01, 0x18, 0x6f, 0x58, + 0x58, 0x7c, 0xec, 0x11, 0x22, 0x12, 0x45, 0x8f, 0x8f, 0x6a, 0xa1, 0x8c, 0x85, 0x4f, 0x66, 0x8a, + 0x66, 0xaf, 0x66, 0x02, 0x18, 0x45, 0x8b, 0x53, 0x00, 0x01, 0x00, 0x1b, 0xff, 0x56, 0x01, 0xd5, + 0x02, 0x79, 0x00, 0x36, 0x00, 0x4d, 0x40, 0x2c, 0x32, 0x20, 0x0d, 0x0e, 0x00, 0x4c, 0x32, 0x40, + 0x0b, 0x00, 0x4d, 0x24, 0x23, 0x33, 0x38, 0x32, 0x38, 0x2c, 0x46, 0x19, 0x37, 0x03, 0x10, 0x0a, + 0x37, 0x32, 0x4a, 0x33, 0x36, 0x09, 0x24, 0x4a, 0x23, 0x27, 0x4a, 0x1e, 0x03, 0x2f, 0x4a, 0x16, + 0x09, 0x0e, 0x08, 0x92, 0x00, 0x3f, 0xc5, 0x3f, 0xed, 0x3f, 0xed, 0xd5, 0xed, 0x3f, 0xd5, 0xe9, + 0x01, 0x10, 0xd6, 0xdc, 0xc5, 0x10, 0xd6, 0xed, 0x11, 0x33, 0x10, 0xd6, 0xc6, 0x32, 0x31, 0x30, + 0x00, 0x2b, 0x2b, 0x05, 0x16, 0x16, 0x15, 0x14, 0x0e, 0x02, 0x23, 0x22, 0x27, 0x37, 0x16, 0x16, + 0x33, 0x32, 0x35, 0x34, 0x27, 0x27, 0x36, 0x36, 0x37, 0x26, 0x26, 0x35, 0x34, 0x3e, 0x02, 0x33, + 0x32, 0x1e, 0x02, 0x17, 0x07, 0x26, 0x26, 0x23, 0x22, 0x0e, 0x02, 0x15, 0x14, 0x16, 0x33, 0x32, + 0x36, 0x37, 0x17, 0x06, 0x06, 0x07, 0x01, 0x2c, 0x21, 0x1a, 0x15, 0x21, 0x2c, 0x16, 0x2d, 0x23, + 0x0d, 0x06, 0x22, 0x10, 0x29, 0x24, 0x14, 0x02, 0x08, 0x04, 0x61, 0x67, 0x2a, 0x4b, 0x67, 0x3d, + 0x21, 0x35, 0x28, 0x1b, 0x07, 0x20, 0x17, 0x41, 0x2a, 0x1d, 0x37, 0x2b, 0x1b, 0x49, 0x53, 0x30, + 0x3f, 0x13, 0x1f, 0x19, 0x55, 0x37, 0x18, 0x0a, 0x27, 0x12, 0x17, 0x1e, 0x12, 0x08, 0x0b, 0x3f, + 0x02, 0x07, 0x19, 0x13, 0x0c, 0x06, 0x09, 0x14, 0x08, 0x15, 0xa1, 0x86, 0x4d, 0x78, 0x53, 0x2b, + 0x0b, 0x0e, 0x10, 0x04, 0x62, 0x0f, 0x15, 0x15, 0x31, 0x52, 0x3d, 0x6a, 0x71, 0x16, 0x0b, 0x61, + 0x0f, 0x1a, 0x02, 0x00, 0xff, 0xff, 0x00, 0x3f, 0x00, 0x00, 0x01, 0xcc, 0x03, 0x3e, 0x02, 0x26, + 0x00, 0x28, 0x00, 0x00, 0x01, 0x07, 0x00, 0x43, 0xff, 0xf0, 0x00, 0x8b, 0x00, 0x13, 0xb9, 0x00, + 0x01, 0xff, 0xf0, 0x40, 0x09, 0x0f, 0x0d, 0x00, 0x0a, 0x50, 0x01, 0x01, 0x0e, 0x4f, 0x2b, 0x2b, + 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x3f, 0x00, 0x00, 0x01, 0xcc, 0x03, 0x3e, 0x02, 0x26, + 0x00, 0x28, 0x00, 0x00, 0x01, 0x07, 0x00, 0x8f, 0xff, 0xf4, 0x00, 0x8b, 0x00, 0x13, 0xb9, 0x00, + 0x01, 0xff, 0xf4, 0x40, 0x09, 0x0e, 0x0c, 0x00, 0x0a, 0x50, 0x01, 0x01, 0x0d, 0x4f, 0x2b, 0x2b, + 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x3f, 0x00, 0x00, 0x01, 0xcc, 0x03, 0x3e, 0x02, 0x26, + 0x00, 0x28, 0x00, 0x00, 0x01, 0x07, 0x00, 0x69, 0x00, 0x00, 0x00, 0x8b, 0x00, 0x13, 0xb9, 0x00, + 0x01, 0xff, 0xf6, 0x40, 0x09, 0x10, 0x0c, 0x00, 0x0a, 0x50, 0x01, 0x01, 0x0d, 0x4f, 0x2b, 0x2b, + 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x3f, 0x00, 0x00, 0x01, 0xcc, 0x03, 0x2c, 0x02, 0x26, + 0x00, 0x28, 0x00, 0x00, 0x01, 0x07, 0x00, 0x83, 0x00, 0x00, 0x00, 0x8b, 0x00, 0x1a, 0xb1, 0x02, + 0x01, 0xb8, 0xff, 0xf6, 0x40, 0x0d, 0x0e, 0x20, 0x00, 0x0a, 0x50, 0x02, 0x01, 0x18, 0x4f, 0x01, + 0x01, 0x0c, 0x4f, 0x2b, 0x2b, 0x2b, 0x34, 0x34, 0xff, 0xff, 0x00, 0x36, 0x00, 0x00, 0x01, 0xbf, + 0x03, 0x3e, 0x02, 0x26, 0x00, 0x2c, 0x00, 0x00, 0x01, 0x07, 0x00, 0x43, 0xff, 0xf0, 0x00, 0x8b, + 0x00, 0x13, 0xb9, 0x00, 0x01, 0xff, 0xfb, 0x40, 0x09, 0x0f, 0x0d, 0x00, 0x06, 0x50, 0x01, 0x05, + 0x0e, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x36, 0x00, 0x00, 0x01, 0xbf, + 0x03, 0x3e, 0x02, 0x26, 0x00, 0x2c, 0x00, 0x00, 0x01, 0x07, 0x00, 0x8f, 0xff, 0xf4, 0x00, 0x8b, + 0x00, 0x13, 0xb9, 0x00, 0x01, 0xff, 0xff, 0x40, 0x09, 0x0e, 0x0c, 0x00, 0x06, 0x50, 0x01, 0x05, + 0x0d, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x36, 0x00, 0x00, 0x01, 0xbf, + 0x03, 0x3e, 0x02, 0x26, 0x00, 0x2c, 0x00, 0x00, 0x01, 0x07, 0x00, 0x69, 0x00, 0x00, 0x00, 0x8b, + 0x00, 0x10, 0x40, 0x0b, 0x01, 0x00, 0x10, 0x0c, 0x00, 0x06, 0x50, 0x01, 0x05, 0x0d, 0x4f, 0x2b, + 0x2b, 0x34, 0x00, 0x00, 0xff, 0xff, 0x00, 0x36, 0x00, 0x00, 0x01, 0xbf, 0x03, 0x2c, 0x02, 0x26, + 0x00, 0x2c, 0x00, 0x00, 0x01, 0x07, 0x00, 0x83, 0x00, 0x00, 0x00, 0x8b, 0x00, 0x17, 0x40, 0x10, + 0x02, 0x01, 0x01, 0x0e, 0x20, 0x00, 0x06, 0x50, 0x02, 0x05, 0x18, 0x4f, 0x01, 0x05, 0x0c, 0x4f, + 0x2b, 0x2b, 0x2b, 0x34, 0x34, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x12, 0xff, 0xf8, 0x01, 0xd9, + 0x02, 0x72, 0x00, 0x14, 0x00, 0x29, 0x00, 0x49, 0x40, 0x2b, 0x2f, 0x21, 0x3f, 0x21, 0x02, 0x21, + 0x46, 0x80, 0x00, 0x90, 0x00, 0x02, 0x00, 0x2b, 0x16, 0x18, 0x29, 0x44, 0x08, 0x0f, 0x0d, 0x01, + 0x0d, 0x0b, 0x2a, 0x18, 0x09, 0x15, 0x0c, 0x0c, 0x15, 0x09, 0x18, 0x04, 0x05, 0x26, 0x4a, 0x10, + 0x02, 0x1c, 0x4a, 0x05, 0x09, 0x00, 0x3f, 0xed, 0x3f, 0xed, 0x12, 0x17, 0x39, 0x2f, 0x2f, 0x2f, + 0x2f, 0x01, 0x10, 0xd6, 0xd6, 0x5d, 0x32, 0xfd, 0xd0, 0xc5, 0x10, 0xd6, 0x5d, 0xed, 0x5d, 0x31, + 0x30, 0x01, 0x14, 0x0e, 0x02, 0x23, 0x22, 0x26, 0x27, 0x11, 0x23, 0x35, 0x33, 0x35, 0x36, 0x36, + 0x33, 0x32, 0x1e, 0x02, 0x05, 0x33, 0x15, 0x23, 0x15, 0x16, 0x32, 0x33, 0x32, 0x3e, 0x02, 0x35, + 0x34, 0x2e, 0x02, 0x23, 0x22, 0x06, 0x07, 0x01, 0xd9, 0x29, 0x49, 0x64, 0x3c, 0x20, 0x3d, 0x23, + 0x35, 0x35, 0x2a, 0x46, 0x20, 0x3a, 0x60, 0x43, 0x25, 0xfe, 0xea, 0x4c, 0x4c, 0x04, 0x09, 0x05, + 0x26, 0x34, 0x1f, 0x0e, 0x0a, 0x1b, 0x30, 0x25, 0x08, 0x10, 0x07, 0x01, 0x36, 0x56, 0x79, 0x4c, + 0x23, 0x07, 0x08, 0x01, 0x07, 0x66, 0xef, 0x09, 0x06, 0x24, 0x4d, 0x77, 0x16, 0x66, 0xaa, 0x01, + 0x20, 0x38, 0x4d, 0x2e, 0x28, 0x4c, 0x3a, 0x23, 0x01, 0x02, 0x00, 0x00, 0xff, 0xff, 0x00, 0x2e, + 0x00, 0x00, 0x01, 0xc6, 0x03, 0x2b, 0x02, 0x26, 0x00, 0x31, 0x00, 0x00, 0x01, 0x07, 0x00, 0x75, + 0xff, 0xff, 0x00, 0x8b, 0x00, 0x10, 0x40, 0x0b, 0x01, 0x01, 0x1e, 0x10, 0x05, 0x0e, 0x50, 0x01, + 0x06, 0x1d, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0x00, 0xff, 0xff, 0x00, 0x1b, 0xff, 0xf3, 0x01, 0xd9, + 0x03, 0x3e, 0x02, 0x26, 0x00, 0x32, 0x00, 0x00, 0x01, 0x07, 0x00, 0x43, 0xff, 0xf0, 0x00, 0x8b, + 0x00, 0x13, 0xb9, 0x00, 0x02, 0xff, 0xfc, 0x40, 0x09, 0x23, 0x21, 0x14, 0x19, 0x50, 0x02, 0x16, + 0x22, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x1b, 0xff, 0xf3, 0x01, 0xd9, + 0x03, 0x3e, 0x02, 0x26, 0x00, 0x32, 0x00, 0x00, 0x01, 0x07, 0x00, 0x8f, 0xff, 0xf4, 0x00, 0x8b, + 0x00, 0x10, 0x40, 0x0b, 0x02, 0x00, 0x22, 0x20, 0x14, 0x19, 0x50, 0x02, 0x16, 0x21, 0x4f, 0x2b, + 0x2b, 0x34, 0x00, 0x00, 0xff, 0xff, 0x00, 0x1b, 0xff, 0xf3, 0x01, 0xd9, 0x03, 0x3e, 0x02, 0x26, + 0x00, 0x32, 0x00, 0x00, 0x01, 0x07, 0x00, 0x69, 0x00, 0x00, 0x00, 0x8b, 0x00, 0x10, 0x40, 0x0b, + 0x02, 0x01, 0x24, 0x20, 0x14, 0x19, 0x50, 0x02, 0x16, 0x21, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x1b, 0xff, 0xf3, 0x01, 0xd9, 0x03, 0x2b, 0x02, 0x26, 0x00, 0x32, 0x00, 0x00, + 0x01, 0x07, 0x00, 0x75, 0xff, 0xff, 0x00, 0x8b, 0x00, 0x10, 0x40, 0x0b, 0x02, 0x01, 0x2e, 0x20, + 0x14, 0x19, 0x50, 0x02, 0x16, 0x2d, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0x00, 0xff, 0xff, 0x00, 0x1b, + 0xff, 0xf3, 0x01, 0xd9, 0x03, 0x2c, 0x02, 0x26, 0x00, 0x32, 0x00, 0x00, 0x01, 0x07, 0x00, 0x83, + 0x00, 0x00, 0x00, 0x8b, 0x00, 0x17, 0x40, 0x10, 0x03, 0x02, 0x01, 0x22, 0x34, 0x14, 0x19, 0x50, + 0x03, 0x16, 0x2c, 0x4f, 0x02, 0x16, 0x20, 0x4f, 0x2b, 0x2b, 0x2b, 0x34, 0x34, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x3c, 0x00, 0x46, 0x01, 0xc2, 0x01, 0xcc, 0x00, 0x0b, 0x00, 0x74, 0xb9, 0x00, + 0x06, 0xff, 0xe0, 0xb3, 0x0f, 0x00, 0x4d, 0x0b, 0xb8, 0xff, 0xf0, 0x40, 0x09, 0x0f, 0x00, 0x4d, + 0x0a, 0x08, 0x0f, 0x00, 0x4d, 0x06, 0xb8, 0xff, 0xf0, 0xb3, 0x13, 0x00, 0x4d, 0x06, 0xb8, 0xff, + 0xf8, 0xb4, 0x11, 0x12, 0x00, 0x4c, 0x06, 0xb8, 0xff, 0xf0, 0x40, 0x21, 0x10, 0x00, 0x4d, 0xb7, + 0x06, 0x01, 0x03, 0x01, 0x0d, 0x09, 0x07, 0x0c, 0x01, 0x09, 0x0a, 0x02, 0x08, 0x0b, 0x06, 0x04, + 0x07, 0x03, 0x04, 0x05, 0x0b, 0x05, 0x0b, 0x05, 0x0d, 0x0a, 0x06, 0x00, 0x06, 0x00, 0x3f, 0x3f, + 0x12, 0x39, 0x39, 0x3d, 0x2f, 0x2f, 0x11, 0x17, 0x39, 0x12, 0x39, 0x39, 0x11, 0x39, 0x39, 0x01, + 0x18, 0x10, 0xc6, 0xc6, 0x10, 0xc6, 0xc6, 0x31, 0x30, 0x00, 0x5d, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, + 0x01, 0x2b, 0x01, 0x17, 0x07, 0x17, 0x07, 0x27, 0x07, 0x27, 0x37, 0x27, 0x37, 0x17, 0x01, 0x7b, + 0x46, 0x7d, 0x7e, 0x47, 0x7d, 0x7d, 0x45, 0x7d, 0x7d, 0x45, 0x7d, 0x01, 0xcb, 0x47, 0x7c, 0x7d, + 0x45, 0x7e, 0x7e, 0x44, 0x7d, 0x7d, 0x48, 0x7d, 0x00, 0x03, 0x00, 0x1b, 0xff, 0xd8, 0x01, 0xd9, + 0x02, 0x93, 0x00, 0x13, 0x00, 0x1e, 0x00, 0x28, 0x00, 0x8e, 0xb9, 0x00, 0x11, 0xff, 0xe0, 0x40, + 0x0a, 0x17, 0x00, 0x4d, 0x07, 0x20, 0x11, 0x12, 0x00, 0x4c, 0x10, 0xb8, 0xff, 0xe0, 0x40, 0x46, + 0x0d, 0x0e, 0x00, 0x4c, 0x14, 0x46, 0x5f, 0x0a, 0x01, 0x0a, 0x40, 0x09, 0x0c, 0x48, 0x0a, 0x2a, + 0x0f, 0x10, 0x12, 0x11, 0x04, 0x29, 0x18, 0x21, 0x22, 0x06, 0x05, 0x07, 0x08, 0x2a, 0x21, 0x22, + 0x17, 0x05, 0x08, 0x08, 0x05, 0x17, 0x22, 0x21, 0x05, 0x29, 0x2a, 0x1f, 0x46, 0x00, 0x29, 0x11, + 0x08, 0x10, 0x91, 0x22, 0x17, 0x18, 0x21, 0x17, 0x03, 0x24, 0x1a, 0x4a, 0x0d, 0x09, 0x07, 0x02, + 0x06, 0x90, 0x24, 0x4a, 0x03, 0x03, 0x00, 0x3f, 0xed, 0x3f, 0x3f, 0x3f, 0xed, 0x11, 0x17, 0x39, + 0x10, 0xc5, 0x3f, 0x3f, 0x01, 0x10, 0xd6, 0xed, 0x11, 0x12, 0x17, 0x39, 0x2f, 0x2f, 0x2f, 0x2f, + 0x2f, 0x11, 0x12, 0x39, 0x11, 0x39, 0x11, 0x12, 0x39, 0x11, 0x17, 0x39, 0x10, 0xde, 0x2b, 0x5d, + 0xed, 0x31, 0x30, 0x00, 0x2b, 0x01, 0x2b, 0x2b, 0x13, 0x34, 0x36, 0x33, 0x32, 0x17, 0x37, 0x17, + 0x07, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x27, 0x07, 0x27, 0x37, 0x26, 0x25, 0x34, 0x26, 0x27, + 0x03, 0x16, 0x33, 0x32, 0x3e, 0x02, 0x27, 0x14, 0x17, 0x13, 0x26, 0x23, 0x22, 0x0e, 0x02, 0x1b, + 0x76, 0x69, 0x37, 0x27, 0x17, 0x50, 0x22, 0x3c, 0x74, 0x6a, 0x39, 0x2c, 0x17, 0x4f, 0x22, 0x37, + 0x01, 0x41, 0x03, 0x02, 0x91, 0x16, 0x1e, 0x1f, 0x27, 0x15, 0x07, 0xc4, 0x03, 0x8d, 0x13, 0x1b, + 0x20, 0x26, 0x15, 0x07, 0x01, 0x34, 0xa0, 0xa3, 0x13, 0x2f, 0x28, 0x43, 0x53, 0xa1, 0xa0, 0xa3, + 0x17, 0x30, 0x28, 0x47, 0x52, 0x9b, 0x1a, 0x31, 0x16, 0xfe, 0xd8, 0x11, 0x22, 0x3b, 0x4e, 0x2d, + 0x30, 0x27, 0x01, 0x22, 0x0d, 0x22, 0x3b, 0x4e, 0xff, 0xff, 0x00, 0x27, 0xff, 0xf3, 0x01, 0xcd, + 0x03, 0x3e, 0x02, 0x26, 0x00, 0x38, 0x00, 0x00, 0x01, 0x07, 0x00, 0x43, 0xff, 0xe7, 0x00, 0x8b, + 0x00, 0x13, 0xb9, 0x00, 0x01, 0xff, 0xf3, 0x40, 0x09, 0x1d, 0x1b, 0x04, 0x14, 0x50, 0x01, 0x06, + 0x1c, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x27, 0xff, 0xf3, 0x01, 0xcd, + 0x03, 0x3e, 0x02, 0x26, 0x00, 0x38, 0x00, 0x00, 0x01, 0x07, 0x00, 0x8f, 0x00, 0x04, 0x00, 0x8b, + 0x00, 0x10, 0x40, 0x0b, 0x01, 0x0f, 0x1c, 0x1a, 0x04, 0x14, 0x50, 0x01, 0x06, 0x1b, 0x4f, 0x2b, + 0x2b, 0x34, 0x00, 0x00, 0xff, 0xff, 0x00, 0x27, 0xff, 0xf3, 0x01, 0xcd, 0x03, 0x3e, 0x02, 0x26, + 0x00, 0x38, 0x00, 0x00, 0x01, 0x07, 0x00, 0x69, 0x00, 0x00, 0x00, 0x8b, 0x00, 0x10, 0x40, 0x0b, + 0x01, 0x01, 0x1e, 0x1a, 0x04, 0x14, 0x50, 0x01, 0x06, 0x1b, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x27, 0xff, 0xf3, 0x01, 0xcd, 0x03, 0x2c, 0x02, 0x26, 0x00, 0x38, 0x00, 0x00, + 0x01, 0x07, 0x00, 0x83, 0x00, 0x00, 0x00, 0x8b, 0x00, 0x17, 0x40, 0x10, 0x02, 0x01, 0x01, 0x1c, + 0x2e, 0x04, 0x14, 0x50, 0x02, 0x06, 0x26, 0x4f, 0x01, 0x06, 0x1a, 0x4f, 0x2b, 0x2b, 0x2b, 0x34, + 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x0d, 0x00, 0x00, 0x01, 0xe8, 0x03, 0x3e, 0x02, 0x26, + 0x00, 0x3c, 0x00, 0x00, 0x01, 0x07, 0x00, 0x8f, 0x00, 0x04, 0x00, 0x8b, 0x00, 0x10, 0x40, 0x0b, + 0x01, 0x0f, 0x17, 0x15, 0x11, 0x06, 0x50, 0x01, 0x05, 0x16, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0x00, + 0x00, 0x02, 0x00, 0x36, 0x00, 0x00, 0x01, 0xd8, 0x02, 0x6b, 0x00, 0x0e, 0x00, 0x19, 0x00, 0x44, + 0x40, 0x28, 0x17, 0x53, 0x1f, 0x03, 0x01, 0x03, 0x1b, 0x12, 0x07, 0x0b, 0x51, 0x20, 0x0a, 0x30, + 0x0a, 0x50, 0x0a, 0x03, 0x0a, 0x1a, 0x12, 0x57, 0x0c, 0x07, 0x57, 0x13, 0x5f, 0x13, 0x6f, 0x13, + 0x02, 0x0c, 0x13, 0x0c, 0x13, 0x08, 0x0a, 0x02, 0x08, 0x08, 0x00, 0x3f, 0x3f, 0x12, 0x39, 0x39, + 0x2f, 0x2f, 0x5d, 0x10, 0xed, 0x10, 0xed, 0x01, 0x10, 0xd6, 0x5d, 0xed, 0x32, 0x32, 0x10, 0xde, + 0x5d, 0xed, 0x31, 0x30, 0x13, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x23, 0x15, 0x23, 0x11, 0x33, + 0x15, 0x36, 0x32, 0x17, 0x22, 0x06, 0x07, 0x15, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0xe0, 0x77, + 0x81, 0x82, 0x79, 0x2c, 0x7b, 0x7b, 0x0d, 0x17, 0x19, 0x0b, 0x27, 0x0b, 0x32, 0x3b, 0x3c, 0x3b, + 0x02, 0x13, 0x66, 0x69, 0x68, 0x6a, 0x72, 0x02, 0x6b, 0x59, 0x01, 0x6b, 0x01, 0x02, 0xc8, 0x36, + 0x32, 0x30, 0x33, 0x00, 0x00, 0x01, 0x00, 0x1f, 0xff, 0xf5, 0x01, 0xec, 0x02, 0xb5, 0x00, 0x36, + 0x00, 0x7e, 0x40, 0x2d, 0x21, 0x40, 0x0b, 0x0c, 0x00, 0x4c, 0x20, 0x40, 0x0b, 0x0c, 0x00, 0x4c, + 0x1f, 0x40, 0x0b, 0x0c, 0x00, 0x4c, 0x1e, 0x40, 0x0b, 0x0c, 0x00, 0x4c, 0x1c, 0x40, 0x0c, 0x00, + 0x4d, 0x14, 0x40, 0x0b, 0x00, 0x4d, 0x13, 0x40, 0x0b, 0x00, 0x4d, 0x07, 0x40, 0x0c, 0x00, 0x4d, + 0x13, 0xb8, 0xff, 0xc0, 0x40, 0x27, 0x0c, 0x0e, 0x00, 0x4c, 0x1f, 0x53, 0x05, 0x0c, 0x24, 0x53, + 0x00, 0x19, 0x53, 0x0c, 0x38, 0x12, 0x40, 0x0a, 0x00, 0x4d, 0x0f, 0x12, 0x01, 0x12, 0x2a, 0x51, + 0x2d, 0x37, 0x27, 0x57, 0x32, 0x00, 0x2b, 0x06, 0x13, 0x16, 0x57, 0x0f, 0x07, 0x00, 0x3f, 0xfd, + 0xce, 0x3f, 0x3f, 0xed, 0x01, 0x10, 0xd6, 0xfd, 0xc6, 0x5d, 0x2b, 0x10, 0xd6, 0xed, 0xd4, 0xed, + 0x10, 0xd4, 0xed, 0x31, 0x30, 0x00, 0x2b, 0x01, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, + 0x01, 0x14, 0x0e, 0x02, 0x15, 0x14, 0x1e, 0x04, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x27, 0x37, + 0x16, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x27, 0x26, 0x26, 0x35, 0x34, 0x3e, 0x02, 0x35, + 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x11, 0x23, 0x11, 0x34, 0x3e, 0x02, 0x33, 0x32, 0x1e, 0x02, + 0x01, 0x98, 0x15, 0x18, 0x15, 0x16, 0x22, 0x26, 0x22, 0x16, 0x4d, 0x5e, 0x2f, 0x37, 0x11, 0x16, + 0x11, 0x33, 0x15, 0x1b, 0x1b, 0x2b, 0x22, 0x2d, 0x18, 0x16, 0x1a, 0x16, 0x20, 0x1d, 0x26, 0x26, + 0x7b, 0x16, 0x30, 0x4a, 0x34, 0x32, 0x45, 0x2b, 0x13, 0x02, 0x21, 0x2b, 0x31, 0x23, 0x22, 0x1d, + 0x15, 0x1d, 0x19, 0x18, 0x1f, 0x2d, 0x20, 0x4d, 0x52, 0x11, 0x08, 0x66, 0x08, 0x0f, 0x1d, 0x18, + 0x18, 0x24, 0x11, 0x18, 0x3b, 0x20, 0x23, 0x2c, 0x25, 0x2a, 0x22, 0x1d, 0x1d, 0x3a, 0x33, 0xfe, + 0x21, 0x01, 0xdc, 0x2f, 0x50, 0x3a, 0x20, 0x18, 0x29, 0x35, 0x00, 0x00, 0xff, 0xff, 0x00, 0x2c, + 0xff, 0xf5, 0x01, 0xb9, 0x02, 0xb3, 0x02, 0x26, 0x00, 0x44, 0x00, 0x00, 0x01, 0x06, 0x00, 0x43, + 0xef, 0x00, 0x00, 0x10, 0x40, 0x0b, 0x02, 0x02, 0x32, 0x30, 0x1c, 0x13, 0x50, 0x02, 0x0f, 0x31, + 0x4f, 0x2b, 0x2b, 0x34, 0xff, 0xff, 0x00, 0x2c, 0xff, 0xf5, 0x01, 0xb9, 0x02, 0xb3, 0x02, 0x26, + 0x00, 0x44, 0x00, 0x00, 0x01, 0x06, 0x00, 0x8f, 0x00, 0x00, 0x00, 0x10, 0x40, 0x0b, 0x02, 0x13, + 0x31, 0x2f, 0x1c, 0x13, 0x50, 0x02, 0x0f, 0x30, 0x4f, 0x2b, 0x2b, 0x34, 0xff, 0xff, 0x00, 0x2c, + 0xff, 0xf5, 0x01, 0xb9, 0x02, 0xb3, 0x02, 0x26, 0x00, 0x44, 0x00, 0x00, 0x01, 0x06, 0x00, 0x69, + 0x00, 0x00, 0x00, 0x10, 0x40, 0x0b, 0x02, 0x08, 0x33, 0x2f, 0x1c, 0x13, 0x50, 0x02, 0x0f, 0x30, + 0x4f, 0x2b, 0x2b, 0x34, 0xff, 0xff, 0x00, 0x2c, 0xff, 0xf5, 0x01, 0xb9, 0x02, 0xa0, 0x02, 0x26, + 0x00, 0x44, 0x00, 0x00, 0x01, 0x06, 0x00, 0x75, 0x00, 0x00, 0x00, 0x10, 0x40, 0x0b, 0x02, 0x09, + 0x3d, 0x2f, 0x1c, 0x13, 0x50, 0x02, 0x0f, 0x3c, 0x4f, 0x2b, 0x2b, 0x34, 0xff, 0xff, 0x00, 0x2c, + 0xff, 0xf5, 0x01, 0xb9, 0x02, 0xa1, 0x02, 0x26, 0x00, 0x44, 0x00, 0x00, 0x01, 0x06, 0x00, 0x83, + 0x00, 0x00, 0x00, 0x17, 0x40, 0x10, 0x03, 0x02, 0x09, 0x31, 0x43, 0x1c, 0x13, 0x50, 0x03, 0x0f, + 0x3b, 0x4f, 0x02, 0x0f, 0x2f, 0x4f, 0x2b, 0x2b, 0x2b, 0x34, 0x34, 0x00, 0xff, 0xff, 0x00, 0x2c, + 0xff, 0xf5, 0x01, 0xb9, 0x02, 0xc3, 0x02, 0x26, 0x00, 0x44, 0x00, 0x00, 0x01, 0x06, 0x01, 0x63, + 0x00, 0x00, 0x00, 0x14, 0x40, 0x0d, 0x03, 0x02, 0x07, 0x36, 0x2f, 0x1c, 0x13, 0x50, 0x03, 0x02, + 0x0f, 0x32, 0x4f, 0x2b, 0x34, 0x2b, 0x34, 0x34, 0x00, 0x03, 0x00, 0x17, 0xff, 0xf5, 0x01, 0xe8, + 0x01, 0xe2, 0x00, 0x36, 0x00, 0x44, 0x00, 0x4f, 0x00, 0x8e, 0xb5, 0x4d, 0x20, 0x0b, 0x00, 0x4d, + 0x42, 0xb8, 0xff, 0xe0, 0xb6, 0x1a, 0x00, 0x4d, 0x04, 0x42, 0x01, 0x2d, 0xb8, 0xff, 0xe0, 0xb3, + 0x17, 0x00, 0x4d, 0x0a, 0xb8, 0xff, 0x60, 0x40, 0x43, 0x0d, 0x00, 0x4d, 0x2f, 0x40, 0x0d, 0x00, + 0x4d, 0x0b, 0x40, 0x0d, 0x00, 0x4d, 0x20, 0x4a, 0x30, 0x4a, 0x02, 0x4a, 0x52, 0x2c, 0x2c, 0x50, + 0x51, 0x0e, 0x18, 0x51, 0x3d, 0x52, 0x34, 0x26, 0x50, 0x40, 0x57, 0x21, 0x07, 0x30, 0x3a, 0x01, + 0x30, 0x0f, 0x01, 0x29, 0x4a, 0x3a, 0x0f, 0x0f, 0x3a, 0x4a, 0x29, 0x04, 0x06, 0x14, 0x57, 0x1b, + 0x07, 0x45, 0x57, 0x06, 0x0b, 0x4f, 0x30, 0x01, 0x30, 0x57, 0x00, 0x0b, 0x00, 0x3f, 0xed, 0x5d, + 0x3f, 0xed, 0x3f, 0xed, 0x12, 0x17, 0x39, 0x2f, 0x2f, 0x2f, 0x2f, 0x5d, 0x5d, 0x3f, 0xed, 0x01, + 0x10, 0xd6, 0xc4, 0xed, 0x10, 0xd6, 0xc6, 0x11, 0x12, 0x39, 0x10, 0xed, 0x5d, 0x31, 0x30, 0x00, + 0x2b, 0x2b, 0x01, 0x2b, 0x2b, 0x71, 0x2b, 0x2b, 0x13, 0x32, 0x16, 0x17, 0x36, 0x36, 0x33, 0x32, + 0x1e, 0x02, 0x15, 0x14, 0x14, 0x07, 0x23, 0x1e, 0x03, 0x33, 0x32, 0x36, 0x37, 0x17, 0x06, 0x06, + 0x23, 0x22, 0x26, 0x27, 0x06, 0x06, 0x23, 0x22, 0x2e, 0x02, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, + 0x17, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x27, 0x36, 0x36, 0x13, 0x26, 0x26, 0x23, 0x22, + 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x37, 0x26, 0x26, 0x37, 0x22, 0x0e, 0x02, 0x15, 0x33, 0x34, + 0x2e, 0x02, 0xa3, 0x1f, 0x37, 0x15, 0x11, 0x2a, 0x19, 0x1d, 0x31, 0x24, 0x14, 0x02, 0xb3, 0x01, + 0x0e, 0x16, 0x1c, 0x10, 0x12, 0x23, 0x0e, 0x12, 0x17, 0x2d, 0x1e, 0x23, 0x32, 0x11, 0x17, 0x3b, + 0x1d, 0x22, 0x34, 0x23, 0x12, 0x4d, 0x3c, 0x0d, 0x1a, 0x0e, 0x1f, 0x1b, 0x11, 0x27, 0x17, 0x11, + 0x1a, 0x34, 0x4c, 0x09, 0x13, 0x08, 0x1a, 0x21, 0x1c, 0x1b, 0x17, 0x1a, 0x06, 0x03, 0x8d, 0x0d, + 0x11, 0x0b, 0x05, 0x58, 0x04, 0x09, 0x10, 0x01, 0xe2, 0x19, 0x1d, 0x1a, 0x1c, 0x18, 0x36, 0x58, + 0x40, 0x0c, 0x23, 0x0a, 0x1c, 0x27, 0x19, 0x0b, 0x09, 0x08, 0x61, 0x0c, 0x0b, 0x1c, 0x15, 0x1a, + 0x17, 0x1b, 0x2c, 0x38, 0x1d, 0x44, 0x4d, 0x03, 0x05, 0x17, 0x2c, 0x22, 0x0b, 0x08, 0x5f, 0x0b, + 0x0c, 0xfe, 0xe5, 0x03, 0x02, 0x1a, 0x20, 0x1b, 0x20, 0x0c, 0x1a, 0x34, 0xcf, 0x13, 0x1e, 0x25, + 0x12, 0x13, 0x26, 0x1d, 0x12, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x2c, 0xff, 0x56, 0x01, 0xd2, + 0x01, 0xe2, 0x00, 0x36, 0x00, 0x4c, 0xb4, 0x08, 0x00, 0x18, 0x01, 0x18, 0xb8, 0xff, 0xc0, 0x40, + 0x0c, 0x0b, 0x0f, 0x48, 0x18, 0x38, 0x20, 0x2d, 0x27, 0x37, 0x11, 0x53, 0x00, 0xb8, 0xff, 0xc0, + 0x40, 0x15, 0x0c, 0x0f, 0x48, 0x00, 0x37, 0x17, 0x14, 0x57, 0x32, 0x06, 0x28, 0x2b, 0x25, 0x92, + 0x1c, 0x07, 0x09, 0x0c, 0x57, 0x05, 0x0b, 0x00, 0x3f, 0xfd, 0xc6, 0x3f, 0x3f, 0xd5, 0xc6, 0x3f, + 0xfd, 0xc6, 0x01, 0x10, 0xd6, 0x2b, 0xed, 0x10, 0xd6, 0xdc, 0xc5, 0x10, 0xd6, 0x2b, 0x5d, 0xc6, + 0x31, 0x30, 0x37, 0x34, 0x3e, 0x02, 0x33, 0x32, 0x16, 0x17, 0x07, 0x26, 0x26, 0x23, 0x22, 0x0e, + 0x02, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x17, 0x06, 0x06, 0x23, 0x23, 0x07, 0x16, 0x16, + 0x15, 0x14, 0x0e, 0x02, 0x23, 0x22, 0x27, 0x37, 0x16, 0x16, 0x33, 0x32, 0x35, 0x34, 0x27, 0x27, + 0x36, 0x37, 0x2e, 0x03, 0x2c, 0x20, 0x42, 0x65, 0x46, 0x2a, 0x44, 0x23, 0x1b, 0x14, 0x31, 0x26, + 0x2c, 0x3b, 0x24, 0x10, 0x49, 0x58, 0x1d, 0x3f, 0x1a, 0x12, 0x1a, 0x4a, 0x32, 0x0b, 0x05, 0x21, + 0x1a, 0x15, 0x21, 0x2c, 0x16, 0x2d, 0x23, 0x0d, 0x06, 0x22, 0x10, 0x29, 0x24, 0x14, 0x06, 0x0a, + 0x31, 0x46, 0x2d, 0x15, 0xeb, 0x33, 0x5a, 0x43, 0x27, 0x0c, 0x0e, 0x63, 0x07, 0x0b, 0x15, 0x25, + 0x34, 0x1e, 0x41, 0x4a, 0x08, 0x09, 0x65, 0x0a, 0x0d, 0x0d, 0x0a, 0x27, 0x12, 0x17, 0x1e, 0x12, + 0x08, 0x0b, 0x3f, 0x02, 0x07, 0x19, 0x13, 0x0c, 0x06, 0x15, 0x14, 0x0a, 0x2c, 0x3e, 0x4d, 0x00, + 0xff, 0xff, 0x00, 0x1f, 0xff, 0xf5, 0x01, 0xd1, 0x02, 0xb3, 0x02, 0x26, 0x00, 0x48, 0x00, 0x00, + 0x01, 0x06, 0x00, 0x43, 0xef, 0x00, 0x00, 0x13, 0xb9, 0x00, 0x02, 0xff, 0xfd, 0x40, 0x09, 0x29, + 0x27, 0x00, 0x07, 0x50, 0x02, 0x04, 0x28, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0xff, 0xff, 0x00, 0x1f, + 0xff, 0xf5, 0x01, 0xd1, 0x02, 0xb3, 0x02, 0x26, 0x00, 0x48, 0x00, 0x00, 0x01, 0x06, 0x00, 0x8f, + 0x09, 0x00, 0x00, 0x10, 0x40, 0x0b, 0x02, 0x16, 0x28, 0x26, 0x00, 0x07, 0x50, 0x02, 0x04, 0x27, + 0x4f, 0x2b, 0x2b, 0x34, 0xff, 0xff, 0x00, 0x1f, 0xff, 0xf5, 0x01, 0xd1, 0x02, 0xb3, 0x02, 0x26, + 0x00, 0x48, 0x00, 0x00, 0x01, 0x06, 0x00, 0x69, 0x04, 0x00, 0x00, 0x10, 0x40, 0x0b, 0x02, 0x07, + 0x2a, 0x26, 0x00, 0x07, 0x50, 0x02, 0x04, 0x27, 0x4f, 0x2b, 0x2b, 0x34, 0xff, 0xff, 0x00, 0x1f, + 0xff, 0xf5, 0x01, 0xd1, 0x02, 0xa1, 0x02, 0x26, 0x00, 0x48, 0x00, 0x00, 0x01, 0x06, 0x00, 0x83, + 0x00, 0x00, 0x00, 0x17, 0x40, 0x10, 0x03, 0x02, 0x03, 0x28, 0x3a, 0x00, 0x07, 0x50, 0x03, 0x04, + 0x32, 0x4f, 0x02, 0x04, 0x26, 0x4f, 0x2b, 0x2b, 0x2b, 0x34, 0x34, 0x00, 0xff, 0xff, 0x00, 0x24, + 0xff, 0xf5, 0x01, 0xd3, 0x02, 0xb3, 0x02, 0x26, 0x01, 0x0c, 0x00, 0x00, 0x01, 0x06, 0x00, 0x43, + 0xdd, 0x00, 0x00, 0x13, 0xb9, 0x00, 0x01, 0xff, 0xe7, 0x40, 0x09, 0x17, 0x15, 0x0a, 0x00, 0x50, + 0x01, 0x0b, 0x16, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0xff, 0xff, 0x00, 0x24, 0xff, 0xf5, 0x01, 0xd3, + 0x02, 0xb3, 0x02, 0x26, 0x01, 0x0c, 0x00, 0x00, 0x01, 0x06, 0x00, 0x8f, 0xf4, 0x00, 0x00, 0x13, + 0xb9, 0x00, 0x01, 0xff, 0xfe, 0x40, 0x09, 0x16, 0x14, 0x0a, 0x00, 0x50, 0x01, 0x0b, 0x15, 0x4f, + 0x2b, 0x2b, 0x34, 0x00, 0xff, 0xff, 0x00, 0x24, 0xff, 0xf5, 0x01, 0xd3, 0x02, 0xb3, 0x02, 0x26, + 0x01, 0x0c, 0x00, 0x00, 0x01, 0x06, 0x00, 0x69, 0xef, 0x00, 0x00, 0x13, 0xb9, 0x00, 0x01, 0xff, + 0xef, 0x40, 0x09, 0x18, 0x14, 0x0a, 0x00, 0x50, 0x01, 0x0b, 0x15, 0x4f, 0x2b, 0x2b, 0x34, 0x00, + 0xff, 0xff, 0x00, 0x24, 0xff, 0xf5, 0x01, 0xd3, 0x02, 0xa1, 0x02, 0x26, 0x01, 0x0c, 0x00, 0x00, + 0x01, 0x06, 0x00, 0x83, 0xef, 0x00, 0x00, 0x1a, 0xb1, 0x02, 0x01, 0xb8, 0xff, 0xef, 0x40, 0x0d, + 0x16, 0x28, 0x0a, 0x00, 0x50, 0x02, 0x0b, 0x20, 0x4f, 0x01, 0x0b, 0x14, 0x4f, 0x2b, 0x2b, 0x2b, + 0x34, 0x34, 0x00, 0x00, 0x00, 0x02, 0x00, 0x28, 0xff, 0xf3, 0x01, 0xe0, 0x02, 0xb9, 0x00, 0x23, + 0x00, 0x34, 0x00, 0x5f, 0xb6, 0x01, 0x20, 0x13, 0x14, 0x00, 0x4c, 0x00, 0xb8, 0xff, 0xc0, 0x40, + 0x2e, 0x0a, 0x00, 0x4d, 0x15, 0x32, 0x53, 0x03, 0x00, 0x23, 0xa0, 0x23, 0x02, 0x23, 0x36, 0x1a, + 0x1e, 0x35, 0x2a, 0x53, 0x0d, 0x35, 0x1f, 0x10, 0x24, 0x57, 0x15, 0x27, 0x57, 0x12, 0x00, 0x19, + 0x73, 0x1a, 0x21, 0x1a, 0x1a, 0x23, 0x1e, 0x15, 0x15, 0x1e, 0x02, 0x2f, 0x57, 0x08, 0x07, 0x00, + 0x3f, 0xed, 0x3f, 0x39, 0x2f, 0x12, 0x39, 0x39, 0x11, 0x33, 0x10, 0xfd, 0x32, 0xd6, 0xed, 0x10, + 0xed, 0x3f, 0x01, 0x10, 0xd6, 0xed, 0x10, 0xd4, 0xc6, 0x10, 0xd6, 0x5d, 0xd6, 0xfd, 0xc4, 0x31, + 0x30, 0x2b, 0x2b, 0x01, 0x16, 0x16, 0x15, 0x14, 0x0e, 0x02, 0x23, 0x22, 0x2e, 0x02, 0x35, 0x34, + 0x3e, 0x02, 0x33, 0x32, 0x16, 0x17, 0x26, 0x26, 0x27, 0x07, 0x27, 0x37, 0x26, 0x26, 0x27, 0x37, + 0x16, 0x17, 0x37, 0x17, 0x03, 0x26, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x1e, 0x02, 0x33, 0x32, + 0x36, 0x35, 0x34, 0x26, 0x01, 0x87, 0x20, 0x20, 0x15, 0x30, 0x50, 0x3c, 0x34, 0x4d, 0x33, 0x1a, + 0x19, 0x31, 0x4b, 0x33, 0x14, 0x2c, 0x11, 0x05, 0x14, 0x10, 0x5c, 0x1a, 0x44, 0x0e, 0x20, 0x12, + 0x4a, 0x3d, 0x2d, 0x6d, 0x19, 0x99, 0x18, 0x2b, 0x0b, 0x2a, 0x29, 0x0a, 0x13, 0x1c, 0x12, 0x30, + 0x27, 0x01, 0x02, 0x17, 0x3c, 0x85, 0x42, 0x3a, 0x69, 0x4f, 0x2f, 0x23, 0x3c, 0x51, 0x2e, 0x2b, + 0x4d, 0x3a, 0x22, 0x0e, 0x09, 0x17, 0x32, 0x1a, 0x1f, 0x4b, 0x17, 0x10, 0x1b, 0x0d, 0x4d, 0x24, + 0x39, 0x24, 0x4b, 0xfe, 0xf1, 0x15, 0x08, 0x3c, 0x36, 0x16, 0x29, 0x20, 0x14, 0x5f, 0x4e, 0x07, + 0x0d, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x3f, 0x00, 0x00, 0x01, 0xb9, 0x02, 0xa0, 0x02, 0x26, + 0x00, 0x51, 0x00, 0x00, 0x01, 0x06, 0x00, 0x75, 0x00, 0x00, 0x00, 0x10, 0x40, 0x0b, 0x01, 0x00, + 0x22, 0x14, 0x00, 0x07, 0x50, 0x01, 0x02, 0x21, 0x4f, 0x2b, 0x2b, 0x34, 0xff, 0xff, 0x00, 0x1d, + 0xff, 0xf3, 0x01, 0xd8, 0x02, 0xb3, 0x02, 0x26, 0x00, 0x52, 0x00, 0x00, 0x01, 0x06, 0x00, 0x43, + 0xef, 0x00, 0x00, 0x13, 0xb9, 0x00, 0x02, 0xff, 0xfa, 0x40, 0x09, 0x23, 0x21, 0x09, 0x00, 0x50, + 0x02, 0x0e, 0x22, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0xff, 0xff, 0x00, 0x1d, 0xff, 0xf3, 0x01, 0xd8, + 0x02, 0xb3, 0x02, 0x26, 0x00, 0x52, 0x00, 0x00, 0x01, 0x06, 0x00, 0x8f, 0xf8, 0x00, 0x00, 0x10, + 0x40, 0x0b, 0x02, 0x03, 0x22, 0x20, 0x09, 0x00, 0x50, 0x02, 0x0e, 0x21, 0x4f, 0x2b, 0x2b, 0x34, + 0xff, 0xff, 0x00, 0x1d, 0xff, 0xf3, 0x01, 0xd8, 0x02, 0xb3, 0x02, 0x26, 0x00, 0x52, 0x00, 0x00, + 0x01, 0x06, 0x00, 0x69, 0x00, 0x00, 0x00, 0x10, 0x40, 0x0b, 0x02, 0x00, 0x24, 0x20, 0x09, 0x00, + 0x50, 0x02, 0x0e, 0x21, 0x4f, 0x2b, 0x2b, 0x34, 0xff, 0xff, 0x00, 0x1d, 0xff, 0xf3, 0x01, 0xd8, + 0x02, 0xa0, 0x02, 0x26, 0x00, 0x52, 0x00, 0x00, 0x01, 0x06, 0x00, 0x75, 0x00, 0x00, 0x00, 0x10, + 0x40, 0x0b, 0x02, 0x01, 0x2e, 0x20, 0x09, 0x00, 0x50, 0x02, 0x0e, 0x2d, 0x4f, 0x2b, 0x2b, 0x34, + 0xff, 0xff, 0x00, 0x1d, 0xff, 0xf3, 0x01, 0xd8, 0x02, 0xa1, 0x02, 0x26, 0x00, 0x52, 0x00, 0x00, + 0x01, 0x06, 0x00, 0x83, 0x00, 0x00, 0x00, 0x17, 0x40, 0x10, 0x03, 0x02, 0x01, 0x22, 0x34, 0x09, + 0x00, 0x50, 0x03, 0x0e, 0x2c, 0x4f, 0x02, 0x0e, 0x20, 0x4f, 0x2b, 0x2b, 0x2b, 0x34, 0x34, 0x00, + 0x00, 0x03, 0x00, 0x28, 0x00, 0x05, 0x01, 0xcc, 0x02, 0x06, 0x00, 0x0b, 0x00, 0x17, 0x00, 0x1b, + 0x00, 0x5c, 0x40, 0x10, 0x1a, 0x40, 0x14, 0x00, 0x4d, 0x19, 0x40, 0x14, 0x00, 0x4d, 0x19, 0x40, + 0x0e, 0x00, 0x4d, 0x19, 0xb8, 0xff, 0xc0, 0xb3, 0x12, 0x00, 0x4d, 0x18, 0xb8, 0xff, 0xc0, 0x40, + 0x20, 0x12, 0x00, 0x4d, 0x19, 0x1d, 0x0c, 0x95, 0x12, 0x1c, 0x00, 0x95, 0x06, 0x1b, 0x1c, 0x19, + 0x79, 0x1a, 0x1a, 0x09, 0x15, 0x96, 0x0f, 0x07, 0x03, 0x96, 0x80, 0x09, 0xc0, 0x09, 0x02, 0x09, + 0x7e, 0x00, 0x3f, 0x5d, 0xed, 0x3f, 0xed, 0x12, 0x39, 0x2f, 0xed, 0x01, 0x10, 0xc6, 0xd4, 0xed, + 0x10, 0xd6, 0xed, 0x10, 0xc6, 0x31, 0x30, 0x00, 0x2b, 0x2b, 0x01, 0x2b, 0x2b, 0x2b, 0x01, 0x14, + 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x11, 0x14, 0x06, 0x23, 0x22, 0x26, + 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x25, 0x21, 0x15, 0x21, 0x01, 0x41, 0x2a, 0x1b, 0x1d, 0x2a, + 0x2a, 0x1d, 0x1b, 0x2a, 0x2a, 0x1b, 0x1d, 0x2a, 0x2a, 0x1d, 0x1b, 0x2a, 0xfe, 0xe7, 0x01, 0xa4, + 0xfe, 0x5c, 0x01, 0xbc, 0x24, 0x25, 0x25, 0x24, 0x24, 0x26, 0x26, 0xfe, 0x6f, 0x23, 0x27, 0x27, + 0x23, 0x24, 0x27, 0x27, 0xc6, 0x65, 0x00, 0x00, 0x00, 0x03, 0x00, 0x1d, 0xff, 0xda, 0x01, 0xd8, + 0x01, 0xf6, 0x00, 0x1a, 0x00, 0x23, 0x00, 0x2c, 0x00, 0x43, 0xb5, 0x1e, 0x40, 0x0a, 0x00, 0x4d, + 0x0c, 0xb8, 0xff, 0xc0, 0x40, 0x11, 0x10, 0x00, 0x4d, 0x20, 0x00, 0x01, 0x00, 0x53, 0x27, 0x1e, + 0x53, 0xc0, 0x0e, 0xd0, 0x0e, 0x02, 0x0e, 0xb8, 0xff, 0xc0, 0x40, 0x0e, 0x0d, 0x10, 0x48, 0x0e, + 0x0a, 0x2d, 0x21, 0x57, 0x13, 0x0b, 0x2a, 0x57, 0x05, 0x07, 0x00, 0x3f, 0xed, 0x3f, 0xed, 0x01, + 0x10, 0xd6, 0xd4, 0x2b, 0x5d, 0xfd, 0xd5, 0xed, 0x5d, 0x31, 0x30, 0x2b, 0x2b, 0x25, 0x14, 0x0e, + 0x02, 0x23, 0x22, 0x26, 0x27, 0x07, 0x27, 0x37, 0x26, 0x26, 0x35, 0x34, 0x3e, 0x02, 0x33, 0x32, + 0x17, 0x37, 0x17, 0x07, 0x16, 0x16, 0x05, 0x14, 0x16, 0x17, 0x37, 0x26, 0x23, 0x22, 0x06, 0x17, + 0x34, 0x26, 0x27, 0x07, 0x16, 0x33, 0x32, 0x36, 0x01, 0xd8, 0x20, 0x3a, 0x51, 0x32, 0x20, 0x38, + 0x19, 0x26, 0x3e, 0x29, 0x18, 0x1a, 0x21, 0x3b, 0x52, 0x30, 0x3e, 0x32, 0x25, 0x3f, 0x2a, 0x18, + 0x1b, 0xfe, 0xc2, 0x02, 0x03, 0x89, 0x13, 0x1a, 0x30, 0x31, 0xc0, 0x02, 0x03, 0x89, 0x13, 0x1a, + 0x30, 0x31, 0xea, 0x38, 0x5b, 0x42, 0x24, 0x0f, 0x0d, 0x33, 0x2f, 0x39, 0x20, 0x55, 0x33, 0x37, + 0x5b, 0x41, 0x23, 0x1d, 0x33, 0x2f, 0x39, 0x20, 0x52, 0x33, 0x10, 0x1d, 0x0e, 0xbc, 0x0b, 0x4d, + 0x3f, 0x10, 0x1b, 0x0d, 0xb9, 0x0c, 0x4e, 0x00, 0xff, 0xff, 0x00, 0x3b, 0xff, 0xf5, 0x01, 0xb6, + 0x02, 0xb3, 0x02, 0x26, 0x00, 0x58, 0x00, 0x00, 0x01, 0x06, 0x00, 0x43, 0xef, 0x00, 0x00, 0x13, + 0xb9, 0x00, 0x01, 0xff, 0xfc, 0x40, 0x09, 0x16, 0x14, 0x07, 0x00, 0x50, 0x01, 0x09, 0x15, 0x4f, + 0x2b, 0x2b, 0x34, 0x00, 0xff, 0xff, 0x00, 0x3b, 0xff, 0xf5, 0x01, 0xb6, 0x02, 0xb3, 0x02, 0x26, + 0x00, 0x58, 0x00, 0x00, 0x01, 0x06, 0x00, 0x8f, 0xf4, 0x00, 0x00, 0x10, 0x40, 0x0b, 0x01, 0x01, + 0x15, 0x13, 0x07, 0x00, 0x50, 0x01, 0x09, 0x14, 0x4f, 0x2b, 0x2b, 0x34, 0xff, 0xff, 0x00, 0x3b, + 0xff, 0xf5, 0x01, 0xb6, 0x02, 0xb3, 0x02, 0x26, 0x00, 0x58, 0x00, 0x00, 0x01, 0x06, 0x00, 0x69, + 0x00, 0x00, 0x00, 0x10, 0x40, 0x0b, 0x01, 0x02, 0x17, 0x13, 0x07, 0x00, 0x50, 0x01, 0x09, 0x14, + 0x4f, 0x2b, 0x2b, 0x34, 0xff, 0xff, 0x00, 0x3b, 0xff, 0xf5, 0x01, 0xb6, 0x02, 0xa1, 0x02, 0x26, + 0x00, 0x58, 0x00, 0x00, 0x01, 0x06, 0x00, 0x83, 0x00, 0x00, 0x00, 0x17, 0x40, 0x10, 0x02, 0x01, + 0x03, 0x15, 0x27, 0x07, 0x00, 0x50, 0x02, 0x09, 0x1f, 0x4f, 0x01, 0x09, 0x13, 0x4f, 0x2b, 0x2b, + 0x2b, 0x34, 0x34, 0x00, 0xff, 0xff, 0x00, 0x14, 0xff, 0x58, 0x01, 0xd8, 0x02, 0xb3, 0x02, 0x26, + 0x00, 0x5c, 0x00, 0x00, 0x01, 0x06, 0x00, 0x8f, 0xf4, 0x00, 0x00, 0x10, 0x40, 0x0b, 0x01, 0x03, + 0x25, 0x23, 0x0d, 0x00, 0x50, 0x01, 0x00, 0x24, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0x02, 0x00, 0x3f, + 0xff, 0x5b, 0x01, 0xd5, 0x02, 0xb6, 0x00, 0x11, 0x00, 0x1e, 0x00, 0x4d, 0xb2, 0x12, 0x53, 0x00, + 0xb8, 0xff, 0xc0, 0xb3, 0x0f, 0x00, 0x4d, 0x00, 0xb8, 0xff, 0xc0, 0x40, 0x0d, 0x09, 0x0f, 0x48, + 0x00, 0x20, 0x18, 0x07, 0x0c, 0x51, 0xf0, 0x0a, 0x01, 0x0a, 0xb8, 0xff, 0xc0, 0x40, 0x13, 0x09, + 0x10, 0x48, 0x0a, 0x1f, 0x15, 0x57, 0x0f, 0x07, 0x0b, 0x01, 0x0a, 0x00, 0x08, 0x0e, 0x1c, 0x57, + 0x05, 0x07, 0x00, 0x3f, 0xed, 0x3f, 0x3f, 0x3f, 0x3f, 0xed, 0x01, 0x10, 0xd6, 0x2b, 0x5d, 0xed, + 0x32, 0x32, 0x10, 0xd6, 0x2b, 0x2b, 0xed, 0x31, 0x30, 0x25, 0x14, 0x0e, 0x02, 0x23, 0x22, 0x27, + 0x15, 0x23, 0x11, 0x37, 0x15, 0x36, 0x36, 0x33, 0x32, 0x16, 0x07, 0x34, 0x26, 0x23, 0x22, 0x06, + 0x07, 0x11, 0x16, 0x16, 0x33, 0x32, 0x36, 0x01, 0xd5, 0x18, 0x2e, 0x46, 0x2e, 0x2f, 0x32, 0x7b, + 0x7b, 0x0e, 0x1e, 0x0e, 0x6d, 0x74, 0x7d, 0x32, 0x33, 0x0e, 0x20, 0x0b, 0x0c, 0x28, 0x14, 0x2c, + 0x2a, 0xeb, 0x36, 0x5b, 0x41, 0x24, 0x17, 0xb1, 0x03, 0x46, 0x15, 0xde, 0x03, 0x05, 0x84, 0x75, + 0x3f, 0x51, 0x03, 0x01, 0xfe, 0xfe, 0x08, 0x0a, 0x47, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x14, + 0xff, 0x58, 0x01, 0xd8, 0x02, 0xa1, 0x02, 0x26, 0x00, 0x5c, 0x00, 0x00, 0x01, 0x06, 0x00, 0x83, + 0x00, 0x00, 0x00, 0x17, 0x40, 0x10, 0x02, 0x01, 0x05, 0x25, 0x37, 0x0d, 0x00, 0x50, 0x02, 0x00, + 0x2f, 0x4f, 0x01, 0x00, 0x23, 0x4f, 0x2b, 0x2b, 0x2b, 0x34, 0x34, 0x00, 0xff, 0xff, 0x00, 0x09, + 0x00, 0x00, 0x01, 0xeb, 0x03, 0x12, 0x02, 0x26, 0x00, 0x24, 0x00, 0x00, 0x01, 0x07, 0x00, 0x8a, + 0xff, 0xff, 0x00, 0x8b, 0x00, 0x10, 0x40, 0x0b, 0x02, 0x01, 0x17, 0x18, 0x04, 0x0b, 0x50, 0x02, + 0x07, 0x19, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0x00, 0xff, 0xff, 0x00, 0x2c, 0xff, 0xf5, 0x01, 0xb9, + 0x02, 0x87, 0x02, 0x26, 0x00, 0x44, 0x00, 0x00, 0x01, 0x06, 0x00, 0x8a, 0xff, 0x00, 0x00, 0x10, + 0x40, 0x0b, 0x02, 0x08, 0x2f, 0x30, 0x1c, 0x13, 0x50, 0x02, 0x0f, 0x31, 0x4f, 0x2b, 0x2b, 0x34, + 0xff, 0xff, 0x00, 0x09, 0x00, 0x00, 0x01, 0xeb, 0x03, 0x35, 0x02, 0x26, 0x00, 0x24, 0x00, 0x00, + 0x01, 0x07, 0x01, 0x61, 0x00, 0x00, 0x00, 0x8b, 0x00, 0x10, 0x40, 0x0b, 0x02, 0x00, 0x1b, 0x25, + 0x04, 0x0b, 0x50, 0x02, 0x07, 0x17, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0x00, 0xff, 0xff, 0x00, 0x2c, + 0xff, 0xf5, 0x01, 0xb9, 0x02, 0xaa, 0x02, 0x26, 0x00, 0x44, 0x00, 0x00, 0x01, 0x06, 0x01, 0x61, + 0x00, 0x00, 0x00, 0x10, 0x40, 0x0b, 0x02, 0x07, 0x33, 0x3d, 0x1c, 0x13, 0x50, 0x02, 0x0f, 0x2f, + 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0x02, 0x00, 0x09, 0xff, 0x56, 0x01, 0xf9, 0x02, 0x6b, 0x00, 0x0a, + 0x00, 0x2c, 0x00, 0x40, 0x40, 0x24, 0x28, 0x1b, 0x21, 0x0b, 0x0c, 0x13, 0x06, 0x00, 0x05, 0x12, + 0x0d, 0x0e, 0x09, 0x0f, 0x16, 0x2e, 0x0f, 0x2d, 0x1e, 0x25, 0x92, 0x0c, 0x4a, 0x06, 0x06, 0x00, + 0x0b, 0x13, 0x02, 0x12, 0x02, 0x0e, 0x08, 0x16, 0x0b, 0x08, 0x00, 0x3f, 0x33, 0x3f, 0x3f, 0x3f, + 0x12, 0x39, 0x39, 0x10, 0xed, 0x3f, 0xcd, 0x01, 0x10, 0xc6, 0x10, 0xd6, 0x11, 0x17, 0x39, 0xd6, + 0xde, 0xc5, 0x31, 0x30, 0x13, 0x0e, 0x03, 0x07, 0x33, 0x2e, 0x03, 0x13, 0x27, 0x23, 0x07, 0x23, + 0x36, 0x12, 0x37, 0x33, 0x16, 0x12, 0x17, 0x0e, 0x03, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, + 0x17, 0x06, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x37, 0x37, 0xf9, 0x0a, 0x11, 0x0f, 0x0d, + 0x06, 0x79, 0x06, 0x0c, 0x0f, 0x11, 0x64, 0x1d, 0xa5, 0x1c, 0x80, 0x2c, 0x5a, 0x2a, 0x86, 0x2c, + 0x57, 0x29, 0x09, 0x17, 0x14, 0x0d, 0x0b, 0x10, 0x08, 0x16, 0x0f, 0x07, 0x0e, 0x33, 0x1c, 0x30, + 0x2a, 0x1b, 0x1a, 0x09, 0x01, 0xf3, 0x23, 0x3f, 0x3d, 0x3e, 0x21, 0x21, 0x3e, 0x3d, 0x3f, 0xfe, + 0x30, 0x8f, 0x8f, 0xb7, 0x01, 0x2d, 0x87, 0x88, 0xfe, 0xcf, 0xb2, 0x08, 0x14, 0x16, 0x16, 0x09, + 0x0a, 0x0e, 0x02, 0x05, 0x3a, 0x05, 0x09, 0x25, 0x1b, 0x18, 0x36, 0x14, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x02, 0x00, 0x2c, 0xff, 0x56, 0x01, 0xb9, 0x01, 0xe2, 0x00, 0x34, 0x00, 0x43, 0x00, 0x59, + 0x40, 0x35, 0x09, 0x53, 0x29, 0x45, 0x39, 0x18, 0x51, 0x28, 0x45, 0x06, 0x2e, 0x00, 0x45, 0x41, + 0x53, 0x20, 0x30, 0x11, 0x40, 0x11, 0x50, 0x11, 0x03, 0x11, 0x44, 0x40, 0x16, 0x50, 0x16, 0x60, + 0x16, 0x03, 0x16, 0x57, 0x3c, 0x3c, 0x0c, 0x4f, 0x1c, 0x01, 0x1c, 0x57, 0x23, 0x0b, 0x34, 0x06, + 0x03, 0x35, 0x57, 0x0c, 0x07, 0x03, 0x0f, 0x00, 0x3f, 0x3f, 0xed, 0x12, 0x39, 0x39, 0x3f, 0xed, + 0x5d, 0x12, 0x39, 0x2f, 0xed, 0x5d, 0x01, 0x10, 0xd6, 0x5d, 0xc4, 0xed, 0x10, 0xd6, 0xdc, 0xc5, + 0x10, 0xde, 0xed, 0x32, 0x10, 0xd6, 0xed, 0x31, 0x30, 0x05, 0x06, 0x06, 0x23, 0x22, 0x26, 0x35, + 0x34, 0x36, 0x37, 0x06, 0x06, 0x23, 0x22, 0x2e, 0x02, 0x35, 0x34, 0x3e, 0x02, 0x33, 0x32, 0x17, + 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x27, 0x36, 0x36, 0x33, 0x32, 0x1e, 0x02, 0x15, 0x11, + 0x0e, 0x03, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x27, 0x32, 0x36, 0x37, 0x35, 0x26, 0x26, + 0x23, 0x22, 0x0e, 0x02, 0x15, 0x14, 0x16, 0x01, 0xb7, 0x0e, 0x33, 0x1c, 0x30, 0x2a, 0x1d, 0x18, + 0x11, 0x22, 0x10, 0x2d, 0x49, 0x34, 0x1c, 0x20, 0x36, 0x46, 0x26, 0x30, 0x25, 0x2c, 0x36, 0x23, + 0x41, 0x14, 0x11, 0x17, 0x54, 0x2d, 0x3a, 0x4d, 0x2e, 0x14, 0x07, 0x1b, 0x1b, 0x14, 0x0b, 0x10, + 0x08, 0x16, 0x0f, 0xb5, 0x14, 0x26, 0x0e, 0x0c, 0x22, 0x0e, 0x13, 0x24, 0x1b, 0x10, 0x30, 0x9c, + 0x05, 0x09, 0x25, 0x1b, 0x18, 0x35, 0x16, 0x02, 0x02, 0x10, 0x25, 0x3b, 0x2b, 0x29, 0x38, 0x22, + 0x0f, 0x08, 0x0f, 0x23, 0x2f, 0x0a, 0x07, 0x63, 0x08, 0x0d, 0x1b, 0x31, 0x47, 0x2c, 0xfe, 0xea, + 0x05, 0x16, 0x1b, 0x1c, 0x0c, 0x0a, 0x0e, 0x02, 0x05, 0xba, 0x01, 0x02, 0x6c, 0x02, 0x03, 0x05, + 0x0c, 0x16, 0x12, 0x20, 0x1b, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x1b, 0xff, 0xf3, 0x01, 0xd5, + 0x03, 0x3e, 0x02, 0x26, 0x00, 0x26, 0x00, 0x00, 0x01, 0x07, 0x00, 0x8f, 0x00, 0x24, 0x00, 0x8b, + 0x00, 0x10, 0x40, 0x0b, 0x01, 0x31, 0x22, 0x20, 0x02, 0x1d, 0x50, 0x01, 0x07, 0x21, 0x4f, 0x2b, + 0x2b, 0x34, 0x00, 0x00, 0xff, 0xff, 0x00, 0x2c, 0xff, 0xf5, 0x01, 0xd2, 0x02, 0xb3, 0x02, 0x26, + 0x00, 0x46, 0x00, 0x00, 0x01, 0x06, 0x00, 0x8f, 0x1b, 0x00, 0x00, 0x10, 0x40, 0x0b, 0x01, 0x21, + 0x22, 0x20, 0x00, 0x18, 0x50, 0x01, 0x04, 0x21, 0x4f, 0x2b, 0x2b, 0x34, 0xff, 0xff, 0x00, 0x1b, + 0xff, 0xf3, 0x01, 0xd5, 0x03, 0x3e, 0x02, 0x26, 0x00, 0x26, 0x00, 0x00, 0x01, 0x07, 0x00, 0x69, + 0x00, 0x36, 0x00, 0x8b, 0x00, 0x10, 0x40, 0x0b, 0x01, 0x39, 0x24, 0x20, 0x02, 0x1d, 0x50, 0x01, + 0x07, 0x21, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0x00, 0xff, 0xff, 0x00, 0x2c, 0xff, 0xf5, 0x01, 0xd2, + 0x02, 0xb3, 0x02, 0x26, 0x00, 0x46, 0x00, 0x00, 0x01, 0x06, 0x00, 0x69, 0x2d, 0x00, 0x00, 0x10, + 0x40, 0x0b, 0x01, 0x29, 0x24, 0x20, 0x00, 0x18, 0x50, 0x01, 0x04, 0x21, 0x4f, 0x2b, 0x2b, 0x34, + 0xff, 0xff, 0x00, 0x1b, 0xff, 0xf3, 0x01, 0xd5, 0x03, 0x2e, 0x02, 0x26, 0x00, 0x26, 0x00, 0x00, + 0x01, 0x07, 0x01, 0x62, 0x00, 0x36, 0x00, 0x8b, 0x00, 0x10, 0x40, 0x0b, 0x01, 0x38, 0x22, 0x28, + 0x02, 0x1d, 0x50, 0x01, 0x07, 0x20, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0x00, 0xff, 0xff, 0x00, 0x2c, + 0xff, 0xf5, 0x01, 0xd2, 0x02, 0xa3, 0x02, 0x26, 0x00, 0x46, 0x00, 0x00, 0x01, 0x06, 0x01, 0x62, + 0x36, 0x00, 0x00, 0x10, 0x40, 0x0b, 0x01, 0x31, 0x22, 0x28, 0x00, 0x18, 0x50, 0x01, 0x04, 0x20, + 0x4f, 0x2b, 0x2b, 0x34, 0xff, 0xff, 0x00, 0x1b, 0xff, 0xf3, 0x01, 0xd5, 0x03, 0x3e, 0x02, 0x26, + 0x00, 0x26, 0x00, 0x00, 0x01, 0x07, 0x01, 0x5f, 0x00, 0x36, 0x00, 0x8b, 0x00, 0x10, 0x40, 0x0b, + 0x01, 0x39, 0x20, 0x24, 0x02, 0x1d, 0x50, 0x01, 0x07, 0x25, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x2c, 0xff, 0xf5, 0x01, 0xd2, 0x02, 0xb3, 0x02, 0x26, 0x00, 0x46, 0x00, 0x00, + 0x01, 0x06, 0x01, 0x5f, 0x36, 0x00, 0x00, 0x10, 0x40, 0x0b, 0x01, 0x32, 0x20, 0x24, 0x00, 0x18, + 0x50, 0x01, 0x04, 0x25, 0x4f, 0x2b, 0x2b, 0x34, 0xff, 0xff, 0x00, 0x36, 0xff, 0xf8, 0x01, 0xd9, + 0x03, 0x3e, 0x02, 0x26, 0x00, 0x27, 0x00, 0x00, 0x01, 0x07, 0x01, 0x5f, 0xff, 0xdd, 0x00, 0x8b, + 0x00, 0x13, 0xb9, 0x00, 0x02, 0xff, 0xd1, 0x40, 0x09, 0x22, 0x26, 0x19, 0x11, 0x50, 0x02, 0x1c, + 0x27, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x0d, 0xff, 0xf5, 0x02, 0x06, + 0x02, 0xb6, 0x00, 0x0b, 0x00, 0x1a, 0x00, 0x1e, 0x00, 0x51, 0x40, 0x13, 0x18, 0x06, 0x51, 0x0c, + 0x1a, 0x5f, 0x1e, 0x01, 0x1e, 0x1b, 0x20, 0x20, 0x00, 0x30, 0x00, 0x02, 0x00, 0x53, 0x12, 0xb8, + 0xff, 0xc0, 0xb3, 0x15, 0x18, 0x48, 0x12, 0xb8, 0xff, 0xc0, 0x40, 0x15, 0x09, 0x12, 0x48, 0x12, + 0x1f, 0x1e, 0x01, 0x1d, 0x0a, 0x1a, 0x01, 0x19, 0x00, 0x09, 0x57, 0x15, 0x07, 0x03, 0x57, 0x0f, + 0x07, 0x00, 0x3f, 0xed, 0x3f, 0xed, 0x3f, 0x3f, 0x3f, 0x3f, 0x01, 0x10, 0xde, 0x2b, 0x2b, 0xed, + 0x5d, 0x10, 0xd6, 0xd5, 0x5d, 0xde, 0xd0, 0xfd, 0xc0, 0x31, 0x30, 0x37, 0x14, 0x16, 0x33, 0x32, + 0x37, 0x11, 0x26, 0x26, 0x23, 0x22, 0x06, 0x13, 0x06, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, + 0x33, 0x32, 0x16, 0x17, 0x35, 0x37, 0x17, 0x07, 0x23, 0x35, 0x8a, 0x21, 0x24, 0x16, 0x10, 0x0a, + 0x1c, 0x0f, 0x1d, 0x19, 0xe7, 0x1f, 0x59, 0x2b, 0x5f, 0x62, 0x50, 0x4e, 0x14, 0x28, 0x0e, 0x7c, + 0x95, 0x1d, 0x50, 0xee, 0x3f, 0x50, 0x04, 0x01, 0x00, 0x08, 0x0b, 0x46, 0xfe, 0xde, 0x0b, 0x0e, + 0x82, 0x71, 0x73, 0x85, 0x0b, 0x0a, 0xd6, 0x15, 0x01, 0xda, 0xda, 0x00, 0xff, 0xff, 0x00, 0x12, + 0xff, 0xf8, 0x01, 0xd9, 0x02, 0x72, 0x02, 0x06, 0x00, 0xab, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1c, + 0xff, 0xf5, 0x01, 0xe2, 0x02, 0xb6, 0x00, 0x16, 0x00, 0x23, 0x00, 0x40, 0x40, 0x23, 0x14, 0x10, + 0x1e, 0x53, 0x04, 0x02, 0x25, 0x17, 0x53, 0x13, 0x0a, 0x24, 0x16, 0x01, 0x15, 0x00, 0x02, 0x12, + 0x00, 0x13, 0x02, 0x1e, 0x55, 0x10, 0x21, 0x57, 0x30, 0x0d, 0x01, 0x0d, 0x0b, 0x1a, 0x57, 0x07, + 0x07, 0x00, 0x3f, 0xed, 0x3f, 0x5d, 0xed, 0xd5, 0xed, 0x3f, 0x33, 0xcd, 0x32, 0x3f, 0x3f, 0x01, + 0x10, 0xd6, 0xc4, 0xed, 0x10, 0xd6, 0xd6, 0xed, 0x32, 0x32, 0x31, 0x30, 0x01, 0x33, 0x15, 0x23, + 0x11, 0x06, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x17, 0x35, 0x23, 0x35, + 0x33, 0x35, 0x37, 0x01, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x11, 0x26, 0x26, 0x23, 0x22, 0x06, + 0x01, 0xab, 0x37, 0x37, 0x23, 0x60, 0x30, 0x6d, 0x6f, 0x5e, 0x5b, 0x19, 0x30, 0x12, 0x80, 0x80, + 0x7b, 0xfe, 0xee, 0x2d, 0x33, 0x10, 0x19, 0x0e, 0x0e, 0x24, 0x14, 0x2a, 0x27, 0x02, 0x67, 0x53, + 0xfd, 0xfa, 0x0b, 0x0e, 0x82, 0x71, 0x73, 0x85, 0x0b, 0x0a, 0x49, 0x53, 0x3a, 0x15, 0xfe, 0x38, + 0x3f, 0x50, 0x02, 0x02, 0x01, 0x00, 0x08, 0x0b, 0x46, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x3f, + 0x00, 0x00, 0x01, 0xcc, 0x03, 0x12, 0x02, 0x26, 0x00, 0x28, 0x00, 0x00, 0x01, 0x07, 0x00, 0x8a, + 0x00, 0x00, 0x00, 0x8b, 0x00, 0x13, 0xb9, 0x00, 0x01, 0xff, 0xf7, 0x40, 0x09, 0x0c, 0x0d, 0x00, + 0x0a, 0x50, 0x01, 0x01, 0x0e, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x1f, + 0xff, 0xf5, 0x01, 0xd1, 0x02, 0x87, 0x02, 0x26, 0x00, 0x48, 0x00, 0x00, 0x01, 0x06, 0x00, 0x8a, + 0xff, 0x00, 0x00, 0x10, 0x40, 0x0b, 0x02, 0x03, 0x26, 0x27, 0x00, 0x07, 0x50, 0x02, 0x04, 0x28, + 0x4f, 0x2b, 0x2b, 0x34, 0xff, 0xff, 0x00, 0x3f, 0x00, 0x00, 0x01, 0xcc, 0x03, 0x35, 0x02, 0x26, + 0x00, 0x28, 0x00, 0x00, 0x01, 0x07, 0x01, 0x61, 0x00, 0x00, 0x00, 0x8b, 0x00, 0x13, 0xb9, 0x00, + 0x01, 0xff, 0xf5, 0x40, 0x09, 0x10, 0x1a, 0x00, 0x0a, 0x50, 0x01, 0x01, 0x0c, 0x4f, 0x2b, 0x2b, + 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x1f, 0xff, 0xf5, 0x01, 0xd1, 0x02, 0xaa, 0x02, 0x26, + 0x00, 0x48, 0x00, 0x00, 0x01, 0x06, 0x01, 0x61, 0x00, 0x00, 0x00, 0x10, 0x40, 0x0b, 0x02, 0x02, + 0x2a, 0x34, 0x00, 0x07, 0x50, 0x02, 0x04, 0x26, 0x4f, 0x2b, 0x2b, 0x34, 0xff, 0xff, 0x00, 0x3f, + 0x00, 0x00, 0x01, 0xcc, 0x03, 0x2e, 0x02, 0x26, 0x00, 0x28, 0x00, 0x00, 0x01, 0x07, 0x01, 0x62, + 0x00, 0x00, 0x00, 0x8b, 0x00, 0x13, 0xb9, 0x00, 0x01, 0xff, 0xf5, 0x40, 0x09, 0x0e, 0x14, 0x00, + 0x0a, 0x50, 0x01, 0x01, 0x0c, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x1f, + 0xff, 0xf5, 0x01, 0xd1, 0x02, 0xa3, 0x02, 0x26, 0x00, 0x48, 0x00, 0x00, 0x01, 0x06, 0x01, 0x62, + 0x00, 0x00, 0x00, 0x10, 0x40, 0x0b, 0x02, 0x02, 0x28, 0x2e, 0x00, 0x07, 0x50, 0x02, 0x04, 0x26, + 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0x01, 0x00, 0x3f, 0xff, 0x56, 0x01, 0xda, 0x02, 0x6b, 0x00, 0x20, + 0x00, 0x5b, 0x40, 0x39, 0x1d, 0x10, 0x17, 0x20, 0x0b, 0x01, 0x0b, 0x20, 0x06, 0x40, 0x06, 0x50, + 0x06, 0x60, 0x06, 0x04, 0x06, 0x03, 0x40, 0x0a, 0x00, 0x4d, 0x0f, 0x03, 0x3f, 0x03, 0x02, 0x03, + 0x22, 0x09, 0x04, 0x08, 0x44, 0x20, 0x00, 0x01, 0x00, 0x21, 0x13, 0x1a, 0x92, 0x05, 0x48, 0x40, + 0x08, 0x01, 0x08, 0x08, 0x09, 0x03, 0x48, 0x01, 0x02, 0x09, 0x48, 0x00, 0x08, 0x00, 0x3f, 0xed, + 0x3f, 0xed, 0x12, 0x39, 0x2f, 0x5d, 0xed, 0x3f, 0xc5, 0x01, 0x10, 0xd6, 0x5d, 0xed, 0x32, 0x32, + 0x10, 0xc6, 0x5d, 0x2b, 0xc6, 0x5d, 0xd6, 0x5d, 0xd6, 0xdc, 0xc5, 0x31, 0x30, 0x33, 0x11, 0x21, + 0x15, 0x23, 0x15, 0x33, 0x15, 0x23, 0x15, 0x21, 0x15, 0x0e, 0x03, 0x15, 0x14, 0x16, 0x33, 0x32, + 0x36, 0x37, 0x17, 0x06, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x37, 0x3f, 0x01, 0x77, 0xfc, + 0xdb, 0xdb, 0x01, 0x12, 0x0a, 0x17, 0x13, 0x0d, 0x0b, 0x10, 0x08, 0x16, 0x0f, 0x07, 0x0e, 0x33, + 0x1c, 0x30, 0x2a, 0x21, 0x1d, 0x02, 0x6b, 0x66, 0x8b, 0x66, 0xae, 0x66, 0x08, 0x14, 0x16, 0x16, + 0x09, 0x0a, 0x0e, 0x02, 0x05, 0x3a, 0x05, 0x09, 0x25, 0x1b, 0x1a, 0x3a, 0x16, 0x00, 0x00, 0x00, + 0x00, 0x02, 0x00, 0x1f, 0xff, 0x56, 0x01, 0xd1, 0x01, 0xe2, 0x00, 0x2e, 0x00, 0x39, 0x00, 0x73, + 0xb9, 0x00, 0x2e, 0xff, 0xc0, 0xb4, 0x09, 0x0d, 0x00, 0x4c, 0x21, 0xb8, 0xff, 0xc0, 0x40, 0x3e, + 0x19, 0x1a, 0x00, 0x4c, 0x2f, 0x53, 0x22, 0x00, 0x1a, 0x20, 0x1a, 0x40, 0x1a, 0x03, 0x1a, 0x3b, + 0x06, 0x28, 0x00, 0x3b, 0x1b, 0x39, 0x53, 0x70, 0x0f, 0x01, 0x0f, 0x3a, 0x1a, 0x4f, 0x1b, 0x5f, + 0x1b, 0x6f, 0x1b, 0x03, 0x1b, 0x55, 0x0f, 0x2f, 0x01, 0x2f, 0x2f, 0x1e, 0x30, 0x34, 0x01, 0x34, + 0x57, 0x14, 0x0b, 0x21, 0x40, 0x1e, 0x01, 0x1e, 0x57, 0x0a, 0x07, 0x2b, 0x03, 0x92, 0x00, 0x3f, + 0xcd, 0x3f, 0xfd, 0x5d, 0xc6, 0x3f, 0xed, 0x5d, 0x12, 0x39, 0x2f, 0x5d, 0xed, 0x5d, 0x32, 0x01, + 0x10, 0xd6, 0x5d, 0xed, 0x32, 0x10, 0xd6, 0xdc, 0xcd, 0x10, 0xd6, 0x5d, 0xc6, 0xed, 0x31, 0x30, + 0x00, 0x2b, 0x2b, 0x05, 0x06, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x37, 0x23, 0x22, 0x2e, + 0x02, 0x35, 0x34, 0x3e, 0x02, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x07, 0x21, 0x14, 0x16, 0x33, + 0x32, 0x36, 0x37, 0x17, 0x07, 0x0e, 0x03, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x03, 0x34, + 0x2e, 0x02, 0x23, 0x22, 0x0e, 0x02, 0x07, 0x01, 0xad, 0x0e, 0x33, 0x1c, 0x30, 0x2a, 0x1a, 0x17, + 0x06, 0x3c, 0x5f, 0x43, 0x24, 0x26, 0x3e, 0x50, 0x2a, 0x68, 0x6c, 0x01, 0x01, 0xfe, 0xcf, 0x4c, + 0x3c, 0x25, 0x43, 0x17, 0x11, 0x09, 0x08, 0x1b, 0x19, 0x13, 0x0b, 0x10, 0x08, 0x16, 0x0f, 0x4c, + 0x0a, 0x16, 0x22, 0x19, 0x18, 0x23, 0x17, 0x0d, 0x02, 0x9c, 0x05, 0x09, 0x25, 0x1b, 0x17, 0x33, + 0x15, 0x1f, 0x3d, 0x5a, 0x3c, 0x3e, 0x5e, 0x3f, 0x20, 0x7b, 0x76, 0x0c, 0x1a, 0x08, 0x2e, 0x35, + 0x10, 0x08, 0x67, 0x06, 0x05, 0x16, 0x1a, 0x1c, 0x0b, 0x0a, 0x0e, 0x02, 0x05, 0x01, 0x7a, 0x13, + 0x23, 0x1c, 0x11, 0x10, 0x1c, 0x24, 0x13, 0x00, 0xff, 0xff, 0x00, 0x3f, 0x00, 0x00, 0x01, 0xcc, + 0x03, 0x3e, 0x02, 0x26, 0x00, 0x28, 0x00, 0x00, 0x01, 0x07, 0x01, 0x5f, 0x00, 0x00, 0x00, 0x8b, + 0x00, 0x13, 0xb9, 0x00, 0x01, 0xff, 0xf6, 0x40, 0x09, 0x0c, 0x10, 0x00, 0x0a, 0x50, 0x01, 0x01, + 0x11, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x1f, 0xff, 0xf5, 0x01, 0xd1, + 0x02, 0xb3, 0x02, 0x26, 0x00, 0x48, 0x00, 0x00, 0x01, 0x06, 0x01, 0x5f, 0x00, 0x00, 0x00, 0x10, + 0x40, 0x0b, 0x02, 0x03, 0x26, 0x2a, 0x00, 0x07, 0x50, 0x02, 0x04, 0x2b, 0x4f, 0x2b, 0x2b, 0x34, + 0xff, 0xff, 0x00, 0x1b, 0xff, 0xf3, 0x01, 0xd0, 0x03, 0x3e, 0x02, 0x26, 0x00, 0x2a, 0x00, 0x00, + 0x01, 0x07, 0x00, 0x69, 0x00, 0x2d, 0x00, 0x8b, 0x00, 0x10, 0x40, 0x0b, 0x01, 0x32, 0x28, 0x24, + 0x15, 0x20, 0x50, 0x01, 0x1a, 0x25, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0x00, 0xff, 0xff, 0x00, 0x21, + 0xff, 0x58, 0x01, 0xb6, 0x02, 0xb3, 0x02, 0x26, 0x00, 0x4a, 0x00, 0x00, 0x01, 0x06, 0x00, 0x69, + 0x00, 0x00, 0x00, 0x10, 0x40, 0x0b, 0x02, 0x0f, 0x2c, 0x28, 0x21, 0x0c, 0x50, 0x02, 0x24, 0x29, + 0x4f, 0x2b, 0x2b, 0x34, 0xff, 0xff, 0x00, 0x1b, 0xff, 0xf3, 0x01, 0xd0, 0x03, 0x35, 0x02, 0x26, + 0x00, 0x2a, 0x00, 0x00, 0x01, 0x07, 0x01, 0x61, 0x00, 0x2d, 0x00, 0x8b, 0x00, 0x10, 0x40, 0x0b, + 0x01, 0x31, 0x28, 0x32, 0x15, 0x20, 0x50, 0x01, 0x1a, 0x24, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x21, 0xff, 0x58, 0x01, 0xb6, 0x02, 0xaa, 0x02, 0x26, 0x00, 0x4a, 0x00, 0x00, + 0x01, 0x06, 0x01, 0x61, 0x00, 0x00, 0x00, 0x10, 0x40, 0x0b, 0x02, 0x0e, 0x2c, 0x36, 0x21, 0x0c, + 0x50, 0x02, 0x24, 0x28, 0x4f, 0x2b, 0x2b, 0x34, 0xff, 0xff, 0x00, 0x1b, 0xff, 0xf3, 0x01, 0xd0, + 0x03, 0x2e, 0x02, 0x26, 0x00, 0x2a, 0x00, 0x00, 0x01, 0x07, 0x01, 0x62, 0x00, 0x2d, 0x00, 0x8b, + 0x00, 0x10, 0x40, 0x0b, 0x01, 0x31, 0x26, 0x2c, 0x15, 0x20, 0x50, 0x01, 0x1a, 0x24, 0x4f, 0x2b, + 0x2b, 0x34, 0x00, 0x00, 0xff, 0xff, 0x00, 0x21, 0xff, 0x58, 0x01, 0xb6, 0x02, 0xa3, 0x02, 0x26, + 0x00, 0x4a, 0x00, 0x00, 0x01, 0x06, 0x01, 0x62, 0x00, 0x00, 0x00, 0x10, 0x40, 0x0b, 0x02, 0x0e, + 0x2a, 0x30, 0x21, 0x0c, 0x50, 0x02, 0x24, 0x28, 0x4f, 0x2b, 0x2b, 0x34, 0xff, 0xff, 0x00, 0x1b, + 0xff, 0x56, 0x01, 0xd0, 0x02, 0x79, 0x02, 0x26, 0x00, 0x2a, 0x00, 0x00, 0x01, 0x06, 0x01, 0xc3, + 0x00, 0x00, 0x00, 0x0a, 0xb6, 0x01, 0x04, 0x2d, 0x26, 0x15, 0x20, 0x50, 0x2b, 0x34, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x21, 0xff, 0x58, 0x01, 0xb6, 0x02, 0xc4, 0x02, 0x26, 0x00, 0x4a, 0x00, 0x00, + 0x01, 0x06, 0x01, 0xc4, 0x24, 0x00, 0x00, 0x10, 0x40, 0x0b, 0x02, 0x2f, 0x2a, 0x2d, 0x21, 0x0c, + 0x50, 0x02, 0x24, 0x28, 0x4f, 0x2b, 0x2b, 0x34, 0xff, 0xff, 0x00, 0x2d, 0x00, 0x00, 0x01, 0xc7, + 0x03, 0x3e, 0x02, 0x26, 0x00, 0x2b, 0x00, 0x00, 0x01, 0x07, 0x00, 0x69, 0x00, 0x00, 0x00, 0x8b, + 0x00, 0x10, 0x40, 0x0b, 0x01, 0x01, 0x10, 0x0c, 0x06, 0x00, 0x50, 0x01, 0x00, 0x0d, 0x4f, 0x2b, + 0x2b, 0x34, 0x00, 0x00, 0x00, 0x02, 0x00, 0x37, 0x00, 0x00, 0x01, 0xb9, 0x03, 0x3d, 0x00, 0x15, + 0x00, 0x1b, 0x00, 0x48, 0xb9, 0x00, 0x16, 0xff, 0xf8, 0x40, 0x0f, 0x12, 0x14, 0x00, 0x4c, 0x0e, + 0x51, 0x0b, 0x1d, 0x16, 0x1a, 0x1c, 0x03, 0x14, 0x51, 0x00, 0xb8, 0xff, 0xc0, 0x40, 0x14, 0x09, + 0x0c, 0x48, 0x00, 0x1c, 0x19, 0x17, 0x18, 0x1b, 0x86, 0x15, 0x06, 0x0d, 0x06, 0x11, 0x57, 0x06, + 0x0b, 0x02, 0x07, 0x00, 0x3f, 0x3f, 0xed, 0x3f, 0x3f, 0x3f, 0xd5, 0xcd, 0xcd, 0x01, 0x10, 0xd6, + 0x2b, 0xfd, 0xc0, 0x10, 0xd6, 0xc5, 0x10, 0xd6, 0xed, 0x31, 0x30, 0x2b, 0x33, 0x11, 0x37, 0x15, + 0x36, 0x36, 0x33, 0x32, 0x1e, 0x02, 0x15, 0x11, 0x23, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, + 0x11, 0x13, 0x07, 0x27, 0x07, 0x27, 0x37, 0x3f, 0x7b, 0x0f, 0x2a, 0x10, 0x34, 0x46, 0x2a, 0x12, + 0x7b, 0x1e, 0x2a, 0x11, 0x21, 0x0a, 0x83, 0x26, 0x5c, 0x5e, 0x26, 0x84, 0x02, 0x79, 0x15, 0xbc, + 0x05, 0x09, 0x1f, 0x39, 0x4f, 0x30, 0xfe, 0xf7, 0xf9, 0x42, 0x3a, 0x08, 0x03, 0xfe, 0x96, 0x02, + 0xde, 0x39, 0x36, 0x36, 0x39, 0x5f, 0x00, 0x00, 0x00, 0x02, 0x00, 0x12, 0x00, 0x00, 0x01, 0xe3, + 0x02, 0x6b, 0x00, 0x13, 0x00, 0x17, 0x00, 0x63, 0x40, 0x3d, 0x04, 0x02, 0x20, 0x01, 0x30, 0x01, + 0x02, 0x01, 0x44, 0x15, 0x14, 0x07, 0x20, 0x12, 0x40, 0x12, 0x50, 0x12, 0x03, 0x12, 0x44, 0x17, + 0x16, 0x08, 0x20, 0x11, 0x30, 0x11, 0x02, 0x11, 0x44, 0x0f, 0x0a, 0x0f, 0x0c, 0x2f, 0x0c, 0x02, + 0xbf, 0x0c, 0x01, 0x0c, 0x18, 0x07, 0x48, 0x14, 0x0b, 0x04, 0x15, 0x48, 0x0e, 0x01, 0x12, 0x13, + 0x02, 0x10, 0x02, 0x09, 0x08, 0x06, 0x08, 0x00, 0x3f, 0x3f, 0x3f, 0x3f, 0xd5, 0x32, 0x32, 0xfd, + 0x32, 0x32, 0xd6, 0xed, 0x01, 0x10, 0xd6, 0x5d, 0x71, 0xce, 0xdc, 0xfd, 0x5d, 0x32, 0x32, 0x32, + 0xfe, 0x5d, 0x32, 0x32, 0x32, 0xfd, 0x5d, 0xcd, 0x33, 0x31, 0x30, 0x01, 0x15, 0x33, 0x15, 0x23, + 0x11, 0x23, 0x35, 0x23, 0x15, 0x23, 0x11, 0x23, 0x35, 0x33, 0x35, 0x33, 0x15, 0x33, 0x35, 0x11, + 0x35, 0x23, 0x15, 0x01, 0xb6, 0x2d, 0x2d, 0x7c, 0x80, 0x7b, 0x2d, 0x2d, 0x7b, 0x80, 0x80, 0x02, + 0x6b, 0x48, 0x63, 0xfe, 0x40, 0xfe, 0xfe, 0x01, 0xc0, 0x63, 0x48, 0x48, 0x48, 0xfe, 0xf8, 0x5d, + 0x5d, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x19, 0x00, 0x00, 0x01, 0xb9, 0x02, 0xb6, 0x00, 0x1d, + 0x00, 0xb2, 0xb5, 0x06, 0x40, 0x09, 0x00, 0x4d, 0x05, 0xb8, 0xff, 0xc0, 0xb3, 0x09, 0x00, 0x4d, + 0x0a, 0xb8, 0xff, 0xc0, 0xb3, 0x16, 0x00, 0x4d, 0x0a, 0xb8, 0xff, 0xc0, 0x40, 0x09, 0x14, 0x00, + 0x4d, 0x0a, 0x40, 0x10, 0x00, 0x4d, 0x09, 0xb8, 0xff, 0xc0, 0xb3, 0x16, 0x00, 0x4d, 0x09, 0xb8, + 0xff, 0xc0, 0x40, 0x09, 0x14, 0x00, 0x4d, 0x09, 0x40, 0x10, 0x00, 0x4d, 0x02, 0xb8, 0xff, 0xc0, + 0xb3, 0x16, 0x00, 0x4d, 0x02, 0xb8, 0xff, 0xc0, 0x40, 0x3b, 0x14, 0x00, 0x4d, 0x02, 0x48, 0x10, + 0x00, 0x4d, 0x16, 0x51, 0x08, 0xa0, 0x13, 0x01, 0x2f, 0x13, 0x3f, 0x13, 0x02, 0x13, 0x1f, 0x0b, + 0x0a, 0x07, 0x1c, 0x51, 0x04, 0xa0, 0x00, 0x01, 0x00, 0x05, 0x02, 0x1e, 0x07, 0x04, 0x01, 0x0a, + 0x0a, 0x01, 0x04, 0x07, 0x04, 0x06, 0x1d, 0x06, 0x15, 0x06, 0x19, 0x57, 0x30, 0x0e, 0x01, 0x0e, + 0x0b, 0x06, 0x01, 0x05, 0x00, 0x00, 0x3f, 0x3f, 0x3f, 0x5d, 0xed, 0x3f, 0x3f, 0x12, 0x17, 0x39, + 0x2f, 0x2f, 0x2f, 0x2f, 0x01, 0x10, 0xc6, 0xc4, 0xd6, 0x5d, 0x32, 0xed, 0x32, 0x32, 0x32, 0x10, + 0xd6, 0x5d, 0x5d, 0xc4, 0xed, 0x31, 0x30, 0x00, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, + 0x2b, 0x01, 0x2b, 0x2b, 0x33, 0x11, 0x23, 0x35, 0x33, 0x35, 0x37, 0x15, 0x33, 0x15, 0x23, 0x15, + 0x36, 0x36, 0x33, 0x32, 0x1e, 0x02, 0x15, 0x11, 0x23, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, + 0x11, 0x50, 0x37, 0x37, 0x7c, 0x7f, 0x7f, 0x0e, 0x26, 0x0f, 0x31, 0x41, 0x27, 0x11, 0x7b, 0x1a, + 0x23, 0x0e, 0x1f, 0x08, 0x02, 0x14, 0x53, 0x3a, 0x15, 0x4f, 0x53, 0x42, 0x05, 0x09, 0x1f, 0x39, + 0x4f, 0x30, 0xfe, 0xf7, 0xf9, 0x42, 0x3a, 0x08, 0x03, 0xfe, 0x96, 0x00, 0xff, 0xff, 0x00, 0x36, + 0x00, 0x00, 0x01, 0xbf, 0x03, 0x2b, 0x02, 0x26, 0x00, 0x2c, 0x00, 0x00, 0x01, 0x07, 0x00, 0x75, + 0xff, 0xff, 0x00, 0x8b, 0x00, 0x10, 0x40, 0x0b, 0x01, 0x00, 0x1a, 0x0c, 0x00, 0x06, 0x50, 0x01, + 0x05, 0x19, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0x00, 0xff, 0xff, 0x00, 0x24, 0xff, 0xf5, 0x01, 0xd3, + 0x02, 0xa0, 0x02, 0x26, 0x01, 0x0c, 0x00, 0x00, 0x01, 0x06, 0x00, 0x75, 0xed, 0x00, 0x00, 0x13, + 0xb9, 0x00, 0x01, 0xff, 0xee, 0x40, 0x09, 0x22, 0x14, 0x0a, 0x00, 0x50, 0x01, 0x0b, 0x21, 0x4f, + 0x2b, 0x2b, 0x34, 0x00, 0xff, 0xff, 0x00, 0x36, 0x00, 0x00, 0x01, 0xbf, 0x03, 0x12, 0x02, 0x26, + 0x00, 0x2c, 0x00, 0x00, 0x01, 0x07, 0x00, 0x8a, 0xff, 0xff, 0x00, 0x8b, 0x00, 0x10, 0x40, 0x0b, + 0x01, 0x00, 0x0c, 0x0d, 0x00, 0x06, 0x50, 0x01, 0x05, 0x0e, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x24, 0xff, 0xf5, 0x01, 0xd3, 0x02, 0x87, 0x02, 0x26, 0x01, 0x0c, 0x00, 0x00, + 0x01, 0x06, 0x00, 0x8a, 0xed, 0x00, 0x00, 0x13, 0xb9, 0x00, 0x01, 0xff, 0xee, 0x40, 0x09, 0x14, + 0x15, 0x0a, 0x00, 0x50, 0x01, 0x0b, 0x16, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0xff, 0xff, 0x00, 0x36, + 0x00, 0x00, 0x01, 0xbf, 0x03, 0x35, 0x02, 0x26, 0x00, 0x2c, 0x00, 0x00, 0x01, 0x07, 0x01, 0x61, + 0x00, 0x00, 0x00, 0x8b, 0x00, 0x10, 0x40, 0x0b, 0x01, 0x00, 0x10, 0x1a, 0x00, 0x06, 0x50, 0x01, + 0x05, 0x0c, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0x00, 0xff, 0xff, 0x00, 0x24, 0xff, 0xf5, 0x01, 0xd3, + 0x02, 0xaa, 0x02, 0x26, 0x01, 0x0c, 0x00, 0x00, 0x01, 0x06, 0x01, 0x61, 0xef, 0x00, 0x00, 0x13, + 0xb9, 0x00, 0x01, 0xff, 0xee, 0x40, 0x09, 0x18, 0x22, 0x0a, 0x00, 0x50, 0x01, 0x0b, 0x14, 0x4f, + 0x2b, 0x2b, 0x34, 0x00, 0x00, 0x01, 0x00, 0x36, 0xff, 0x56, 0x01, 0xbf, 0x02, 0x6b, 0x00, 0x21, + 0x00, 0x59, 0xb9, 0x00, 0x13, 0xff, 0xc0, 0xb4, 0x09, 0x0a, 0x00, 0x4c, 0x12, 0xb8, 0xff, 0xc0, + 0x40, 0x2d, 0x09, 0x0a, 0x00, 0x4c, 0x06, 0x1b, 0x00, 0x23, 0x14, 0x10, 0x0f, 0x13, 0x1f, 0x13, + 0x02, 0x13, 0x44, 0x0d, 0x0b, 0x10, 0x0f, 0x30, 0x0f, 0x40, 0x0f, 0x50, 0x0f, 0x04, 0x0f, 0x22, + 0x0c, 0x13, 0x48, 0x15, 0x08, 0x0d, 0x12, 0x48, 0x10, 0x02, 0x0a, 0x08, 0x21, 0x03, 0x92, 0x00, + 0x3f, 0xc5, 0x3f, 0x3f, 0xfd, 0xc0, 0x3f, 0xfd, 0xc0, 0x01, 0x10, 0xd6, 0x5d, 0x32, 0xd5, 0xfd, + 0x5d, 0xc4, 0xc5, 0x10, 0xd6, 0xdc, 0xc5, 0x31, 0x30, 0x2b, 0x2b, 0x05, 0x06, 0x06, 0x23, 0x22, + 0x26, 0x35, 0x34, 0x36, 0x37, 0x23, 0x35, 0x33, 0x11, 0x23, 0x35, 0x21, 0x15, 0x23, 0x11, 0x33, + 0x15, 0x23, 0x0e, 0x03, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x01, 0x4e, 0x0e, 0x33, 0x1c, + 0x30, 0x2a, 0x21, 0x1d, 0x9f, 0x87, 0x87, 0x01, 0x89, 0x86, 0x86, 0x80, 0x0a, 0x16, 0x13, 0x0d, + 0x0b, 0x10, 0x08, 0x16, 0x0f, 0x9c, 0x05, 0x09, 0x25, 0x1b, 0x1a, 0x3a, 0x16, 0x66, 0x01, 0x9f, + 0x66, 0x66, 0xfe, 0x61, 0x66, 0x08, 0x14, 0x16, 0x16, 0x09, 0x0a, 0x0e, 0x02, 0x05, 0x00, 0x00, + 0x00, 0x02, 0x00, 0x24, 0xff, 0x56, 0x01, 0xd3, 0x02, 0xac, 0x00, 0x0b, 0x00, 0x33, 0x00, 0x52, + 0xb9, 0x00, 0x33, 0xff, 0xc0, 0xb3, 0x0d, 0x00, 0x4d, 0x32, 0xb8, 0xff, 0xc0, 0x40, 0x26, 0x0d, + 0x00, 0x4d, 0x1f, 0x11, 0x18, 0x33, 0x35, 0x00, 0x35, 0x20, 0x35, 0x02, 0x2b, 0x51, 0x28, 0x2a, + 0x00, 0x54, 0x06, 0x2a, 0x34, 0x32, 0x2f, 0x55, 0x0c, 0x22, 0x07, 0x17, 0x1a, 0x92, 0x29, 0x55, + 0x2b, 0x03, 0x58, 0x09, 0x00, 0x00, 0x3f, 0xfd, 0xd6, 0xed, 0x3f, 0xcd, 0x3f, 0xc5, 0xfd, 0xc6, + 0x01, 0x10, 0xd6, 0xd6, 0xed, 0x10, 0xd5, 0xed, 0x5d, 0x10, 0xc6, 0xd6, 0xdc, 0xc5, 0x31, 0x30, + 0x2b, 0x2b, 0x01, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x13, 0x0e, + 0x03, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x17, 0x06, 0x23, 0x22, 0x2e, 0x02, 0x35, 0x34, + 0x36, 0x37, 0x2e, 0x03, 0x35, 0x35, 0x23, 0x35, 0x33, 0x11, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, + 0x17, 0x01, 0x1c, 0x2e, 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x20, 0x2e, 0x9f, 0x0a, 0x17, 0x13, 0x0c, + 0x0b, 0x10, 0x08, 0x16, 0x0f, 0x07, 0x27, 0x2c, 0x14, 0x24, 0x1b, 0x11, 0x1a, 0x17, 0x2d, 0x3d, + 0x24, 0x10, 0x82, 0xfd, 0x1f, 0x24, 0x11, 0x30, 0x1e, 0x10, 0x02, 0x5d, 0x24, 0x2a, 0x2a, 0x24, + 0x25, 0x2a, 0x2a, 0xfd, 0x7e, 0x08, 0x14, 0x16, 0x16, 0x09, 0x0a, 0x0e, 0x02, 0x05, 0x3a, 0x0e, + 0x07, 0x0f, 0x19, 0x11, 0x17, 0x33, 0x15, 0x02, 0x1d, 0x35, 0x4b, 0x2f, 0xad, 0x66, 0xfe, 0xdc, + 0x2b, 0x27, 0x09, 0x0e, 0x65, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x36, 0x00, 0x00, 0x01, 0xbf, + 0x03, 0x3d, 0x02, 0x26, 0x00, 0x2c, 0x00, 0x00, 0x01, 0x07, 0x01, 0x62, 0x00, 0x00, 0x00, 0x9a, + 0x00, 0x10, 0x40, 0x0b, 0x01, 0x00, 0x0e, 0x14, 0x00, 0x06, 0x50, 0x01, 0x05, 0x0c, 0x4f, 0x2b, + 0x2b, 0x34, 0x00, 0x00, 0x00, 0x01, 0x00, 0x24, 0xff, 0xf5, 0x01, 0xd3, 0x01, 0xd6, 0x00, 0x13, + 0x00, 0x3b, 0xb9, 0x00, 0x13, 0xff, 0xc0, 0xb3, 0x0a, 0x00, 0x4d, 0x00, 0xb8, 0xff, 0xc0, 0x40, + 0x1a, 0x0a, 0x00, 0x4d, 0x00, 0x00, 0x20, 0x00, 0x40, 0x00, 0x03, 0x00, 0x15, 0x0d, 0x51, 0x09, + 0x0a, 0x14, 0x09, 0x55, 0x0c, 0x0a, 0x13, 0x10, 0x57, 0x03, 0x07, 0x00, 0x3f, 0xfd, 0xce, 0x3f, + 0xed, 0x01, 0x10, 0xd6, 0xdd, 0xed, 0x10, 0xc6, 0x5d, 0x31, 0x30, 0x2b, 0x2b, 0x25, 0x06, 0x06, + 0x23, 0x22, 0x2e, 0x02, 0x35, 0x35, 0x23, 0x35, 0x33, 0x11, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, + 0x01, 0xd3, 0x26, 0x43, 0x1c, 0x30, 0x41, 0x27, 0x10, 0x82, 0xfd, 0x1f, 0x24, 0x11, 0x30, 0x1e, + 0x14, 0x12, 0x0d, 0x1c, 0x35, 0x4c, 0x31, 0xad, 0x66, 0xfe, 0xdd, 0x2a, 0x29, 0x09, 0x0e, 0x00, + 0xff, 0xff, 0x00, 0x24, 0xff, 0xf5, 0x01, 0xd3, 0x02, 0xac, 0x02, 0x06, 0x00, 0x4c, 0x00, 0x00, + 0x00, 0x02, 0x00, 0x18, 0xff, 0xf3, 0x01, 0xe0, 0x02, 0x6b, 0x00, 0x03, 0x00, 0x17, 0x00, 0x3f, + 0x40, 0x0b, 0x2f, 0x15, 0x3f, 0x15, 0x02, 0x15, 0x44, 0x60, 0x04, 0x01, 0x04, 0xb8, 0xff, 0xc0, + 0x40, 0x18, 0x11, 0x15, 0x48, 0x04, 0x19, 0x0c, 0x02, 0x44, 0xc0, 0x01, 0x01, 0x01, 0x18, 0x16, + 0x02, 0x0d, 0x10, 0x4a, 0x09, 0x09, 0x03, 0x08, 0x01, 0x02, 0x00, 0x3f, 0x3f, 0x3f, 0xfd, 0xc2, + 0x3f, 0x01, 0x10, 0xd6, 0x5d, 0xfd, 0xce, 0x10, 0xd6, 0x2b, 0x5d, 0xed, 0x5d, 0x31, 0x30, 0x33, + 0x11, 0x33, 0x11, 0x25, 0x14, 0x0e, 0x02, 0x23, 0x22, 0x26, 0x27, 0x37, 0x16, 0x16, 0x33, 0x32, + 0x3e, 0x02, 0x35, 0x11, 0x33, 0x18, 0x7b, 0x01, 0x4d, 0x1b, 0x30, 0x3f, 0x24, 0x23, 0x3e, 0x24, + 0x30, 0x0f, 0x21, 0x1a, 0x0d, 0x17, 0x10, 0x09, 0x7c, 0x02, 0x6b, 0xfd, 0x95, 0xc2, 0x3e, 0x50, + 0x2e, 0x13, 0x11, 0x19, 0x62, 0x0e, 0x13, 0x08, 0x17, 0x2a, 0x23, 0x01, 0xa1, 0x00, 0x00, 0x00, + 0x00, 0x04, 0x00, 0x37, 0xff, 0x5b, 0x01, 0xbb, 0x02, 0xac, 0x00, 0x03, 0x00, 0x0f, 0x00, 0x1f, + 0x00, 0x2b, 0x00, 0x89, 0xb9, 0x00, 0x03, 0xff, 0xc0, 0xb3, 0x0e, 0x00, 0x4d, 0x00, 0xb8, 0xff, + 0xc0, 0x40, 0x1d, 0x0e, 0x00, 0x4d, 0x26, 0x54, 0xa0, 0x20, 0xb0, 0x20, 0x02, 0x02, 0x80, 0x20, + 0x90, 0x20, 0x02, 0x3f, 0x20, 0x01, 0x20, 0x2d, 0x04, 0x54, 0xcf, 0x0a, 0xdf, 0x0a, 0x02, 0x0a, + 0xb8, 0xff, 0xc0, 0x40, 0x13, 0x0b, 0x0e, 0x48, 0x0a, 0x2c, 0x1c, 0x51, 0x3f, 0x1b, 0x4f, 0x1b, + 0x02, 0x1b, 0x5f, 0x03, 0x01, 0x03, 0x51, 0x02, 0xb8, 0xff, 0xc0, 0x40, 0x1a, 0x0b, 0x0e, 0x48, + 0x02, 0xb0, 0x13, 0x01, 0x13, 0x2c, 0x1b, 0x23, 0x58, 0x29, 0x00, 0x14, 0x17, 0x57, 0x10, 0x0e, + 0x03, 0x07, 0x58, 0x0d, 0x00, 0x01, 0x06, 0x00, 0x3f, 0x3f, 0xfd, 0xce, 0x3f, 0xfd, 0xc6, 0x3f, + 0xfd, 0xce, 0x01, 0x10, 0xc6, 0x5d, 0xd6, 0x2b, 0xfd, 0x5d, 0xd6, 0x5d, 0xed, 0x10, 0xd6, 0x2b, + 0x5d, 0xed, 0x10, 0xd6, 0x5d, 0x5d, 0x5f, 0x5d, 0xed, 0x31, 0x30, 0x2b, 0x2b, 0x33, 0x23, 0x11, + 0x33, 0x37, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x13, 0x22, 0x26, + 0x27, 0x37, 0x16, 0x16, 0x33, 0x32, 0x36, 0x35, 0x11, 0x33, 0x11, 0x14, 0x06, 0x13, 0x14, 0x06, + 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0xc4, 0x7b, 0x7b, 0x12, 0x30, 0x20, 0x20, + 0x2f, 0x2f, 0x20, 0x20, 0x30, 0x2d, 0x0d, 0x31, 0x15, 0x11, 0x0e, 0x16, 0x11, 0x20, 0x18, 0x7c, + 0x51, 0x62, 0x30, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x20, 0x30, 0x01, 0xd6, 0x87, 0x25, 0x29, 0x29, + 0x25, 0x26, 0x29, 0x29, 0xfc, 0xd8, 0x04, 0x08, 0x65, 0x05, 0x03, 0x26, 0x23, 0x01, 0xc9, 0xfe, + 0x3b, 0x5e, 0x58, 0x03, 0x02, 0x25, 0x29, 0x29, 0x25, 0x26, 0x29, 0x29, 0xff, 0xff, 0x00, 0x2a, + 0xff, 0xf3, 0x01, 0xbc, 0x03, 0x3e, 0x02, 0x26, 0x00, 0x2d, 0x00, 0x00, 0x01, 0x07, 0x00, 0x69, + 0x00, 0x36, 0x00, 0x8b, 0x00, 0x10, 0x40, 0x0b, 0x01, 0x41, 0x18, 0x14, 0x08, 0x00, 0x50, 0x01, + 0x12, 0x15, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0x00, 0xff, 0xff, 0x00, 0x31, 0xff, 0x56, 0x01, 0x98, + 0x02, 0xb3, 0x02, 0x26, 0x01, 0x5d, 0x00, 0x00, 0x01, 0x06, 0x00, 0x69, 0x12, 0x00, 0x00, 0x10, + 0x40, 0x0b, 0x01, 0x2c, 0x18, 0x14, 0x08, 0x00, 0x50, 0x01, 0x12, 0x15, 0x4f, 0x2b, 0x2b, 0x34, + 0xff, 0xff, 0x00, 0x2d, 0xff, 0x56, 0x01, 0xe9, 0x02, 0x6b, 0x02, 0x26, 0x00, 0x2e, 0x00, 0x00, + 0x01, 0x06, 0x01, 0xc3, 0xef, 0x00, 0x00, 0x0d, 0xb9, 0x00, 0x01, 0xff, 0xde, 0xb4, 0x24, 0x1d, + 0x07, 0x1a, 0x50, 0x2b, 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x3f, 0xff, 0x56, 0x01, 0xe7, + 0x02, 0xb6, 0x02, 0x26, 0x00, 0x4e, 0x00, 0x00, 0x01, 0x06, 0x01, 0xc3, 0xef, 0x00, 0x00, 0x0d, + 0xb9, 0x00, 0x01, 0xff, 0xd6, 0xb4, 0x24, 0x1d, 0x18, 0x10, 0x50, 0x2b, 0x34, 0x00, 0x00, 0x00, + 0x00, 0x02, 0x00, 0x2d, 0x00, 0x00, 0x02, 0x14, 0x02, 0xb3, 0x00, 0x1a, 0x00, 0x2a, 0x00, 0x65, + 0x40, 0x0c, 0x00, 0x61, 0x1a, 0x2c, 0x24, 0x1b, 0x40, 0x10, 0x01, 0x10, 0x2c, 0x2c, 0xb8, 0xff, + 0xc0, 0x40, 0x11, 0x0b, 0x0e, 0x48, 0x09, 0x0a, 0x0a, 0x15, 0x15, 0x05, 0x20, 0x06, 0x30, 0x06, + 0x02, 0x06, 0x51, 0x07, 0xb8, 0xff, 0xc0, 0x40, 0x17, 0x0b, 0x0e, 0x48, 0x07, 0x2b, 0x2a, 0x23, + 0x9f, 0x0f, 0x02, 0x15, 0x0a, 0x05, 0x0a, 0x05, 0x0a, 0x06, 0x08, 0x02, 0x06, 0x08, 0x00, 0x08, + 0x00, 0x3f, 0x3f, 0x3f, 0x12, 0x39, 0x39, 0x2f, 0x2f, 0x12, 0x39, 0x3f, 0x3f, 0xc4, 0x01, 0x10, + 0xd6, 0x2b, 0xed, 0x5d, 0x32, 0x32, 0x2f, 0x32, 0x2f, 0x33, 0x2b, 0x10, 0xd4, 0x5d, 0xd4, 0xc5, + 0x10, 0xd6, 0xed, 0x31, 0x30, 0x21, 0x2e, 0x03, 0x27, 0x11, 0x23, 0x11, 0x33, 0x11, 0x3e, 0x03, + 0x37, 0x33, 0x0e, 0x03, 0x07, 0x1e, 0x03, 0x17, 0x03, 0x26, 0x26, 0x37, 0x3e, 0x03, 0x37, 0x17, + 0x06, 0x06, 0x15, 0x14, 0x16, 0x17, 0x01, 0x20, 0x08, 0x1d, 0x24, 0x26, 0x12, 0x72, 0x72, 0x0f, + 0x20, 0x1c, 0x18, 0x08, 0x82, 0x0a, 0x20, 0x2a, 0x33, 0x1c, 0x24, 0x3a, 0x2d, 0x22, 0x0c, 0x0f, + 0x02, 0x02, 0x01, 0x02, 0x0a, 0x0f, 0x16, 0x0e, 0x45, 0x13, 0x0f, 0x01, 0x02, 0x23, 0x51, 0x4d, + 0x43, 0x17, 0xfe, 0xe5, 0x02, 0x6b, 0xfe, 0xff, 0x1c, 0x44, 0x44, 0x42, 0x1b, 0x1b, 0x44, 0x4b, + 0x50, 0x27, 0x22, 0x53, 0x58, 0x58, 0x25, 0x01, 0xba, 0x0e, 0x1d, 0x0d, 0x21, 0x34, 0x2c, 0x29, + 0x17, 0x10, 0x31, 0x59, 0x2f, 0x0d, 0x1a, 0x09, 0x00, 0x01, 0x00, 0x3f, 0x00, 0x00, 0x01, 0xe7, + 0x01, 0xd6, 0x00, 0x1a, 0x00, 0x27, 0x40, 0x14, 0x10, 0x1c, 0x16, 0x1a, 0x51, 0x19, 0x1b, 0x16, + 0x0b, 0x00, 0x03, 0x17, 0x1a, 0x0a, 0x17, 0x06, 0x11, 0x06, 0x05, 0x0a, 0x00, 0x3f, 0x3f, 0x3f, + 0x3f, 0x12, 0x17, 0x39, 0x01, 0x10, 0xd6, 0xed, 0x32, 0x10, 0xc6, 0x31, 0x30, 0x13, 0x3e, 0x03, + 0x37, 0x33, 0x0e, 0x03, 0x07, 0x1e, 0x03, 0x17, 0x23, 0x2e, 0x03, 0x27, 0x15, 0x23, 0x11, 0x37, + 0xbb, 0x12, 0x25, 0x23, 0x20, 0x0c, 0x94, 0x12, 0x2e, 0x31, 0x31, 0x14, 0x19, 0x3a, 0x38, 0x2f, + 0x0e, 0x8d, 0x0c, 0x27, 0x2c, 0x2d, 0x13, 0x7c, 0x7c, 0x01, 0x1c, 0x15, 0x2f, 0x32, 0x2f, 0x15, + 0x17, 0x36, 0x38, 0x34, 0x16, 0x18, 0x43, 0x48, 0x48, 0x1c, 0x19, 0x3f, 0x3d, 0x37, 0x12, 0xde, + 0x01, 0xd5, 0x01, 0x00, 0xff, 0xff, 0x00, 0x47, 0x00, 0x00, 0x01, 0xcc, 0x03, 0x3e, 0x02, 0x26, + 0x00, 0x2f, 0x00, 0x00, 0x01, 0x07, 0x00, 0x8f, 0xff, 0xcb, 0x00, 0x8b, 0x00, 0x13, 0xb9, 0x00, + 0x01, 0xff, 0xc7, 0x40, 0x09, 0x08, 0x06, 0x01, 0x00, 0x50, 0x01, 0x02, 0x07, 0x4f, 0x2b, 0x2b, + 0x34, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x24, 0xff, 0xf5, 0x01, 0xd3, 0x03, 0x3d, 0x00, 0x13, + 0x00, 0x17, 0x00, 0x39, 0x40, 0x20, 0x3f, 0x00, 0x01, 0x00, 0x19, 0x14, 0x50, 0x16, 0x01, 0x16, + 0x18, 0x0d, 0x53, 0xaf, 0x09, 0x01, 0x09, 0x50, 0x0a, 0x01, 0x0a, 0x18, 0x15, 0x17, 0x86, 0x0b, + 0x9e, 0x13, 0x10, 0x57, 0x05, 0x07, 0x00, 0x3f, 0xfd, 0xc6, 0x3f, 0x3f, 0xc5, 0x01, 0x10, 0xd6, + 0x5d, 0xd5, 0x5d, 0xed, 0x10, 0xd4, 0x5d, 0xc5, 0x10, 0xce, 0x5d, 0x31, 0x30, 0x25, 0x0e, 0x03, + 0x23, 0x22, 0x26, 0x35, 0x11, 0x23, 0x35, 0x33, 0x11, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x03, + 0x07, 0x27, 0x37, 0x01, 0xd3, 0x03, 0x15, 0x22, 0x31, 0x1f, 0x55, 0x4e, 0x82, 0xfd, 0x26, 0x1d, + 0x25, 0x32, 0x08, 0x63, 0xc3, 0x1b, 0xbe, 0x14, 0x02, 0x0a, 0x0b, 0x08, 0x65, 0x61, 0x01, 0x64, + 0x66, 0xfe, 0x2d, 0x30, 0x22, 0x14, 0x03, 0x02, 0x6c, 0x3e, 0x3e, 0x5a, 0xff, 0xff, 0x00, 0x47, + 0xff, 0x56, 0x01, 0xcc, 0x02, 0x6b, 0x02, 0x26, 0x00, 0x2f, 0x00, 0x00, 0x01, 0x06, 0x01, 0xc3, + 0x00, 0x00, 0x00, 0x0d, 0xb9, 0x00, 0x01, 0xff, 0xf1, 0xb4, 0x0f, 0x08, 0x01, 0x00, 0x50, 0x2b, + 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x24, 0xff, 0x56, 0x01, 0xd3, 0x02, 0xb0, 0x02, 0x26, + 0x00, 0x4f, 0x00, 0x00, 0x01, 0x06, 0x01, 0xc3, 0x2d, 0x00, 0x00, 0x0a, 0xb6, 0x01, 0x2b, 0x1d, + 0x16, 0x0a, 0x00, 0x50, 0x2b, 0x34, 0x00, 0x00, 0xff, 0xff, 0x00, 0x47, 0x00, 0x00, 0x01, 0xcc, + 0x02, 0x6d, 0x02, 0x26, 0x00, 0x2f, 0x00, 0x00, 0x01, 0x06, 0x01, 0xc2, 0x59, 0xb8, 0x00, 0x0a, + 0xb6, 0x01, 0x4a, 0x08, 0x06, 0x01, 0x00, 0x50, 0x2b, 0x34, 0x00, 0x00, 0xff, 0xff, 0x00, 0x24, + 0xff, 0xf5, 0x01, 0xdd, 0x02, 0xb5, 0x02, 0x26, 0x00, 0x4f, 0x00, 0x00, 0x01, 0x07, 0x01, 0xc2, + 0x00, 0xac, 0x00, 0x00, 0x00, 0x0a, 0xb6, 0x01, 0xab, 0x16, 0x14, 0x0a, 0x00, 0x50, 0x2b, 0x34, + 0x00, 0x02, 0x00, 0x47, 0x00, 0x00, 0x01, 0xcc, 0x02, 0x6b, 0x00, 0x0b, 0x00, 0x11, 0x00, 0x46, + 0xb2, 0x06, 0x54, 0x00, 0xb8, 0xff, 0xc0, 0xb6, 0x09, 0x0d, 0x48, 0x00, 0x00, 0x12, 0x11, 0xb8, + 0xff, 0xc0, 0x40, 0x1b, 0x09, 0x0d, 0x48, 0x11, 0x13, 0x10, 0x44, 0x20, 0x0e, 0x30, 0x0e, 0x40, + 0x0e, 0x03, 0x0e, 0x12, 0x03, 0x58, 0x09, 0x09, 0x0d, 0x0f, 0x02, 0x10, 0x48, 0x0d, 0x08, 0x00, + 0x3f, 0xed, 0x3f, 0x12, 0x39, 0x2f, 0xed, 0x01, 0x10, 0xd6, 0x5d, 0xed, 0x10, 0xc6, 0x2b, 0x12, + 0x39, 0x2f, 0x2b, 0xed, 0x31, 0x30, 0x01, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, + 0x32, 0x16, 0x13, 0x21, 0x11, 0x33, 0x11, 0x21, 0x01, 0xca, 0x33, 0x20, 0x20, 0x33, 0x33, 0x20, + 0x20, 0x33, 0x02, 0xfe, 0x7b, 0x7c, 0x01, 0x09, 0x01, 0x68, 0x28, 0x2a, 0x2a, 0x28, 0x28, 0x2a, + 0x2a, 0xfe, 0x70, 0x02, 0x6b, 0xfd, 0xfb, 0x00, 0x00, 0x02, 0x00, 0x24, 0xff, 0xf5, 0x02, 0x38, + 0x02, 0xb5, 0x00, 0x0b, 0x00, 0x1f, 0x00, 0x4e, 0x40, 0x30, 0x00, 0x54, 0x40, 0x06, 0x50, 0x06, + 0x02, 0x06, 0x06, 0x20, 0x40, 0x0c, 0x50, 0x0c, 0x02, 0x0c, 0x21, 0x19, 0x51, 0x15, 0x40, 0x09, + 0x0a, 0x00, 0x4c, 0x2f, 0x15, 0x01, 0x15, 0x50, 0x16, 0x01, 0x16, 0x20, 0x03, 0x58, 0x09, 0x09, + 0x11, 0x16, 0x55, 0x17, 0x00, 0x1f, 0x1c, 0x57, 0x11, 0x07, 0x00, 0x3f, 0xfd, 0xc6, 0x3f, 0xed, + 0x12, 0x39, 0x2f, 0xed, 0x01, 0x10, 0xd6, 0x5d, 0xdd, 0x5d, 0x2b, 0xed, 0x10, 0xc6, 0x5d, 0x12, + 0x39, 0x2f, 0x5d, 0xed, 0x31, 0x30, 0x01, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, + 0x32, 0x16, 0x03, 0x0e, 0x03, 0x23, 0x22, 0x26, 0x35, 0x11, 0x23, 0x35, 0x33, 0x11, 0x14, 0x16, + 0x33, 0x32, 0x36, 0x37, 0x02, 0x38, 0x33, 0x20, 0x20, 0x33, 0x33, 0x20, 0x20, 0x33, 0x65, 0x03, + 0x15, 0x22, 0x31, 0x1f, 0x55, 0x4e, 0x82, 0xfd, 0x26, 0x1d, 0x25, 0x32, 0x08, 0x01, 0x70, 0x28, + 0x2a, 0x2a, 0x28, 0x28, 0x2a, 0x2a, 0xfe, 0x7c, 0x02, 0x0a, 0x0b, 0x08, 0x65, 0x61, 0x01, 0x94, + 0x66, 0xfd, 0xfd, 0x30, 0x22, 0x14, 0x03, 0x00, 0x00, 0x01, 0xff, 0xf6, 0x00, 0x00, 0x01, 0xcc, + 0x02, 0x6b, 0x00, 0x0d, 0x00, 0x43, 0x40, 0x25, 0x00, 0x02, 0x10, 0x02, 0x02, 0x02, 0x0f, 0x00, + 0x0a, 0x44, 0x05, 0x09, 0x07, 0x0e, 0x08, 0x0d, 0x0b, 0x03, 0x0c, 0x06, 0x05, 0x00, 0x03, 0x07, + 0x0c, 0x07, 0x0c, 0x07, 0x03, 0x09, 0x02, 0x04, 0x08, 0x02, 0x48, 0x03, 0x08, 0x00, 0x3f, 0xed, + 0x3f, 0x3f, 0x12, 0x39, 0x39, 0x2f, 0x2f, 0x11, 0x17, 0x39, 0x12, 0x17, 0x39, 0x01, 0x10, 0xc6, + 0xd4, 0x32, 0xed, 0x32, 0x10, 0xc6, 0x5d, 0x31, 0x30, 0x13, 0x15, 0x33, 0x15, 0x21, 0x35, 0x07, + 0x27, 0x37, 0x11, 0x33, 0x15, 0x37, 0x17, 0xd5, 0xf7, 0xfe, 0x8d, 0x37, 0x2c, 0x63, 0x7c, 0x6c, + 0x2b, 0x01, 0x24, 0xbe, 0x66, 0xe6, 0x1b, 0x5a, 0x32, 0x01, 0x14, 0xd6, 0x36, 0x5a, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x24, 0xff, 0xf5, 0x01, 0xd3, 0x02, 0xb0, 0x00, 0x1b, 0x00, 0x3e, 0x40, 0x25, + 0x00, 0x00, 0x10, 0x00, 0x02, 0x00, 0x1d, 0x14, 0x11, 0x51, 0x09, 0x0d, 0x51, 0xc0, 0x0e, 0xd0, + 0x0e, 0x02, 0x0e, 0x1c, 0x12, 0x13, 0x0b, 0x0a, 0x04, 0x05, 0x0d, 0x55, 0x10, 0x10, 0x0f, 0x10, + 0x1b, 0x18, 0x57, 0x05, 0x07, 0x00, 0x3f, 0xfd, 0xc6, 0x3f, 0x3f, 0xed, 0x12, 0x17, 0x39, 0x01, + 0x10, 0xd6, 0x5d, 0xfd, 0x32, 0xed, 0x32, 0x10, 0xc6, 0x5d, 0x31, 0x30, 0x25, 0x0e, 0x03, 0x23, + 0x22, 0x26, 0x35, 0x35, 0x07, 0x27, 0x37, 0x35, 0x23, 0x35, 0x33, 0x15, 0x37, 0x17, 0x07, 0x15, + 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x01, 0xd3, 0x03, 0x15, 0x22, 0x31, 0x1f, 0x55, 0x4e, 0x37, + 0x28, 0x5f, 0x82, 0xfd, 0x40, 0x28, 0x68, 0x26, 0x1d, 0x25, 0x32, 0x08, 0x14, 0x02, 0x0a, 0x0b, + 0x08, 0x65, 0x61, 0x70, 0x1c, 0x53, 0x2f, 0xb9, 0x66, 0xe2, 0x20, 0x52, 0x34, 0xb6, 0x30, 0x22, + 0x14, 0x03, 0x00, 0x00, 0xff, 0xff, 0x00, 0x2e, 0x00, 0x00, 0x01, 0xc6, 0x03, 0x3e, 0x02, 0x26, + 0x00, 0x31, 0x00, 0x00, 0x01, 0x07, 0x00, 0x8f, 0x00, 0x00, 0x00, 0x8b, 0x00, 0x10, 0x40, 0x0b, + 0x01, 0x0b, 0x12, 0x10, 0x05, 0x0e, 0x50, 0x01, 0x06, 0x11, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x3f, 0x00, 0x00, 0x01, 0xb9, 0x02, 0xb3, 0x02, 0x26, 0x00, 0x51, 0x00, 0x00, + 0x01, 0x06, 0x00, 0x8f, 0xf8, 0x00, 0x00, 0x10, 0x40, 0x0b, 0x01, 0x01, 0x16, 0x14, 0x00, 0x07, + 0x50, 0x01, 0x02, 0x15, 0x4f, 0x2b, 0x2b, 0x34, 0xff, 0xff, 0x00, 0x2e, 0xff, 0x56, 0x01, 0xc6, + 0x02, 0x6b, 0x02, 0x26, 0x00, 0x31, 0x00, 0x00, 0x01, 0x06, 0x01, 0xc3, 0xef, 0x00, 0x00, 0x0d, + 0xb9, 0x00, 0x01, 0xff, 0xef, 0xb4, 0x19, 0x12, 0x05, 0x0e, 0x50, 0x2b, 0x34, 0x00, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x3f, 0xff, 0x56, 0x01, 0xb9, 0x01, 0xe0, 0x02, 0x26, 0x00, 0x51, 0x00, 0x00, + 0x01, 0x06, 0x01, 0xc3, 0xe6, 0x00, 0x00, 0x0d, 0xb9, 0x00, 0x01, 0xff, 0xe4, 0xb4, 0x1d, 0x16, + 0x00, 0x07, 0x50, 0x2b, 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x2e, 0x00, 0x00, 0x01, 0xc6, + 0x03, 0x3e, 0x02, 0x26, 0x00, 0x31, 0x00, 0x00, 0x01, 0x07, 0x01, 0x5f, 0x00, 0x00, 0x00, 0x8b, + 0x00, 0x10, 0x40, 0x0b, 0x01, 0x01, 0x10, 0x14, 0x05, 0x0e, 0x50, 0x01, 0x06, 0x15, 0x4f, 0x2b, + 0x2b, 0x34, 0x00, 0x00, 0xff, 0xff, 0x00, 0x3f, 0x00, 0x00, 0x01, 0xb9, 0x02, 0xb3, 0x02, 0x26, + 0x00, 0x51, 0x00, 0x00, 0x01, 0x06, 0x01, 0x5f, 0x00, 0x00, 0x00, 0x13, 0xb9, 0x00, 0x01, 0xff, + 0xff, 0x40, 0x09, 0x14, 0x18, 0x00, 0x07, 0x50, 0x01, 0x02, 0x19, 0x4f, 0x2b, 0x2b, 0x34, 0x00, + 0x00, 0x02, 0x00, 0x09, 0x00, 0x00, 0x01, 0xc6, 0x02, 0xb5, 0x00, 0x11, 0x00, 0x1f, 0x00, 0x8f, + 0x40, 0x0d, 0x11, 0x40, 0x0f, 0x10, 0x00, 0x4c, 0x10, 0x40, 0x0f, 0x10, 0x00, 0x4c, 0x00, 0xb8, + 0xff, 0xc0, 0x40, 0x11, 0x12, 0x00, 0x4d, 0x20, 0x0f, 0x30, 0x0f, 0x40, 0x0f, 0x03, 0x80, 0x0f, + 0x01, 0x0f, 0x8f, 0x10, 0x00, 0xb8, 0xff, 0xe8, 0x40, 0x43, 0x11, 0x00, 0x4d, 0x00, 0x9f, 0x11, + 0xbf, 0x11, 0x02, 0x11, 0x40, 0x0b, 0x0e, 0x48, 0x11, 0x21, 0x2f, 0x06, 0x3f, 0x06, 0x4f, 0x06, + 0x03, 0x6f, 0x06, 0x7f, 0x06, 0x8f, 0x06, 0x03, 0x06, 0x8f, 0x60, 0x07, 0x70, 0x07, 0x80, 0x07, + 0x03, 0x0f, 0x07, 0x1f, 0x07, 0x2f, 0x07, 0x4f, 0x07, 0x5f, 0x07, 0x05, 0x07, 0x12, 0x19, 0x20, + 0x18, 0x1f, 0x9f, 0x0e, 0x05, 0x0f, 0x02, 0x09, 0x02, 0x07, 0x08, 0x00, 0x08, 0x00, 0x3f, 0x3f, + 0x3f, 0x3f, 0x39, 0x39, 0x3f, 0xc4, 0x01, 0x10, 0xd6, 0xd5, 0xd6, 0x5d, 0x5d, 0xed, 0x5d, 0x71, + 0x10, 0xd6, 0x2b, 0x5d, 0xc5, 0x2b, 0xd0, 0xed, 0x5d, 0x71, 0x31, 0x30, 0x2b, 0x2b, 0x2b, 0x21, + 0x2e, 0x03, 0x27, 0x11, 0x23, 0x11, 0x33, 0x1e, 0x03, 0x17, 0x11, 0x33, 0x11, 0x01, 0x15, 0x0e, + 0x03, 0x07, 0x27, 0x36, 0x36, 0x35, 0x34, 0x26, 0x27, 0x01, 0x7b, 0x11, 0x1e, 0x1c, 0x1e, 0x10, + 0x57, 0x4b, 0x0d, 0x1e, 0x1f, 0x20, 0x0e, 0x58, 0xfe, 0xc4, 0x02, 0x09, 0x0f, 0x15, 0x0d, 0x45, + 0x13, 0x0f, 0x01, 0x02, 0x34, 0x5f, 0x5d, 0x62, 0x37, 0xfe, 0x77, 0x02, 0x6b, 0x27, 0x5a, 0x5e, + 0x5f, 0x2d, 0x01, 0x6b, 0xfd, 0x95, 0x02, 0xb5, 0x26, 0x1c, 0x2e, 0x28, 0x25, 0x14, 0x14, 0x28, + 0x47, 0x26, 0x0b, 0x15, 0x08, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xe6, 0x00, 0x00, 0x01, 0xcb, + 0x02, 0xb5, 0x02, 0x26, 0x00, 0x51, 0x12, 0x00, 0x01, 0x07, 0x01, 0x5e, 0xff, 0x36, 0x00, 0x00, + 0x00, 0x06, 0xb3, 0x01, 0x03, 0x1c, 0x4f, 0x2b, 0x00, 0x01, 0x00, 0x2e, 0xff, 0x59, 0x01, 0xc6, + 0x02, 0x6b, 0x00, 0x1b, 0x00, 0x46, 0xb9, 0x00, 0x00, 0xff, 0xe0, 0x40, 0x0f, 0x0e, 0x00, 0x4d, + 0x2f, 0x0c, 0x3f, 0x0c, 0x02, 0x0c, 0x44, 0x0e, 0x1d, 0x03, 0x44, 0x06, 0xb8, 0xff, 0xc0, 0x40, + 0x14, 0x0b, 0x0e, 0x48, 0x06, 0x15, 0x1c, 0x16, 0x18, 0x48, 0x12, 0x92, 0x03, 0x0c, 0x04, 0x0d, + 0x02, 0x07, 0x02, 0x04, 0x08, 0x00, 0x3f, 0x3f, 0x3f, 0x12, 0x39, 0x39, 0x3f, 0xfd, 0xc6, 0x01, + 0x10, 0xc6, 0xd6, 0x2b, 0xed, 0x10, 0xde, 0xed, 0x5d, 0x31, 0x30, 0x2b, 0x25, 0x26, 0x26, 0x27, + 0x11, 0x23, 0x11, 0x33, 0x1e, 0x03, 0x17, 0x11, 0x33, 0x11, 0x14, 0x06, 0x23, 0x22, 0x26, 0x27, + 0x37, 0x16, 0x33, 0x32, 0x36, 0x35, 0x01, 0x57, 0x28, 0x5d, 0x35, 0x6f, 0x63, 0x1c, 0x38, 0x35, + 0x2d, 0x10, 0x6f, 0x47, 0x4e, 0x0b, 0x24, 0x12, 0x12, 0x13, 0x12, 0x1c, 0x14, 0x1e, 0x5f, 0xbe, + 0x60, 0xfe, 0x65, 0x02, 0x6b, 0x2c, 0x67, 0x66, 0x60, 0x24, 0x01, 0x7d, 0xfd, 0x9d, 0x57, 0x58, + 0x04, 0x08, 0x65, 0x08, 0x22, 0x20, 0x00, 0x00, 0x00, 0x01, 0x00, 0x3f, 0xff, 0x5b, 0x01, 0xb9, + 0x01, 0xe0, 0x00, 0x1d, 0x00, 0x35, 0x40, 0x0b, 0x00, 0x51, 0x11, 0x1f, 0x0f, 0x18, 0x01, 0x18, + 0x07, 0x51, 0x08, 0xb8, 0xff, 0xc0, 0x40, 0x10, 0x09, 0x0c, 0x48, 0x08, 0x1e, 0x19, 0x1b, 0x57, + 0x15, 0x0e, 0x03, 0x57, 0x0c, 0x0b, 0x07, 0x06, 0x00, 0x3f, 0x3f, 0xed, 0x3f, 0xfd, 0xc6, 0x01, + 0x10, 0xd6, 0x2b, 0xed, 0xc6, 0x5d, 0x10, 0xd6, 0xed, 0x31, 0x30, 0x25, 0x34, 0x26, 0x23, 0x22, + 0x06, 0x07, 0x11, 0x23, 0x11, 0x36, 0x36, 0x33, 0x32, 0x1e, 0x02, 0x15, 0x11, 0x14, 0x06, 0x23, + 0x22, 0x26, 0x27, 0x37, 0x16, 0x33, 0x32, 0x35, 0x01, 0x3e, 0x1e, 0x2e, 0x0e, 0x1b, 0x0f, 0x7b, + 0x21, 0x61, 0x39, 0x38, 0x4a, 0x2b, 0x12, 0x49, 0x54, 0x0b, 0x29, 0x13, 0x10, 0x13, 0x15, 0x31, + 0xf9, 0x42, 0x3a, 0x02, 0x02, 0xfe, 0x8f, 0x01, 0xc7, 0x09, 0x10, 0x1f, 0x39, 0x4f, 0x30, 0xfe, + 0xfa, 0x56, 0x52, 0x03, 0x08, 0x5f, 0x06, 0x3f, 0xff, 0xff, 0x00, 0x1b, 0xff, 0xf3, 0x01, 0xd9, + 0x03, 0x12, 0x02, 0x26, 0x00, 0x32, 0x00, 0x00, 0x01, 0x07, 0x00, 0x8a, 0x00, 0x00, 0x00, 0x8b, + 0x00, 0x10, 0x40, 0x0b, 0x02, 0x02, 0x20, 0x21, 0x14, 0x19, 0x50, 0x02, 0x16, 0x22, 0x4f, 0x2b, + 0x2b, 0x34, 0x00, 0x00, 0xff, 0xff, 0x00, 0x1d, 0xff, 0xf3, 0x01, 0xd8, 0x02, 0x87, 0x02, 0x26, + 0x00, 0x52, 0x00, 0x00, 0x01, 0x06, 0x00, 0x8a, 0xff, 0x00, 0x00, 0x10, 0x40, 0x0b, 0x02, 0x00, + 0x20, 0x21, 0x09, 0x00, 0x50, 0x02, 0x0e, 0x22, 0x4f, 0x2b, 0x2b, 0x34, 0xff, 0xff, 0x00, 0x1b, + 0xff, 0xf3, 0x01, 0xd9, 0x03, 0x35, 0x02, 0x26, 0x00, 0x32, 0x00, 0x00, 0x01, 0x07, 0x01, 0x61, + 0x00, 0x00, 0x00, 0x8b, 0x00, 0x10, 0x40, 0x0b, 0x02, 0x00, 0x24, 0x2e, 0x14, 0x19, 0x50, 0x02, + 0x16, 0x20, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0x00, 0xff, 0xff, 0x00, 0x1d, 0xff, 0xf3, 0x01, 0xd8, + 0x02, 0xaa, 0x02, 0x26, 0x00, 0x52, 0x00, 0x00, 0x01, 0x06, 0x01, 0x61, 0x00, 0x00, 0x00, 0x10, + 0x40, 0x0b, 0x02, 0x00, 0x24, 0x2e, 0x09, 0x00, 0x50, 0x02, 0x0e, 0x20, 0x4f, 0x2b, 0x2b, 0x34, + 0xff, 0xff, 0x00, 0x1b, 0xff, 0xf3, 0x01, 0xda, 0x03, 0x3e, 0x02, 0x26, 0x00, 0x32, 0x00, 0x00, + 0x01, 0x07, 0x01, 0x65, 0x00, 0x24, 0x00, 0x8a, 0x00, 0x17, 0x40, 0x10, 0x03, 0x02, 0x26, 0x22, + 0x24, 0x14, 0x19, 0x50, 0x03, 0x16, 0x25, 0x4f, 0x02, 0x16, 0x21, 0x4f, 0x2b, 0x2b, 0x2b, 0x34, + 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x1d, 0xff, 0xf3, 0x01, 0xda, 0x02, 0xb4, 0x02, 0x26, + 0x00, 0x52, 0x00, 0x00, 0x01, 0x06, 0x01, 0x65, 0x24, 0x00, 0x00, 0x17, 0x40, 0x10, 0x03, 0x02, + 0x26, 0x22, 0x24, 0x09, 0x00, 0x50, 0x03, 0x0e, 0x25, 0x4f, 0x02, 0x0e, 0x21, 0x4f, 0x2b, 0x2b, + 0x2b, 0x34, 0x34, 0x00, 0xff, 0xff, 0x00, 0x36, 0x00, 0x00, 0x01, 0xe9, 0x03, 0x3e, 0x02, 0x26, + 0x00, 0x35, 0x00, 0x00, 0x01, 0x07, 0x00, 0x8f, 0xff, 0xf4, 0x00, 0x8b, 0x00, 0x13, 0xb9, 0x00, + 0x02, 0xff, 0xea, 0x40, 0x09, 0x27, 0x25, 0x14, 0x0d, 0x50, 0x02, 0x00, 0x26, 0x4f, 0x2b, 0x2b, + 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x59, 0x00, 0x00, 0x01, 0xcb, 0x02, 0xb3, 0x02, 0x26, + 0x00, 0x55, 0x00, 0x00, 0x01, 0x06, 0x00, 0x8f, 0x1b, 0x00, 0x00, 0x10, 0x40, 0x0b, 0x01, 0x0e, + 0x16, 0x14, 0x0a, 0x13, 0x50, 0x01, 0x0d, 0x15, 0x4f, 0x2b, 0x2b, 0x34, 0xff, 0xff, 0x00, 0x36, + 0xff, 0x56, 0x01, 0xe9, 0x02, 0x72, 0x02, 0x26, 0x00, 0x35, 0x00, 0x00, 0x01, 0x06, 0x01, 0xc3, + 0xef, 0x00, 0x00, 0x0d, 0xb9, 0x00, 0x02, 0xff, 0xda, 0xb4, 0x2e, 0x27, 0x14, 0x0d, 0x50, 0x2b, + 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x23, 0xff, 0x56, 0x01, 0xcb, 0x01, 0xdf, 0x02, 0x26, + 0x00, 0x55, 0x00, 0x00, 0x01, 0x07, 0x01, 0xc3, 0xff, 0x7f, 0x00, 0x00, 0x00, 0x0d, 0xb9, 0x00, + 0x01, 0xff, 0x67, 0xb4, 0x1d, 0x16, 0x0a, 0x13, 0x50, 0x2b, 0x34, 0x00, 0xff, 0xff, 0x00, 0x36, + 0x00, 0x00, 0x01, 0xe9, 0x03, 0x3e, 0x02, 0x26, 0x00, 0x35, 0x00, 0x00, 0x01, 0x07, 0x01, 0x5f, + 0xff, 0xef, 0x00, 0x8b, 0x00, 0x13, 0xb9, 0x00, 0x02, 0xff, 0xdb, 0x40, 0x09, 0x25, 0x29, 0x14, + 0x0d, 0x50, 0x02, 0x00, 0x2a, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x59, + 0x00, 0x00, 0x01, 0xcb, 0x02, 0xb3, 0x02, 0x26, 0x00, 0x55, 0x00, 0x00, 0x01, 0x06, 0x01, 0x5f, + 0x24, 0x00, 0x00, 0x10, 0x40, 0x0b, 0x01, 0x0d, 0x14, 0x18, 0x0a, 0x13, 0x50, 0x01, 0x0d, 0x19, + 0x4f, 0x2b, 0x2b, 0x34, 0xff, 0xff, 0x00, 0x28, 0xff, 0xf3, 0x01, 0xcc, 0x03, 0x3e, 0x02, 0x26, + 0x00, 0x36, 0x00, 0x00, 0x01, 0x07, 0x00, 0x8f, 0xff, 0xfd, 0x00, 0x8b, 0x00, 0x10, 0x40, 0x0b, + 0x01, 0x08, 0x31, 0x2f, 0x2b, 0x24, 0x50, 0x01, 0x11, 0x30, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x36, 0xff, 0xf5, 0x01, 0xba, 0x02, 0xb3, 0x02, 0x26, 0x00, 0x56, 0x00, 0x00, + 0x01, 0x06, 0x00, 0x8f, 0xfd, 0x00, 0x00, 0x10, 0x40, 0x0b, 0x01, 0x0a, 0x34, 0x32, 0x2e, 0x25, + 0x50, 0x01, 0x11, 0x33, 0x4f, 0x2b, 0x2b, 0x34, 0xff, 0xff, 0x00, 0x28, 0xff, 0xf3, 0x01, 0xcc, + 0x03, 0x3e, 0x02, 0x26, 0x00, 0x36, 0x00, 0x00, 0x01, 0x07, 0x00, 0x69, 0x00, 0x00, 0x00, 0x8b, + 0x00, 0x10, 0x40, 0x0b, 0x01, 0x01, 0x33, 0x2f, 0x2b, 0x24, 0x50, 0x01, 0x11, 0x30, 0x4f, 0x2b, + 0x2b, 0x34, 0x00, 0x00, 0xff, 0xff, 0x00, 0x36, 0xff, 0xf5, 0x01, 0xba, 0x02, 0xb3, 0x02, 0x26, + 0x00, 0x56, 0x00, 0x00, 0x01, 0x06, 0x00, 0x69, 0x00, 0x00, 0x00, 0x10, 0x40, 0x0b, 0x01, 0x03, + 0x36, 0x32, 0x2e, 0x25, 0x50, 0x01, 0x11, 0x33, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0x01, 0x00, 0x28, + 0xff, 0x56, 0x01, 0xcc, 0x02, 0x79, 0x00, 0x46, 0x00, 0x7e, 0xb9, 0x00, 0x40, 0xff, 0xe0, 0xb4, + 0x0e, 0x0f, 0x00, 0x4c, 0x3b, 0xb8, 0xff, 0xe0, 0x40, 0x09, 0x0d, 0x00, 0x4d, 0x33, 0x40, 0x0d, + 0x00, 0x4d, 0x29, 0xb8, 0xff, 0xc0, 0xb3, 0x0d, 0x00, 0x4d, 0x1a, 0xb8, 0xff, 0xc0, 0x40, 0x0b, + 0x0d, 0x00, 0x4d, 0x22, 0x46, 0x42, 0x32, 0x48, 0x38, 0x46, 0x2c, 0xb8, 0xff, 0xc0, 0x40, 0x22, + 0x0b, 0x0e, 0x48, 0x2c, 0x47, 0x03, 0x10, 0x0a, 0x40, 0x19, 0x50, 0x19, 0x02, 0x19, 0x47, 0x33, + 0x36, 0x4a, 0x2f, 0x3d, 0x4a, 0x27, 0x27, 0x16, 0x2f, 0x03, 0x1a, 0x1d, 0x4a, 0x16, 0x09, 0x0e, + 0x08, 0x92, 0x00, 0x3f, 0xc5, 0x3f, 0xfd, 0xce, 0x3f, 0x12, 0x39, 0x10, 0xed, 0x10, 0xfd, 0xce, + 0x01, 0x10, 0xc6, 0x5d, 0xd6, 0xdc, 0xcd, 0x10, 0xd6, 0x2b, 0xed, 0x10, 0xce, 0xde, 0xed, 0x31, + 0x30, 0x00, 0x2b, 0x2b, 0x2b, 0x2b, 0x01, 0x2b, 0x05, 0x16, 0x16, 0x15, 0x14, 0x0e, 0x02, 0x23, + 0x22, 0x27, 0x37, 0x16, 0x16, 0x33, 0x32, 0x35, 0x34, 0x27, 0x27, 0x36, 0x36, 0x37, 0x26, 0x26, + 0x27, 0x37, 0x16, 0x16, 0x33, 0x32, 0x3e, 0x02, 0x35, 0x34, 0x2e, 0x02, 0x27, 0x2e, 0x03, 0x35, + 0x34, 0x36, 0x33, 0x32, 0x16, 0x17, 0x07, 0x26, 0x26, 0x23, 0x22, 0x15, 0x14, 0x1e, 0x02, 0x17, + 0x1e, 0x03, 0x15, 0x14, 0x06, 0x07, 0x06, 0x01, 0x04, 0x21, 0x1a, 0x15, 0x21, 0x2c, 0x16, 0x2d, + 0x23, 0x0d, 0x06, 0x22, 0x10, 0x29, 0x24, 0x14, 0x02, 0x07, 0x03, 0x38, 0x45, 0x14, 0x24, 0x1b, + 0x4b, 0x36, 0x1f, 0x29, 0x18, 0x09, 0x16, 0x22, 0x2a, 0x15, 0x1c, 0x3c, 0x31, 0x20, 0x71, 0x63, + 0x39, 0x55, 0x1d, 0x24, 0x19, 0x3d, 0x28, 0x62, 0x14, 0x1f, 0x27, 0x13, 0x1d, 0x3f, 0x35, 0x22, + 0x61, 0x62, 0x04, 0x18, 0x0a, 0x27, 0x12, 0x17, 0x1e, 0x12, 0x08, 0x0b, 0x3f, 0x02, 0x07, 0x19, + 0x13, 0x0c, 0x06, 0x08, 0x10, 0x08, 0x05, 0x1c, 0x0c, 0x64, 0x10, 0x1c, 0x0d, 0x17, 0x1d, 0x0f, + 0x13, 0x1e, 0x17, 0x13, 0x08, 0x0a, 0x1a, 0x28, 0x3b, 0x2c, 0x57, 0x62, 0x1a, 0x10, 0x5f, 0x0e, + 0x14, 0x47, 0x12, 0x1b, 0x15, 0x10, 0x07, 0x0b, 0x1b, 0x2d, 0x43, 0x33, 0x51, 0x5d, 0x07, 0x08, + 0x00, 0x01, 0x00, 0x36, 0xff, 0x56, 0x01, 0xba, 0x01, 0xe2, 0x00, 0x48, 0x00, 0xa1, 0x40, 0x0d, + 0x34, 0x20, 0x0e, 0x0f, 0x00, 0x4c, 0x33, 0x40, 0x0e, 0x0f, 0x00, 0x4c, 0x1a, 0xb8, 0xff, 0xe0, + 0xb3, 0x10, 0x00, 0x4d, 0x1a, 0xb8, 0xff, 0xc0, 0x40, 0x15, 0x0e, 0x0f, 0x00, 0x4c, 0x32, 0x20, + 0x53, 0x20, 0x43, 0x40, 0x43, 0x50, 0x43, 0x60, 0x43, 0x04, 0x43, 0x4a, 0x39, 0x53, 0x2a, 0xb8, + 0xff, 0xc0, 0x40, 0x09, 0x0b, 0x0f, 0x48, 0x2a, 0x49, 0x03, 0x10, 0x0a, 0x19, 0xb8, 0xff, 0xc0, + 0x40, 0x30, 0x0b, 0x0f, 0x48, 0x0f, 0x19, 0x01, 0x19, 0x49, 0x0f, 0x33, 0x1f, 0x33, 0x2f, 0x33, + 0x03, 0x33, 0x4f, 0x36, 0x01, 0x36, 0x57, 0x2f, 0x00, 0x1a, 0x10, 0x1a, 0x20, 0x1a, 0x03, 0x1a, + 0x40, 0x1d, 0x01, 0x1d, 0x57, 0x0e, 0x12, 0x08, 0x25, 0x3e, 0x2f, 0x16, 0x16, 0x08, 0x2f, 0x0b, + 0x08, 0x12, 0x00, 0x3f, 0x3f, 0x12, 0x39, 0x2f, 0x12, 0x39, 0x39, 0x12, 0x39, 0x39, 0xfd, 0x5d, + 0xce, 0x5d, 0x10, 0xfd, 0x5d, 0xce, 0x5d, 0x01, 0x10, 0xd6, 0x5d, 0x2b, 0xd6, 0xdc, 0xc5, 0x10, + 0xd6, 0x2b, 0xed, 0x10, 0xde, 0x5d, 0xed, 0xc4, 0x31, 0x30, 0x00, 0x2b, 0x2b, 0x2b, 0x2b, 0x05, + 0x16, 0x16, 0x15, 0x14, 0x0e, 0x02, 0x23, 0x22, 0x27, 0x37, 0x16, 0x16, 0x33, 0x32, 0x35, 0x34, + 0x27, 0x27, 0x36, 0x36, 0x37, 0x26, 0x26, 0x27, 0x37, 0x16, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, + 0x2e, 0x02, 0x27, 0x2e, 0x03, 0x35, 0x34, 0x3e, 0x02, 0x33, 0x32, 0x16, 0x17, 0x07, 0x26, 0x26, + 0x23, 0x22, 0x06, 0x15, 0x14, 0x1e, 0x02, 0x17, 0x1e, 0x03, 0x15, 0x14, 0x0e, 0x02, 0x07, 0x01, + 0x0e, 0x21, 0x1a, 0x15, 0x21, 0x2c, 0x16, 0x2d, 0x23, 0x0d, 0x06, 0x22, 0x10, 0x29, 0x24, 0x14, + 0x02, 0x07, 0x04, 0x31, 0x47, 0x16, 0x13, 0x23, 0x4f, 0x29, 0x2d, 0x30, 0x0f, 0x1b, 0x23, 0x13, + 0x1b, 0x38, 0x2e, 0x1e, 0x17, 0x31, 0x4c, 0x35, 0x2e, 0x4f, 0x1d, 0x13, 0x11, 0x48, 0x2d, 0x2f, + 0x21, 0x0f, 0x19, 0x21, 0x13, 0x1b, 0x3a, 0x2f, 0x1e, 0x12, 0x27, 0x3f, 0x2e, 0x18, 0x0a, 0x27, + 0x12, 0x17, 0x1e, 0x12, 0x08, 0x0b, 0x3f, 0x02, 0x07, 0x19, 0x13, 0x0c, 0x06, 0x08, 0x11, 0x08, + 0x04, 0x18, 0x0a, 0x67, 0x0e, 0x18, 0x0d, 0x14, 0x0d, 0x12, 0x0d, 0x0c, 0x06, 0x08, 0x15, 0x20, + 0x31, 0x25, 0x1e, 0x35, 0x29, 0x17, 0x0e, 0x0d, 0x68, 0x05, 0x17, 0x17, 0x0d, 0x0b, 0x11, 0x0e, + 0x0d, 0x06, 0x09, 0x16, 0x21, 0x33, 0x25, 0x1a, 0x2f, 0x24, 0x19, 0x04, 0x00, 0x01, 0x00, 0x19, + 0xff, 0x56, 0x01, 0xdb, 0x02, 0x6b, 0x00, 0x20, 0x00, 0x50, 0x40, 0x31, 0x13, 0x40, 0x0b, 0x0f, + 0x00, 0x4c, 0x0f, 0x1c, 0x01, 0x1c, 0x1d, 0x44, 0x0f, 0x18, 0x01, 0x18, 0xd0, 0x1a, 0xe0, 0x1a, + 0xf0, 0x1a, 0x03, 0x1a, 0x21, 0xa0, 0x03, 0x01, 0x03, 0x10, 0x2f, 0x0a, 0x01, 0x0a, 0x21, 0x13, + 0x00, 0x08, 0x1e, 0x08, 0x1d, 0x18, 0x48, 0x1a, 0x02, 0x0b, 0x0e, 0x08, 0x12, 0x00, 0x3f, 0xd5, + 0xc6, 0x3f, 0xed, 0x32, 0x3f, 0x12, 0x39, 0x39, 0x01, 0x10, 0xd6, 0x5d, 0xdc, 0xc5, 0x5d, 0x10, + 0xd6, 0x5d, 0xdd, 0x5d, 0xfd, 0xcd, 0x5d, 0x31, 0x30, 0x2b, 0x05, 0x16, 0x16, 0x15, 0x14, 0x0e, + 0x02, 0x23, 0x22, 0x27, 0x37, 0x16, 0x16, 0x33, 0x32, 0x35, 0x34, 0x27, 0x27, 0x36, 0x36, 0x37, + 0x23, 0x11, 0x23, 0x35, 0x21, 0x15, 0x23, 0x11, 0x23, 0x06, 0x01, 0x11, 0x21, 0x1a, 0x15, 0x21, + 0x2c, 0x16, 0x2d, 0x23, 0x0d, 0x06, 0x22, 0x10, 0x29, 0x24, 0x14, 0x03, 0x09, 0x05, 0x0f, 0xa3, + 0x01, 0xc2, 0xa3, 0x1d, 0x05, 0x18, 0x0a, 0x27, 0x12, 0x17, 0x1e, 0x12, 0x08, 0x0b, 0x3f, 0x02, + 0x07, 0x19, 0x13, 0x0c, 0x06, 0x0b, 0x17, 0x09, 0x02, 0x05, 0x66, 0x66, 0xfd, 0xfb, 0x08, 0x00, + 0x00, 0x01, 0x00, 0x24, 0xff, 0x56, 0x01, 0xd8, 0x02, 0x60, 0x00, 0x34, 0x00, 0x69, 0xb9, 0x00, + 0x31, 0xff, 0xc0, 0x40, 0x3e, 0x0b, 0x00, 0x4d, 0x00, 0x31, 0x10, 0x31, 0x40, 0x31, 0x60, 0x31, + 0x80, 0x31, 0x05, 0x31, 0x36, 0x3f, 0x23, 0x01, 0x23, 0x90, 0x24, 0x01, 0x24, 0x22, 0x25, 0x51, + 0x1f, 0x1c, 0x50, 0x1d, 0x60, 0x1d, 0x02, 0x1d, 0x35, 0x03, 0x10, 0x10, 0x0a, 0x01, 0x0a, 0x35, + 0x30, 0x2b, 0x57, 0x34, 0x07, 0x1c, 0x25, 0x55, 0x1f, 0x22, 0x0a, 0x20, 0x21, 0x07, 0x16, 0x07, + 0x0e, 0x08, 0x0f, 0x00, 0x3f, 0xc5, 0x3f, 0x3f, 0xc1, 0x3f, 0x33, 0xed, 0x32, 0x3f, 0xed, 0xc5, + 0x01, 0x10, 0xd6, 0x5d, 0xdc, 0xcd, 0x10, 0xd6, 0x5d, 0xd5, 0x32, 0xfd, 0x32, 0xc5, 0x5d, 0x32, + 0x5d, 0x10, 0xc6, 0x5d, 0x31, 0x30, 0x2b, 0x05, 0x16, 0x16, 0x15, 0x14, 0x0e, 0x02, 0x23, 0x22, + 0x27, 0x37, 0x16, 0x16, 0x33, 0x32, 0x35, 0x34, 0x27, 0x27, 0x36, 0x36, 0x37, 0x2e, 0x03, 0x35, + 0x35, 0x23, 0x35, 0x33, 0x35, 0x37, 0x15, 0x33, 0x15, 0x23, 0x15, 0x14, 0x1e, 0x02, 0x33, 0x32, + 0x3e, 0x02, 0x37, 0x17, 0x06, 0x06, 0x07, 0x01, 0x57, 0x21, 0x1a, 0x15, 0x21, 0x2c, 0x16, 0x2d, + 0x23, 0x0d, 0x06, 0x22, 0x10, 0x29, 0x24, 0x14, 0x02, 0x07, 0x04, 0x1e, 0x2f, 0x20, 0x11, 0x6b, + 0x6b, 0x7b, 0xc5, 0xc5, 0x0a, 0x12, 0x1a, 0x10, 0x11, 0x1d, 0x1b, 0x1d, 0x11, 0x11, 0x1c, 0x40, + 0x20, 0x18, 0x0a, 0x27, 0x12, 0x17, 0x1e, 0x12, 0x08, 0x0b, 0x3f, 0x02, 0x07, 0x19, 0x13, 0x0c, + 0x06, 0x09, 0x12, 0x08, 0x03, 0x15, 0x2a, 0x43, 0x32, 0xc1, 0x66, 0x76, 0x14, 0x8a, 0x66, 0xbe, + 0x1a, 0x20, 0x12, 0x06, 0x02, 0x05, 0x0a, 0x08, 0x6a, 0x0b, 0x0c, 0x02, 0xff, 0xff, 0x00, 0x19, + 0x00, 0x00, 0x01, 0xdb, 0x03, 0x3e, 0x02, 0x26, 0x00, 0x37, 0x00, 0x00, 0x01, 0x07, 0x01, 0x5f, + 0x00, 0x00, 0x00, 0x8b, 0x00, 0x10, 0x40, 0x0b, 0x01, 0x01, 0x08, 0x0c, 0x06, 0x00, 0x50, 0x01, + 0x00, 0x0d, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0x00, 0xff, 0xff, 0x00, 0x24, 0xff, 0xf5, 0x01, 0xd8, + 0x02, 0xb5, 0x02, 0x26, 0x00, 0x57, 0x00, 0x00, 0x01, 0x07, 0x01, 0xc5, 0x00, 0x82, 0x00, 0x00, + 0x00, 0x0a, 0xb6, 0x01, 0x7d, 0x20, 0x1e, 0x01, 0x15, 0x50, 0x2b, 0x34, 0x00, 0x01, 0x00, 0x19, + 0x00, 0x00, 0x01, 0xdb, 0x02, 0x6b, 0x00, 0x0f, 0x00, 0x63, 0x40, 0x0d, 0x0b, 0x40, 0x0a, 0x0c, + 0x00, 0x4c, 0x0a, 0x40, 0x0a, 0x0c, 0x00, 0x4c, 0x05, 0xb8, 0xff, 0xc0, 0xb4, 0x0a, 0x0d, 0x00, + 0x4c, 0x04, 0xb8, 0xff, 0xc0, 0x40, 0x24, 0x0a, 0x0d, 0x00, 0x4c, 0x11, 0x04, 0x01, 0x02, 0x06, + 0x03, 0x03, 0x02, 0x44, 0x0d, 0x0c, 0x0c, 0x09, 0x0d, 0x0b, 0x0e, 0x10, 0x02, 0x0d, 0x48, 0x0f, + 0x02, 0x09, 0x06, 0x48, 0x0c, 0x03, 0x03, 0x08, 0x08, 0x00, 0x02, 0x00, 0x3f, 0x3f, 0x39, 0x2f, + 0x33, 0xed, 0x32, 0x3f, 0xed, 0x32, 0x01, 0x10, 0xd6, 0xc6, 0xc5, 0x32, 0x32, 0x2f, 0x10, 0xed, + 0x32, 0x2f, 0x32, 0x10, 0xd5, 0xc6, 0xc6, 0x31, 0x30, 0x2b, 0x2b, 0x2b, 0x2b, 0x01, 0x15, 0x23, + 0x15, 0x33, 0x15, 0x23, 0x15, 0x23, 0x35, 0x23, 0x35, 0x33, 0x35, 0x23, 0x35, 0x01, 0xdb, 0xa3, + 0x7e, 0x7e, 0x7c, 0x7d, 0x7d, 0xa3, 0x02, 0x6b, 0x66, 0xb4, 0x63, 0xee, 0xee, 0x63, 0xb4, 0x66, + 0x00, 0x01, 0x00, 0x24, 0xff, 0xf5, 0x01, 0xd8, 0x02, 0x60, 0x00, 0x25, 0x00, 0x9e, 0xb9, 0x00, + 0x1c, 0xff, 0xc0, 0xb4, 0x19, 0x1a, 0x00, 0x4c, 0x1c, 0xb8, 0xff, 0xc0, 0xb3, 0x14, 0x00, 0x4d, + 0x1b, 0xb8, 0xff, 0xc0, 0xb4, 0x19, 0x1a, 0x00, 0x4c, 0x1b, 0xb8, 0xff, 0xc0, 0x40, 0x0f, 0x14, + 0x00, 0x4d, 0x20, 0x0b, 0x40, 0x0b, 0x60, 0x0b, 0x70, 0x0b, 0x80, 0x0b, 0x05, 0x0b, 0xb8, 0xff, + 0xb8, 0x40, 0x18, 0x0a, 0x49, 0x00, 0x0b, 0x01, 0x0b, 0x27, 0x00, 0x03, 0x03, 0x04, 0x04, 0x0a, + 0x51, 0x50, 0x07, 0x60, 0x07, 0x70, 0x07, 0x03, 0x07, 0x05, 0x01, 0xb8, 0xff, 0xc0, 0x40, 0x24, + 0x0e, 0x11, 0x48, 0x01, 0x26, 0x1c, 0x17, 0x57, 0x20, 0x07, 0x00, 0x4f, 0x11, 0x5f, 0x11, 0x6f, + 0x11, 0x03, 0x11, 0x55, 0x03, 0x0e, 0x04, 0x4f, 0x0d, 0x5f, 0x0d, 0x6f, 0x0d, 0x03, 0x0d, 0x55, + 0x07, 0x0a, 0x09, 0x02, 0x00, 0x3f, 0xd5, 0x32, 0xfd, 0x5d, 0x32, 0xd6, 0x32, 0xed, 0x5d, 0x32, + 0x3f, 0xfd, 0xc6, 0x01, 0x10, 0xd6, 0x2b, 0xd0, 0xd5, 0x5d, 0xed, 0x33, 0x11, 0x33, 0x11, 0x33, + 0x10, 0xc6, 0x5d, 0x2b, 0x5d, 0x31, 0x30, 0x00, 0x2b, 0x2b, 0x2b, 0x2b, 0x37, 0x23, 0x35, 0x33, + 0x35, 0x23, 0x35, 0x33, 0x35, 0x37, 0x15, 0x33, 0x15, 0x23, 0x15, 0x33, 0x15, 0x23, 0x15, 0x14, + 0x1e, 0x02, 0x33, 0x32, 0x3e, 0x02, 0x37, 0x17, 0x06, 0x06, 0x23, 0x22, 0x2e, 0x02, 0x35, 0x8f, + 0x6b, 0x6b, 0x6b, 0x6b, 0x7b, 0xc5, 0xc5, 0xc4, 0xc4, 0x0a, 0x12, 0x1a, 0x10, 0x11, 0x1d, 0x1b, + 0x1d, 0x11, 0x11, 0x22, 0x4f, 0x25, 0x2b, 0x42, 0x2e, 0x18, 0xcc, 0x54, 0x50, 0x66, 0x76, 0x14, + 0x8a, 0x66, 0x50, 0x54, 0x1a, 0x1a, 0x20, 0x12, 0x06, 0x02, 0x05, 0x0a, 0x08, 0x6a, 0x0e, 0x0c, + 0x0e, 0x28, 0x49, 0x3b, 0xff, 0xff, 0x00, 0x27, 0xff, 0xf3, 0x01, 0xcd, 0x03, 0x2b, 0x02, 0x26, + 0x00, 0x38, 0x00, 0x00, 0x01, 0x07, 0x00, 0x75, 0x00, 0x00, 0x00, 0x8b, 0x00, 0x10, 0x40, 0x0b, + 0x01, 0x02, 0x28, 0x1a, 0x04, 0x14, 0x50, 0x01, 0x06, 0x27, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x3b, 0xff, 0xf5, 0x01, 0xb6, 0x02, 0xa0, 0x02, 0x26, 0x00, 0x58, 0x00, 0x00, + 0x01, 0x06, 0x00, 0x75, 0x00, 0x00, 0x00, 0x10, 0x40, 0x0b, 0x01, 0x03, 0x21, 0x13, 0x07, 0x00, + 0x50, 0x01, 0x09, 0x20, 0x4f, 0x2b, 0x2b, 0x34, 0xff, 0xff, 0x00, 0x27, 0xff, 0xf3, 0x01, 0xcd, + 0x03, 0x12, 0x02, 0x26, 0x00, 0x38, 0x00, 0x00, 0x01, 0x07, 0x00, 0x8a, 0x00, 0x00, 0x00, 0x8b, + 0x00, 0x10, 0x40, 0x0b, 0x01, 0x02, 0x1a, 0x1b, 0x04, 0x14, 0x50, 0x01, 0x06, 0x1c, 0x4f, 0x2b, + 0x2b, 0x34, 0x00, 0x00, 0xff, 0xff, 0x00, 0x3b, 0xff, 0xf5, 0x01, 0xb6, 0x02, 0x87, 0x02, 0x26, + 0x00, 0x58, 0x00, 0x00, 0x01, 0x06, 0x00, 0x8a, 0x00, 0x00, 0x00, 0x10, 0x40, 0x0b, 0x01, 0x03, + 0x13, 0x14, 0x07, 0x00, 0x50, 0x01, 0x09, 0x15, 0x4f, 0x2b, 0x2b, 0x34, 0xff, 0xff, 0x00, 0x27, + 0xff, 0xf3, 0x01, 0xcd, 0x03, 0x35, 0x02, 0x26, 0x00, 0x38, 0x00, 0x00, 0x01, 0x07, 0x01, 0x61, + 0x00, 0x00, 0x00, 0x8b, 0x00, 0x10, 0x40, 0x0b, 0x01, 0x00, 0x1e, 0x28, 0x04, 0x14, 0x50, 0x01, + 0x06, 0x1a, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0x00, 0xff, 0xff, 0x00, 0x3b, 0xff, 0xf5, 0x01, 0xb6, + 0x02, 0xaa, 0x02, 0x26, 0x00, 0x58, 0x00, 0x00, 0x01, 0x06, 0x01, 0x61, 0x00, 0x00, 0x00, 0x10, + 0x40, 0x0b, 0x01, 0x01, 0x17, 0x21, 0x07, 0x00, 0x50, 0x01, 0x09, 0x13, 0x4f, 0x2b, 0x2b, 0x34, + 0x00, 0x03, 0x00, 0x27, 0xff, 0xf3, 0x01, 0xcd, 0x03, 0x3a, 0x00, 0x19, 0x00, 0x29, 0x00, 0x35, + 0x00, 0x60, 0x40, 0x24, 0x2a, 0x7f, 0x80, 0x1a, 0x01, 0x6f, 0x1a, 0x01, 0x30, 0x1a, 0x40, 0x1a, + 0x50, 0x1a, 0x03, 0x1a, 0x12, 0x44, 0x00, 0x15, 0x60, 0x15, 0x02, 0x15, 0x37, 0x30, 0x7f, 0x0f, + 0x22, 0x2f, 0x22, 0x02, 0x22, 0x08, 0x44, 0x05, 0xb8, 0xff, 0xc0, 0x40, 0x18, 0x0d, 0x11, 0x48, + 0x05, 0x36, 0x2d, 0x80, 0xb0, 0x27, 0x01, 0x27, 0x86, 0x33, 0x80, 0x1d, 0x03, 0x14, 0x02, 0x06, + 0x02, 0x0d, 0x4a, 0x00, 0x09, 0x00, 0x3f, 0xed, 0x3f, 0x3f, 0x3f, 0xed, 0x3f, 0x5d, 0xed, 0x01, + 0x10, 0xd6, 0x2b, 0xed, 0xd4, 0x5d, 0xed, 0x10, 0xd6, 0x5d, 0xed, 0xd4, 0x5d, 0x5d, 0x5d, 0xed, + 0x31, 0x30, 0x17, 0x22, 0x2e, 0x02, 0x35, 0x11, 0x33, 0x11, 0x14, 0x1e, 0x02, 0x33, 0x32, 0x3e, + 0x02, 0x35, 0x11, 0x33, 0x11, 0x14, 0x0e, 0x02, 0x13, 0x14, 0x06, 0x23, 0x22, 0x2e, 0x02, 0x35, + 0x34, 0x3e, 0x02, 0x33, 0x32, 0x16, 0x07, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, + 0x32, 0x36, 0xf8, 0x3c, 0x51, 0x30, 0x14, 0x7c, 0x08, 0x13, 0x22, 0x1a, 0x1a, 0x22, 0x14, 0x08, + 0x7b, 0x14, 0x32, 0x52, 0x2e, 0x3f, 0x2b, 0x14, 0x26, 0x1d, 0x11, 0x11, 0x1d, 0x26, 0x14, 0x2b, + 0x3f, 0x41, 0x18, 0x11, 0x0f, 0x19, 0x19, 0x0f, 0x11, 0x18, 0x0d, 0x21, 0x3e, 0x58, 0x36, 0x01, + 0x77, 0xfe, 0x91, 0x27, 0x35, 0x20, 0x0e, 0x0e, 0x21, 0x35, 0x27, 0x01, 0x6e, 0xfe, 0x89, 0x36, + 0x58, 0x3e, 0x21, 0x02, 0xe0, 0x32, 0x34, 0x0d, 0x1a, 0x26, 0x19, 0x19, 0x27, 0x1a, 0x0d, 0x34, + 0x33, 0x15, 0x15, 0x15, 0x15, 0x14, 0x16, 0x16, 0xff, 0xff, 0x00, 0x3b, 0xff, 0xf5, 0x01, 0xb6, + 0x02, 0xc3, 0x02, 0x26, 0x00, 0x58, 0x00, 0x00, 0x01, 0x06, 0x01, 0x63, 0x00, 0x00, 0x00, 0x0c, + 0xb7, 0x02, 0x01, 0x01, 0x1a, 0x13, 0x07, 0x00, 0x50, 0x2b, 0x34, 0x34, 0xff, 0xff, 0x00, 0x27, + 0xff, 0xf3, 0x01, 0xda, 0x03, 0x3e, 0x02, 0x26, 0x00, 0x38, 0x00, 0x00, 0x01, 0x07, 0x01, 0x65, + 0x00, 0x24, 0x00, 0x8a, 0x00, 0x17, 0x40, 0x10, 0x02, 0x01, 0x26, 0x1c, 0x1e, 0x04, 0x14, 0x50, + 0x02, 0x06, 0x1f, 0x4f, 0x01, 0x06, 0x1b, 0x4f, 0x2b, 0x2b, 0x2b, 0x34, 0x34, 0x00, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x3b, 0xff, 0xf5, 0x01, 0xd1, 0x02, 0xb4, 0x02, 0x26, 0x00, 0x58, 0x00, 0x00, + 0x01, 0x06, 0x01, 0x65, 0x1b, 0x00, 0x00, 0x17, 0x40, 0x10, 0x02, 0x01, 0x1f, 0x15, 0x17, 0x07, + 0x00, 0x50, 0x02, 0x09, 0x18, 0x4f, 0x01, 0x09, 0x14, 0x4f, 0x2b, 0x2b, 0x2b, 0x34, 0x34, 0x00, + 0x00, 0x01, 0x00, 0x27, 0xff, 0x56, 0x01, 0xcd, 0x02, 0x6b, 0x00, 0x2c, 0x00, 0x2b, 0x40, 0x16, + 0x27, 0x44, 0x29, 0x2e, 0x12, 0x05, 0x0c, 0x2e, 0x1d, 0x44, 0x1b, 0x2d, 0x28, 0x02, 0x1c, 0x02, + 0x22, 0x4a, 0x15, 0x09, 0x0f, 0x92, 0x00, 0x3f, 0x3f, 0xed, 0x3f, 0x3f, 0x01, 0x10, 0xd6, 0xed, + 0x10, 0xd6, 0xdc, 0xc5, 0x10, 0xd6, 0xed, 0x31, 0x30, 0x25, 0x0e, 0x03, 0x15, 0x14, 0x16, 0x33, + 0x32, 0x36, 0x37, 0x17, 0x06, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x37, 0x22, 0x2e, 0x02, + 0x35, 0x11, 0x33, 0x11, 0x14, 0x1e, 0x02, 0x33, 0x32, 0x3e, 0x02, 0x35, 0x11, 0x33, 0x11, 0x14, + 0x06, 0x01, 0x87, 0x07, 0x1d, 0x1e, 0x17, 0x0b, 0x10, 0x08, 0x16, 0x0f, 0x07, 0x0e, 0x33, 0x1c, + 0x30, 0x2a, 0x19, 0x16, 0x3c, 0x4f, 0x2f, 0x14, 0x7c, 0x08, 0x13, 0x22, 0x1a, 0x1a, 0x22, 0x14, + 0x08, 0x7b, 0x1e, 0x18, 0x05, 0x1a, 0x1f, 0x1f, 0x0c, 0x0a, 0x0e, 0x02, 0x05, 0x3a, 0x05, 0x09, + 0x25, 0x1b, 0x17, 0x31, 0x15, 0x22, 0x3e, 0x57, 0x36, 0x01, 0x8b, 0xfe, 0x7d, 0x27, 0x35, 0x20, + 0x0e, 0x0e, 0x21, 0x35, 0x27, 0x01, 0x82, 0xfe, 0x75, 0x44, 0x63, 0x00, 0x00, 0x01, 0x00, 0x3b, + 0xff, 0x56, 0x01, 0xb6, 0x01, 0xd6, 0x00, 0x27, 0x00, 0x41, 0x40, 0x15, 0x19, 0x51, 0x1c, 0x29, + 0x06, 0x21, 0x00, 0x29, 0x60, 0x29, 0x01, 0x14, 0x51, 0x50, 0x11, 0x60, 0x11, 0x70, 0x11, 0x03, + 0x11, 0xb8, 0xff, 0xc0, 0x40, 0x0f, 0x09, 0x0c, 0x48, 0x11, 0x28, 0x1a, 0x0a, 0x12, 0x0a, 0x17, + 0x57, 0x0c, 0x07, 0x03, 0x12, 0x00, 0x3f, 0x3f, 0xed, 0x3f, 0x3f, 0x01, 0x10, 0xd6, 0x2b, 0x5d, + 0xed, 0x5d, 0x10, 0xd6, 0xdc, 0xc5, 0x10, 0xd6, 0xed, 0x31, 0x30, 0x05, 0x06, 0x06, 0x23, 0x22, + 0x26, 0x35, 0x34, 0x36, 0x37, 0x06, 0x06, 0x23, 0x22, 0x2e, 0x02, 0x35, 0x11, 0x33, 0x15, 0x14, + 0x16, 0x33, 0x32, 0x37, 0x11, 0x33, 0x11, 0x0e, 0x03, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, + 0x01, 0xb2, 0x0e, 0x33, 0x1c, 0x30, 0x2a, 0x1c, 0x19, 0x0e, 0x1b, 0x0d, 0x3a, 0x4a, 0x2b, 0x10, + 0x7b, 0x1f, 0x2d, 0x1c, 0x1c, 0x7c, 0x07, 0x1b, 0x1c, 0x15, 0x0b, 0x10, 0x08, 0x16, 0x0f, 0x9c, + 0x05, 0x09, 0x25, 0x1b, 0x18, 0x35, 0x16, 0x02, 0x02, 0x20, 0x3b, 0x50, 0x30, 0x01, 0x06, 0xf6, + 0x41, 0x3f, 0x05, 0x01, 0x71, 0xfe, 0x3a, 0x05, 0x17, 0x1c, 0x1d, 0x0c, 0x0a, 0x0e, 0x02, 0x05, + 0xff, 0xff, 0x00, 0x17, 0x00, 0x00, 0x01, 0xdd, 0x03, 0x3e, 0x02, 0x26, 0x00, 0x3a, 0x00, 0x00, + 0x01, 0x07, 0x00, 0x69, 0x00, 0x00, 0x00, 0x8b, 0x00, 0x10, 0x40, 0x0b, 0x01, 0x01, 0x2d, 0x29, + 0x1d, 0x0b, 0x50, 0x01, 0x0a, 0x2a, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0x00, 0xff, 0xff, 0x00, 0x0b, + 0x00, 0x00, 0x01, 0xe9, 0x02, 0xb3, 0x02, 0x26, 0x00, 0x5a, 0x00, 0x00, 0x01, 0x06, 0x00, 0x69, + 0x00, 0x00, 0x00, 0x10, 0x40, 0x0b, 0x01, 0x01, 0x2d, 0x29, 0x10, 0x25, 0x50, 0x01, 0x10, 0x2a, + 0x4f, 0x2b, 0x2b, 0x34, 0xff, 0xff, 0x00, 0x0d, 0x00, 0x00, 0x01, 0xe8, 0x03, 0x3e, 0x02, 0x26, + 0x00, 0x3c, 0x00, 0x00, 0x01, 0x07, 0x00, 0x69, 0x00, 0x00, 0x00, 0x8b, 0x00, 0x10, 0x40, 0x0b, + 0x01, 0x00, 0x19, 0x15, 0x11, 0x06, 0x50, 0x01, 0x05, 0x16, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x14, 0xff, 0x58, 0x01, 0xd8, 0x02, 0xb3, 0x02, 0x26, 0x00, 0x5c, 0x00, 0x00, + 0x01, 0x06, 0x00, 0x69, 0x00, 0x00, 0x00, 0x10, 0x40, 0x0b, 0x01, 0x05, 0x27, 0x23, 0x0d, 0x00, + 0x50, 0x01, 0x00, 0x24, 0x4f, 0x2b, 0x2b, 0x34, 0xff, 0xff, 0x00, 0x2e, 0x00, 0x00, 0x01, 0xc6, + 0x03, 0x3e, 0x02, 0x26, 0x00, 0x3d, 0x00, 0x00, 0x01, 0x07, 0x00, 0x8f, 0x00, 0x00, 0x00, 0x8b, + 0x00, 0x10, 0x40, 0x0b, 0x01, 0x0b, 0x14, 0x12, 0x08, 0x06, 0x50, 0x01, 0x10, 0x13, 0x4f, 0x2b, + 0x2b, 0x34, 0x00, 0x00, 0xff, 0xff, 0x00, 0x43, 0x00, 0x00, 0x01, 0xb4, 0x02, 0xb3, 0x02, 0x26, + 0x00, 0x5d, 0x00, 0x00, 0x01, 0x06, 0x00, 0x8f, 0x00, 0x00, 0x00, 0x10, 0x40, 0x0b, 0x01, 0x0a, + 0x14, 0x12, 0x08, 0x06, 0x50, 0x01, 0x10, 0x13, 0x4f, 0x2b, 0x2b, 0x34, 0xff, 0xff, 0x00, 0x2e, + 0x00, 0x00, 0x01, 0xc6, 0x03, 0x2e, 0x02, 0x26, 0x00, 0x3d, 0x00, 0x00, 0x01, 0x07, 0x01, 0x62, + 0x00, 0x00, 0x00, 0x8b, 0x00, 0x10, 0x40, 0x0b, 0x01, 0x00, 0x14, 0x1a, 0x08, 0x06, 0x50, 0x01, + 0x10, 0x12, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0x00, 0xff, 0xff, 0x00, 0x43, 0x00, 0x00, 0x01, 0xb4, + 0x02, 0xa3, 0x02, 0x26, 0x00, 0x5d, 0x00, 0x00, 0x01, 0x06, 0x01, 0x62, 0x00, 0x00, 0x00, 0x13, + 0xb9, 0x00, 0x01, 0xff, 0xff, 0x40, 0x09, 0x14, 0x1a, 0x08, 0x06, 0x50, 0x01, 0x10, 0x12, 0x4f, + 0x2b, 0x2b, 0x34, 0x00, 0xff, 0xff, 0x00, 0x2e, 0x00, 0x00, 0x01, 0xc6, 0x03, 0x3e, 0x02, 0x26, + 0x00, 0x3d, 0x00, 0x00, 0x01, 0x07, 0x01, 0x5f, 0x00, 0x00, 0x00, 0x8b, 0x00, 0x10, 0x40, 0x0b, + 0x01, 0x01, 0x12, 0x16, 0x08, 0x06, 0x50, 0x01, 0x10, 0x17, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x43, 0x00, 0x00, 0x01, 0xb4, 0x02, 0xb3, 0x02, 0x26, 0x00, 0x5d, 0x00, 0x00, + 0x01, 0x06, 0x01, 0x5f, 0x00, 0x00, 0x00, 0x10, 0x40, 0x0b, 0x01, 0x00, 0x12, 0x16, 0x08, 0x06, + 0x50, 0x01, 0x10, 0x17, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0x01, 0x00, 0x8b, 0x00, 0x00, 0x01, 0xec, + 0x02, 0xb5, 0x00, 0x13, 0x00, 0x37, 0xb3, 0xa0, 0x09, 0x01, 0x09, 0xb8, 0xff, 0xc0, 0x40, 0x0c, + 0x09, 0x12, 0x48, 0x09, 0x15, 0x13, 0x51, 0xa0, 0x00, 0x01, 0x02, 0x00, 0xb8, 0xff, 0xc0, 0x40, + 0x0b, 0x09, 0x12, 0x48, 0x00, 0x14, 0x13, 0x06, 0x0d, 0x57, 0x06, 0x01, 0x00, 0x3f, 0xed, 0x3f, + 0x01, 0x10, 0xd6, 0x2b, 0x5f, 0x5d, 0xed, 0x10, 0xc6, 0x2b, 0x5d, 0x31, 0x30, 0x33, 0x11, 0x34, + 0x3e, 0x02, 0x33, 0x32, 0x16, 0x17, 0x07, 0x26, 0x26, 0x23, 0x22, 0x0e, 0x02, 0x15, 0x11, 0x8b, + 0x21, 0x38, 0x48, 0x26, 0x27, 0x52, 0x21, 0x15, 0x17, 0x45, 0x1f, 0x11, 0x1f, 0x17, 0x0e, 0x01, + 0xf1, 0x39, 0x4b, 0x2d, 0x13, 0x0c, 0x10, 0x65, 0x08, 0x10, 0x06, 0x14, 0x25, 0x1e, 0xfe, 0x11, + 0xff, 0xff, 0x00, 0x28, 0xff, 0x56, 0x01, 0xcc, 0x02, 0x79, 0x02, 0x26, 0x00, 0x36, 0x00, 0x00, + 0x01, 0x06, 0x01, 0xc3, 0xdd, 0x00, 0x00, 0x0d, 0xb9, 0x00, 0x01, 0xff, 0xdd, 0xb4, 0x38, 0x31, + 0x2b, 0x24, 0x50, 0x2b, 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x36, 0xff, 0x56, 0x01, 0xba, + 0x01, 0xe2, 0x02, 0x26, 0x00, 0x56, 0x00, 0x00, 0x01, 0x06, 0x01, 0xc3, 0xdd, 0x00, 0x00, 0x0d, + 0xb9, 0x00, 0x01, 0xff, 0xdf, 0xb4, 0x3b, 0x34, 0x2e, 0x25, 0x50, 0x2b, 0x34, 0x00, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x19, 0xff, 0x56, 0x01, 0xdb, 0x02, 0x6b, 0x02, 0x26, 0x00, 0x37, 0x00, 0x00, + 0x01, 0x06, 0x01, 0xc3, 0xe6, 0x00, 0x00, 0x0d, 0xb9, 0x00, 0x01, 0xff, 0xe6, 0xb4, 0x11, 0x0a, + 0x06, 0x00, 0x50, 0x2b, 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x24, 0xff, 0x56, 0x01, 0xd8, + 0x02, 0x60, 0x02, 0x26, 0x00, 0x57, 0x00, 0x00, 0x01, 0x06, 0x01, 0xc3, 0x24, 0x00, 0x00, 0x0a, + 0xb6, 0x01, 0x20, 0x27, 0x20, 0x01, 0x15, 0x50, 0x2b, 0x34, 0x00, 0x00, 0x00, 0x01, 0x00, 0x31, + 0xff, 0x56, 0x01, 0x90, 0x01, 0xd5, 0x00, 0x13, 0x00, 0x25, 0x40, 0x14, 0x00, 0x44, 0x10, 0x12, + 0x0f, 0x08, 0x1f, 0x08, 0x02, 0x08, 0x14, 0x10, 0x55, 0x12, 0x0a, 0x09, 0x0c, 0x57, 0x05, 0x0e, + 0x00, 0x3f, 0xfd, 0xc6, 0x3f, 0xed, 0x01, 0x10, 0xc6, 0x5d, 0xd6, 0xdd, 0xed, 0x31, 0x30, 0x25, + 0x14, 0x0e, 0x02, 0x23, 0x22, 0x26, 0x27, 0x37, 0x16, 0x16, 0x33, 0x32, 0x36, 0x35, 0x11, 0x23, + 0x35, 0x21, 0x01, 0x90, 0x1c, 0x31, 0x43, 0x27, 0x30, 0x52, 0x26, 0x26, 0x19, 0x47, 0x1d, 0x1f, + 0x22, 0xbe, 0x01, 0x39, 0x1f, 0x39, 0x4d, 0x2f, 0x14, 0x18, 0x13, 0x68, 0x0e, 0x19, 0x25, 0x32, + 0x01, 0x56, 0x66, 0x00, 0x00, 0x01, 0x00, 0xb0, 0x01, 0xe2, 0x01, 0x43, 0x02, 0xb5, 0x00, 0x0f, + 0x00, 0x10, 0xb5, 0x00, 0x09, 0x10, 0x08, 0x0f, 0x9f, 0x00, 0x3f, 0xc5, 0x01, 0x10, 0xd6, 0xc5, + 0x31, 0x30, 0x01, 0x14, 0x14, 0x07, 0x0e, 0x03, 0x07, 0x27, 0x36, 0x36, 0x35, 0x34, 0x26, 0x27, + 0x01, 0x43, 0x01, 0x02, 0x09, 0x0f, 0x14, 0x0d, 0x57, 0x13, 0x0f, 0x01, 0x02, 0x02, 0xb5, 0x0b, + 0x10, 0x0b, 0x1c, 0x2e, 0x29, 0x26, 0x14, 0x18, 0x29, 0x44, 0x26, 0x0b, 0x15, 0x08, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x70, 0x01, 0xfe, 0x01, 0x86, 0x02, 0xb3, 0x00, 0x05, 0x00, 0x3f, 0xb5, 0x04, + 0x20, 0x0c, 0x00, 0x4d, 0x00, 0xb8, 0xff, 0xe0, 0x40, 0x1a, 0x0c, 0x00, 0x4d, 0x05, 0x20, 0x0e, + 0x00, 0x4d, 0x01, 0x06, 0x03, 0x07, 0x05, 0x05, 0x06, 0x04, 0x07, 0x00, 0x06, 0x05, 0x03, 0x9f, + 0x02, 0x02, 0x01, 0x9f, 0x00, 0x3f, 0x3f, 0x3f, 0xc5, 0x01, 0x10, 0xc6, 0x10, 0xc6, 0x12, 0x39, + 0x3d, 0x2f, 0x12, 0x39, 0x12, 0x39, 0x31, 0x30, 0x00, 0x2b, 0x01, 0x2b, 0x2b, 0x13, 0x37, 0x17, + 0x37, 0x17, 0x07, 0x70, 0x31, 0x59, 0x59, 0x33, 0x8c, 0x02, 0x78, 0x3b, 0x45, 0x45, 0x3b, 0x7a, + 0x00, 0x01, 0x00, 0x6a, 0x02, 0x2c, 0x01, 0x8a, 0x02, 0x87, 0x00, 0x03, 0x00, 0x10, 0xb5, 0x01, + 0x03, 0x04, 0x03, 0x01, 0x93, 0x00, 0x3f, 0xc5, 0x01, 0x10, 0xd6, 0xc5, 0x31, 0x30, 0x13, 0x21, + 0x15, 0x21, 0x6a, 0x01, 0x20, 0xfe, 0xe0, 0x02, 0x87, 0x5b, 0x00, 0x00, 0x00, 0x01, 0x00, 0x69, + 0x02, 0x16, 0x01, 0x8b, 0x02, 0xaa, 0x00, 0x13, 0x00, 0x1e, 0x40, 0x0e, 0x0d, 0x8f, 0x0e, 0x15, + 0x07, 0x8f, 0x06, 0x14, 0x0e, 0x06, 0x00, 0x7d, 0x0a, 0x02, 0x00, 0x3f, 0xed, 0xdc, 0xc0, 0x01, + 0x10, 0xd6, 0xe5, 0x10, 0xd6, 0xed, 0x31, 0x30, 0x13, 0x22, 0x2e, 0x02, 0x35, 0x35, 0x33, 0x16, + 0x16, 0x33, 0x32, 0x36, 0x37, 0x33, 0x15, 0x14, 0x0e, 0x02, 0xfa, 0x1f, 0x35, 0x27, 0x16, 0x5b, + 0x02, 0x1e, 0x16, 0x16, 0x1e, 0x03, 0x5a, 0x16, 0x27, 0x35, 0x02, 0x16, 0x13, 0x25, 0x34, 0x21, + 0x07, 0x26, 0x19, 0x19, 0x26, 0x07, 0x21, 0x34, 0x25, 0x13, 0x00, 0x00, 0x00, 0x01, 0x00, 0xb3, + 0x02, 0x18, 0x01, 0x41, 0x02, 0xa3, 0x00, 0x0b, 0x00, 0x12, 0xb7, 0x09, 0x95, 0x03, 0x0c, 0x00, + 0x96, 0x06, 0x98, 0x00, 0x3f, 0xed, 0x01, 0x10, 0xd6, 0xed, 0x31, 0x30, 0x13, 0x22, 0x26, 0x35, + 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0xfa, 0x1d, 0x2a, 0x2a, 0x1d, 0x1d, 0x2a, 0x2a, + 0x02, 0x18, 0x25, 0x20, 0x20, 0x26, 0x26, 0x20, 0x20, 0x25, 0x00, 0x00, 0x00, 0x02, 0x00, 0x91, + 0x01, 0xf6, 0x01, 0x63, 0x02, 0xc3, 0x00, 0x0f, 0x00, 0x1b, 0x00, 0x2b, 0x40, 0x19, 0x06, 0x08, + 0x10, 0x00, 0x4d, 0x00, 0x7f, 0x10, 0x16, 0x7f, 0x08, 0x1c, 0x03, 0x80, 0x5f, 0x19, 0x01, 0x9f, + 0x19, 0x01, 0x19, 0x13, 0x80, 0x0d, 0x8a, 0x00, 0x3f, 0xfd, 0xd6, 0x5d, 0x71, 0xed, 0x01, 0x10, + 0xd6, 0xfd, 0xd6, 0xed, 0x31, 0x30, 0x2b, 0x01, 0x14, 0x06, 0x23, 0x22, 0x2e, 0x02, 0x35, 0x34, + 0x3e, 0x02, 0x33, 0x32, 0x16, 0x07, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, + 0x36, 0x01, 0x63, 0x3f, 0x2b, 0x14, 0x26, 0x1d, 0x11, 0x11, 0x1d, 0x26, 0x14, 0x2b, 0x3f, 0x41, + 0x18, 0x11, 0x0f, 0x19, 0x19, 0x0f, 0x11, 0x18, 0x02, 0x5c, 0x32, 0x34, 0x0d, 0x1a, 0x26, 0x19, + 0x19, 0x27, 0x1a, 0x0d, 0x34, 0x33, 0x15, 0x15, 0x15, 0x15, 0x14, 0x16, 0x16, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x00, 0xa3, 0xff, 0x56, 0x01, 0x5c, 0x00, 0x0d, 0x00, 0x15, 0x00, 0x17, 0x40, 0x0a, + 0x00, 0x0f, 0x06, 0x16, 0x0b, 0x06, 0x09, 0x06, 0x03, 0x92, 0x00, 0x3f, 0x3f, 0x3f, 0x01, 0x10, + 0xd6, 0xd5, 0xcc, 0x31, 0x30, 0x05, 0x06, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x37, 0x33, + 0x0e, 0x03, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x01, 0x5a, 0x0e, 0x33, 0x1c, 0x30, 0x2a, + 0x2d, 0x24, 0x68, 0x07, 0x1b, 0x1b, 0x14, 0x0b, 0x10, 0x08, 0x16, 0x0f, 0x9c, 0x05, 0x09, 0x25, + 0x1b, 0x1e, 0x43, 0x16, 0x05, 0x16, 0x1b, 0x1c, 0x0c, 0x0a, 0x0e, 0x02, 0x05, 0x00, 0x00, 0x00, + 0x00, 0x02, 0x00, 0x43, 0x01, 0xfe, 0x01, 0xb6, 0x02, 0xb4, 0x00, 0x03, 0x00, 0x07, 0x00, 0x26, + 0x40, 0x14, 0x04, 0x06, 0x00, 0x00, 0x02, 0x10, 0x02, 0x02, 0x02, 0x08, 0x05, 0x07, 0xa0, 0x04, + 0x04, 0x01, 0x03, 0xa0, 0x00, 0x04, 0x00, 0x3f, 0x3f, 0xc5, 0x3f, 0x3f, 0xc5, 0x01, 0x10, 0xd6, + 0x5d, 0xd5, 0xd6, 0xc5, 0x31, 0x30, 0x01, 0x07, 0x27, 0x37, 0x17, 0x07, 0x27, 0x37, 0x01, 0x02, + 0x90, 0x2f, 0x79, 0xfa, 0x90, 0x2f, 0x7a, 0x02, 0x6e, 0x70, 0x31, 0x85, 0x46, 0x70, 0x31, 0x84, + 0xff, 0xff, 0x00, 0x17, 0x00, 0x00, 0x01, 0xdd, 0x03, 0x3e, 0x02, 0x26, 0x00, 0x3a, 0x00, 0x00, + 0x01, 0x07, 0x00, 0x43, 0xff, 0xe6, 0x00, 0x8b, 0x00, 0x13, 0xb9, 0x00, 0x01, 0xff, 0xf2, 0x40, + 0x09, 0x2c, 0x2a, 0x1d, 0x0b, 0x50, 0x01, 0x0a, 0x2b, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x0b, 0x00, 0x00, 0x01, 0xe9, 0x02, 0xb3, 0x02, 0x26, 0x00, 0x5a, 0x00, 0x00, + 0x01, 0x06, 0x00, 0x43, 0xe6, 0x00, 0x00, 0x13, 0xb9, 0x00, 0x01, 0xff, 0xf2, 0x40, 0x09, 0x2c, + 0x2a, 0x10, 0x25, 0x50, 0x01, 0x10, 0x2b, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0xff, 0xff, 0x00, 0x17, + 0x00, 0x00, 0x01, 0xdd, 0x03, 0x3e, 0x02, 0x26, 0x00, 0x3a, 0x00, 0x00, 0x01, 0x07, 0x00, 0x8f, + 0x00, 0x00, 0x00, 0x8b, 0x00, 0x10, 0x40, 0x0b, 0x01, 0x0b, 0x2b, 0x29, 0x1d, 0x0b, 0x50, 0x01, + 0x0a, 0x2a, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0x00, 0xff, 0xff, 0x00, 0x0b, 0x00, 0x00, 0x01, 0xe9, + 0x02, 0xb3, 0x02, 0x26, 0x00, 0x5a, 0x00, 0x00, 0x01, 0x06, 0x00, 0x8f, 0x00, 0x00, 0x00, 0x10, + 0x40, 0x0b, 0x01, 0x0b, 0x2b, 0x29, 0x10, 0x25, 0x50, 0x01, 0x10, 0x2a, 0x4f, 0x2b, 0x2b, 0x34, + 0xff, 0xff, 0x00, 0x17, 0x00, 0x00, 0x01, 0xdd, 0x03, 0x2c, 0x02, 0x26, 0x00, 0x3a, 0x00, 0x00, + 0x01, 0x07, 0x00, 0x83, 0x00, 0x00, 0x00, 0x8b, 0x00, 0x17, 0x40, 0x10, 0x02, 0x01, 0x01, 0x2b, + 0x3d, 0x1d, 0x0b, 0x50, 0x02, 0x0a, 0x35, 0x4f, 0x01, 0x0a, 0x29, 0x4f, 0x2b, 0x2b, 0x2b, 0x34, + 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x0b, 0x00, 0x00, 0x01, 0xe9, 0x02, 0xa1, 0x02, 0x26, + 0x00, 0x5a, 0x00, 0x00, 0x01, 0x06, 0x00, 0x83, 0x00, 0x00, 0x00, 0x17, 0x40, 0x10, 0x02, 0x01, + 0x01, 0x2b, 0x3d, 0x10, 0x25, 0x50, 0x02, 0x10, 0x35, 0x4f, 0x01, 0x10, 0x29, 0x4f, 0x2b, 0x2b, + 0x2b, 0x34, 0x34, 0x00, 0xff, 0xff, 0x00, 0x0d, 0x00, 0x00, 0x01, 0xe8, 0x03, 0x3e, 0x02, 0x26, + 0x00, 0x3c, 0x00, 0x00, 0x01, 0x07, 0x00, 0x43, 0xff, 0xdd, 0x00, 0x8b, 0x00, 0x13, 0xb9, 0x00, + 0x01, 0xff, 0xe8, 0x40, 0x09, 0x18, 0x16, 0x11, 0x06, 0x50, 0x01, 0x05, 0x17, 0x4f, 0x2b, 0x2b, + 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x14, 0xff, 0x58, 0x01, 0xd8, 0x02, 0xb3, 0x02, 0x26, + 0x00, 0x5c, 0x00, 0x00, 0x01, 0x06, 0x00, 0x43, 0xe6, 0x00, 0x00, 0x13, 0xb9, 0x00, 0x01, 0xff, + 0xf6, 0x40, 0x09, 0x26, 0x24, 0x0d, 0x00, 0x50, 0x01, 0x00, 0x25, 0x4f, 0x2b, 0x2b, 0x34, 0x00, + 0x00, 0x01, 0x00, 0x19, 0x00, 0x00, 0x01, 0xda, 0x02, 0x6b, 0x00, 0x03, 0x00, 0x18, 0x40, 0x0b, + 0x00, 0x79, 0x03, 0x01, 0x79, 0x02, 0x04, 0x01, 0x06, 0x00, 0x04, 0x00, 0x3f, 0x3f, 0x01, 0x10, + 0xd6, 0xed, 0xd5, 0xed, 0x31, 0x30, 0x01, 0x01, 0x23, 0x01, 0x01, 0xda, 0xfe, 0xa3, 0x64, 0x01, + 0x5d, 0x02, 0x6b, 0xfd, 0x95, 0x02, 0x6b, 0x00, 0x00, 0x03, 0x00, 0x66, 0x01, 0x07, 0x01, 0x8f, + 0x02, 0x79, 0x00, 0x0b, 0x00, 0x17, 0x00, 0x23, 0x00, 0x32, 0x40, 0x1b, 0x06, 0x84, 0xaf, 0x0c, + 0xbf, 0x0c, 0x02, 0x0c, 0x18, 0x7f, 0x1e, 0x12, 0x84, 0x00, 0x24, 0x15, 0x7d, 0x1b, 0x21, 0x03, + 0x09, 0x09, 0x25, 0x0f, 0x7d, 0x03, 0x01, 0x00, 0x3f, 0xed, 0x12, 0x39, 0x2f, 0x12, 0x39, 0x39, + 0xed, 0x01, 0x10, 0xd6, 0xfd, 0xd6, 0xfd, 0xd6, 0x5d, 0xed, 0x31, 0x30, 0x13, 0x34, 0x36, 0x33, + 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x37, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, + 0x16, 0x33, 0x32, 0x36, 0x27, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, + 0x66, 0x4d, 0x48, 0x47, 0x4d, 0x4d, 0x47, 0x48, 0x4d, 0xca, 0x16, 0x1e, 0x1e, 0x19, 0x19, 0x1e, + 0x1e, 0x16, 0x18, 0x10, 0x0e, 0x0e, 0x10, 0x10, 0x0e, 0x0e, 0x10, 0x01, 0xc0, 0x59, 0x60, 0x60, + 0x59, 0x59, 0x60, 0x60, 0x59, 0x2f, 0x3a, 0x3a, 0x2f, 0x30, 0x39, 0x39, 0x33, 0x10, 0x16, 0x16, + 0x10, 0x10, 0x16, 0x16, 0x00, 0x02, 0x00, 0x59, 0x01, 0x0d, 0x01, 0x7d, 0x02, 0x72, 0x00, 0x0c, + 0x00, 0x11, 0x00, 0x56, 0x40, 0x0a, 0x03, 0x40, 0x0a, 0x0c, 0x00, 0x4c, 0x0f, 0x03, 0x01, 0x06, + 0xb8, 0xff, 0xc0, 0x40, 0x25, 0x09, 0x0a, 0x00, 0x4c, 0x03, 0x02, 0x01, 0x04, 0x04, 0x01, 0x8f, + 0x07, 0x11, 0x10, 0x00, 0x08, 0x10, 0x08, 0x02, 0x08, 0x12, 0x0d, 0x11, 0x05, 0x04, 0x07, 0x01, + 0x11, 0x11, 0x01, 0x07, 0x04, 0x05, 0x05, 0x13, 0x00, 0x04, 0x00, 0x3f, 0x11, 0x17, 0x39, 0x2f, + 0x2f, 0x2f, 0x2f, 0x2f, 0x11, 0x39, 0x01, 0x10, 0xd6, 0x5d, 0xc5, 0xd5, 0x32, 0xed, 0x32, 0x2f, + 0x10, 0xc5, 0x32, 0x31, 0x30, 0x00, 0x2b, 0x01, 0x5d, 0x2b, 0x01, 0x15, 0x33, 0x15, 0x23, 0x15, + 0x23, 0x35, 0x23, 0x35, 0x36, 0x36, 0x37, 0x17, 0x06, 0x06, 0x07, 0x33, 0x01, 0x54, 0x29, 0x29, + 0x54, 0xa7, 0x26, 0x4d, 0x30, 0x04, 0x14, 0x25, 0x10, 0x49, 0x02, 0x72, 0xce, 0x4a, 0x4d, 0x4d, + 0x40, 0x40, 0x65, 0x33, 0x63, 0x17, 0x34, 0x20, 0x00, 0x01, 0x00, 0x71, 0x01, 0x07, 0x01, 0x7c, + 0x02, 0x72, 0x00, 0x1c, 0x00, 0x80, 0xb9, 0x00, 0x1c, 0xff, 0xc0, 0x40, 0x0f, 0x0c, 0x00, 0x4d, + 0x11, 0x40, 0x09, 0x0a, 0x00, 0x4c, 0x0f, 0x40, 0x13, 0x00, 0x4d, 0x0f, 0xb8, 0xff, 0xc0, 0xb3, + 0x0a, 0x00, 0x4d, 0x0e, 0xb8, 0xff, 0xc0, 0x40, 0x37, 0x09, 0x00, 0x4d, 0xaf, 0x0e, 0x01, 0x08, + 0x20, 0x0c, 0x00, 0x4d, 0x16, 0x0c, 0x84, 0x20, 0x00, 0x30, 0x00, 0x40, 0x00, 0x03, 0x00, 0x1e, + 0x17, 0x14, 0x0f, 0x06, 0x1d, 0x07, 0x7f, 0x0a, 0x8f, 0x0a, 0x9f, 0x0a, 0x03, 0x0a, 0x7d, 0x03, + 0xbf, 0x0f, 0x01, 0x0f, 0x7d, 0x1a, 0x03, 0x1a, 0x03, 0x1a, 0x1e, 0x17, 0x16, 0x45, 0x15, 0x04, + 0x00, 0x3f, 0xed, 0x32, 0x12, 0x39, 0x39, 0x2f, 0x2f, 0x10, 0xed, 0x5d, 0x10, 0xfd, 0x5d, 0xc6, + 0x01, 0x10, 0xd6, 0xd6, 0xc4, 0xc5, 0x10, 0xd6, 0x5d, 0xed, 0xc4, 0x31, 0x30, 0x00, 0x2b, 0x5d, + 0x2b, 0x2b, 0x2b, 0x01, 0x2b, 0x2b, 0x01, 0x14, 0x06, 0x23, 0x22, 0x26, 0x27, 0x37, 0x16, 0x16, + 0x33, 0x32, 0x35, 0x34, 0x26, 0x23, 0x3e, 0x03, 0x37, 0x33, 0x15, 0x23, 0x14, 0x06, 0x07, 0x16, + 0x16, 0x01, 0x7c, 0x42, 0x53, 0x20, 0x41, 0x15, 0x14, 0x12, 0x26, 0x21, 0x3a, 0x49, 0x47, 0x03, + 0x05, 0x05, 0x04, 0x02, 0xd4, 0x89, 0x02, 0x02, 0x57, 0x43, 0x01, 0x7f, 0x35, 0x43, 0x0b, 0x0b, + 0x4f, 0x07, 0x0b, 0x24, 0x1e, 0x0c, 0x18, 0x39, 0x39, 0x31, 0x0f, 0x51, 0x09, 0x1f, 0x0a, 0x02, + 0x3b, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x62, 0x01, 0x07, 0x01, 0x73, 0x02, 0x73, 0x00, 0x0a, + 0x00, 0x1f, 0x00, 0x77, 0x40, 0x12, 0x1d, 0x40, 0x18, 0x00, 0x4d, 0x04, 0x40, 0x11, 0x12, 0x00, + 0x4c, 0x03, 0x40, 0x11, 0x12, 0x00, 0x4c, 0x14, 0xb8, 0xff, 0xf0, 0xb3, 0x0f, 0x00, 0x4d, 0x05, + 0xb8, 0xff, 0xc0, 0x40, 0x33, 0x13, 0x14, 0x00, 0x4c, 0x1a, 0x80, 0x08, 0x90, 0x08, 0x02, 0x08, + 0x7c, 0x00, 0x0e, 0x01, 0x20, 0x0e, 0x60, 0x0e, 0xa0, 0x0e, 0x03, 0x0e, 0x21, 0x8f, 0x1d, 0x9f, + 0x1d, 0x02, 0x1d, 0x03, 0x7c, 0x16, 0x20, 0x7f, 0x05, 0x01, 0x05, 0x7d, 0x13, 0x0b, 0x00, 0x13, + 0x00, 0x13, 0x00, 0x21, 0x1a, 0x7d, 0x19, 0x03, 0x00, 0x3f, 0xed, 0x12, 0x39, 0x39, 0x2f, 0x2f, + 0x10, 0xc1, 0x10, 0xed, 0x5d, 0x01, 0x10, 0xd6, 0xed, 0xc1, 0x5d, 0x10, 0xd6, 0x5d, 0x71, 0xed, + 0x5d, 0xc4, 0x31, 0x30, 0x00, 0x2b, 0x2b, 0x01, 0x2b, 0x2b, 0x2b, 0x13, 0x22, 0x06, 0x07, 0x06, + 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x27, 0x32, 0x16, 0x15, 0x14, 0x0e, 0x02, 0x23, 0x22, 0x26, + 0x35, 0x34, 0x36, 0x33, 0x17, 0x06, 0x06, 0x07, 0x36, 0x36, 0xe6, 0x0b, 0x18, 0x06, 0x05, 0x38, + 0x17, 0x13, 0x17, 0x0b, 0x43, 0x38, 0x10, 0x21, 0x32, 0x22, 0x45, 0x47, 0x81, 0x73, 0x04, 0x3f, + 0x45, 0x12, 0x08, 0x1d, 0x01, 0xac, 0x06, 0x03, 0x50, 0x1b, 0x11, 0x17, 0x16, 0x41, 0x3d, 0x2e, + 0x18, 0x2d, 0x22, 0x14, 0x4f, 0x49, 0x63, 0x71, 0x50, 0x02, 0x20, 0x1e, 0x04, 0x06, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x6b, 0x01, 0x0e, 0x01, 0x7d, 0x02, 0x72, 0x00, 0x0c, 0x00, 0x3f, 0x40, 0x28, + 0x0b, 0x40, 0x09, 0x00, 0x4d, 0x0a, 0x40, 0x09, 0x00, 0x4d, 0x08, 0x20, 0x15, 0x00, 0x4d, 0x08, + 0x20, 0x12, 0x00, 0x4d, 0x08, 0x20, 0x0e, 0x0f, 0x00, 0x4c, 0x0c, 0x07, 0x03, 0x00, 0x05, 0x0d, + 0x00, 0x00, 0x0e, 0x07, 0x03, 0x73, 0x06, 0x04, 0x00, 0x3f, 0xed, 0x32, 0x12, 0x39, 0x2f, 0x01, + 0x10, 0xd6, 0xc4, 0xd5, 0xd5, 0xc6, 0x31, 0x30, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x13, 0x36, 0x36, + 0x37, 0x23, 0x35, 0x21, 0x15, 0x0e, 0x03, 0x07, 0xa3, 0x0d, 0x32, 0x28, 0x9f, 0x01, 0x12, 0x12, + 0x24, 0x20, 0x18, 0x06, 0x01, 0x0e, 0x58, 0x80, 0x36, 0x56, 0x4b, 0x14, 0x3d, 0x49, 0x54, 0x2b, + 0x00, 0x03, 0x00, 0x6a, 0x01, 0x07, 0x01, 0x8a, 0x02, 0x79, 0x00, 0x1d, 0x00, 0x29, 0x00, 0x35, + 0x00, 0xa8, 0xb9, 0x00, 0x31, 0xff, 0xc0, 0xb3, 0x0e, 0x00, 0x4d, 0x31, 0xb8, 0xff, 0xc0, 0xb3, + 0x0c, 0x00, 0x4d, 0x2f, 0xb8, 0xff, 0xc8, 0xb3, 0x10, 0x00, 0x4d, 0x29, 0xb8, 0xff, 0xc0, 0x40, + 0x09, 0x0b, 0x00, 0x4d, 0x1e, 0x20, 0x0f, 0x00, 0x4d, 0x1e, 0xb8, 0xff, 0xc0, 0xb3, 0x0e, 0x00, + 0x4d, 0x1b, 0xb8, 0xff, 0xc0, 0x40, 0x24, 0x0e, 0x00, 0x4d, 0x0b, 0x20, 0x15, 0x16, 0x00, 0x4c, + 0x0b, 0x40, 0x0d, 0x00, 0x4d, 0x08, 0x36, 0x0e, 0x24, 0x2a, 0x30, 0x1e, 0x04, 0x0b, 0x1b, 0x00, + 0x18, 0x37, 0x40, 0x0e, 0x50, 0x0e, 0x02, 0x40, 0x0b, 0x01, 0x18, 0xb8, 0xff, 0xc0, 0x40, 0x1f, + 0x0b, 0x00, 0x4d, 0x0e, 0x0b, 0x1b, 0x18, 0x18, 0x1b, 0x0b, 0x0e, 0x04, 0x36, 0x37, 0x2d, 0x33, + 0x27, 0x21, 0x04, 0x13, 0x10, 0x03, 0x01, 0x03, 0x03, 0x37, 0x3f, 0x13, 0x01, 0x13, 0x05, 0x00, + 0x3f, 0x5d, 0x12, 0x39, 0x2f, 0x5d, 0x12, 0x17, 0x39, 0x01, 0x11, 0x12, 0x17, 0x39, 0x2f, 0x2f, + 0x2f, 0x2f, 0x2b, 0x5d, 0x5d, 0x11, 0x12, 0x39, 0x11, 0x12, 0x17, 0x39, 0x11, 0x12, 0x39, 0x31, + 0x30, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x01, 0x14, 0x06, 0x23, 0x22, 0x2e, + 0x02, 0x35, 0x34, 0x36, 0x37, 0x26, 0x26, 0x35, 0x34, 0x3e, 0x02, 0x33, 0x32, 0x1e, 0x02, 0x15, + 0x14, 0x06, 0x07, 0x16, 0x16, 0x07, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x27, 0x06, + 0x06, 0x37, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x17, 0x36, 0x36, 0x01, 0x8a, 0x43, + 0x4e, 0x2c, 0x38, 0x20, 0x0b, 0x20, 0x18, 0x19, 0x16, 0x11, 0x21, 0x33, 0x22, 0x27, 0x34, 0x1f, + 0x0d, 0x1c, 0x16, 0x21, 0x1a, 0xc2, 0x15, 0x1d, 0x1c, 0x16, 0x25, 0x1e, 0x0f, 0x12, 0x5e, 0x14, + 0x17, 0x17, 0x14, 0x16, 0x1d, 0x12, 0x11, 0x01, 0x71, 0x2f, 0x3b, 0x14, 0x1e, 0x23, 0x0f, 0x20, + 0x27, 0x0f, 0x12, 0x24, 0x1b, 0x14, 0x25, 0x1d, 0x11, 0x12, 0x1c, 0x23, 0x10, 0x18, 0x2a, 0x0d, + 0x14, 0x29, 0x1b, 0x0d, 0x18, 0x17, 0x0e, 0x16, 0x19, 0x06, 0x0a, 0x19, 0x8f, 0x0b, 0x17, 0x17, + 0x0b, 0x0f, 0x1b, 0x08, 0x0a, 0x16, 0x00, 0x00, 0x00, 0x02, 0x00, 0x81, 0x01, 0x0d, 0x01, 0x92, + 0x02, 0x79, 0x00, 0x0a, 0x00, 0x21, 0x00, 0x86, 0xb9, 0x00, 0x1c, 0xff, 0xc0, 0xb4, 0x14, 0x16, + 0x00, 0x4c, 0x1b, 0xb8, 0xff, 0xc0, 0xb4, 0x14, 0x16, 0x00, 0x4c, 0x1d, 0xb8, 0xff, 0xc0, 0xb3, + 0x10, 0x00, 0x4d, 0x1c, 0xb8, 0xff, 0xc0, 0x40, 0x40, 0x10, 0x00, 0x4d, 0x0d, 0x20, 0x17, 0x00, + 0x4d, 0x0d, 0x40, 0x13, 0x00, 0x4d, 0x0c, 0x40, 0x16, 0x00, 0x4d, 0x0c, 0x40, 0x14, 0x00, 0x4d, + 0x00, 0x40, 0x0d, 0x0e, 0x00, 0x4c, 0x1f, 0x84, 0x03, 0x84, 0x7f, 0x18, 0x01, 0x20, 0x18, 0x01, + 0x18, 0x23, 0x1c, 0x08, 0x84, 0x10, 0x22, 0x70, 0x1b, 0x01, 0x1b, 0x7d, 0x1c, 0x0b, 0x7d, 0x00, + 0x1c, 0x00, 0x1c, 0x00, 0x23, 0x05, 0x7d, 0x15, 0x05, 0x00, 0x3f, 0xed, 0x12, 0x39, 0x39, 0x2f, + 0x2f, 0x10, 0xed, 0x10, 0xed, 0x5d, 0x01, 0x10, 0xd6, 0xed, 0xc4, 0x10, 0xd6, 0x5d, 0x5d, 0xed, + 0xed, 0x31, 0x30, 0x00, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x01, 0x2b, 0x2b, 0x01, 0x32, + 0x36, 0x37, 0x36, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x17, 0x22, 0x2e, 0x02, 0x35, 0x34, 0x3e, + 0x02, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x27, 0x36, 0x36, 0x37, 0x06, 0x06, 0x01, 0x0f, + 0x0b, 0x18, 0x06, 0x05, 0x36, 0x17, 0x15, 0x17, 0x0a, 0x21, 0x2f, 0x1e, 0x0d, 0x10, 0x21, 0x32, + 0x22, 0x46, 0x46, 0x76, 0x7e, 0x04, 0x45, 0x43, 0x0f, 0x08, 0x1e, 0x01, 0xd6, 0x05, 0x04, 0x4f, + 0x19, 0x11, 0x16, 0x18, 0x43, 0x11, 0x1e, 0x28, 0x17, 0x17, 0x2b, 0x22, 0x14, 0x51, 0x48, 0x62, + 0x71, 0x4f, 0x02, 0x1f, 0x20, 0x04, 0x06, 0x00, 0xff, 0xff, 0x00, 0x66, 0xff, 0xfb, 0x01, 0x8f, + 0x01, 0x6d, 0x02, 0x07, 0x01, 0x6f, 0x00, 0x00, 0xfe, 0xf4, 0x00, 0x00, 0xff, 0xff, 0x00, 0x81, + 0x00, 0x02, 0x01, 0xa6, 0x01, 0x66, 0x02, 0x07, 0x00, 0x94, 0x00, 0x00, 0xfe, 0xf4, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x71, 0x00, 0x02, 0x01, 0x82, 0x01, 0x6d, 0x02, 0x07, 0x00, 0x8d, 0x00, 0x00, + 0xfe, 0xf4, 0x00, 0x00, 0xff, 0xff, 0x00, 0x71, 0xff, 0xfb, 0x01, 0x80, 0x01, 0x6d, 0x02, 0x07, + 0x00, 0x8e, 0x00, 0x00, 0xfe, 0xf4, 0x00, 0x00, 0xff, 0xff, 0x00, 0x59, 0x00, 0x01, 0x01, 0x7d, + 0x01, 0x66, 0x02, 0x07, 0x01, 0x70, 0x00, 0x00, 0xfe, 0xf4, 0x00, 0x00, 0xff, 0xff, 0x00, 0x71, + 0xff, 0xfb, 0x01, 0x7c, 0x01, 0x66, 0x02, 0x07, 0x01, 0x71, 0x00, 0x00, 0xfe, 0xf4, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x62, 0xff, 0xfb, 0x01, 0x73, 0x01, 0x67, 0x02, 0x07, 0x01, 0x72, 0x00, 0x00, + 0xfe, 0xf4, 0x00, 0x00, 0xff, 0xff, 0x00, 0x6b, 0x00, 0x02, 0x01, 0x7d, 0x01, 0x66, 0x02, 0x07, + 0x01, 0x73, 0x00, 0x00, 0xfe, 0xf4, 0x00, 0x00, 0xff, 0xff, 0x00, 0x6a, 0xff, 0xfb, 0x01, 0x8a, + 0x01, 0x6d, 0x02, 0x07, 0x01, 0x74, 0x00, 0x00, 0xfe, 0xf4, 0x00, 0x00, 0xff, 0xff, 0x00, 0x81, + 0x00, 0x01, 0x01, 0x92, 0x01, 0x6d, 0x02, 0x07, 0x01, 0x75, 0x00, 0x00, 0xfe, 0xf4, 0x00, 0x00, + 0x00, 0x02, 0x00, 0x35, 0xff, 0xf3, 0x01, 0xad, 0x02, 0xb5, 0x00, 0x21, 0x00, 0x2f, 0x00, 0x34, + 0x40, 0x1d, 0x25, 0x49, 0x0b, 0x16, 0x31, 0x0e, 0x20, 0x2f, 0x30, 0x2f, 0x02, 0x2f, 0x52, 0x1f, + 0x01, 0x10, 0x21, 0x01, 0x21, 0x30, 0x15, 0x12, 0x7d, 0x19, 0x07, 0x2a, 0x80, 0x06, 0x10, 0x00, + 0x3f, 0xed, 0x3f, 0xfd, 0xc6, 0x01, 0x10, 0xd6, 0x5d, 0xd6, 0x32, 0xed, 0x5d, 0x32, 0x10, 0xd6, + 0xd6, 0xed, 0x31, 0x30, 0x37, 0x11, 0x34, 0x3e, 0x02, 0x33, 0x32, 0x1e, 0x02, 0x15, 0x14, 0x06, + 0x07, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x17, 0x06, 0x06, 0x23, 0x22, 0x2e, 0x02, 0x35, + 0x35, 0x07, 0x27, 0x37, 0x36, 0x36, 0x35, 0x34, 0x2e, 0x02, 0x23, 0x22, 0x0e, 0x02, 0x15, 0x90, + 0x18, 0x28, 0x36, 0x1d, 0x26, 0x2f, 0x1b, 0x09, 0x66, 0x54, 0x2a, 0x2d, 0x1d, 0x26, 0x10, 0x21, + 0x17, 0x40, 0x2b, 0x2c, 0x3c, 0x24, 0x0f, 0x3b, 0x20, 0xad, 0x39, 0x40, 0x04, 0x0c, 0x15, 0x11, + 0x0e, 0x18, 0x12, 0x0b, 0xe4, 0x01, 0x02, 0x3d, 0x51, 0x2e, 0x13, 0x1c, 0x2d, 0x36, 0x1a, 0x5f, + 0x9d, 0x46, 0x27, 0x3f, 0x39, 0x16, 0x0b, 0x3e, 0x14, 0x17, 0x1a, 0x2d, 0x3b, 0x20, 0x07, 0x2a, + 0x30, 0x82, 0x34, 0x79, 0x4c, 0x0f, 0x1e, 0x18, 0x0f, 0x0a, 0x1e, 0x35, 0x2b, 0x00, 0x00, 0x00, + 0x00, 0x02, 0x00, 0x1b, 0xff, 0xf4, 0x01, 0xd9, 0x01, 0x86, 0x00, 0x20, 0x00, 0x31, 0x00, 0x61, + 0xb9, 0x00, 0x1d, 0xff, 0xe0, 0x40, 0x40, 0x0c, 0x00, 0x4d, 0x2f, 0x28, 0x14, 0x00, 0x4d, 0x40, + 0x0d, 0x01, 0x0d, 0x33, 0xb0, 0x1f, 0x01, 0x2f, 0x1f, 0x3f, 0x1f, 0x6f, 0x1f, 0x7f, 0x1f, 0x8f, + 0x1f, 0x05, 0x00, 0x1f, 0x01, 0x1f, 0x8f, 0x2f, 0x02, 0x7f, 0x2c, 0x01, 0x2c, 0x7c, 0x15, 0x32, + 0x0f, 0x2f, 0x1f, 0x2f, 0x2f, 0x2f, 0x5f, 0x2f, 0x6f, 0x2f, 0x7f, 0x2f, 0xaf, 0x2f, 0xbf, 0x2f, + 0x08, 0x2f, 0x26, 0x1a, 0xa3, 0x10, 0x07, 0x00, 0x3f, 0x3f, 0xd5, 0xc6, 0x5d, 0x01, 0x10, 0xd6, + 0xfd, 0x5d, 0x32, 0xd6, 0xed, 0x5d, 0x5d, 0x5d, 0x10, 0xc6, 0x5d, 0x31, 0x30, 0x00, 0x2b, 0x01, + 0x2b, 0x37, 0x22, 0x15, 0x15, 0x14, 0x16, 0x17, 0x16, 0x16, 0x33, 0x32, 0x36, 0x37, 0x33, 0x06, + 0x06, 0x23, 0x22, 0x2e, 0x02, 0x35, 0x34, 0x3e, 0x02, 0x33, 0x32, 0x1e, 0x02, 0x15, 0x15, 0x27, + 0x34, 0x27, 0x26, 0x26, 0x23, 0x22, 0x06, 0x07, 0x06, 0x15, 0x15, 0x14, 0x33, 0x21, 0x32, 0x35, + 0x70, 0x04, 0x03, 0x02, 0x1c, 0x44, 0x2a, 0x2c, 0x49, 0x1b, 0x20, 0x1d, 0x5e, 0x36, 0x2f, 0x51, + 0x3c, 0x23, 0x23, 0x3c, 0x51, 0x2f, 0x2e, 0x51, 0x3d, 0x23, 0x52, 0x05, 0x1a, 0x45, 0x28, 0x29, + 0x45, 0x1b, 0x06, 0x04, 0x01, 0x14, 0x03, 0xb7, 0x02, 0x6e, 0x04, 0x05, 0x03, 0x1d, 0x1f, 0x25, + 0x1e, 0x23, 0x2b, 0x20, 0x36, 0x49, 0x29, 0x2a, 0x4a, 0x36, 0x20, 0x20, 0x36, 0x4a, 0x2a, 0x05, + 0x7d, 0x06, 0x07, 0x1a, 0x1f, 0x20, 0x1b, 0x06, 0x08, 0x6b, 0x04, 0x04, 0x00, 0x03, 0x00, 0x02, + 0xff, 0xf8, 0x01, 0xf5, 0x02, 0x72, 0x00, 0x27, 0x00, 0x32, 0x00, 0x36, 0x00, 0xba, 0xb9, 0x00, + 0x0d, 0xff, 0xc0, 0xb3, 0x1a, 0x00, 0x4d, 0x0c, 0xb8, 0xff, 0xc0, 0xb4, 0x1b, 0x1c, 0x00, 0x4c, + 0x0b, 0xb8, 0xff, 0xc0, 0xb4, 0x19, 0x1c, 0x00, 0x4c, 0x0a, 0xb8, 0xff, 0xc0, 0xb4, 0x19, 0x1c, + 0x00, 0x4c, 0x00, 0xb8, 0xff, 0xe0, 0x40, 0x52, 0x20, 0x00, 0x4d, 0x34, 0x36, 0x35, 0x36, 0xaf, + 0x33, 0x34, 0x14, 0x33, 0x34, 0x33, 0x38, 0x06, 0x7c, 0x1f, 0x38, 0x0e, 0x7c, 0x1b, 0x38, 0x35, + 0x37, 0x90, 0x2d, 0x01, 0x2d, 0x8f, 0x2e, 0x28, 0x37, 0x15, 0x09, 0xef, 0x27, 0x01, 0x27, 0x33, + 0x36, 0x04, 0x35, 0x34, 0x0c, 0x32, 0x2f, 0x28, 0x28, 0x2f, 0x32, 0x03, 0x2b, 0x30, 0x2d, 0x60, + 0x2d, 0x02, 0x2d, 0x9c, 0x2b, 0x04, 0x08, 0x80, 0x0a, 0x18, 0x0b, 0x1d, 0x1d, 0x0b, 0x18, 0x03, + 0x80, 0x24, 0x09, 0x11, 0x80, 0x0f, 0x18, 0x01, 0x18, 0x9a, 0x00, 0x3f, 0x71, 0xed, 0x3f, 0xed, + 0x11, 0x39, 0x39, 0x3d, 0x2f, 0x18, 0x2f, 0x12, 0x39, 0xed, 0x3f, 0x3f, 0x5d, 0x12, 0x17, 0x39, + 0x2f, 0x2f, 0x2f, 0x3f, 0x33, 0x3f, 0x33, 0x01, 0x2f, 0x5d, 0xc4, 0xc6, 0x10, 0xd6, 0xd4, 0xed, + 0x5d, 0x10, 0xc2, 0x10, 0xd4, 0xed, 0x10, 0xd4, 0xed, 0x10, 0xd0, 0x87, 0x2b, 0x87, 0x7d, 0xc4, + 0x31, 0x30, 0x00, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x25, 0x16, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, + 0x23, 0x23, 0x35, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x27, 0x36, 0x36, + 0x33, 0x32, 0x16, 0x15, 0x14, 0x07, 0x16, 0x15, 0x14, 0x0e, 0x02, 0x23, 0x22, 0x26, 0x27, 0x01, + 0x36, 0x36, 0x37, 0x33, 0x15, 0x23, 0x35, 0x06, 0x06, 0x07, 0x25, 0x01, 0x23, 0x01, 0x01, 0x2b, + 0x0b, 0x27, 0x14, 0x17, 0x17, 0x3c, 0x13, 0x16, 0x1a, 0x13, 0x0f, 0x0b, 0x11, 0x28, 0x09, 0x17, + 0x0f, 0x38, 0x1d, 0x35, 0x2f, 0x1d, 0x2a, 0x13, 0x22, 0x2d, 0x1b, 0x1d, 0x32, 0x11, 0xfe, 0xea, + 0x22, 0x32, 0x18, 0x3f, 0x55, 0x14, 0x1c, 0x13, 0x01, 0xaa, 0xfe, 0xc3, 0x64, 0x01, 0x3d, 0x46, + 0x05, 0x0b, 0x09, 0x0d, 0x1a, 0x39, 0x0a, 0x0a, 0x09, 0x08, 0x0c, 0x05, 0x36, 0x0b, 0x0e, 0x29, + 0x1a, 0x26, 0x12, 0x14, 0x2b, 0x17, 0x1e, 0x13, 0x08, 0x09, 0x08, 0x02, 0x24, 0x0f, 0x1f, 0x17, + 0xfa, 0x96, 0x0b, 0x0c, 0x05, 0x79, 0xfd, 0x95, 0x02, 0x6b, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, + 0xff, 0xf8, 0x01, 0xf5, 0x02, 0x79, 0x00, 0x27, 0x00, 0x45, 0x00, 0x49, 0x00, 0xd1, 0xb9, 0x00, + 0x34, 0xff, 0xe0, 0x40, 0x0a, 0x12, 0x00, 0x4d, 0x30, 0x20, 0x13, 0x14, 0x00, 0x4c, 0x0d, 0xb8, + 0xff, 0xc0, 0xb3, 0x1c, 0x00, 0x4d, 0x0d, 0xb8, 0xff, 0xc0, 0xb3, 0x1a, 0x00, 0x4d, 0x0c, 0xb8, + 0xff, 0xc0, 0xb4, 0x1a, 0x1c, 0x00, 0x4c, 0x0b, 0xb8, 0xff, 0xc0, 0xb4, 0x1a, 0x1c, 0x00, 0x4c, + 0x0a, 0xb8, 0xff, 0xc0, 0x40, 0x37, 0x1a, 0x1c, 0x00, 0x4c, 0x49, 0x47, 0x46, 0x47, 0xaf, 0x48, + 0x49, 0x14, 0x48, 0x48, 0x49, 0x46, 0x4b, 0x0e, 0x06, 0x7c, 0x1f, 0x1b, 0x4b, 0x48, 0x4a, 0x34, + 0x7c, 0x40, 0x40, 0x29, 0x3a, 0x4a, 0x29, 0x2a, 0x4a, 0x15, 0x09, 0xef, 0x27, 0x01, 0x27, 0x49, + 0x04, 0x48, 0x47, 0x0c, 0x46, 0x39, 0x36, 0x99, 0x3d, 0x03, 0x28, 0x81, 0x29, 0xb8, 0xff, 0xc0, + 0x40, 0x1d, 0x0c, 0x00, 0x4d, 0x60, 0x29, 0x90, 0x29, 0xb0, 0x29, 0xe0, 0x29, 0x04, 0x29, 0x9c, + 0x0b, 0x80, 0x08, 0x1d, 0x08, 0x1d, 0x18, 0x03, 0x80, 0x24, 0x09, 0x11, 0x80, 0x18, 0x9a, 0x00, + 0x3f, 0xed, 0x3f, 0xed, 0x11, 0x39, 0x39, 0x3d, 0x2f, 0x18, 0x2f, 0xed, 0x3f, 0x5d, 0x2b, 0xed, + 0x3f, 0xfd, 0xc6, 0x2f, 0x3f, 0x2f, 0x3f, 0x01, 0x2f, 0x5d, 0xc4, 0xc6, 0x10, 0xd6, 0xc5, 0x10, + 0xc0, 0x11, 0x39, 0x10, 0xed, 0x10, 0xc6, 0x10, 0xc4, 0xd4, 0xed, 0x32, 0x10, 0xc4, 0x87, 0x10, + 0x2b, 0x87, 0x7d, 0xc4, 0x31, 0x30, 0x00, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x01, 0x2b, 0x2b, 0x25, + 0x16, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x23, 0x23, 0x35, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, + 0x23, 0x22, 0x06, 0x07, 0x27, 0x36, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x07, 0x16, 0x15, 0x14, + 0x0e, 0x02, 0x23, 0x22, 0x26, 0x27, 0x03, 0x15, 0x23, 0x26, 0x26, 0x35, 0x34, 0x36, 0x37, 0x37, + 0x36, 0x36, 0x35, 0x34, 0x23, 0x22, 0x06, 0x07, 0x27, 0x36, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, + 0x0e, 0x02, 0x07, 0x25, 0x01, 0x23, 0x01, 0x01, 0x2b, 0x0b, 0x27, 0x14, 0x17, 0x17, 0x3c, 0x13, + 0x16, 0x1a, 0x13, 0x0f, 0x0b, 0x11, 0x28, 0x09, 0x17, 0x0f, 0x38, 0x1d, 0x35, 0x2f, 0x1d, 0x2a, + 0x13, 0x22, 0x2d, 0x1b, 0x1d, 0x32, 0x11, 0x42, 0xd1, 0x01, 0x01, 0x29, 0x1d, 0x17, 0x10, 0x0c, + 0x1a, 0x0e, 0x1f, 0x0c, 0x29, 0x13, 0x3a, 0x20, 0x27, 0x3d, 0x16, 0x20, 0x24, 0x0e, 0x01, 0x69, + 0xfe, 0xc3, 0x64, 0x01, 0x3d, 0x46, 0x05, 0x0b, 0x09, 0x0d, 0x1a, 0x39, 0x0a, 0x0a, 0x09, 0x08, + 0x0c, 0x05, 0x36, 0x0b, 0x0e, 0x29, 0x1a, 0x26, 0x12, 0x14, 0x2b, 0x17, 0x1e, 0x13, 0x08, 0x09, + 0x08, 0x01, 0xac, 0x3f, 0x06, 0x0c, 0x05, 0x23, 0x26, 0x13, 0x0f, 0x0a, 0x0e, 0x0d, 0x16, 0x10, + 0x0d, 0x36, 0x16, 0x17, 0x28, 0x2a, 0x1b, 0x22, 0x18, 0x13, 0x0a, 0xb6, 0xfd, 0x95, 0x02, 0x6b, + 0x00, 0x05, 0x00, 0x02, 0xff, 0xf9, 0x01, 0xec, 0x02, 0x72, 0x00, 0x1a, 0x00, 0x25, 0x00, 0x30, + 0x00, 0x3d, 0x00, 0x41, 0x00, 0xb2, 0xb9, 0x00, 0x32, 0xff, 0xc0, 0xb3, 0x12, 0x00, 0x4d, 0x31, + 0xb8, 0xff, 0xc0, 0xb3, 0x12, 0x00, 0x4d, 0x2b, 0xb8, 0xff, 0xc0, 0x40, 0x61, 0x12, 0x00, 0x4d, + 0x00, 0x40, 0x1d, 0x00, 0x4d, 0x00, 0x40, 0x17, 0x18, 0x00, 0x4c, 0x41, 0x3f, 0x3e, 0x3f, 0xaf, + 0x40, 0x41, 0x14, 0x40, 0x40, 0x41, 0x3e, 0x43, 0x00, 0x00, 0x7c, 0x2b, 0x26, 0x7c, 0x15, 0x70, + 0x06, 0x80, 0x06, 0x90, 0x06, 0x03, 0x06, 0x7c, 0x31, 0x38, 0x7c, 0x10, 0x15, 0x43, 0x40, 0x42, + 0x90, 0x20, 0x01, 0x20, 0x8f, 0x21, 0x1b, 0x42, 0x41, 0x04, 0x40, 0x0c, 0x3f, 0x0c, 0x3e, 0x04, + 0x25, 0x22, 0x1b, 0x1b, 0x22, 0x25, 0x03, 0x1f, 0x30, 0x20, 0x60, 0x20, 0x02, 0x20, 0x9c, 0x1f, + 0x04, 0x35, 0x80, 0x29, 0x29, 0x3b, 0x2e, 0x80, 0x18, 0x0d, 0x3b, 0x80, 0x0b, 0x9a, 0x00, 0x3f, + 0xed, 0x3f, 0xed, 0x11, 0x39, 0x10, 0xed, 0x3f, 0x3f, 0x5d, 0x12, 0x17, 0x39, 0x2f, 0x2f, 0x2f, + 0x3f, 0x3f, 0x3f, 0x3f, 0x01, 0x10, 0xd6, 0xd4, 0xed, 0x5d, 0x10, 0xc6, 0x10, 0xd6, 0xd4, 0xfd, + 0xd6, 0xed, 0x5d, 0x10, 0xfd, 0xd2, 0xe9, 0x2f, 0x10, 0xcc, 0x87, 0x10, 0x2b, 0x87, 0x7d, 0xc4, + 0x31, 0x30, 0x01, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x25, 0x34, 0x36, 0x37, 0x26, 0x26, 0x35, 0x34, + 0x3e, 0x02, 0x33, 0x32, 0x1e, 0x02, 0x15, 0x14, 0x06, 0x07, 0x16, 0x17, 0x16, 0x06, 0x23, 0x22, + 0x26, 0x01, 0x36, 0x36, 0x37, 0x33, 0x15, 0x23, 0x35, 0x06, 0x06, 0x07, 0x01, 0x34, 0x26, 0x27, + 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x27, 0x14, 0x16, 0x17, 0x17, 0x36, 0x36, 0x35, 0x34, + 0x26, 0x23, 0x22, 0x06, 0x13, 0x01, 0x23, 0x01, 0x01, 0x02, 0x12, 0x15, 0x0d, 0x11, 0x13, 0x1e, + 0x27, 0x14, 0x14, 0x27, 0x1e, 0x13, 0x0e, 0x11, 0x25, 0x02, 0x01, 0x36, 0x40, 0x33, 0x41, 0xff, + 0x00, 0x22, 0x32, 0x18, 0x3f, 0x55, 0x14, 0x1c, 0x13, 0x01, 0x89, 0x23, 0x18, 0x14, 0x19, 0x0e, + 0x0f, 0x19, 0x46, 0x12, 0x17, 0x02, 0x08, 0x0b, 0x13, 0x0c, 0x09, 0x16, 0x5f, 0xfe, 0xc3, 0x64, + 0x01, 0x3d, 0x45, 0x0e, 0x22, 0x0c, 0x0a, 0x1c, 0x14, 0x12, 0x1b, 0x12, 0x09, 0x09, 0x11, 0x1a, + 0x11, 0x11, 0x1c, 0x0b, 0x14, 0x2b, 0x1e, 0x30, 0x26, 0x02, 0x0e, 0x0f, 0x1f, 0x17, 0xfa, 0x96, + 0x0b, 0x0c, 0x05, 0xfe, 0x56, 0x0c, 0x0c, 0x07, 0x0b, 0x13, 0x0b, 0x0a, 0x09, 0x7c, 0x06, 0x0c, + 0x08, 0x01, 0x06, 0x0c, 0x08, 0x08, 0x08, 0x07, 0x01, 0xaa, 0xfd, 0x95, 0x02, 0x6b, 0x00, 0x00, + 0x00, 0x05, 0x00, 0x03, 0xff, 0xf9, 0x01, 0xf5, 0x02, 0x79, 0x00, 0x1a, 0x00, 0x42, 0x00, 0x4d, + 0x00, 0x5a, 0x00, 0x5e, 0x00, 0xd8, 0xb5, 0x48, 0x40, 0x15, 0x00, 0x4d, 0x03, 0xb8, 0xff, 0xc0, + 0x40, 0x84, 0x14, 0x15, 0x00, 0x4c, 0x00, 0x40, 0x22, 0x00, 0x4d, 0x00, 0x40, 0x15, 0x18, 0x00, + 0x4c, 0x3d, 0x40, 0x0c, 0x00, 0x4d, 0x24, 0x40, 0x1a, 0x1b, 0x00, 0x4c, 0x23, 0x40, 0x1a, 0x1b, + 0x00, 0x4c, 0x21, 0x40, 0x1b, 0x00, 0x4d, 0x5c, 0x5e, 0x5d, 0x5e, 0xaf, 0x5b, 0x5c, 0x14, 0x5b, + 0x5c, 0x5b, 0x60, 0x21, 0x7c, 0x3a, 0x29, 0x7c, 0x36, 0x3a, 0x36, 0x3a, 0x36, 0x60, 0x5f, 0x00, + 0x40, 0x14, 0x00, 0x4d, 0x9f, 0x00, 0xaf, 0x00, 0x02, 0x00, 0x7c, 0x48, 0x43, 0x7c, 0x15, 0x06, + 0x7c, 0x4e, 0x55, 0x7c, 0x10, 0x15, 0x60, 0x5d, 0x5f, 0x30, 0x42, 0x5f, 0x5e, 0x04, 0x5d, 0x0c, + 0x5c, 0x0c, 0x5b, 0x04, 0x38, 0x38, 0x33, 0x1e, 0x80, 0x30, 0x3f, 0x60, 0x3f, 0xb0, 0x3f, 0x03, + 0x3f, 0x9d, 0x23, 0x81, 0x26, 0x2c, 0x80, 0x33, 0x03, 0x51, 0x80, 0x46, 0x46, 0x58, 0x4b, 0x80, + 0x18, 0x0d, 0x58, 0x80, 0x0b, 0x9a, 0x00, 0x3f, 0xed, 0x3f, 0xed, 0x11, 0x39, 0x10, 0xed, 0x3f, + 0xfd, 0xd6, 0xed, 0x3f, 0x5d, 0xed, 0x12, 0x39, 0x3d, 0x2f, 0x18, 0x3f, 0x3f, 0x3f, 0x3f, 0x01, + 0x10, 0xd6, 0xc6, 0x10, 0xc2, 0x10, 0xd0, 0xd4, 0xfd, 0xd6, 0xed, 0x10, 0xfd, 0xd6, 0xed, 0x5d, + 0x2b, 0x11, 0x12, 0x39, 0x39, 0x2f, 0x2f, 0x10, 0xed, 0x10, 0xed, 0x10, 0xd4, 0x87, 0x2b, 0x87, + 0x7d, 0xc4, 0x31, 0x30, 0x00, 0x2b, 0x2b, 0x2b, 0x2b, 0x01, 0x2b, 0x2b, 0x2b, 0x2b, 0x25, 0x34, + 0x36, 0x37, 0x26, 0x26, 0x35, 0x34, 0x3e, 0x02, 0x33, 0x32, 0x1e, 0x02, 0x15, 0x14, 0x06, 0x07, + 0x16, 0x17, 0x16, 0x06, 0x23, 0x22, 0x26, 0x03, 0x16, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x23, + 0x23, 0x35, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x27, 0x36, 0x36, 0x33, + 0x32, 0x16, 0x15, 0x14, 0x07, 0x16, 0x15, 0x14, 0x0e, 0x02, 0x23, 0x22, 0x26, 0x27, 0x01, 0x34, + 0x26, 0x27, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x27, 0x14, 0x16, 0x17, 0x17, 0x36, 0x36, + 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x13, 0x01, 0x23, 0x01, 0x01, 0x0b, 0x12, 0x15, 0x0e, 0x10, + 0x13, 0x1e, 0x27, 0x14, 0x14, 0x27, 0x1e, 0x13, 0x0e, 0x11, 0x25, 0x02, 0x01, 0x36, 0x40, 0x33, + 0x41, 0xf6, 0x0b, 0x27, 0x14, 0x17, 0x18, 0x3c, 0x14, 0x16, 0x1a, 0x13, 0x0f, 0x0b, 0x11, 0x27, + 0x0a, 0x16, 0x0e, 0x38, 0x1e, 0x34, 0x30, 0x1e, 0x2a, 0x13, 0x22, 0x2d, 0x1b, 0x1c, 0x33, 0x10, + 0x01, 0xa4, 0x23, 0x18, 0x14, 0x18, 0x0f, 0x0f, 0x19, 0x46, 0x12, 0x17, 0x02, 0x08, 0x0b, 0x13, + 0x0c, 0x0a, 0x15, 0x68, 0xfe, 0xc3, 0x64, 0x01, 0x3d, 0x45, 0x0e, 0x22, 0x0c, 0x0a, 0x1c, 0x14, + 0x12, 0x1b, 0x12, 0x09, 0x09, 0x11, 0x1a, 0x11, 0x11, 0x1c, 0x0b, 0x14, 0x2b, 0x1e, 0x30, 0x26, + 0x01, 0x9e, 0x05, 0x0a, 0x08, 0x0d, 0x1a, 0x39, 0x0a, 0x0a, 0x09, 0x08, 0x0c, 0x05, 0x36, 0x0b, + 0x0e, 0x29, 0x1a, 0x25, 0x13, 0x14, 0x2b, 0x17, 0x1e, 0x13, 0x08, 0x09, 0x08, 0xfe, 0xc8, 0x0c, + 0x0c, 0x07, 0x0b, 0x13, 0x0b, 0x0a, 0x09, 0x7c, 0x06, 0x0c, 0x08, 0x01, 0x06, 0x0c, 0x08, 0x08, + 0x08, 0x07, 0x01, 0xaa, 0xfd, 0x95, 0x02, 0x6b, 0x00, 0x05, 0x00, 0x05, 0xff, 0xf9, 0x01, 0xf5, + 0x02, 0x72, 0x00, 0x1a, 0x00, 0x3b, 0x00, 0x46, 0x00, 0x53, 0x00, 0x57, 0x01, 0x3e, 0x40, 0x17, + 0x3a, 0x40, 0x19, 0x1b, 0x00, 0x4c, 0x3a, 0x40, 0x15, 0x00, 0x4d, 0x39, 0x40, 0x19, 0x1b, 0x00, + 0x4c, 0x39, 0x40, 0x0e, 0x00, 0x4d, 0x1d, 0xb8, 0xff, 0xe0, 0xb3, 0x12, 0x00, 0x4d, 0x03, 0xb8, + 0xff, 0xc0, 0x40, 0x14, 0x14, 0x00, 0x4d, 0x00, 0x40, 0x17, 0x18, 0x00, 0x4c, 0x00, 0x50, 0x16, + 0x00, 0x4d, 0x00, 0x40, 0x15, 0x00, 0x4d, 0x28, 0xb8, 0xff, 0xc0, 0xb3, 0x1a, 0x00, 0x4d, 0x27, + 0xb8, 0xff, 0xc0, 0xb3, 0x1f, 0x00, 0x4d, 0x27, 0xb8, 0xff, 0xe0, 0xb3, 0x1d, 0x00, 0x4d, 0x27, + 0xb8, 0xff, 0xc0, 0xb4, 0x1a, 0x1c, 0x00, 0x4c, 0x1c, 0xb8, 0xff, 0xc0, 0xb3, 0x1f, 0x00, 0x4d, + 0x1c, 0xb8, 0xff, 0xc0, 0xb3, 0x1d, 0x00, 0x4d, 0x1c, 0xb8, 0xff, 0xc0, 0xb3, 0x1b, 0x00, 0x4d, + 0x1c, 0xb8, 0xff, 0xe0, 0xb3, 0x0e, 0x00, 0x4d, 0x1b, 0xb8, 0xff, 0xc0, 0xb3, 0x1c, 0x00, 0x4d, + 0x1b, 0xb8, 0xff, 0xc0, 0x40, 0x66, 0x19, 0x1a, 0x00, 0x4c, 0x55, 0x57, 0x56, 0x57, 0xaf, 0x54, + 0x55, 0x14, 0x54, 0x55, 0x54, 0x59, 0x2d, 0x7c, 0xa0, 0x1e, 0xe0, 0x1e, 0x02, 0x1e, 0x59, 0xaf, + 0x00, 0xbf, 0x00, 0x02, 0x00, 0x7c, 0x41, 0x3c, 0x7c, 0x15, 0x06, 0x7c, 0x47, 0x4e, 0x7c, 0x10, + 0x15, 0x59, 0x56, 0x58, 0x3b, 0x82, 0x39, 0x50, 0x38, 0x01, 0x38, 0x26, 0x58, 0x57, 0x04, 0x56, + 0x0c, 0x55, 0x0c, 0x54, 0x04, 0x3a, 0x81, 0x39, 0x04, 0x32, 0x81, 0x26, 0x1b, 0x1b, 0x23, 0x38, + 0x04, 0x2a, 0x80, 0x30, 0x23, 0x01, 0x60, 0x23, 0xb0, 0x23, 0x02, 0x23, 0x9d, 0x4a, 0x3f, 0x3f, + 0x51, 0x44, 0x80, 0x18, 0x0d, 0x51, 0x80, 0x0f, 0x0b, 0x01, 0x0b, 0x9a, 0x00, 0x3f, 0x71, 0xed, + 0x3f, 0xed, 0x11, 0x39, 0x10, 0xcd, 0x3f, 0x5d, 0x71, 0xed, 0x3f, 0x12, 0x39, 0x2f, 0x39, 0xed, + 0x3f, 0xed, 0x3f, 0x3f, 0x3f, 0x3f, 0x01, 0x10, 0xd6, 0xd6, 0x5d, 0xc5, 0xed, 0x10, 0xc6, 0x10, + 0xd0, 0xd4, 0xfd, 0xd6, 0xed, 0x10, 0xfd, 0xd6, 0xed, 0x5d, 0x10, 0xd4, 0x5d, 0xed, 0x10, 0xd4, + 0x87, 0x2b, 0x87, 0x7d, 0xc4, 0x31, 0x30, 0x00, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, + 0x2b, 0x2b, 0x01, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x25, 0x34, 0x36, 0x37, + 0x26, 0x26, 0x35, 0x34, 0x3e, 0x02, 0x33, 0x32, 0x1e, 0x02, 0x15, 0x14, 0x06, 0x07, 0x16, 0x17, + 0x16, 0x06, 0x23, 0x22, 0x26, 0x03, 0x16, 0x16, 0x15, 0x14, 0x0e, 0x02, 0x23, 0x22, 0x26, 0x27, + 0x37, 0x16, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x2e, 0x02, 0x23, 0x23, 0x3e, 0x03, 0x37, 0x33, + 0x15, 0x23, 0x01, 0x34, 0x26, 0x27, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x27, 0x14, 0x16, + 0x17, 0x17, 0x36, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x13, 0x01, 0x23, 0x01, 0x01, 0x0b, + 0x12, 0x15, 0x0e, 0x10, 0x13, 0x1e, 0x27, 0x14, 0x14, 0x27, 0x1e, 0x13, 0x0e, 0x11, 0x25, 0x02, + 0x01, 0x36, 0x40, 0x33, 0x41, 0x9b, 0x3f, 0x2d, 0x13, 0x21, 0x2c, 0x18, 0x1c, 0x32, 0x11, 0x10, + 0x11, 0x2a, 0x13, 0x14, 0x0f, 0x06, 0x12, 0x21, 0x1a, 0x13, 0x03, 0x03, 0x03, 0x02, 0x01, 0xa5, + 0x60, 0x01, 0x36, 0x23, 0x18, 0x14, 0x18, 0x0f, 0x0f, 0x19, 0x46, 0x12, 0x17, 0x02, 0x08, 0x0b, + 0x13, 0x0c, 0x0a, 0x15, 0x68, 0xfe, 0xc3, 0x64, 0x01, 0x3d, 0x45, 0x0e, 0x22, 0x0c, 0x0a, 0x1c, + 0x14, 0x12, 0x1b, 0x12, 0x09, 0x09, 0x11, 0x1a, 0x11, 0x11, 0x1c, 0x0b, 0x14, 0x2b, 0x1e, 0x30, + 0x26, 0x02, 0x01, 0x06, 0x30, 0x23, 0x18, 0x21, 0x15, 0x0a, 0x0e, 0x0b, 0x3d, 0x0a, 0x0d, 0x0f, + 0x0a, 0x06, 0x0a, 0x09, 0x05, 0x17, 0x22, 0x1f, 0x20, 0x15, 0x3f, 0xfe, 0x15, 0x0c, 0x0c, 0x07, + 0x0b, 0x13, 0x0b, 0x0a, 0x09, 0x7c, 0x06, 0x0c, 0x08, 0x01, 0x06, 0x0c, 0x08, 0x08, 0x08, 0x07, + 0x01, 0xaa, 0xfd, 0x95, 0x02, 0x6b, 0x00, 0x00, 0x00, 0x05, 0x00, 0x16, 0xff, 0xf9, 0x01, 0xf5, + 0x02, 0x72, 0x00, 0x1a, 0x00, 0x25, 0x00, 0x32, 0x00, 0x41, 0x00, 0x45, 0x00, 0xd6, 0x40, 0x15, + 0x3e, 0x40, 0x0f, 0x00, 0x4d, 0x3e, 0x20, 0x0c, 0x00, 0x4d, 0x3e, 0x40, 0x0b, 0x00, 0x4d, 0x3e, + 0x20, 0x09, 0x00, 0x4d, 0x3a, 0xb8, 0xff, 0xc0, 0xb4, 0x0e, 0x11, 0x00, 0x4c, 0x03, 0xb8, 0xff, + 0xe0, 0x40, 0x5c, 0x14, 0x00, 0x4d, 0x00, 0x40, 0x18, 0x00, 0x4d, 0x00, 0x40, 0x15, 0x16, 0x00, + 0x4c, 0xef, 0x00, 0x01, 0x43, 0x45, 0x44, 0x45, 0xaf, 0x42, 0x43, 0x14, 0x42, 0x43, 0x42, 0x47, + 0xaf, 0x00, 0xbf, 0x00, 0x02, 0x00, 0x7c, 0x20, 0x1b, 0x7c, 0x15, 0x06, 0x7c, 0x26, 0x2d, 0x7c, + 0x10, 0x15, 0x47, 0x44, 0x46, 0x38, 0x3c, 0x3a, 0x41, 0x8f, 0x33, 0xa0, 0x3a, 0xb0, 0x3a, 0x02, + 0x5f, 0x3a, 0x6f, 0x3a, 0x8f, 0x3a, 0x03, 0x3a, 0x46, 0x45, 0x04, 0x44, 0x0c, 0x43, 0x0c, 0x42, + 0x04, 0x30, 0x41, 0x60, 0x41, 0xb0, 0x41, 0x03, 0x41, 0x9c, 0x38, 0x81, 0x3b, 0x04, 0x29, 0xb8, + 0xff, 0xc0, 0x40, 0x13, 0x19, 0x1c, 0x48, 0x29, 0x80, 0x1e, 0x1e, 0x0b, 0x23, 0x80, 0x18, 0x0d, + 0x30, 0x80, 0x0f, 0x0b, 0x01, 0x0b, 0x9a, 0x00, 0x3f, 0x71, 0xed, 0x3f, 0xed, 0x11, 0x39, 0x2f, + 0xed, 0x2b, 0x3f, 0xed, 0x3f, 0x5d, 0x3f, 0x3f, 0x3f, 0x3f, 0x01, 0x10, 0xd6, 0x5d, 0x5d, 0xd4, + 0xed, 0x10, 0xd5, 0xc5, 0x10, 0xc2, 0x10, 0xd0, 0xd4, 0xfd, 0xd6, 0xed, 0x10, 0xfd, 0xd6, 0xed, + 0x5d, 0x10, 0xd4, 0x87, 0x2b, 0x87, 0x7d, 0xc4, 0x31, 0x30, 0x01, 0x5d, 0x2b, 0x2b, 0x2b, 0x2b, + 0x2b, 0x2b, 0x2b, 0x2b, 0x25, 0x34, 0x36, 0x37, 0x26, 0x26, 0x35, 0x34, 0x3e, 0x02, 0x33, 0x32, + 0x1e, 0x02, 0x15, 0x14, 0x06, 0x07, 0x16, 0x17, 0x16, 0x06, 0x23, 0x22, 0x26, 0x37, 0x34, 0x26, + 0x27, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x27, 0x14, 0x16, 0x17, 0x17, 0x36, 0x36, 0x35, + 0x34, 0x26, 0x23, 0x22, 0x06, 0x25, 0x3e, 0x03, 0x37, 0x23, 0x35, 0x33, 0x15, 0x0e, 0x03, 0x07, + 0x25, 0x01, 0x23, 0x01, 0x01, 0x0b, 0x12, 0x15, 0x0e, 0x10, 0x13, 0x1e, 0x27, 0x14, 0x14, 0x27, + 0x1e, 0x13, 0x0e, 0x11, 0x25, 0x02, 0x01, 0x36, 0x40, 0x33, 0x41, 0x9c, 0x23, 0x18, 0x14, 0x18, + 0x0f, 0x0f, 0x19, 0x46, 0x12, 0x17, 0x02, 0x08, 0x0b, 0x13, 0x0c, 0x0a, 0x15, 0xfe, 0xd8, 0x06, + 0x0c, 0x0f, 0x17, 0x12, 0x64, 0xc1, 0x18, 0x1c, 0x11, 0x0a, 0x06, 0x01, 0x2c, 0xfe, 0xc3, 0x64, + 0x01, 0x3d, 0x45, 0x0e, 0x22, 0x0c, 0x0a, 0x1c, 0x14, 0x12, 0x1b, 0x12, 0x09, 0x09, 0x11, 0x1a, + 0x11, 0x11, 0x1c, 0x0b, 0x14, 0x2b, 0x1e, 0x30, 0x26, 0x29, 0x0c, 0x0c, 0x07, 0x0b, 0x13, 0x0b, + 0x0a, 0x09, 0x7c, 0x06, 0x0c, 0x08, 0x01, 0x06, 0x0c, 0x08, 0x08, 0x08, 0x07, 0xb7, 0x22, 0x30, + 0x29, 0x26, 0x1a, 0x3f, 0x32, 0x1b, 0x29, 0x2b, 0x34, 0x25, 0xf3, 0xfd, 0x95, 0x02, 0x6b, 0x00, + 0x00, 0x03, 0x00, 0x02, 0xff, 0xf8, 0x01, 0xf4, 0x02, 0x72, 0x00, 0x0a, 0x00, 0x2b, 0x00, 0x2f, + 0x00, 0xa6, 0xb9, 0x00, 0x17, 0xff, 0xc0, 0xb3, 0x1f, 0x00, 0x4d, 0x17, 0xb8, 0xff, 0xc0, 0xb3, + 0x1c, 0x00, 0x4d, 0x17, 0xb8, 0xff, 0xe0, 0x40, 0x58, 0x19, 0x1b, 0x00, 0x4c, 0x44, 0x17, 0x54, + 0x17, 0x02, 0x2d, 0x2f, 0x2e, 0x2f, 0xaf, 0x2c, 0x2d, 0x14, 0x2c, 0x2d, 0x2c, 0x31, 0x29, 0x2a, + 0x1d, 0x7c, 0x0e, 0x31, 0x2e, 0x30, 0x2b, 0x82, 0x9f, 0x23, 0x01, 0x23, 0x6f, 0x16, 0x01, 0x16, + 0x30, 0x90, 0x05, 0x01, 0x05, 0x8f, 0x06, 0x00, 0x30, 0x2f, 0x04, 0x2e, 0x0c, 0x2d, 0x0c, 0x2c, + 0x04, 0x22, 0x80, 0x0b, 0x0b, 0x13, 0x2b, 0x81, 0x29, 0x9a, 0x1a, 0x80, 0x13, 0x0c, 0x00, 0x07, + 0x0a, 0x0a, 0x07, 0x00, 0x03, 0x04, 0x30, 0x05, 0x60, 0x05, 0xb0, 0x05, 0x03, 0x05, 0x9c, 0x04, + 0x04, 0x00, 0x3f, 0x3f, 0x5d, 0x12, 0x17, 0x39, 0x2f, 0x2f, 0x2f, 0x3f, 0xed, 0x3f, 0xed, 0x11, + 0x39, 0x10, 0xed, 0x3f, 0x3f, 0x3f, 0x3f, 0x01, 0x10, 0xd6, 0xd4, 0xed, 0x5d, 0x10, 0xd4, 0x5d, + 0xd4, 0x5d, 0xed, 0x10, 0xc2, 0x10, 0xd0, 0xed, 0xd4, 0xc0, 0x10, 0xd4, 0x87, 0x2b, 0x87, 0x7d, + 0xc4, 0x31, 0x30, 0x00, 0x71, 0x2b, 0x2b, 0x2b, 0x13, 0x36, 0x36, 0x37, 0x33, 0x15, 0x23, 0x35, + 0x06, 0x06, 0x07, 0x01, 0x16, 0x16, 0x15, 0x14, 0x0e, 0x02, 0x23, 0x22, 0x26, 0x27, 0x37, 0x16, + 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x2e, 0x02, 0x23, 0x23, 0x3e, 0x03, 0x37, 0x33, 0x15, 0x23, + 0x13, 0x01, 0x23, 0x01, 0x02, 0x22, 0x32, 0x18, 0x3f, 0x55, 0x14, 0x1c, 0x13, 0x01, 0x73, 0x3f, + 0x2d, 0x13, 0x21, 0x2b, 0x19, 0x1b, 0x32, 0x11, 0x10, 0x10, 0x2b, 0x13, 0x14, 0x0e, 0x06, 0x12, + 0x21, 0x1a, 0x12, 0x03, 0x03, 0x02, 0x02, 0x01, 0xa5, 0x5f, 0x3f, 0xfe, 0xc3, 0x64, 0x01, 0x3d, + 0x02, 0x2d, 0x0f, 0x1f, 0x17, 0xfa, 0x96, 0x0b, 0x0c, 0x05, 0xfe, 0xb7, 0x06, 0x30, 0x24, 0x17, + 0x21, 0x15, 0x0a, 0x0e, 0x0b, 0x3d, 0x0a, 0x0d, 0x0f, 0x0a, 0x06, 0x0a, 0x09, 0x05, 0x17, 0x22, + 0x1f, 0x20, 0x15, 0x3f, 0x01, 0xaf, 0xfd, 0x95, 0x02, 0x6b, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, + 0xff, 0xf8, 0x01, 0xf4, 0x02, 0x79, 0x00, 0x20, 0x00, 0x3e, 0x00, 0x42, 0x00, 0xf6, 0xb5, 0x32, + 0x40, 0x17, 0x00, 0x4d, 0x2d, 0xb8, 0xff, 0xa8, 0x40, 0x2f, 0x12, 0x00, 0x4d, 0x29, 0x20, 0x13, + 0x00, 0x4d, 0x22, 0x40, 0x1f, 0x00, 0x4d, 0x21, 0x40, 0x1f, 0x00, 0x4d, 0x32, 0x20, 0x17, 0x00, + 0x4d, 0x32, 0x20, 0x12, 0x00, 0x4d, 0x18, 0x40, 0x19, 0x1a, 0x00, 0x4c, 0x17, 0x40, 0x19, 0x1a, + 0x00, 0x4c, 0x16, 0x40, 0x19, 0x1a, 0x00, 0x4c, 0x0c, 0xb8, 0xff, 0xc0, 0xb3, 0x20, 0x00, 0x4d, + 0x0c, 0xb8, 0xff, 0xc0, 0xb3, 0x13, 0x00, 0x4d, 0x0c, 0xb8, 0xff, 0xe0, 0xb3, 0x12, 0x00, 0x4d, + 0x0c, 0xb8, 0xff, 0xe0, 0xb3, 0x1a, 0x1f, 0x48, 0x00, 0xb8, 0xff, 0xc0, 0x40, 0x53, 0x1b, 0x1c, + 0x00, 0x4c, 0x40, 0x42, 0x41, 0x42, 0xaf, 0x3f, 0x40, 0x14, 0x3f, 0x40, 0x3f, 0x44, 0x2d, 0x7c, + 0x39, 0x39, 0x43, 0x44, 0x1e, 0x12, 0x7c, 0x03, 0x44, 0x41, 0x43, 0x22, 0x23, 0x43, 0x20, 0x82, + 0x9f, 0x18, 0x01, 0x18, 0x6f, 0x0b, 0x01, 0x0b, 0x33, 0x43, 0x42, 0x04, 0x41, 0x0c, 0x40, 0x0c, + 0x3f, 0x04, 0x2f, 0x99, 0x36, 0x05, 0x21, 0x81, 0x30, 0x22, 0x01, 0x30, 0x22, 0x60, 0x22, 0xb0, + 0x22, 0x03, 0x22, 0x9c, 0x0c, 0x08, 0x20, 0x81, 0x1e, 0x9a, 0x0f, 0x80, 0x08, 0x0d, 0x17, 0x80, + 0x00, 0x00, 0x2f, 0xed, 0x3f, 0xed, 0x3f, 0xed, 0x11, 0x39, 0x3f, 0x5d, 0x71, 0xed, 0x3f, 0xed, + 0x3f, 0x3f, 0x3f, 0x3f, 0x01, 0x10, 0xc0, 0xd4, 0x5d, 0xd4, 0x5d, 0xed, 0x10, 0xd6, 0xc5, 0x10, + 0xc2, 0x10, 0xd0, 0xed, 0xc4, 0x11, 0x12, 0x39, 0x2f, 0xed, 0x10, 0xd4, 0x87, 0x2b, 0x87, 0x7d, + 0xc4, 0x31, 0x30, 0x00, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x01, 0x2b, + 0x2b, 0x2b, 0x2b, 0x2b, 0x25, 0x16, 0x16, 0x15, 0x14, 0x0e, 0x02, 0x23, 0x22, 0x26, 0x27, 0x37, + 0x16, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x2e, 0x02, 0x23, 0x23, 0x3e, 0x03, 0x37, 0x33, 0x15, + 0x23, 0x27, 0x15, 0x23, 0x26, 0x26, 0x35, 0x34, 0x36, 0x37, 0x37, 0x36, 0x36, 0x35, 0x34, 0x23, + 0x22, 0x06, 0x07, 0x27, 0x36, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x0e, 0x02, 0x07, 0x25, 0x01, + 0x23, 0x01, 0x01, 0x88, 0x3f, 0x2d, 0x13, 0x21, 0x2b, 0x19, 0x1b, 0x32, 0x11, 0x10, 0x10, 0x2b, + 0x13, 0x14, 0x0e, 0x06, 0x12, 0x21, 0x1a, 0x12, 0x03, 0x03, 0x02, 0x02, 0x01, 0xa5, 0x5f, 0xb4, + 0xd1, 0x01, 0x01, 0x29, 0x1d, 0x17, 0x10, 0x0c, 0x1a, 0x0e, 0x1f, 0x0c, 0x29, 0x13, 0x3a, 0x20, + 0x27, 0x3d, 0x16, 0x20, 0x24, 0x0e, 0x01, 0x72, 0xfe, 0xc3, 0x64, 0x01, 0x3d, 0xa9, 0x06, 0x30, + 0x24, 0x17, 0x21, 0x15, 0x0a, 0x0e, 0x0b, 0x3d, 0x0a, 0x0d, 0x0f, 0x0a, 0x06, 0x0a, 0x09, 0x05, + 0x17, 0x22, 0x1f, 0x20, 0x15, 0x3f, 0xf9, 0x3f, 0x06, 0x0c, 0x05, 0x23, 0x26, 0x13, 0x0f, 0x0a, + 0x0e, 0x0d, 0x16, 0x10, 0x0d, 0x36, 0x16, 0x17, 0x28, 0x2a, 0x1b, 0x22, 0x18, 0x13, 0x0a, 0xb6, + 0xfd, 0x95, 0x02, 0x6b, 0x00, 0x03, 0x00, 0x0c, 0xff, 0xf8, 0x01, 0xf4, 0x02, 0x79, 0x00, 0x27, + 0x00, 0x48, 0x00, 0x4c, 0x00, 0xfe, 0xb9, 0x00, 0x34, 0xff, 0xe0, 0xb4, 0x1c, 0x20, 0x00, 0x4c, + 0x34, 0xb8, 0xff, 0xe0, 0x40, 0x09, 0x1a, 0x00, 0x4d, 0x04, 0x34, 0x24, 0x34, 0x02, 0x0c, 0xb8, + 0xff, 0xc0, 0xb3, 0x1f, 0x00, 0x4d, 0x0c, 0xb8, 0xff, 0xc0, 0xb3, 0x1d, 0x00, 0x4d, 0x0c, 0xb8, + 0xff, 0xc0, 0xb4, 0x1a, 0x1b, 0x00, 0x4c, 0x0b, 0xb8, 0xff, 0xc0, 0xb3, 0x1f, 0x00, 0x4d, 0x0b, + 0xb8, 0xff, 0xc0, 0xb3, 0x1d, 0x00, 0x4d, 0x0b, 0xb8, 0xff, 0xc0, 0xb4, 0x1a, 0x1b, 0x00, 0x4c, + 0x0a, 0xb8, 0xff, 0xc0, 0xb3, 0x1f, 0x00, 0x4d, 0x0a, 0xb8, 0xff, 0xc0, 0xb3, 0x1d, 0x00, 0x4d, + 0x0a, 0xb8, 0xff, 0xc0, 0x40, 0x58, 0x1a, 0x1b, 0x00, 0x4c, 0x4c, 0x4a, 0x49, 0x4a, 0xaf, 0x4b, + 0x4c, 0x14, 0x4b, 0x4b, 0x4c, 0x49, 0x4e, 0x46, 0x3a, 0x7c, 0x2b, 0x4e, 0x0e, 0x7c, 0x1b, 0x06, + 0x7c, 0x1f, 0x4e, 0x4b, 0x4d, 0x48, 0x82, 0x9f, 0x40, 0x01, 0x40, 0x6f, 0x33, 0x01, 0x33, 0x4d, + 0x15, 0x27, 0x4d, 0x4c, 0x04, 0x4b, 0x0c, 0x4a, 0x0c, 0x49, 0x04, 0x3f, 0x80, 0x28, 0x28, 0x30, + 0x48, 0x81, 0x46, 0x9a, 0x37, 0x80, 0x30, 0x0d, 0x0b, 0x81, 0x08, 0x1d, 0x08, 0x1d, 0x18, 0x03, + 0x80, 0x30, 0x24, 0x60, 0x24, 0xb0, 0x24, 0x03, 0x24, 0x9d, 0x11, 0x80, 0x18, 0x05, 0x00, 0x3f, + 0xed, 0x3f, 0x5d, 0xed, 0x11, 0x39, 0x39, 0x3d, 0x2f, 0x18, 0x2f, 0xed, 0x3f, 0xed, 0x3f, 0xed, + 0x11, 0x39, 0x10, 0xed, 0x3f, 0x3f, 0x3f, 0x3f, 0x01, 0x10, 0xd6, 0xc6, 0x10, 0xd4, 0x5d, 0xd4, + 0x5d, 0xed, 0x10, 0xc6, 0x10, 0xdc, 0xed, 0xd4, 0xed, 0x10, 0xd0, 0xed, 0xc4, 0x10, 0xc4, 0x87, + 0x10, 0x2b, 0x87, 0x7d, 0xc4, 0x31, 0x30, 0x00, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, + 0x2b, 0x71, 0x2b, 0x2b, 0x13, 0x16, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x23, 0x23, 0x35, 0x33, + 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x27, 0x36, 0x36, 0x33, 0x32, 0x16, 0x15, + 0x14, 0x07, 0x16, 0x15, 0x14, 0x0e, 0x02, 0x23, 0x22, 0x26, 0x27, 0x05, 0x16, 0x16, 0x15, 0x14, + 0x0e, 0x02, 0x23, 0x22, 0x26, 0x27, 0x37, 0x16, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x2e, 0x02, + 0x23, 0x23, 0x3e, 0x03, 0x37, 0x33, 0x15, 0x23, 0x13, 0x01, 0x23, 0x01, 0x1e, 0x0b, 0x27, 0x14, + 0x17, 0x17, 0x3b, 0x14, 0x16, 0x1a, 0x13, 0x0f, 0x0b, 0x11, 0x28, 0x09, 0x16, 0x0e, 0x38, 0x1e, + 0x34, 0x30, 0x1e, 0x2a, 0x13, 0x22, 0x2d, 0x1b, 0x1c, 0x33, 0x10, 0x01, 0x7c, 0x3f, 0x2d, 0x13, + 0x21, 0x2b, 0x19, 0x1b, 0x32, 0x11, 0x10, 0x10, 0x2b, 0x13, 0x14, 0x0e, 0x06, 0x12, 0x21, 0x1a, + 0x12, 0x03, 0x03, 0x02, 0x02, 0x01, 0xa5, 0x5f, 0x51, 0xfe, 0xc3, 0x64, 0x01, 0x3d, 0x01, 0xbd, + 0x05, 0x0a, 0x08, 0x0d, 0x1a, 0x39, 0x0a, 0x0a, 0x09, 0x08, 0x0c, 0x05, 0x36, 0x0b, 0x0e, 0x29, + 0x1a, 0x25, 0x13, 0x14, 0x2b, 0x17, 0x1e, 0x13, 0x08, 0x09, 0x08, 0xd7, 0x06, 0x30, 0x24, 0x17, + 0x21, 0x15, 0x0a, 0x0e, 0x0b, 0x3d, 0x0a, 0x0d, 0x0f, 0x0a, 0x06, 0x0a, 0x09, 0x05, 0x17, 0x22, + 0x1f, 0x20, 0x15, 0x3f, 0x01, 0xaf, 0xfd, 0x95, 0x02, 0x6b, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, + 0xff, 0xf8, 0x01, 0xf4, 0x02, 0x72, 0x00, 0x20, 0x00, 0x2d, 0x00, 0x32, 0x00, 0x36, 0x00, 0xb9, + 0xb6, 0x32, 0x40, 0x13, 0x14, 0x00, 0x4c, 0x30, 0xb8, 0xff, 0xc0, 0x40, 0x10, 0x12, 0x00, 0x4d, + 0x0c, 0x20, 0x17, 0x18, 0x00, 0x4c, 0x0b, 0x40, 0x17, 0x1c, 0x00, 0x4c, 0x0c, 0xb8, 0xff, 0xe0, + 0xb4, 0x1a, 0x20, 0x00, 0x4c, 0x0c, 0xb8, 0xff, 0xe8, 0x40, 0x53, 0x19, 0x00, 0x4d, 0x36, 0x34, + 0x33, 0x34, 0xaf, 0x35, 0x36, 0x14, 0x35, 0x35, 0x36, 0x33, 0x1e, 0x38, 0x35, 0x37, 0x25, 0x3f, + 0x22, 0x01, 0x22, 0x28, 0x32, 0x32, 0x31, 0x2d, 0x2a, 0x37, 0x20, 0x82, 0x18, 0x6f, 0x0b, 0x01, + 0x0b, 0x37, 0x12, 0x7c, 0x03, 0x36, 0x04, 0x35, 0x0c, 0x34, 0x0c, 0x33, 0x04, 0x22, 0x32, 0x80, + 0x28, 0x30, 0x26, 0x01, 0x30, 0x26, 0x60, 0x26, 0x90, 0x26, 0xb0, 0x26, 0x04, 0x26, 0x9c, 0x21, + 0x04, 0x17, 0x80, 0x00, 0x00, 0x08, 0x20, 0x81, 0x1e, 0x9a, 0x0f, 0x80, 0x08, 0x0d, 0x00, 0x3f, + 0xed, 0x3f, 0xed, 0x11, 0x39, 0x10, 0xed, 0x3f, 0x3f, 0x5d, 0x71, 0xd5, 0xed, 0x32, 0x3f, 0x3f, + 0x3f, 0x3f, 0x01, 0x2f, 0xed, 0x10, 0xd4, 0x5d, 0xd4, 0xed, 0x10, 0xd0, 0xc5, 0xd1, 0xc2, 0x2f, + 0x32, 0xc5, 0x5d, 0x32, 0x10, 0xc6, 0x10, 0xc4, 0xc4, 0x87, 0x10, 0x2b, 0x87, 0x7d, 0xc4, 0x31, + 0x30, 0x00, 0x2b, 0x2b, 0x01, 0x2b, 0x2b, 0x2b, 0x2b, 0x25, 0x16, 0x16, 0x15, 0x14, 0x0e, 0x02, + 0x23, 0x22, 0x26, 0x27, 0x37, 0x16, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x2e, 0x02, 0x23, 0x23, + 0x3e, 0x03, 0x37, 0x33, 0x15, 0x23, 0x03, 0x15, 0x33, 0x15, 0x23, 0x15, 0x23, 0x35, 0x23, 0x35, + 0x36, 0x36, 0x37, 0x17, 0x06, 0x06, 0x07, 0x33, 0x25, 0x01, 0x23, 0x01, 0x01, 0x88, 0x3f, 0x2d, + 0x13, 0x21, 0x2b, 0x19, 0x1b, 0x32, 0x11, 0x10, 0x10, 0x2b, 0x13, 0x14, 0x0e, 0x06, 0x12, 0x21, + 0x1a, 0x12, 0x03, 0x03, 0x02, 0x02, 0x01, 0xa5, 0x5f, 0xbe, 0x24, 0x24, 0x50, 0x7c, 0x17, 0x2d, + 0x20, 0x18, 0x0f, 0x19, 0x0b, 0x33, 0x01, 0x65, 0xfe, 0xc3, 0x64, 0x01, 0x3d, 0xa9, 0x06, 0x30, + 0x24, 0x17, 0x21, 0x15, 0x0a, 0x0e, 0x0b, 0x3d, 0x0a, 0x0d, 0x0f, 0x0a, 0x06, 0x0a, 0x09, 0x05, + 0x17, 0x22, 0x1f, 0x20, 0x15, 0x3f, 0x01, 0xb6, 0x94, 0x3f, 0x27, 0x27, 0x2d, 0x2b, 0x4c, 0x2f, + 0x40, 0x17, 0x29, 0x14, 0x8d, 0xfd, 0x95, 0x02, 0x6b, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x02, + 0xff, 0xf7, 0x01, 0xde, 0x02, 0x72, 0x00, 0x12, 0x00, 0x1d, 0x00, 0x28, 0x00, 0x2c, 0x00, 0xa5, + 0x40, 0x0c, 0x1c, 0x40, 0x13, 0x15, 0x00, 0x4c, 0x28, 0x20, 0x13, 0x00, 0x4d, 0x07, 0xb8, 0xff, + 0xc0, 0x40, 0x3b, 0x1a, 0x1b, 0x00, 0x4c, 0x2a, 0x2c, 0x2b, 0x2c, 0xaf, 0x29, 0x2a, 0x14, 0x29, + 0x2a, 0x29, 0x2e, 0x1c, 0x7c, 0x00, 0xa0, 0x09, 0xc0, 0x09, 0x02, 0x09, 0x2e, 0x2b, 0x2d, 0x23, + 0x8f, 0x24, 0x1e, 0x2d, 0x16, 0x7c, 0x8f, 0x0f, 0xbf, 0x0f, 0x02, 0x0f, 0x2d, 0x2c, 0x04, 0x2b, + 0x0c, 0x2a, 0x0c, 0x29, 0x04, 0x1e, 0x25, 0x28, 0x28, 0x25, 0x1e, 0x03, 0x21, 0x23, 0xb8, 0xff, + 0xc0, 0x40, 0x1c, 0x0c, 0x00, 0x4d, 0x60, 0x23, 0xb0, 0x23, 0x02, 0x23, 0x9c, 0x21, 0x04, 0x0f, + 0x13, 0x01, 0x13, 0x80, 0x06, 0x06, 0x0c, 0x00, 0x81, 0x12, 0x9a, 0x19, 0x80, 0x0c, 0x0b, 0x00, + 0x3f, 0xed, 0x3f, 0xed, 0x12, 0x39, 0x2f, 0xed, 0x71, 0x3f, 0x3f, 0x5d, 0x2b, 0x12, 0x17, 0x39, + 0x2f, 0x2f, 0x2f, 0x3f, 0x3f, 0x3f, 0x3f, 0x01, 0x10, 0xd4, 0x5d, 0xed, 0x10, 0xd6, 0xd4, 0xed, + 0x10, 0xc2, 0x10, 0xd6, 0x5d, 0xc4, 0xed, 0x10, 0xd6, 0x87, 0x2b, 0x87, 0x7d, 0xc4, 0x31, 0x30, + 0x00, 0x2b, 0x2b, 0x01, 0x2b, 0x25, 0x06, 0x06, 0x07, 0x36, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, + 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x17, 0x07, 0x22, 0x06, 0x07, 0x16, 0x16, 0x33, 0x32, + 0x36, 0x35, 0x34, 0x01, 0x36, 0x36, 0x37, 0x33, 0x15, 0x23, 0x35, 0x06, 0x06, 0x07, 0x25, 0x01, + 0x23, 0x01, 0x01, 0xd9, 0x30, 0x3d, 0x0f, 0x08, 0x0d, 0x06, 0x35, 0x31, 0x37, 0x34, 0x30, 0x3d, + 0x6b, 0x61, 0x5f, 0x0b, 0x11, 0x08, 0x02, 0x19, 0x0e, 0x0e, 0x0f, 0xfe, 0x6d, 0x22, 0x32, 0x18, + 0x3f, 0x55, 0x14, 0x1c, 0x13, 0x01, 0xb2, 0xfe, 0xc3, 0x64, 0x01, 0x3d, 0xbf, 0x03, 0x0a, 0x11, + 0x02, 0x02, 0x29, 0x27, 0x2a, 0x34, 0x34, 0x39, 0x52, 0x50, 0x03, 0x99, 0x03, 0x02, 0x20, 0x0f, + 0x0f, 0x0b, 0x1a, 0x01, 0xc3, 0x0f, 0x1f, 0x17, 0xfa, 0x96, 0x0b, 0x0c, 0x05, 0x79, 0xfd, 0x95, + 0x02, 0x6b, 0x00, 0x00, 0x00, 0x04, 0x00, 0x05, 0xff, 0xf7, 0x01, 0xde, 0x02, 0x72, 0x00, 0x12, + 0x00, 0x33, 0x00, 0x3e, 0x00, 0x42, 0x00, 0xeb, 0x40, 0x0c, 0x3d, 0x40, 0x14, 0x15, 0x00, 0x4c, + 0x34, 0x40, 0x19, 0x00, 0x4d, 0x1f, 0xb8, 0xff, 0xe0, 0xb3, 0x21, 0x00, 0x4d, 0x1f, 0xb8, 0xff, + 0xc0, 0xb4, 0x1e, 0x1f, 0x00, 0x4c, 0x1f, 0xb8, 0xff, 0xc0, 0xb4, 0x1b, 0x1c, 0x00, 0x4c, 0x1f, + 0xb8, 0xff, 0xe0, 0x40, 0x0d, 0x1a, 0x00, 0x4d, 0x40, 0x1f, 0x01, 0x34, 0x1f, 0x01, 0x05, 0x1f, + 0x01, 0x13, 0xb8, 0xff, 0xc0, 0x40, 0x6a, 0x1a, 0x00, 0x4d, 0x24, 0x13, 0x34, 0x13, 0x02, 0x42, + 0x40, 0x3f, 0x40, 0xaf, 0x41, 0x42, 0x14, 0x41, 0x41, 0x42, 0x3f, 0x44, 0x25, 0x7c, 0x16, 0x31, + 0x44, 0x3d, 0x7c, 0x00, 0x09, 0x40, 0x0c, 0x00, 0x4d, 0xbf, 0x09, 0xdf, 0x09, 0x02, 0x09, 0x44, + 0x41, 0x43, 0x33, 0x82, 0x30, 0x1e, 0x43, 0x37, 0x7c, 0xbf, 0x0f, 0x01, 0x0f, 0x43, 0x42, 0x04, + 0x41, 0x0c, 0x40, 0x0c, 0x3f, 0x04, 0x2b, 0x2b, 0x81, 0x13, 0x33, 0x81, 0x31, 0x04, 0x22, 0x80, + 0x20, 0x1b, 0x30, 0x1b, 0x40, 0x1b, 0x03, 0x30, 0x1b, 0x60, 0x1b, 0x90, 0x1b, 0xb0, 0x1b, 0xe0, + 0x1b, 0x05, 0x1b, 0x9d, 0x34, 0x80, 0x06, 0x06, 0x0c, 0x00, 0x81, 0x12, 0x9a, 0x3a, 0x80, 0x0c, + 0x0b, 0x00, 0x3f, 0xed, 0x3f, 0xed, 0x12, 0x39, 0x10, 0xed, 0x3f, 0x5d, 0x71, 0xed, 0x3f, 0xfd, + 0xd2, 0xe9, 0x2f, 0x3f, 0x3f, 0x3f, 0x3f, 0x01, 0x10, 0xd4, 0x5d, 0xed, 0x10, 0xd6, 0xd6, 0xed, + 0x10, 0xc6, 0x10, 0xde, 0x5d, 0x2b, 0xc4, 0xed, 0x10, 0xd4, 0xd4, 0xed, 0x10, 0xc6, 0x87, 0x10, + 0x2b, 0x87, 0x7d, 0xc4, 0x31, 0x30, 0x00, 0x71, 0x2b, 0x71, 0x71, 0x71, 0x2b, 0x2b, 0x2b, 0x2b, + 0x2b, 0x01, 0x2b, 0x25, 0x06, 0x06, 0x07, 0x36, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, + 0x22, 0x26, 0x35, 0x34, 0x36, 0x17, 0x01, 0x16, 0x16, 0x15, 0x14, 0x0e, 0x02, 0x23, 0x22, 0x26, + 0x27, 0x37, 0x16, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x2e, 0x02, 0x23, 0x23, 0x3e, 0x03, 0x37, + 0x33, 0x15, 0x23, 0x01, 0x22, 0x06, 0x07, 0x16, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x13, 0x01, + 0x23, 0x01, 0x01, 0xd9, 0x30, 0x3d, 0x0f, 0x08, 0x0d, 0x06, 0x35, 0x31, 0x37, 0x34, 0x30, 0x3d, + 0x6b, 0x61, 0xfe, 0x9e, 0x3f, 0x2d, 0x13, 0x21, 0x2c, 0x18, 0x1c, 0x32, 0x11, 0x10, 0x11, 0x2a, + 0x13, 0x14, 0x0f, 0x06, 0x12, 0x21, 0x1a, 0x13, 0x03, 0x03, 0x03, 0x02, 0x01, 0xa5, 0x60, 0x01, + 0x02, 0x0b, 0x11, 0x08, 0x02, 0x19, 0x0e, 0x0e, 0x0f, 0x3b, 0xfe, 0xc3, 0x64, 0x01, 0x3d, 0xbf, + 0x03, 0x0a, 0x11, 0x02, 0x02, 0x29, 0x27, 0x2a, 0x34, 0x34, 0x39, 0x52, 0x50, 0x03, 0x01, 0x1d, + 0x06, 0x30, 0x23, 0x18, 0x21, 0x15, 0x0a, 0x0e, 0x0b, 0x3d, 0x0a, 0x0d, 0x0f, 0x0a, 0x06, 0x0a, + 0x09, 0x05, 0x17, 0x22, 0x1f, 0x20, 0x15, 0x3f, 0xfe, 0x37, 0x03, 0x02, 0x20, 0x0f, 0x0f, 0x0b, + 0x1a, 0x02, 0x01, 0xfd, 0x95, 0x02, 0x6b, 0x00, 0x00, 0x03, 0x00, 0x02, 0x00, 0x00, 0x01, 0xf4, + 0x02, 0x72, 0x00, 0x0a, 0x00, 0x19, 0x00, 0x1d, 0x00, 0x92, 0x40, 0x5e, 0x16, 0x40, 0x0f, 0x00, + 0x4d, 0x16, 0x40, 0x0c, 0x00, 0x4d, 0x12, 0x40, 0x15, 0x00, 0x4d, 0x11, 0x40, 0x15, 0x00, 0x4d, + 0x10, 0x40, 0x12, 0x00, 0x4d, 0x0a, 0x20, 0x13, 0x00, 0x4d, 0x1d, 0x1b, 0x1a, 0x1b, 0xaf, 0x1c, + 0x1d, 0x14, 0x1c, 0x1c, 0x1d, 0x1a, 0x1f, 0x10, 0x14, 0x1f, 0x1c, 0x1e, 0x19, 0x8f, 0x0b, 0x12, + 0x1e, 0x90, 0x05, 0x01, 0x05, 0x8f, 0x06, 0x00, 0x1e, 0x1d, 0x04, 0x1c, 0x0c, 0x1b, 0x0c, 0x1a, + 0x04, 0x10, 0x81, 0x12, 0x9b, 0x0b, 0x0c, 0x0a, 0x07, 0x00, 0x00, 0x07, 0x0a, 0x03, 0x03, 0x30, + 0x05, 0x60, 0x05, 0xb0, 0x05, 0x03, 0x05, 0x9c, 0x03, 0x04, 0x00, 0x3f, 0x3f, 0x5d, 0x12, 0x17, + 0x39, 0x2f, 0x2f, 0x2f, 0x3f, 0x3f, 0xed, 0x3f, 0x3f, 0x3f, 0x3f, 0x01, 0x10, 0xd6, 0xd4, 0xed, + 0x5d, 0x10, 0xd4, 0xd4, 0xed, 0x10, 0xc6, 0x10, 0xd0, 0xc5, 0x10, 0xc4, 0x87, 0x10, 0x2b, 0x87, + 0x7d, 0xc4, 0x31, 0x30, 0x00, 0x2b, 0x01, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x13, 0x36, 0x36, 0x37, + 0x33, 0x15, 0x23, 0x35, 0x06, 0x06, 0x07, 0x01, 0x3e, 0x03, 0x37, 0x23, 0x35, 0x33, 0x15, 0x0e, + 0x03, 0x07, 0x13, 0x01, 0x23, 0x01, 0x02, 0x22, 0x32, 0x18, 0x3f, 0x55, 0x14, 0x1c, 0x13, 0x01, + 0x38, 0x06, 0x0c, 0x0f, 0x17, 0x12, 0x64, 0xc1, 0x18, 0x1c, 0x11, 0x0a, 0x06, 0x31, 0xfe, 0xc3, + 0x64, 0x01, 0x3d, 0x02, 0x2d, 0x0f, 0x1f, 0x17, 0xfa, 0x96, 0x0b, 0x0c, 0x05, 0xfe, 0x0e, 0x22, + 0x30, 0x29, 0x27, 0x1a, 0x3e, 0x32, 0x1b, 0x29, 0x2b, 0x34, 0x25, 0x02, 0x6b, 0xfd, 0x95, 0x02, + 0x6b, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x01, 0xf4, 0x02, 0x79, 0x00, 0x0e, + 0x00, 0x2c, 0x00, 0x30, 0x00, 0x97, 0x40, 0x65, 0x18, 0x20, 0x13, 0x00, 0x4d, 0x17, 0x20, 0x13, + 0x00, 0x4d, 0x0b, 0x40, 0x0f, 0x00, 0x4d, 0x0b, 0x40, 0x0c, 0x00, 0x4d, 0x07, 0x40, 0x1b, 0x00, + 0x4d, 0x07, 0x40, 0x18, 0x00, 0x4d, 0x06, 0x40, 0x1b, 0x00, 0x4d, 0x06, 0x40, 0x18, 0x00, 0x4d, + 0x30, 0x2e, 0x2d, 0x2e, 0xaf, 0x2f, 0x30, 0x14, 0x2f, 0x2f, 0x30, 0x2d, 0x32, 0x05, 0x08, 0x32, + 0x2f, 0x31, 0x1b, 0x7c, 0x27, 0x10, 0x21, 0x11, 0x31, 0x0e, 0x8f, 0x00, 0x07, 0x31, 0x30, 0x04, + 0x2f, 0x0c, 0x2e, 0x0c, 0x2d, 0x04, 0x1d, 0x99, 0x24, 0x05, 0x0f, 0x81, 0x30, 0x10, 0x60, 0x10, + 0xb0, 0x10, 0xe0, 0x10, 0x04, 0x10, 0x9c, 0x05, 0x81, 0x07, 0x9b, 0x00, 0x0c, 0x00, 0x3f, 0x3f, + 0xe5, 0x3f, 0x5d, 0xed, 0x3f, 0xed, 0x3f, 0x3f, 0x3f, 0x3f, 0x01, 0x10, 0xd4, 0xd4, 0xed, 0x10, + 0xd6, 0xc4, 0xd5, 0xd4, 0xed, 0x10, 0xc6, 0x10, 0xd0, 0xc5, 0x10, 0xc4, 0x87, 0x10, 0x2b, 0x87, + 0x7d, 0xc4, 0x31, 0x30, 0x01, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x21, 0x3e, 0x03, + 0x37, 0x23, 0x35, 0x33, 0x15, 0x0e, 0x03, 0x07, 0x03, 0x15, 0x23, 0x26, 0x26, 0x35, 0x34, 0x36, + 0x37, 0x37, 0x36, 0x36, 0x35, 0x34, 0x23, 0x22, 0x06, 0x07, 0x27, 0x36, 0x36, 0x33, 0x32, 0x16, + 0x15, 0x14, 0x0e, 0x02, 0x07, 0x25, 0x01, 0x23, 0x01, 0x01, 0x4d, 0x06, 0x0c, 0x0f, 0x17, 0x12, + 0x64, 0xc1, 0x18, 0x1c, 0x11, 0x0a, 0x06, 0xc9, 0xd1, 0x01, 0x01, 0x29, 0x1d, 0x17, 0x10, 0x0c, + 0x1a, 0x0e, 0x1f, 0x0c, 0x29, 0x13, 0x3a, 0x20, 0x27, 0x3d, 0x16, 0x20, 0x24, 0x0e, 0x01, 0x6e, + 0xfe, 0xc3, 0x64, 0x01, 0x3d, 0x22, 0x30, 0x29, 0x27, 0x1a, 0x3e, 0x32, 0x1b, 0x29, 0x2b, 0x34, + 0x25, 0x01, 0xb5, 0x3f, 0x06, 0x0c, 0x05, 0x23, 0x26, 0x13, 0x0f, 0x0a, 0x0e, 0x0d, 0x16, 0x10, + 0x0d, 0x36, 0x16, 0x17, 0x28, 0x2a, 0x1b, 0x22, 0x18, 0x13, 0x0a, 0xb6, 0xfd, 0x95, 0x02, 0x6b, + 0x00, 0x03, 0x00, 0x0c, 0x00, 0x00, 0x01, 0xf4, 0x02, 0x79, 0x00, 0x27, 0x00, 0x36, 0x00, 0x3a, + 0x00, 0xcc, 0x40, 0x15, 0x33, 0x40, 0x0f, 0x00, 0x4d, 0x33, 0x20, 0x0c, 0x00, 0x4d, 0x2f, 0x40, + 0x1b, 0x00, 0x4d, 0x2e, 0x40, 0x1b, 0x00, 0x4d, 0x0c, 0xb8, 0xff, 0xc0, 0xb3, 0x1a, 0x00, 0x4d, + 0x0b, 0xb8, 0xff, 0xc0, 0xb3, 0x1a, 0x00, 0x4d, 0x0a, 0xb8, 0xff, 0xc0, 0x40, 0x5f, 0x1a, 0x00, + 0x4d, 0x3a, 0x38, 0x37, 0x38, 0xaf, 0x39, 0x3a, 0x14, 0x39, 0x39, 0x3a, 0x37, 0x3c, 0x2d, 0x31, + 0x3c, 0x0e, 0x7c, 0x1b, 0x06, 0x7c, 0x1f, 0x20, 0x1f, 0x30, 0x1f, 0x80, 0x1f, 0x03, 0xa0, 0x1f, + 0xb0, 0x1f, 0xe0, 0x1f, 0xf0, 0x1f, 0x04, 0x1b, 0x1f, 0x1b, 0x1f, 0x3c, 0x39, 0x3b, 0x36, 0x8f, + 0x28, 0x2f, 0x3b, 0x15, 0x27, 0x3b, 0x3a, 0x04, 0x39, 0x0c, 0x38, 0x0c, 0x37, 0x04, 0x36, 0x0c, + 0x2d, 0x81, 0x2f, 0x9b, 0x0b, 0x81, 0x08, 0x1d, 0x1d, 0x08, 0x18, 0x03, 0x80, 0x30, 0x24, 0x01, + 0x30, 0x24, 0x60, 0x24, 0xb0, 0x24, 0x03, 0x24, 0x9d, 0x11, 0x81, 0x18, 0x05, 0x00, 0x3f, 0xed, + 0x3f, 0x5d, 0x71, 0xed, 0x12, 0x39, 0x39, 0x3d, 0x2f, 0x18, 0x2f, 0xed, 0x3f, 0xed, 0x3f, 0x3f, + 0x3f, 0x3f, 0x3f, 0x01, 0x10, 0xd6, 0xc6, 0x10, 0xd4, 0xd4, 0xed, 0x10, 0xc6, 0x12, 0x39, 0x39, + 0x2f, 0x2f, 0x5d, 0x71, 0x10, 0xed, 0x10, 0xed, 0x10, 0xd0, 0xc5, 0x10, 0xc4, 0x87, 0x10, 0x2b, + 0x87, 0x7d, 0xc4, 0x31, 0x30, 0x00, 0x2b, 0x2b, 0x2b, 0x01, 0x2b, 0x2b, 0x2b, 0x2b, 0x13, 0x16, + 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x23, 0x23, 0x35, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, + 0x22, 0x06, 0x07, 0x27, 0x36, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x07, 0x16, 0x15, 0x14, 0x0e, + 0x02, 0x23, 0x22, 0x26, 0x27, 0x01, 0x3e, 0x03, 0x37, 0x23, 0x35, 0x33, 0x15, 0x0e, 0x03, 0x07, + 0x13, 0x01, 0x23, 0x01, 0x1e, 0x0b, 0x27, 0x14, 0x17, 0x17, 0x3b, 0x14, 0x16, 0x1a, 0x13, 0x0f, + 0x0b, 0x11, 0x28, 0x09, 0x16, 0x0e, 0x38, 0x1e, 0x34, 0x30, 0x1e, 0x2a, 0x13, 0x22, 0x2d, 0x1b, + 0x1c, 0x33, 0x10, 0x01, 0x41, 0x06, 0x0c, 0x0f, 0x17, 0x12, 0x64, 0xc1, 0x18, 0x1c, 0x11, 0x0a, + 0x06, 0x33, 0xfe, 0xc3, 0x64, 0x01, 0x3d, 0x01, 0xbd, 0x05, 0x0a, 0x08, 0x0d, 0x1a, 0x39, 0x0a, + 0x0a, 0x09, 0x08, 0x0c, 0x05, 0x36, 0x0b, 0x0e, 0x29, 0x1a, 0x25, 0x13, 0x14, 0x2b, 0x17, 0x1e, + 0x13, 0x08, 0x09, 0x08, 0xfe, 0x80, 0x22, 0x30, 0x29, 0x27, 0x1a, 0x3e, 0x32, 0x1b, 0x29, 0x2b, + 0x34, 0x25, 0x02, 0x6b, 0xfd, 0x95, 0x02, 0x6b, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0xf4, + 0x02, 0x72, 0x00, 0x0e, 0x00, 0x1b, 0x00, 0x20, 0x00, 0x24, 0x00, 0xb5, 0xb6, 0x20, 0x40, 0x13, + 0x14, 0x00, 0x4c, 0x1f, 0xb8, 0xff, 0xc0, 0x40, 0x6e, 0x12, 0x00, 0x4d, 0x0b, 0x40, 0x0f, 0x00, + 0x4d, 0x0b, 0x20, 0x0c, 0x00, 0x4d, 0x07, 0x40, 0x17, 0x00, 0x4d, 0x07, 0x40, 0x15, 0x00, 0x4d, + 0x06, 0x40, 0x17, 0x00, 0x4d, 0x06, 0x40, 0x15, 0x00, 0x4d, 0x24, 0x22, 0x21, 0x22, 0xaf, 0x23, + 0x24, 0x14, 0x23, 0x23, 0x24, 0x21, 0x26, 0x05, 0x09, 0x26, 0x23, 0x25, 0x13, 0xc0, 0x12, 0x01, + 0x12, 0xd0, 0x10, 0x01, 0x10, 0x16, 0x20, 0x20, 0x1f, 0x1b, 0x17, 0x25, 0x0e, 0x8f, 0x00, 0x2f, + 0x07, 0x01, 0x07, 0x25, 0x24, 0x04, 0x23, 0x0c, 0x22, 0x0c, 0x21, 0x04, 0x10, 0x20, 0x81, 0x16, + 0x30, 0x14, 0x60, 0x14, 0x90, 0x14, 0xb0, 0x14, 0x04, 0x14, 0x9c, 0x1c, 0x81, 0x0f, 0x04, 0x0e, + 0x0c, 0x08, 0x9b, 0x05, 0x81, 0x07, 0x9b, 0x00, 0x3f, 0xed, 0x3f, 0x3f, 0x3f, 0xed, 0x3f, 0x5d, + 0xd5, 0xed, 0x32, 0x3f, 0x3f, 0x3f, 0x3f, 0x01, 0x10, 0xd4, 0x71, 0xd4, 0xed, 0x10, 0xd0, 0xc5, + 0xd1, 0xc2, 0x2f, 0x32, 0xd5, 0x5d, 0xc5, 0x5d, 0x33, 0x10, 0xc6, 0x10, 0xd0, 0xc5, 0x10, 0xc4, + 0x87, 0x10, 0x2b, 0x87, 0x7d, 0xc4, 0x31, 0x30, 0x01, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, + 0x2b, 0x21, 0x3e, 0x03, 0x37, 0x23, 0x35, 0x33, 0x15, 0x0e, 0x03, 0x07, 0x03, 0x15, 0x33, 0x15, + 0x23, 0x15, 0x23, 0x35, 0x23, 0x35, 0x36, 0x36, 0x37, 0x17, 0x06, 0x06, 0x07, 0x33, 0x25, 0x01, + 0x23, 0x01, 0x01, 0x4d, 0x06, 0x0c, 0x0f, 0x17, 0x12, 0x64, 0xc1, 0x18, 0x1c, 0x11, 0x0a, 0x06, + 0xd3, 0x24, 0x24, 0x50, 0x7c, 0x17, 0x2d, 0x20, 0x18, 0x0f, 0x19, 0x0b, 0x33, 0x01, 0x5f, 0xfe, + 0xc3, 0x64, 0x01, 0x3d, 0x22, 0x30, 0x29, 0x27, 0x1a, 0x3e, 0x32, 0x1b, 0x29, 0x2b, 0x34, 0x25, + 0x02, 0x72, 0x94, 0x3f, 0x27, 0x27, 0x2d, 0x2b, 0x4c, 0x2f, 0x40, 0x17, 0x29, 0x14, 0x8d, 0xfd, + 0x95, 0x02, 0x6b, 0x00, 0x00, 0x03, 0x00, 0x05, 0x00, 0x00, 0x01, 0xf4, 0x02, 0x72, 0x00, 0x20, + 0x00, 0x2f, 0x00, 0x33, 0x00, 0xc2, 0x40, 0x0b, 0x2c, 0x40, 0x0f, 0x00, 0x4d, 0x2c, 0x20, 0x0c, + 0x00, 0x4d, 0x0c, 0xb8, 0xff, 0xe8, 0xb3, 0x1f, 0x00, 0x4d, 0x0c, 0xb8, 0xff, 0xe0, 0xb3, 0x1d, + 0x00, 0x4d, 0x0c, 0xb8, 0xff, 0xc0, 0x40, 0x09, 0x1a, 0x00, 0x4d, 0x24, 0x0c, 0x34, 0x0c, 0x02, + 0x00, 0xb8, 0xff, 0xc8, 0xb3, 0x1f, 0x00, 0x4d, 0x00, 0xb8, 0xff, 0xc0, 0xb4, 0x1a, 0x1d, 0x00, + 0x4c, 0x00, 0xb8, 0xff, 0xf0, 0x40, 0x49, 0x14, 0x00, 0x4d, 0x33, 0x31, 0x30, 0x31, 0xaf, 0x32, + 0x33, 0x14, 0x32, 0x32, 0x33, 0x30, 0x35, 0x26, 0x2a, 0x35, 0x12, 0x7c, 0x03, 0x1e, 0x35, 0x32, + 0x34, 0x2f, 0x8f, 0x21, 0x28, 0x34, 0x20, 0x82, 0x1d, 0x0b, 0x34, 0x33, 0x04, 0x32, 0x0c, 0x31, + 0x0c, 0x30, 0x04, 0x2f, 0x0c, 0x29, 0x9b, 0x26, 0x81, 0x28, 0x9b, 0x20, 0x81, 0x1e, 0x04, 0x0f, + 0x80, 0x30, 0x08, 0x01, 0x30, 0x08, 0x60, 0x08, 0xb0, 0x08, 0x03, 0x08, 0x9d, 0x18, 0x81, 0x00, + 0x00, 0x2f, 0xed, 0x3f, 0x5d, 0x71, 0xed, 0x3f, 0xed, 0x3f, 0xed, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, + 0x3f, 0x01, 0x10, 0xd6, 0xd6, 0xed, 0x10, 0xd4, 0xd4, 0xed, 0x10, 0xc6, 0x10, 0xd4, 0xd4, 0xed, + 0x10, 0xd0, 0xc5, 0x10, 0xc4, 0x87, 0x10, 0x2b, 0x87, 0x7d, 0xc4, 0x31, 0x30, 0x00, 0x2b, 0x2b, + 0x2b, 0x71, 0x2b, 0x2b, 0x2b, 0x01, 0x2b, 0x2b, 0x13, 0x16, 0x16, 0x15, 0x14, 0x0e, 0x02, 0x23, + 0x22, 0x26, 0x27, 0x37, 0x16, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x2e, 0x02, 0x23, 0x23, 0x3e, + 0x03, 0x37, 0x33, 0x15, 0x23, 0x13, 0x3e, 0x03, 0x37, 0x23, 0x35, 0x33, 0x15, 0x0e, 0x03, 0x07, + 0x13, 0x01, 0x23, 0x01, 0x70, 0x3f, 0x2d, 0x13, 0x21, 0x2c, 0x18, 0x1c, 0x32, 0x11, 0x10, 0x11, + 0x2a, 0x13, 0x14, 0x0f, 0x06, 0x12, 0x21, 0x1a, 0x13, 0x03, 0x03, 0x03, 0x02, 0x01, 0xa5, 0x60, + 0xdc, 0x06, 0x0c, 0x0f, 0x17, 0x12, 0x64, 0xc1, 0x18, 0x1c, 0x11, 0x0a, 0x06, 0x33, 0xfe, 0xc3, + 0x64, 0x01, 0x3d, 0x02, 0x20, 0x06, 0x30, 0x23, 0x18, 0x21, 0x15, 0x0a, 0x0e, 0x0b, 0x3d, 0x0a, + 0x0d, 0x0f, 0x0a, 0x06, 0x0a, 0x09, 0x05, 0x17, 0x22, 0x1f, 0x20, 0x15, 0x3f, 0xfd, 0xcd, 0x22, + 0x30, 0x29, 0x27, 0x1a, 0x3e, 0x32, 0x1b, 0x29, 0x2b, 0x34, 0x25, 0x02, 0x6b, 0xfd, 0x95, 0x02, + 0x6b, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x09, 0x00, 0x00, 0x01, 0xf4, 0x02, 0x7b, 0x00, 0x13, + 0x00, 0x22, 0x00, 0x2d, 0x00, 0x31, 0x00, 0xb2, 0x40, 0x24, 0x2c, 0x40, 0x14, 0x00, 0x4d, 0x1f, + 0x40, 0x0f, 0x00, 0x4d, 0x1f, 0x20, 0x0c, 0x00, 0x4d, 0x1b, 0x40, 0x17, 0x00, 0x4d, 0x1b, 0x40, + 0x15, 0x00, 0x4d, 0x1a, 0x40, 0x17, 0x00, 0x4d, 0x1a, 0x40, 0x15, 0x00, 0x4d, 0x07, 0xb8, 0xff, + 0xc0, 0x40, 0x4e, 0x19, 0x1d, 0x00, 0x4c, 0x31, 0x2f, 0x2e, 0x2f, 0xaf, 0x30, 0x31, 0x14, 0x30, + 0x30, 0x31, 0x2e, 0x33, 0x19, 0x1d, 0x33, 0x2c, 0x7c, 0x09, 0x00, 0x33, 0x30, 0x32, 0x22, 0x8f, + 0x14, 0x1b, 0x32, 0x26, 0x7c, 0xef, 0x0f, 0x01, 0x0f, 0x32, 0x31, 0x04, 0x30, 0x0c, 0x2f, 0x0c, + 0x2e, 0x04, 0x1c, 0x9b, 0x19, 0x81, 0x1b, 0x9b, 0x14, 0x0c, 0x23, 0x80, 0x06, 0x06, 0x0c, 0x00, + 0x80, 0x13, 0x05, 0x29, 0x80, 0x30, 0x0c, 0x01, 0x30, 0x0c, 0x60, 0x0c, 0xb0, 0x0c, 0x03, 0x0c, + 0x9d, 0x00, 0x3f, 0x5d, 0x71, 0xed, 0x3f, 0xed, 0x12, 0x39, 0x2f, 0xed, 0x3f, 0x3f, 0xed, 0x3f, + 0x3f, 0x3f, 0x3f, 0x3f, 0x01, 0x10, 0xd6, 0x5d, 0xed, 0x10, 0xd4, 0xd4, 0xed, 0x10, 0xc6, 0x10, + 0xd4, 0xd4, 0xed, 0x10, 0xd0, 0xc5, 0x10, 0xc4, 0x87, 0x10, 0x2b, 0x87, 0x7d, 0xc4, 0x31, 0x30, + 0x00, 0x2b, 0x01, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x13, 0x06, 0x06, 0x07, 0x36, 0x36, + 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x33, 0x13, 0x3e, + 0x03, 0x37, 0x23, 0x35, 0x33, 0x15, 0x0e, 0x03, 0x07, 0x01, 0x22, 0x06, 0x07, 0x16, 0x16, 0x33, + 0x32, 0x36, 0x35, 0x34, 0x25, 0x01, 0x23, 0x01, 0xdd, 0x31, 0x3d, 0x0f, 0x08, 0x0d, 0x06, 0x35, + 0x31, 0x36, 0x34, 0x30, 0x3e, 0x65, 0x5c, 0x0b, 0x78, 0x06, 0x0c, 0x0f, 0x17, 0x12, 0x64, 0xc1, + 0x18, 0x1c, 0x11, 0x0a, 0x06, 0xfe, 0xd7, 0x0b, 0x11, 0x08, 0x02, 0x19, 0x0e, 0x0e, 0x0f, 0x01, + 0x3a, 0xfe, 0xc3, 0x64, 0x01, 0x3d, 0x02, 0x37, 0x03, 0x0a, 0x11, 0x02, 0x02, 0x29, 0x27, 0x2a, + 0x34, 0x34, 0x39, 0x4f, 0x50, 0xfd, 0x85, 0x22, 0x30, 0x29, 0x27, 0x1a, 0x3e, 0x32, 0x1b, 0x29, + 0x2b, 0x34, 0x25, 0x01, 0xe2, 0x03, 0x02, 0x20, 0x0f, 0x0f, 0x0b, 0x1a, 0x89, 0xfd, 0x95, 0x02, + 0x6b, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x02, 0xff, 0xf7, 0x01, 0xf0, 0x02, 0x72, 0x00, 0x12, + 0x00, 0x1d, 0x00, 0x27, 0x00, 0x2b, 0x00, 0xd6, 0xb9, 0x00, 0x26, 0xff, 0xc0, 0xb3, 0x14, 0x00, + 0x4d, 0x05, 0xb8, 0xff, 0x80, 0x40, 0x0a, 0x1b, 0x1c, 0x00, 0x4c, 0x05, 0xc0, 0x1a, 0x00, 0x4d, + 0x20, 0xb8, 0xff, 0xc0, 0xb3, 0x19, 0x00, 0x4d, 0x1f, 0xb8, 0xff, 0xc0, 0xb3, 0x19, 0x00, 0x4d, + 0x1e, 0xb8, 0xff, 0xc0, 0x40, 0x11, 0x19, 0x00, 0x4d, 0x1d, 0x20, 0x13, 0x00, 0x4d, 0x05, 0x40, + 0x1c, 0x00, 0x4d, 0x2f, 0x05, 0x01, 0x01, 0xb8, 0xff, 0xc0, 0xb3, 0x19, 0x00, 0x4d, 0x00, 0xb8, + 0xff, 0xc0, 0x40, 0x4d, 0x19, 0x00, 0x4d, 0x2b, 0x29, 0x28, 0x29, 0xaf, 0x2a, 0x2b, 0x14, 0x2a, + 0x2a, 0x2b, 0x28, 0x2d, 0x20, 0x7c, 0x03, 0x7c, 0x0f, 0x2d, 0x2a, 0x2c, 0x90, 0x18, 0x01, 0x18, + 0x8f, 0x19, 0x13, 0x2c, 0x26, 0x7c, 0x00, 0x07, 0x2c, 0x2b, 0x04, 0x2a, 0x0c, 0x29, 0x0c, 0x28, + 0x04, 0x1d, 0x1a, 0x13, 0x13, 0x1a, 0x1d, 0x03, 0x16, 0x30, 0x18, 0x60, 0x18, 0xb0, 0x18, 0x03, + 0x18, 0x9c, 0x16, 0x04, 0x1e, 0x80, 0x05, 0x05, 0x0a, 0x00, 0x80, 0x12, 0x0b, 0x23, 0x80, 0x0a, + 0x9a, 0x00, 0x3f, 0xed, 0x3f, 0xed, 0x12, 0x39, 0x2f, 0xed, 0x3f, 0x3f, 0x5d, 0x12, 0x17, 0x39, + 0x2f, 0x2f, 0x2f, 0x3f, 0x3f, 0x3f, 0x3f, 0x01, 0x10, 0xd4, 0xc4, 0xed, 0x10, 0xd6, 0xd4, 0xed, + 0x5d, 0x10, 0xc6, 0x10, 0xd6, 0xed, 0xed, 0x10, 0xc4, 0x87, 0x10, 0x2b, 0x87, 0x7d, 0xc4, 0x31, + 0x30, 0x00, 0x2b, 0x2b, 0x71, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x01, 0x2b, 0x2b, 0x2b, 0x25, 0x36, + 0x36, 0x37, 0x06, 0x23, 0x22, 0x35, 0x34, 0x36, 0x33, 0x32, 0x1e, 0x02, 0x15, 0x14, 0x06, 0x23, + 0x01, 0x36, 0x36, 0x37, 0x33, 0x15, 0x23, 0x35, 0x06, 0x06, 0x07, 0x01, 0x32, 0x37, 0x26, 0x26, + 0x23, 0x22, 0x06, 0x15, 0x14, 0x13, 0x01, 0x23, 0x01, 0x01, 0x1c, 0x30, 0x3d, 0x0e, 0x0e, 0x0c, + 0x65, 0x36, 0x34, 0x14, 0x28, 0x1f, 0x13, 0x66, 0x67, 0xfe, 0xdf, 0x22, 0x32, 0x18, 0x3f, 0x55, + 0x14, 0x1c, 0x13, 0x01, 0x6e, 0x12, 0x11, 0x01, 0x1a, 0x0e, 0x0e, 0x0e, 0x5f, 0xfe, 0xc3, 0x64, + 0x01, 0x3d, 0x3b, 0x03, 0x09, 0x11, 0x03, 0x50, 0x2a, 0x34, 0x0d, 0x1b, 0x29, 0x1c, 0x52, 0x4d, + 0x02, 0x36, 0x0f, 0x1f, 0x17, 0xfa, 0x96, 0x0b, 0x0c, 0x05, 0xfe, 0x9e, 0x05, 0x1f, 0x10, 0x0f, + 0x0b, 0x1a, 0x01, 0xdb, 0xfd, 0x95, 0x02, 0x6b, 0x00, 0x04, 0x00, 0x00, 0xff, 0xf7, 0x01, 0xf0, + 0x02, 0x79, 0x00, 0x12, 0x00, 0x1c, 0x00, 0x3a, 0x00, 0x3e, 0x00, 0xc8, 0x40, 0x0b, 0x26, 0x20, + 0x13, 0x00, 0x4d, 0x25, 0x20, 0x13, 0x00, 0x4d, 0x1b, 0xb8, 0xff, 0xc0, 0x40, 0x09, 0x14, 0x00, + 0x4d, 0x2e, 0x40, 0x17, 0x00, 0x4d, 0x1c, 0xb8, 0xff, 0xc0, 0xb3, 0x19, 0x00, 0x4d, 0x14, 0xb8, + 0xff, 0xc0, 0xb3, 0x19, 0x00, 0x4d, 0x13, 0xb8, 0xff, 0xc0, 0xb3, 0x19, 0x00, 0x4d, 0x01, 0xb8, + 0xff, 0xe0, 0xb3, 0x19, 0x00, 0x4d, 0x00, 0xb8, 0xff, 0xc0, 0x40, 0x4d, 0x19, 0x00, 0x4d, 0x3e, + 0x3c, 0x3b, 0x3c, 0xaf, 0x3d, 0x3e, 0x14, 0x3d, 0x3d, 0x3e, 0x3b, 0x40, 0x15, 0x7c, 0x03, 0x7c, + 0x0f, 0x60, 0x1e, 0x01, 0x1e, 0x40, 0x3d, 0x3f, 0x2f, 0x1f, 0x3f, 0x1b, 0x7c, 0x00, 0xef, 0x07, + 0x01, 0x07, 0x3f, 0x29, 0x7c, 0x35, 0x1d, 0x3e, 0x04, 0x3d, 0x0c, 0x3c, 0x0c, 0x3b, 0x04, 0x2b, + 0x99, 0x32, 0x05, 0x1d, 0x81, 0x30, 0x1e, 0x60, 0x1e, 0x02, 0x1e, 0x9c, 0x13, 0x80, 0x05, 0x05, + 0x0a, 0x00, 0x80, 0x12, 0x0b, 0x18, 0x80, 0x0a, 0x9a, 0x00, 0x3f, 0xed, 0x3f, 0xed, 0x12, 0x39, + 0x10, 0xed, 0x3f, 0x5d, 0xed, 0x3f, 0xed, 0x3f, 0x3f, 0x3f, 0x3f, 0x01, 0x2f, 0xd6, 0xed, 0x10, + 0xd4, 0x5d, 0xc4, 0xed, 0x10, 0xd6, 0xc4, 0x10, 0xc6, 0x10, 0xc4, 0x5d, 0xd6, 0xed, 0xed, 0x10, + 0xc4, 0x87, 0x10, 0x2b, 0x87, 0x7d, 0xc4, 0x31, 0x30, 0x00, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, + 0x01, 0x2b, 0x2b, 0x2b, 0x25, 0x36, 0x36, 0x37, 0x06, 0x23, 0x22, 0x35, 0x34, 0x36, 0x33, 0x32, + 0x1e, 0x02, 0x15, 0x14, 0x06, 0x23, 0x37, 0x32, 0x37, 0x26, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, + 0x03, 0x15, 0x23, 0x26, 0x26, 0x35, 0x34, 0x36, 0x37, 0x37, 0x36, 0x36, 0x35, 0x34, 0x23, 0x22, + 0x06, 0x07, 0x27, 0x36, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x0e, 0x02, 0x07, 0x25, 0x01, 0x23, + 0x01, 0x01, 0x1c, 0x30, 0x3d, 0x0e, 0x0e, 0x0c, 0x65, 0x36, 0x34, 0x14, 0x28, 0x1f, 0x13, 0x66, + 0x67, 0x60, 0x12, 0x11, 0x01, 0x1a, 0x0e, 0x0e, 0x0e, 0x8b, 0xd1, 0x01, 0x01, 0x29, 0x1d, 0x17, + 0x10, 0x0c, 0x1a, 0x0e, 0x1f, 0x0c, 0x29, 0x13, 0x3a, 0x20, 0x27, 0x3d, 0x16, 0x20, 0x24, 0x0e, + 0x01, 0x69, 0xfe, 0xc3, 0x64, 0x01, 0x3d, 0x3b, 0x03, 0x09, 0x11, 0x03, 0x50, 0x2a, 0x34, 0x0d, + 0x1b, 0x29, 0x1c, 0x52, 0x4d, 0x99, 0x05, 0x1f, 0x10, 0x0f, 0x0b, 0x1a, 0x01, 0x25, 0x3f, 0x06, + 0x0c, 0x05, 0x23, 0x26, 0x13, 0x0f, 0x0a, 0x0e, 0x0d, 0x16, 0x10, 0x0d, 0x36, 0x16, 0x17, 0x28, + 0x2a, 0x1b, 0x22, 0x18, 0x13, 0x0a, 0xb6, 0xfd, 0x95, 0x02, 0x6b, 0x00, 0x00, 0x05, 0x00, 0x00, + 0xff, 0xf7, 0x01, 0xf4, 0x02, 0x72, 0x00, 0x13, 0x00, 0x1d, 0x00, 0x2a, 0x00, 0x2f, 0x00, 0x33, + 0x00, 0xdf, 0xb9, 0x00, 0x1c, 0xff, 0xc0, 0xb3, 0x14, 0x00, 0x4d, 0x26, 0xb8, 0xff, 0xc0, 0xb3, + 0x0c, 0x00, 0x4d, 0x25, 0xb8, 0xff, 0xc0, 0xb3, 0x0c, 0x00, 0x4d, 0x21, 0xb8, 0xff, 0xc0, 0xb3, + 0x0c, 0x00, 0x4d, 0x1d, 0xb8, 0xff, 0xa0, 0xb3, 0x19, 0x00, 0x4d, 0x15, 0xb8, 0xff, 0xc0, 0xb3, + 0x19, 0x00, 0x4d, 0x14, 0xb8, 0xff, 0xc0, 0x40, 0x0e, 0x19, 0x00, 0x4d, 0x06, 0x40, 0x1c, 0x00, + 0x4d, 0x05, 0x18, 0x19, 0x00, 0x4d, 0x01, 0xb8, 0xff, 0xe0, 0xb3, 0x19, 0x00, 0x4d, 0x00, 0xb8, + 0xff, 0xc0, 0x40, 0x4d, 0x19, 0x00, 0x4d, 0x33, 0x31, 0x30, 0x31, 0xaf, 0x32, 0x33, 0x14, 0x32, + 0x32, 0x33, 0x30, 0x35, 0x16, 0x7c, 0x03, 0x7c, 0x10, 0x35, 0x32, 0x34, 0x22, 0x20, 0x1f, 0x25, + 0x2f, 0x2e, 0x2a, 0x26, 0x34, 0x1c, 0x7c, 0x00, 0x08, 0x34, 0x33, 0x04, 0x32, 0x0c, 0x31, 0x0c, + 0x30, 0x04, 0x1f, 0x2f, 0x81, 0x22, 0x25, 0x60, 0x23, 0x90, 0x23, 0xb0, 0x23, 0x03, 0x23, 0x9c, + 0x2b, 0x81, 0x1e, 0x04, 0x14, 0x80, 0x05, 0x05, 0x0b, 0x00, 0x80, 0x13, 0x0b, 0x19, 0x80, 0x0b, + 0x9a, 0x00, 0x3f, 0xed, 0x3f, 0xed, 0x12, 0x39, 0x2f, 0xed, 0x3f, 0xed, 0x3f, 0x5d, 0xd5, 0x32, + 0xe5, 0x32, 0x3f, 0x3f, 0x3f, 0x3f, 0x01, 0x10, 0xd4, 0xc4, 0xed, 0x10, 0xd0, 0xc5, 0xd5, 0xd6, + 0xc0, 0xd5, 0xc5, 0xc0, 0x10, 0xc6, 0x10, 0xd0, 0xed, 0xed, 0x10, 0xc4, 0x87, 0x10, 0x2b, 0x87, + 0x7d, 0xc4, 0x31, 0x30, 0x00, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x01, + 0x2b, 0x25, 0x36, 0x36, 0x37, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x1e, 0x02, + 0x15, 0x14, 0x06, 0x23, 0x37, 0x32, 0x37, 0x26, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x03, 0x15, + 0x33, 0x15, 0x23, 0x15, 0x23, 0x35, 0x23, 0x35, 0x36, 0x36, 0x37, 0x17, 0x06, 0x06, 0x07, 0x33, + 0x25, 0x01, 0x23, 0x01, 0x01, 0x20, 0x31, 0x3c, 0x0f, 0x0e, 0x0c, 0x35, 0x31, 0x36, 0x34, 0x15, + 0x27, 0x1f, 0x13, 0x65, 0x67, 0x5f, 0x12, 0x12, 0x02, 0x19, 0x0e, 0x0e, 0x0f, 0x99, 0x24, 0x24, + 0x50, 0x7c, 0x17, 0x2d, 0x20, 0x18, 0x0f, 0x19, 0x0b, 0x33, 0x01, 0x5d, 0xfe, 0xc3, 0x64, 0x01, + 0x3d, 0x3b, 0x03, 0x09, 0x11, 0x03, 0x29, 0x27, 0x2a, 0x34, 0x0d, 0x1b, 0x29, 0x1c, 0x52, 0x4d, + 0x99, 0x05, 0x1f, 0x10, 0x0f, 0x0b, 0x1a, 0x01, 0xe2, 0x94, 0x3f, 0x27, 0x27, 0x2d, 0x2b, 0x4c, + 0x2f, 0x40, 0x17, 0x29, 0x14, 0x8d, 0xfd, 0x95, 0x02, 0x6b, 0x00, 0x00, 0x00, 0x04, 0x00, 0x05, + 0xff, 0xf7, 0x01, 0xf0, 0x02, 0x72, 0x00, 0x12, 0x00, 0x33, 0x00, 0x3d, 0x00, 0x41, 0x00, 0xe1, + 0xb9, 0x00, 0x35, 0xff, 0xc0, 0xb3, 0x19, 0x00, 0x4d, 0x34, 0xb8, 0xff, 0xc0, 0xb3, 0x19, 0x00, + 0x4d, 0x1f, 0xb8, 0xff, 0xc0, 0xb3, 0x24, 0x00, 0x4d, 0x1f, 0xb8, 0xff, 0xc0, 0xb4, 0x21, 0x22, + 0x00, 0x4c, 0x1f, 0xb8, 0xff, 0xc0, 0xb4, 0x1a, 0x1e, 0x00, 0x4c, 0x14, 0xb8, 0xff, 0xc0, 0xb3, + 0x1f, 0x00, 0x4d, 0x14, 0xb8, 0xff, 0xc0, 0xb7, 0x1c, 0x1d, 0x00, 0x4c, 0x20, 0x14, 0x01, 0x13, + 0xb8, 0xff, 0xc0, 0x40, 0x5b, 0x1a, 0x00, 0x4d, 0x14, 0x03, 0x01, 0x41, 0x3f, 0x3e, 0x3f, 0xaf, + 0x40, 0x41, 0x14, 0x40, 0x40, 0x41, 0x3e, 0x43, 0x25, 0x7c, 0x16, 0x31, 0x43, 0x03, 0x36, 0x7c, + 0xe0, 0x0f, 0x01, 0x0f, 0x43, 0x40, 0x42, 0x33, 0x82, 0x30, 0x1e, 0x42, 0x3c, 0x7c, 0x00, 0x07, + 0x42, 0x41, 0x04, 0x40, 0x0c, 0x3f, 0x0c, 0x3e, 0x04, 0x2a, 0x81, 0x13, 0x13, 0x1b, 0x33, 0x81, + 0x31, 0x04, 0x22, 0x81, 0x30, 0x1b, 0x01, 0x0f, 0x1b, 0x01, 0x30, 0x1b, 0x60, 0x1b, 0xb0, 0x1b, + 0x03, 0x1b, 0x9d, 0x34, 0x80, 0x05, 0x05, 0x0a, 0x00, 0x80, 0x12, 0x0b, 0x39, 0x7f, 0x0a, 0x9a, + 0x00, 0x3f, 0xed, 0x3f, 0xed, 0x12, 0x39, 0x2f, 0xed, 0x3f, 0x5d, 0x71, 0x71, 0xed, 0x3f, 0xed, + 0x12, 0x39, 0x2f, 0xed, 0x3f, 0x3f, 0x3f, 0x3f, 0x01, 0x10, 0xd4, 0xc4, 0xed, 0x10, 0xd6, 0xd6, + 0xed, 0x10, 0xc6, 0x10, 0xd6, 0x5d, 0xfd, 0xc5, 0x10, 0xd4, 0xd4, 0xed, 0x10, 0xc4, 0x87, 0x10, + 0x2b, 0x87, 0x7d, 0xc4, 0x31, 0x30, 0x00, 0x71, 0x2b, 0x71, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, + 0x2b, 0x25, 0x36, 0x36, 0x37, 0x06, 0x23, 0x22, 0x35, 0x34, 0x36, 0x33, 0x32, 0x1e, 0x02, 0x15, + 0x14, 0x06, 0x23, 0x03, 0x16, 0x16, 0x15, 0x14, 0x0e, 0x02, 0x23, 0x22, 0x26, 0x27, 0x37, 0x16, + 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x2e, 0x02, 0x23, 0x23, 0x3e, 0x03, 0x37, 0x33, 0x15, 0x23, + 0x01, 0x32, 0x37, 0x26, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x13, 0x01, 0x23, 0x01, 0x01, 0x1c, + 0x30, 0x3d, 0x0e, 0x0e, 0x0c, 0x65, 0x36, 0x34, 0x14, 0x28, 0x1f, 0x13, 0x66, 0x67, 0xb3, 0x3f, + 0x2d, 0x13, 0x21, 0x2c, 0x18, 0x1c, 0x32, 0x11, 0x10, 0x11, 0x2a, 0x13, 0x14, 0x0f, 0x06, 0x12, + 0x21, 0x1a, 0x13, 0x03, 0x03, 0x03, 0x02, 0x01, 0xa5, 0x60, 0x01, 0x12, 0x12, 0x11, 0x01, 0x1a, + 0x0e, 0x0e, 0x0e, 0x69, 0xfe, 0xc3, 0x64, 0x01, 0x3d, 0x3b, 0x03, 0x09, 0x11, 0x03, 0x50, 0x2a, + 0x34, 0x0d, 0x1b, 0x29, 0x1c, 0x52, 0x4d, 0x02, 0x29, 0x06, 0x30, 0x23, 0x18, 0x21, 0x15, 0x0a, + 0x0e, 0x0b, 0x3d, 0x0a, 0x0d, 0x0f, 0x0a, 0x06, 0x0a, 0x09, 0x05, 0x17, 0x22, 0x1f, 0x20, 0x15, + 0x3f, 0xfe, 0x5d, 0x05, 0x1f, 0x10, 0x0f, 0x0b, 0x1a, 0x01, 0xdb, 0xfd, 0x95, 0x02, 0x6b, 0x00, + 0x00, 0x04, 0x00, 0x10, 0xff, 0xf7, 0x01, 0xde, 0x02, 0x72, 0x00, 0x12, 0x00, 0x21, 0x00, 0x2b, + 0x00, 0x2f, 0x00, 0xa3, 0x40, 0x0b, 0x1e, 0x40, 0x0f, 0x00, 0x4d, 0x1e, 0x20, 0x0c, 0x00, 0x4d, + 0x23, 0xb8, 0xff, 0xc0, 0xb3, 0x19, 0x00, 0x4d, 0x22, 0xb8, 0xff, 0xc0, 0xb3, 0x19, 0x00, 0x4d, + 0x01, 0xb8, 0xff, 0xe0, 0xb3, 0x19, 0x00, 0x4d, 0x00, 0xb8, 0xff, 0xc0, 0x40, 0x44, 0x19, 0x00, + 0x4d, 0x2f, 0x2d, 0x2c, 0x2d, 0xaf, 0x2e, 0x2f, 0x14, 0x2e, 0x2e, 0x2f, 0x2c, 0x31, 0x03, 0x24, + 0x7c, 0x0f, 0x31, 0x2e, 0x30, 0x18, 0x1c, 0x1a, 0x21, 0x8f, 0x13, 0x1a, 0x30, 0x2a, 0x7c, 0x00, + 0x07, 0x30, 0x2f, 0x04, 0x2e, 0x0c, 0x2d, 0x0c, 0x2c, 0x04, 0x30, 0x21, 0x60, 0x21, 0x02, 0x21, + 0x9c, 0x18, 0x81, 0x1b, 0x04, 0x22, 0x80, 0x05, 0x05, 0x0a, 0x00, 0x80, 0x12, 0x0b, 0x27, 0x80, + 0x0a, 0x9a, 0x00, 0x3f, 0xed, 0x3f, 0xed, 0x12, 0x39, 0x2f, 0xed, 0x3f, 0xed, 0x3f, 0x5d, 0x3f, + 0x3f, 0x3f, 0x3f, 0x01, 0x10, 0xd4, 0xc4, 0xed, 0x10, 0xd6, 0xd4, 0xed, 0x10, 0xd5, 0xc5, 0x10, + 0xc6, 0x10, 0xd6, 0xfd, 0xc5, 0x10, 0xc6, 0x87, 0x10, 0x2b, 0x87, 0x7d, 0xc4, 0x31, 0x30, 0x00, + 0x2b, 0x2b, 0x2b, 0x2b, 0x01, 0x2b, 0x2b, 0x25, 0x36, 0x36, 0x37, 0x06, 0x23, 0x22, 0x35, 0x34, + 0x36, 0x33, 0x32, 0x1e, 0x02, 0x15, 0x14, 0x06, 0x23, 0x03, 0x3e, 0x03, 0x37, 0x23, 0x35, 0x33, + 0x15, 0x0e, 0x03, 0x07, 0x17, 0x32, 0x37, 0x26, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x13, 0x01, + 0x23, 0x01, 0x01, 0x0a, 0x30, 0x3d, 0x0e, 0x0e, 0x0c, 0x65, 0x36, 0x34, 0x14, 0x28, 0x1f, 0x13, + 0x66, 0x67, 0xd8, 0x06, 0x0c, 0x0f, 0x17, 0x12, 0x64, 0xc1, 0x18, 0x1c, 0x11, 0x0a, 0x06, 0xe6, + 0x12, 0x12, 0x02, 0x1a, 0x0e, 0x0d, 0x0f, 0x62, 0xfe, 0xc3, 0x64, 0x01, 0x3d, 0x3b, 0x03, 0x09, + 0x11, 0x03, 0x50, 0x2a, 0x34, 0x0d, 0x1b, 0x29, 0x1c, 0x52, 0x4d, 0x01, 0x81, 0x22, 0x30, 0x29, + 0x26, 0x1a, 0x3f, 0x32, 0x1b, 0x29, 0x2b, 0x34, 0x25, 0xe8, 0x05, 0x1f, 0x10, 0x0f, 0x0b, 0x1a, + 0x01, 0xdb, 0xfd, 0x95, 0x02, 0x6b, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0xff, 0xf7, 0x01, 0xf4, + 0x02, 0x79, 0x00, 0x1a, 0x00, 0x2e, 0x00, 0x39, 0x00, 0x43, 0x00, 0x4f, 0x00, 0x53, 0x01, 0x66, + 0xb9, 0x00, 0x42, 0xff, 0xc0, 0xb3, 0x14, 0x00, 0x4d, 0x2f, 0xb8, 0xff, 0xc0, 0xb3, 0x18, 0x00, + 0x4d, 0x17, 0xb8, 0xff, 0xc0, 0xb3, 0x16, 0x00, 0x4d, 0x16, 0xb8, 0xff, 0xc0, 0xb3, 0x23, 0x00, + 0x4d, 0x16, 0xb8, 0xff, 0xc0, 0xb4, 0x20, 0x21, 0x00, 0x4c, 0x16, 0xb8, 0xff, 0xc0, 0xb4, 0x15, + 0x17, 0x00, 0x4c, 0x15, 0xb8, 0xff, 0xc0, 0xb3, 0x23, 0x00, 0x4d, 0x15, 0xb8, 0xff, 0xc0, 0xb4, + 0x20, 0x21, 0x00, 0x4c, 0x15, 0xb8, 0xff, 0xc0, 0xb4, 0x15, 0x17, 0x00, 0x4c, 0x13, 0xb8, 0xff, + 0xe0, 0x40, 0x40, 0x17, 0x00, 0x4d, 0x4e, 0x40, 0x1f, 0x00, 0x4d, 0x4e, 0x40, 0x1c, 0x1d, 0x00, + 0x4c, 0x4e, 0x40, 0x19, 0x1a, 0x00, 0x4c, 0x2f, 0x4e, 0x01, 0x4d, 0x40, 0x1f, 0x00, 0x4d, 0x4d, + 0x40, 0x1c, 0x1d, 0x00, 0x4c, 0x4d, 0x40, 0x19, 0x1a, 0x00, 0x4c, 0x2f, 0x4d, 0x01, 0x4c, 0x40, + 0x1f, 0x00, 0x4d, 0x4c, 0x40, 0x1c, 0x1d, 0x00, 0x4c, 0x4c, 0x40, 0x19, 0x1a, 0x00, 0x4c, 0x2f, + 0x4c, 0x01, 0x3b, 0xb8, 0xff, 0xc0, 0x40, 0x25, 0x19, 0x00, 0x4d, 0x00, 0x3a, 0x01, 0x21, 0x40, + 0x1b, 0x00, 0x4d, 0x53, 0x51, 0x50, 0x51, 0xaf, 0x52, 0x53, 0x14, 0x52, 0x52, 0x53, 0x50, 0x55, + 0x1e, 0x3c, 0x7c, 0x2b, 0x55, 0x52, 0x54, 0x42, 0x7c, 0x1b, 0x23, 0x54, 0x15, 0xb8, 0xff, 0xc0, + 0xb3, 0x22, 0x00, 0x4d, 0x15, 0xb8, 0xff, 0xc0, 0x40, 0x46, 0x18, 0x00, 0x4d, 0x6f, 0x15, 0x01, + 0x15, 0x7c, 0xa0, 0x2f, 0xb0, 0x2f, 0x02, 0x2f, 0x34, 0x7c, 0x00, 0x6f, 0x10, 0x01, 0x10, 0x7c, + 0x4a, 0x44, 0x7c, 0x06, 0x00, 0x54, 0x53, 0x04, 0x52, 0x0c, 0x51, 0x0c, 0x50, 0x04, 0x3a, 0x80, + 0x20, 0x20, 0x26, 0x1b, 0x80, 0x2e, 0x0c, 0x3f, 0x80, 0x26, 0x9a, 0x47, 0x80, 0x32, 0x32, 0x0b, + 0x37, 0x80, 0x30, 0x18, 0x01, 0x30, 0x18, 0x60, 0x18, 0x02, 0x18, 0x9d, 0x4d, 0x80, 0x0b, 0x05, + 0x00, 0x3f, 0xed, 0x3f, 0x5d, 0x71, 0xed, 0x12, 0x39, 0x10, 0xed, 0x3f, 0xed, 0x3f, 0xed, 0x12, + 0x39, 0x2f, 0xed, 0x3f, 0x3f, 0x3f, 0x3f, 0x01, 0x10, 0xd0, 0xd4, 0xfd, 0xd6, 0xed, 0x71, 0x10, + 0xfd, 0xd6, 0x5d, 0xed, 0x71, 0x2b, 0x2b, 0x10, 0xd4, 0xc4, 0xed, 0x10, 0xc6, 0x10, 0xd0, 0xfd, + 0xc5, 0x10, 0xc4, 0x87, 0x10, 0x2b, 0x87, 0x7d, 0xc4, 0x31, 0x30, 0x00, 0x2b, 0x71, 0x2b, 0x71, + 0x2b, 0x2b, 0x2b, 0x71, 0x2b, 0x2b, 0x2b, 0x71, 0x2b, 0x2b, 0x2b, 0x01, 0x2b, 0x2b, 0x2b, 0x2b, + 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x11, 0x34, 0x36, 0x37, 0x26, 0x26, 0x35, 0x34, 0x3e, 0x02, + 0x33, 0x32, 0x1e, 0x02, 0x15, 0x14, 0x06, 0x07, 0x16, 0x17, 0x16, 0x06, 0x23, 0x22, 0x26, 0x01, + 0x36, 0x36, 0x37, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x1e, 0x02, 0x15, 0x14, + 0x06, 0x23, 0x03, 0x34, 0x26, 0x27, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x13, 0x32, 0x37, + 0x26, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x01, 0x14, 0x16, 0x17, 0x36, 0x36, 0x35, 0x34, 0x26, + 0x23, 0x22, 0x06, 0x25, 0x01, 0x23, 0x01, 0x12, 0x15, 0x0e, 0x10, 0x13, 0x1e, 0x27, 0x14, 0x14, + 0x27, 0x1e, 0x13, 0x0e, 0x11, 0x25, 0x02, 0x01, 0x36, 0x40, 0x33, 0x41, 0x01, 0x20, 0x31, 0x3c, + 0x0f, 0x0e, 0x0c, 0x35, 0x31, 0x36, 0x34, 0x15, 0x27, 0x1f, 0x13, 0x65, 0x67, 0x8c, 0x23, 0x18, + 0x14, 0x18, 0x0f, 0x0f, 0x19, 0xeb, 0x12, 0x12, 0x02, 0x19, 0x0e, 0x0e, 0x0f, 0xfe, 0xf1, 0x12, + 0x19, 0x08, 0x0b, 0x13, 0x0c, 0x0a, 0x15, 0x01, 0x7b, 0xfe, 0xc3, 0x64, 0x01, 0x3d, 0x01, 0xbb, + 0x0f, 0x21, 0x0c, 0x0a, 0x1c, 0x14, 0x12, 0x1b, 0x12, 0x09, 0x09, 0x11, 0x1a, 0x11, 0x11, 0x1c, + 0x0b, 0x14, 0x2b, 0x1e, 0x30, 0x26, 0xfe, 0xa6, 0x03, 0x09, 0x11, 0x03, 0x29, 0x27, 0x2a, 0x34, + 0x0d, 0x1b, 0x29, 0x1c, 0x52, 0x4d, 0x01, 0xc8, 0x0b, 0x0c, 0x07, 0x0b, 0x13, 0x0b, 0x0a, 0x0a, + 0xfe, 0xdc, 0x05, 0x1f, 0x10, 0x0f, 0x0b, 0x1a, 0x01, 0x9f, 0x06, 0x0d, 0x08, 0x06, 0x0c, 0x08, + 0x08, 0x08, 0x06, 0x33, 0xfd, 0x95, 0x02, 0x6b, 0x00, 0x02, 0x00, 0x1d, 0xff, 0xf5, 0x01, 0xc5, + 0x02, 0xb5, 0x00, 0x20, 0x00, 0x30, 0x00, 0x4f, 0x40, 0x32, 0x03, 0x40, 0x0d, 0x00, 0x4d, 0x02, + 0x40, 0x0d, 0x00, 0x4d, 0x01, 0x40, 0x0d, 0x00, 0x4d, 0x00, 0x40, 0x0d, 0x00, 0x4d, 0x2e, 0x64, + 0x1e, 0x64, 0x00, 0x0c, 0x10, 0x0c, 0x02, 0x0c, 0x32, 0x26, 0x64, 0x04, 0x16, 0x31, 0x1b, 0x74, + 0x21, 0x21, 0x07, 0x29, 0x74, 0x11, 0x07, 0x03, 0x00, 0x74, 0x07, 0x9f, 0x00, 0x3f, 0xfd, 0xc6, + 0x3f, 0xed, 0x12, 0x39, 0x2f, 0xed, 0x01, 0x10, 0xd6, 0xc4, 0xed, 0x10, 0xd6, 0x5d, 0xed, 0xed, + 0x31, 0x30, 0x00, 0x2b, 0x2b, 0x2b, 0x2b, 0x13, 0x22, 0x06, 0x07, 0x27, 0x36, 0x36, 0x33, 0x32, + 0x1e, 0x02, 0x15, 0x14, 0x0e, 0x02, 0x23, 0x22, 0x2e, 0x02, 0x35, 0x34, 0x3e, 0x02, 0x33, 0x32, + 0x16, 0x17, 0x26, 0x26, 0x07, 0x22, 0x0e, 0x02, 0x15, 0x14, 0x16, 0x33, 0x32, 0x3e, 0x02, 0x37, + 0x26, 0x26, 0xc0, 0x17, 0x2d, 0x1f, 0x10, 0x27, 0x3c, 0x1f, 0x4d, 0x60, 0x36, 0x13, 0x18, 0x37, + 0x5b, 0x42, 0x27, 0x45, 0x33, 0x1d, 0x1e, 0x38, 0x4f, 0x31, 0x1c, 0x2e, 0x15, 0x04, 0x4e, 0x0a, + 0x1d, 0x28, 0x1a, 0x0c, 0x2b, 0x23, 0x20, 0x2d, 0x1d, 0x0e, 0x02, 0x14, 0x36, 0x02, 0x4f, 0x08, + 0x0b, 0x5f, 0x10, 0x0a, 0x3b, 0x61, 0x7d, 0x42, 0x3f, 0x7f, 0x66, 0x41, 0x1d, 0x36, 0x4f, 0x33, + 0x39, 0x5f, 0x43, 0x25, 0x0d, 0x0d, 0x48, 0x57, 0xee, 0x1a, 0x2a, 0x35, 0x1c, 0x35, 0x38, 0x24, + 0x3e, 0x54, 0x30, 0x0e, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x09, 0x00, 0x00, 0x01, 0xeb, + 0x02, 0x6b, 0x00, 0x07, 0x00, 0x0e, 0x00, 0x40, 0xb5, 0x0e, 0x20, 0x13, 0x00, 0x4d, 0x09, 0xb8, + 0xff, 0xe0, 0x40, 0x1a, 0x13, 0x00, 0x4d, 0x01, 0x0a, 0x0f, 0x0d, 0x06, 0x10, 0x08, 0x08, 0x0f, + 0x04, 0x10, 0x03, 0x00, 0x0f, 0x07, 0x08, 0x04, 0x02, 0x0c, 0x0b, 0x48, 0x00, 0x08, 0x00, 0x3f, + 0xfd, 0xc0, 0x3f, 0x3f, 0x01, 0x10, 0xd6, 0xc5, 0x10, 0xc4, 0x12, 0x39, 0x3d, 0x2f, 0x12, 0x39, + 0x39, 0x12, 0x39, 0x39, 0x31, 0x30, 0x2b, 0x2b, 0x33, 0x36, 0x12, 0x37, 0x33, 0x16, 0x12, 0x17, + 0x03, 0x06, 0x06, 0x07, 0x33, 0x26, 0x26, 0x09, 0x2c, 0x5a, 0x2a, 0x86, 0x2c, 0x57, 0x29, 0xf2, + 0x1a, 0x2c, 0x17, 0xb6, 0x17, 0x28, 0xb7, 0x01, 0x2d, 0x87, 0x88, 0xfe, 0xcf, 0xb2, 0x01, 0xf3, + 0x5a, 0xc3, 0x70, 0x71, 0xc4, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x28, 0xff, 0x9f, 0x01, 0xcb, + 0x02, 0x6b, 0x00, 0x07, 0x00, 0x28, 0x40, 0x0b, 0x00, 0x6e, 0x03, 0x04, 0x6e, 0xc0, 0x07, 0xd0, + 0x07, 0x02, 0x07, 0xb8, 0xff, 0xc0, 0x40, 0x09, 0x0d, 0x10, 0x48, 0x07, 0x08, 0x07, 0x02, 0x05, + 0x87, 0x00, 0x3f, 0x3f, 0x01, 0x10, 0xd6, 0x2b, 0x5d, 0xfd, 0xd6, 0xed, 0x31, 0x30, 0x01, 0x11, + 0x23, 0x11, 0x23, 0x11, 0x23, 0x11, 0x01, 0xcb, 0x7b, 0xad, 0x7b, 0x02, 0x6b, 0xfd, 0x34, 0x02, + 0x66, 0xfd, 0x9a, 0x02, 0xcc, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x1f, 0xff, 0x9f, 0x01, 0xd0, + 0x02, 0x6b, 0x00, 0x17, 0x00, 0x2f, 0x40, 0x17, 0x12, 0x07, 0x19, 0x00, 0x44, 0x0c, 0x60, 0x0f, + 0x01, 0x0f, 0x08, 0x18, 0x00, 0x00, 0x06, 0x12, 0x48, 0x10, 0x02, 0x06, 0x48, 0x08, 0x87, 0x00, + 0x3f, 0xed, 0x3f, 0xed, 0x11, 0x39, 0x3d, 0x2f, 0x01, 0x18, 0x10, 0xc6, 0xd6, 0x5d, 0xd5, 0xed, + 0x10, 0xc6, 0xc6, 0x31, 0x30, 0x01, 0x0e, 0x03, 0x07, 0x21, 0x15, 0x21, 0x35, 0x36, 0x36, 0x37, + 0x26, 0x26, 0x27, 0x35, 0x21, 0x15, 0x21, 0x1e, 0x03, 0x01, 0x54, 0x14, 0x2c, 0x2c, 0x2b, 0x12, + 0x01, 0x25, 0xfe, 0x4f, 0x2c, 0x60, 0x2e, 0x2f, 0x5c, 0x2c, 0x01, 0xae, 0xfe, 0xe2, 0x13, 0x2a, + 0x2a, 0x29, 0x01, 0x0e, 0x1b, 0x43, 0x47, 0x46, 0x1f, 0x65, 0x47, 0x51, 0x9a, 0x40, 0x42, 0x8c, + 0x48, 0x44, 0x66, 0x1e, 0x41, 0x40, 0x3e, 0x00, 0x00, 0x01, 0x00, 0x09, 0x00, 0x00, 0x01, 0xeb, + 0x02, 0x79, 0x00, 0x27, 0x00, 0x77, 0xb9, 0x00, 0x21, 0xff, 0xc0, 0xb3, 0x12, 0x00, 0x4d, 0x21, + 0xb8, 0xff, 0xc0, 0x40, 0x48, 0x0b, 0x0c, 0x00, 0x4c, 0x11, 0x40, 0x12, 0x00, 0x4d, 0x11, 0x40, + 0x0b, 0x0c, 0x00, 0x4c, 0x10, 0x40, 0x12, 0x00, 0x4d, 0x10, 0x40, 0x0b, 0x0c, 0x00, 0x4c, 0x29, + 0x0e, 0x0a, 0x46, 0x0f, 0x10, 0x1f, 0x10, 0x02, 0x10, 0xaf, 0x14, 0xbf, 0x14, 0x02, 0x30, 0x14, + 0x01, 0x14, 0x00, 0x22, 0x10, 0x22, 0x02, 0x22, 0x1e, 0x46, 0x00, 0x24, 0x28, 0x25, 0x48, 0x23, + 0x08, 0x22, 0x08, 0x10, 0x08, 0x0d, 0x48, 0x0f, 0x08, 0x19, 0x4a, 0x05, 0x03, 0x00, 0x3f, 0xed, + 0x3f, 0xed, 0x3f, 0x3f, 0x3f, 0xed, 0x01, 0x10, 0xd6, 0xd6, 0xfd, 0xc4, 0x5d, 0xd6, 0x5d, 0x5d, + 0xc4, 0x5d, 0xfd, 0xd6, 0xc6, 0x31, 0x30, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x13, 0x34, 0x3e, + 0x02, 0x33, 0x32, 0x1e, 0x02, 0x15, 0x14, 0x06, 0x07, 0x33, 0x15, 0x23, 0x35, 0x36, 0x36, 0x35, + 0x34, 0x2e, 0x02, 0x23, 0x22, 0x0e, 0x02, 0x15, 0x14, 0x16, 0x17, 0x15, 0x23, 0x35, 0x33, 0x26, + 0x26, 0x0e, 0x29, 0x42, 0x55, 0x2d, 0x2c, 0x55, 0x43, 0x29, 0x24, 0x2a, 0x51, 0xd7, 0x22, 0x35, + 0x0b, 0x19, 0x2b, 0x20, 0x20, 0x2b, 0x1b, 0x0b, 0x31, 0x26, 0xd9, 0x54, 0x2a, 0x25, 0x01, 0x62, + 0x4b, 0x6a, 0x43, 0x1f, 0x1f, 0x43, 0x6a, 0x4b, 0x42, 0x7e, 0x3c, 0x66, 0x57, 0x29, 0x77, 0x50, + 0x27, 0x47, 0x38, 0x21, 0x21, 0x38, 0x47, 0x27, 0x50, 0x77, 0x29, 0x57, 0x66, 0x3c, 0x81, 0x00, + 0x00, 0x01, 0x00, 0x28, 0x00, 0xd4, 0x01, 0xcc, 0x01, 0x39, 0x00, 0x03, 0x00, 0x15, 0xb7, 0x01, + 0x05, 0x03, 0x04, 0x02, 0x55, 0x00, 0xa1, 0x00, 0x3f, 0xed, 0x01, 0x7c, 0x2f, 0x18, 0xc6, 0x10, + 0xce, 0x31, 0x30, 0x13, 0x21, 0x15, 0x21, 0x28, 0x01, 0xa4, 0xfe, 0x5c, 0x01, 0x39, 0x65, 0x00, + 0xff, 0xff, 0x00, 0x19, 0x00, 0x00, 0x01, 0xda, 0x02, 0x6b, 0x02, 0x06, 0x01, 0x6e, 0x00, 0x00, + 0x00, 0x01, 0x00, 0xa7, 0x00, 0xc5, 0x01, 0x4d, 0x01, 0x6a, 0x00, 0x0b, 0x00, 0x12, 0xb7, 0x00, + 0x71, 0x06, 0x0c, 0x03, 0x75, 0x09, 0xa2, 0x00, 0x3f, 0xed, 0x01, 0x10, 0xd6, 0xed, 0x31, 0x30, + 0x01, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x01, 0x4d, 0x33, 0x20, + 0x20, 0x33, 0x33, 0x20, 0x20, 0x33, 0x01, 0x18, 0x27, 0x2c, 0x2c, 0x27, 0x26, 0x2c, 0x2c, 0x00, + 0x00, 0x01, 0x00, 0x09, 0xff, 0xf3, 0x01, 0xec, 0x02, 0xbb, 0x00, 0x0c, 0x00, 0x46, 0x40, 0x29, + 0x0b, 0x40, 0x0d, 0x00, 0x4d, 0x09, 0x40, 0x0d, 0x00, 0x4d, 0x0c, 0x20, 0x1a, 0x00, 0x4d, 0x07, + 0x79, 0x08, 0x00, 0x06, 0x6e, 0x05, 0x00, 0x0d, 0x0c, 0x72, 0x00, 0x04, 0x0b, 0x00, 0x01, 0x01, + 0x00, 0x0b, 0x04, 0x04, 0x06, 0x07, 0x0d, 0x06, 0x10, 0x00, 0x3f, 0x3f, 0x12, 0x17, 0x39, 0x2f, + 0x2f, 0x2f, 0x2f, 0x10, 0xed, 0x01, 0x10, 0xd6, 0xd6, 0xed, 0x10, 0xd4, 0xed, 0x31, 0x30, 0x00, + 0x2b, 0x01, 0x2b, 0x2b, 0x13, 0x37, 0x16, 0x16, 0x17, 0x13, 0x33, 0x03, 0x23, 0x26, 0x26, 0x27, + 0x07, 0x09, 0xa3, 0x10, 0x26, 0x0e, 0x7e, 0x7e, 0xc2, 0x66, 0x14, 0x36, 0x16, 0x3c, 0x01, 0x40, + 0x36, 0x28, 0x68, 0x2c, 0x02, 0x01, 0xfd, 0x38, 0x42, 0x88, 0x35, 0x13, 0x00, 0x03, 0x00, 0x0e, + 0x00, 0x78, 0x01, 0xe6, 0x01, 0x95, 0x00, 0x0c, 0x00, 0x2c, 0x00, 0x3a, 0x00, 0x37, 0x40, 0x20, + 0x25, 0xa4, 0x06, 0x30, 0x0c, 0x01, 0x80, 0x0c, 0x90, 0x0c, 0x02, 0x0c, 0xa4, 0x3a, 0x33, 0xa4, + 0x15, 0x3b, 0x2a, 0xa5, 0x03, 0x09, 0xa5, 0x20, 0xa3, 0x10, 0xa5, 0x36, 0x30, 0xa5, 0x1a, 0xa3, + 0x00, 0x3f, 0xfd, 0xd6, 0xed, 0x3f, 0xfd, 0xd6, 0xed, 0x01, 0x10, 0xd6, 0xfd, 0xd6, 0xfd, 0x5d, + 0x71, 0xd6, 0xed, 0x31, 0x30, 0x25, 0x16, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, + 0x0f, 0x02, 0x06, 0x06, 0x23, 0x22, 0x2e, 0x02, 0x35, 0x34, 0x3e, 0x02, 0x33, 0x32, 0x16, 0x17, + 0x36, 0x36, 0x33, 0x32, 0x1e, 0x02, 0x15, 0x14, 0x0e, 0x02, 0x23, 0x22, 0x26, 0x27, 0x26, 0x26, + 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x37, 0x01, 0x2f, 0x0e, 0x18, 0x0e, + 0x15, 0x14, 0x13, 0x15, 0x1f, 0x19, 0x05, 0x2d, 0x14, 0x33, 0x24, 0x16, 0x2e, 0x25, 0x18, 0x18, + 0x25, 0x2e, 0x16, 0x24, 0x38, 0x0f, 0x14, 0x33, 0x24, 0x16, 0x2d, 0x26, 0x18, 0x18, 0x26, 0x2d, + 0x16, 0x24, 0x37, 0x45, 0x0e, 0x18, 0x0d, 0x16, 0x14, 0x13, 0x15, 0x0f, 0x1c, 0x0d, 0x05, 0xfa, + 0x15, 0x10, 0x1f, 0x13, 0x13, 0x1f, 0x2a, 0x08, 0x50, 0x1b, 0x24, 0x11, 0x23, 0x36, 0x25, 0x25, + 0x35, 0x23, 0x11, 0x29, 0x16, 0x1b, 0x24, 0x11, 0x23, 0x35, 0x25, 0x25, 0x36, 0x23, 0x11, 0x29, + 0x72, 0x15, 0x11, 0x1f, 0x13, 0x13, 0x1f, 0x13, 0x16, 0x09, 0x00, 0x00, 0x00, 0x01, 0x00, 0x31, + 0xff, 0x5b, 0x01, 0xc4, 0x02, 0xb6, 0x00, 0x1b, 0x00, 0x4f, 0xb9, 0x00, 0x09, 0xff, 0xc0, 0xb3, + 0x19, 0x00, 0x4d, 0x08, 0xb8, 0xff, 0xc0, 0x40, 0x19, 0x19, 0x00, 0x4d, 0x90, 0x08, 0x01, 0x2f, + 0x08, 0x3f, 0x08, 0x02, 0x08, 0x1d, 0x0d, 0x51, 0x90, 0x00, 0x01, 0x0f, 0x00, 0x1f, 0x00, 0x02, + 0x00, 0x17, 0xb8, 0xff, 0xc0, 0x40, 0x0d, 0x0b, 0x0e, 0x48, 0x17, 0x1c, 0x18, 0x57, 0x11, 0x12, + 0x0a, 0x57, 0x03, 0xa6, 0x00, 0x3f, 0xed, 0x3f, 0xed, 0x01, 0x10, 0xd6, 0x2b, 0xd6, 0x5d, 0x5d, + 0xed, 0x10, 0xc6, 0x5d, 0x5d, 0x31, 0x30, 0x2b, 0x2b, 0x13, 0x34, 0x36, 0x33, 0x32, 0x32, 0x16, + 0x16, 0x17, 0x15, 0x23, 0x22, 0x06, 0x15, 0x11, 0x14, 0x06, 0x23, 0x22, 0x22, 0x26, 0x26, 0x23, + 0x35, 0x33, 0x32, 0x36, 0x35, 0xbc, 0x5b, 0x65, 0x01, 0x11, 0x16, 0x18, 0x08, 0x46, 0x26, 0x1f, + 0x5b, 0x65, 0x01, 0x11, 0x16, 0x18, 0x08, 0x46, 0x26, 0x1f, 0x01, 0xed, 0x61, 0x68, 0x01, 0x01, + 0x01, 0x6b, 0x2c, 0x24, 0xfe, 0x2c, 0x61, 0x68, 0x01, 0x01, 0x6d, 0x2c, 0x24, 0x00, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x15, 0x00, 0x3e, 0x01, 0xe7, 0x01, 0xcf, 0x02, 0x36, 0x00, 0x61, 0x00, 0x6b, + 0x00, 0x06, 0x00, 0x61, 0x00, 0x93, 0x00, 0x00, 0x00, 0x01, 0x00, 0x28, 0xff, 0xf9, 0x01, 0xcc, + 0x02, 0x12, 0x00, 0x13, 0x00, 0x3d, 0x40, 0x25, 0x03, 0x04, 0x02, 0x07, 0x01, 0x08, 0x12, 0x0b, + 0x11, 0x0c, 0x0e, 0x0d, 0x0c, 0x14, 0x15, 0x10, 0x13, 0x14, 0x0c, 0x08, 0x0e, 0x0a, 0x72, 0x11, + 0x09, 0x12, 0x06, 0x72, 0x01, 0x4f, 0x04, 0x5f, 0x04, 0x02, 0x04, 0x02, 0xa7, 0x00, 0x3f, 0xd5, + 0x5d, 0x32, 0xfd, 0x32, 0xd6, 0x32, 0xed, 0x32, 0x3f, 0x01, 0x10, 0xd6, 0xc0, 0x11, 0x12, 0x17, + 0x39, 0x31, 0x30, 0x13, 0x33, 0x37, 0x17, 0x07, 0x33, 0x15, 0x23, 0x07, 0x33, 0x15, 0x23, 0x07, + 0x27, 0x37, 0x23, 0x35, 0x33, 0x37, 0x23, 0x28, 0xf0, 0x40, 0x4b, 0x29, 0x52, 0x88, 0x31, 0xb9, + 0xef, 0x3f, 0x4b, 0x2a, 0x55, 0x8b, 0x31, 0xbc, 0x01, 0x9b, 0x77, 0x29, 0x4e, 0x66, 0x5d, 0x66, + 0x79, 0x29, 0x50, 0x66, 0x5d, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x2c, 0x00, 0x00, 0x01, 0xcf, + 0x02, 0x2e, 0x00, 0x06, 0x00, 0x0a, 0x00, 0x47, 0x40, 0x29, 0x05, 0x20, 0x0a, 0x0b, 0x00, 0x4c, + 0x04, 0x02, 0x06, 0x08, 0x30, 0x07, 0x50, 0x07, 0x70, 0x07, 0x90, 0x07, 0x04, 0x07, 0x0b, 0x06, + 0x04, 0x05, 0x03, 0x08, 0x00, 0x02, 0x01, 0x03, 0x03, 0x01, 0x40, 0x08, 0x01, 0x08, 0x72, 0x09, + 0x04, 0x01, 0xa8, 0x00, 0x3f, 0x3f, 0xed, 0x5d, 0x11, 0x39, 0x3d, 0x2f, 0x12, 0x39, 0x39, 0x12, + 0x17, 0x39, 0x01, 0x18, 0x10, 0xd6, 0x5d, 0xc5, 0xd6, 0xc4, 0xc5, 0x31, 0x30, 0x00, 0x2b, 0x13, + 0x25, 0x17, 0x05, 0x05, 0x07, 0x25, 0x07, 0x21, 0x15, 0x21, 0x2d, 0x01, 0x80, 0x22, 0xfe, 0xe8, + 0x01, 0x18, 0x22, 0xfe, 0x80, 0x01, 0x01, 0xa3, 0xfe, 0x5d, 0x01, 0x95, 0x99, 0x6c, 0x64, 0x64, + 0x6c, 0x99, 0xc1, 0x66, 0x00, 0x02, 0x00, 0x2c, 0x00, 0x00, 0x01, 0xcf, 0x02, 0x2d, 0x00, 0x06, + 0x00, 0x0a, 0x00, 0x56, 0xb9, 0x00, 0x05, 0xff, 0xe0, 0x40, 0x2f, 0x13, 0x14, 0x00, 0x4c, 0x01, + 0x20, 0x09, 0x0b, 0x00, 0x4c, 0x06, 0x04, 0x07, 0x00, 0x02, 0x09, 0x30, 0x07, 0x50, 0x07, 0x70, + 0x07, 0x90, 0x07, 0x04, 0x07, 0x0b, 0x00, 0x02, 0x01, 0x03, 0x07, 0x06, 0x04, 0x05, 0x03, 0x03, + 0x05, 0x40, 0x07, 0x01, 0x07, 0x72, 0x0a, 0x04, 0x05, 0xa8, 0x00, 0x3f, 0x3f, 0xed, 0x5d, 0x11, + 0x39, 0x3d, 0x2f, 0x12, 0x39, 0x39, 0x12, 0x17, 0x39, 0x01, 0x18, 0x10, 0xd6, 0x5d, 0xc5, 0xd0, + 0xc5, 0x10, 0xd0, 0xc5, 0x31, 0x30, 0x00, 0x2b, 0x01, 0x2b, 0x01, 0x05, 0x27, 0x25, 0x25, 0x37, + 0x05, 0x01, 0x21, 0x15, 0x21, 0x01, 0xcf, 0xfe, 0x80, 0x23, 0x01, 0x18, 0xfe, 0xe8, 0x23, 0x01, + 0x80, 0xfe, 0x5d, 0x01, 0xa3, 0xfe, 0x5d, 0x01, 0x26, 0x99, 0x6c, 0x64, 0x64, 0x6c, 0x98, 0xfe, + 0xd1, 0x66, 0x00, 0x00, 0x00, 0x02, 0x00, 0x19, 0xff, 0xf1, 0x01, 0xd9, 0x02, 0x7b, 0x00, 0x0d, + 0x00, 0x18, 0x00, 0x8c, 0x40, 0x0a, 0x70, 0x15, 0x01, 0x70, 0x11, 0x01, 0x70, 0x0e, 0x01, 0x0b, + 0xb8, 0xff, 0xe0, 0xb3, 0x17, 0x00, 0x4d, 0x0b, 0xb8, 0xff, 0xe0, 0xb3, 0x0c, 0x00, 0x4d, 0x0b, + 0xb8, 0xff, 0xf8, 0x40, 0x3f, 0x0b, 0x00, 0x4d, 0x66, 0x0b, 0x01, 0x05, 0x20, 0x17, 0x00, 0x4d, + 0x05, 0x18, 0x0c, 0x00, 0x4d, 0x05, 0x10, 0x0b, 0x00, 0x4d, 0x69, 0x05, 0x01, 0x10, 0x16, 0x13, + 0x0e, 0x20, 0x00, 0x01, 0x70, 0x08, 0x01, 0x00, 0x13, 0x0e, 0x08, 0x08, 0x0e, 0x13, 0x00, 0x04, + 0x19, 0x1a, 0x10, 0x16, 0x0e, 0x13, 0x08, 0x00, 0x16, 0x00, 0x08, 0x13, 0x0e, 0x10, 0x06, 0x05, + 0x0b, 0x00, 0x05, 0x9e, 0x00, 0x3f, 0x3f, 0x12, 0x17, 0x39, 0x3d, 0x2f, 0x2f, 0x2f, 0x2f, 0x18, + 0x2f, 0x2f, 0x01, 0x11, 0x12, 0x17, 0x39, 0x2f, 0x2f, 0x2f, 0x2f, 0x5d, 0x71, 0x11, 0x12, 0x39, + 0x39, 0x31, 0x30, 0x00, 0x5d, 0x2b, 0x2b, 0x2b, 0x5d, 0x2b, 0x2b, 0x2b, 0x01, 0x5d, 0x5d, 0x5d, + 0x13, 0x3e, 0x03, 0x37, 0x16, 0x16, 0x17, 0x06, 0x06, 0x07, 0x26, 0x26, 0x37, 0x26, 0x27, 0x06, + 0x06, 0x07, 0x16, 0x16, 0x17, 0x36, 0x36, 0x19, 0x1f, 0x3b, 0x37, 0x36, 0x1a, 0x34, 0x6d, 0x3e, + 0x3e, 0x6d, 0x34, 0x35, 0x6e, 0xfc, 0x2b, 0x2e, 0x16, 0x2f, 0x16, 0x16, 0x2e, 0x17, 0x19, 0x2b, + 0x01, 0x36, 0x31, 0x56, 0x50, 0x4a, 0x24, 0x49, 0x9b, 0x61, 0x62, 0x9a, 0x49, 0x48, 0x9b, 0x62, + 0x53, 0x3f, 0x1f, 0x49, 0x2a, 0x2a, 0x46, 0x23, 0x23, 0x46, 0x00, 0x00, 0x00, 0x03, 0x00, 0x12, + 0x00, 0x00, 0x01, 0xe0, 0x02, 0xb5, 0x00, 0x03, 0x00, 0x0f, 0x00, 0x2b, 0x00, 0x5a, 0x40, 0x38, + 0x0a, 0x40, 0x0b, 0x00, 0x4d, 0x0a, 0x54, 0xcf, 0x04, 0x01, 0x04, 0x2d, 0x20, 0x03, 0x01, 0x03, + 0x51, 0x02, 0x1a, 0x1c, 0x20, 0x19, 0x30, 0x19, 0x40, 0x19, 0x03, 0x19, 0x51, 0x1f, 0x22, 0x21, + 0x2c, 0x13, 0x57, 0x28, 0x01, 0x20, 0x55, 0x23, 0x0a, 0x22, 0x1d, 0x02, 0x1c, 0x55, 0x1a, 0x0a, + 0x07, 0x58, 0x0d, 0x01, 0x02, 0x0a, 0x01, 0x02, 0x00, 0x3f, 0x3f, 0x3f, 0xed, 0x3f, 0xed, 0x3f, + 0x2f, 0x3f, 0xec, 0x3f, 0xed, 0x01, 0x10, 0xd6, 0xd5, 0x32, 0xfd, 0x5d, 0x32, 0xd5, 0xd6, 0xfd, + 0x5d, 0xc6, 0xd4, 0x5d, 0xed, 0x2b, 0x31, 0x30, 0x21, 0x23, 0x11, 0x33, 0x37, 0x14, 0x06, 0x23, + 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x07, 0x26, 0x22, 0x23, 0x22, 0x0e, 0x02, 0x15, + 0x15, 0x33, 0x15, 0x23, 0x11, 0x23, 0x11, 0x23, 0x35, 0x33, 0x35, 0x34, 0x3e, 0x02, 0x33, 0x32, + 0x16, 0x17, 0x01, 0xcb, 0x72, 0x72, 0x15, 0x2b, 0x20, 0x20, 0x2a, 0x2a, 0x20, 0x20, 0x2b, 0xc2, + 0x0a, 0x0f, 0x06, 0x16, 0x1b, 0x0f, 0x05, 0x56, 0x56, 0x73, 0x35, 0x35, 0x11, 0x28, 0x41, 0x30, + 0x15, 0x1a, 0x11, 0x01, 0xd6, 0x87, 0x25, 0x29, 0x29, 0x25, 0x26, 0x29, 0x29, 0x41, 0x02, 0x0d, + 0x17, 0x20, 0x13, 0x17, 0x66, 0xfe, 0x90, 0x01, 0x70, 0x66, 0x19, 0x2d, 0x4a, 0x33, 0x1c, 0x03, + 0x03, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x12, 0x00, 0x00, 0x01, 0xe0, 0x02, 0xb5, 0x02, 0x06, + 0x01, 0xaa, 0x00, 0x00, 0x00, 0x02, 0x00, 0x12, 0xff, 0xf7, 0x01, 0xf4, 0x02, 0xb5, 0x00, 0x0b, + 0x00, 0x27, 0x00, 0x7c, 0x40, 0x37, 0x0b, 0x40, 0x09, 0x00, 0x4d, 0x00, 0x40, 0x09, 0x00, 0x4d, + 0x00, 0x0b, 0x01, 0x0b, 0x29, 0x20, 0x07, 0x30, 0x07, 0x50, 0x07, 0x03, 0x07, 0x51, 0x06, 0x40, + 0x0d, 0x00, 0x4d, 0x5f, 0x06, 0x01, 0x40, 0x06, 0x01, 0x06, 0x0f, 0x27, 0x01, 0x27, 0x1e, 0x18, + 0x16, 0x20, 0x15, 0x30, 0x15, 0x40, 0x15, 0x03, 0x15, 0x51, 0x1b, 0x1e, 0x1d, 0xb8, 0xff, 0xc0, + 0x40, 0x19, 0x1c, 0x22, 0x48, 0x1d, 0x28, 0x0f, 0x57, 0x24, 0x01, 0x1b, 0x55, 0x1d, 0x0a, 0x19, + 0x02, 0x18, 0x55, 0x16, 0x0a, 0x07, 0x00, 0x0b, 0x57, 0x00, 0x07, 0x00, 0x3f, 0xed, 0x3f, 0x3f, + 0xed, 0x3f, 0x3f, 0xed, 0x3f, 0xed, 0x01, 0x10, 0xd6, 0x2b, 0xd5, 0x32, 0xfd, 0x5d, 0xc5, 0x33, + 0x10, 0xd5, 0x5d, 0xd6, 0x5d, 0x5d, 0x2b, 0xed, 0x5d, 0x10, 0xc0, 0x5d, 0x31, 0x30, 0x2b, 0x2b, + 0x05, 0x2e, 0x03, 0x35, 0x11, 0x37, 0x11, 0x14, 0x16, 0x17, 0x03, 0x26, 0x22, 0x23, 0x22, 0x0e, + 0x02, 0x15, 0x15, 0x33, 0x15, 0x23, 0x11, 0x23, 0x11, 0x23, 0x35, 0x33, 0x35, 0x34, 0x3e, 0x02, + 0x33, 0x32, 0x16, 0x17, 0x01, 0xe1, 0x30, 0x39, 0x1f, 0x0a, 0x72, 0x11, 0x22, 0xd6, 0x0a, 0x0f, + 0x06, 0x16, 0x1b, 0x0f, 0x05, 0x56, 0x56, 0x73, 0x35, 0x35, 0x11, 0x28, 0x41, 0x30, 0x15, 0x1a, + 0x11, 0x09, 0x03, 0x1b, 0x2a, 0x39, 0x22, 0x02, 0x06, 0x15, 0xfe, 0x00, 0x23, 0x29, 0x04, 0x01, + 0xdd, 0x02, 0x0d, 0x17, 0x20, 0x13, 0x17, 0x66, 0xfe, 0x90, 0x01, 0x70, 0x66, 0x19, 0x2d, 0x4a, + 0x33, 0x1c, 0x03, 0x03, 0xff, 0xff, 0x00, 0x12, 0xff, 0xf7, 0x01, 0xf4, 0x02, 0xb5, 0x02, 0x06, + 0x01, 0xac, 0x00, 0x00, 0xff, 0xff, 0x00, 0x66, 0x01, 0x72, 0x01, 0x8f, 0x02, 0xe4, 0x02, 0x06, + 0x01, 0x6f, 0x00, 0x6b, 0xff, 0xff, 0x00, 0x81, 0x01, 0x79, 0x01, 0xa6, 0x02, 0xdd, 0x02, 0x06, + 0x00, 0x94, 0x00, 0x6b, 0xff, 0xff, 0x00, 0x71, 0x01, 0x79, 0x01, 0x82, 0x02, 0xe4, 0x02, 0x06, + 0x00, 0x8d, 0x00, 0x6b, 0xff, 0xff, 0x00, 0x71, 0x01, 0x72, 0x01, 0x80, 0x02, 0xe4, 0x02, 0x06, + 0x00, 0x8e, 0x00, 0x6b, 0xff, 0xff, 0x00, 0x59, 0x01, 0x78, 0x01, 0x7d, 0x02, 0xdd, 0x02, 0x06, + 0x01, 0x70, 0x00, 0x6b, 0xff, 0xff, 0x00, 0x71, 0x01, 0x72, 0x01, 0x7c, 0x02, 0xdd, 0x02, 0x06, + 0x01, 0x71, 0x00, 0x6b, 0xff, 0xff, 0x00, 0x62, 0x01, 0x72, 0x01, 0x73, 0x02, 0xde, 0x02, 0x06, + 0x01, 0x72, 0x00, 0x6b, 0xff, 0xff, 0x00, 0x6b, 0x01, 0x79, 0x01, 0x7d, 0x02, 0xdd, 0x02, 0x06, + 0x01, 0x73, 0x00, 0x6b, 0xff, 0xff, 0x00, 0x6a, 0x01, 0x72, 0x01, 0x8a, 0x02, 0xe4, 0x02, 0x06, + 0x01, 0x74, 0x00, 0x6b, 0xff, 0xff, 0x00, 0x81, 0x01, 0x78, 0x01, 0x92, 0x02, 0xe4, 0x02, 0x06, + 0x01, 0x75, 0x00, 0x6b, 0xff, 0xff, 0x00, 0x66, 0xff, 0x90, 0x01, 0x8f, 0x01, 0x02, 0x02, 0x07, + 0x01, 0x6f, 0x00, 0x00, 0xfe, 0x89, 0x00, 0x00, 0xff, 0xff, 0x00, 0x81, 0xff, 0x97, 0x01, 0xa6, + 0x00, 0xfb, 0x02, 0x07, 0x00, 0x94, 0x00, 0x00, 0xfe, 0x89, 0x00, 0x00, 0xff, 0xff, 0x00, 0x71, + 0xff, 0x97, 0x01, 0x82, 0x01, 0x02, 0x02, 0x07, 0x00, 0x8d, 0x00, 0x00, 0xfe, 0x89, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x71, 0xff, 0x90, 0x01, 0x80, 0x01, 0x02, 0x02, 0x07, 0x00, 0x8e, 0x00, 0x00, + 0xfe, 0x89, 0x00, 0x00, 0xff, 0xff, 0x00, 0x59, 0xff, 0x96, 0x01, 0x7d, 0x00, 0xfb, 0x02, 0x07, + 0x01, 0x70, 0x00, 0x00, 0xfe, 0x89, 0x00, 0x00, 0xff, 0xff, 0x00, 0x71, 0xff, 0x90, 0x01, 0x7c, + 0x00, 0xfb, 0x02, 0x07, 0x01, 0x71, 0x00, 0x00, 0xfe, 0x89, 0x00, 0x00, 0xff, 0xff, 0x00, 0x62, + 0xff, 0x90, 0x01, 0x73, 0x00, 0xfc, 0x02, 0x07, 0x01, 0x72, 0x00, 0x00, 0xfe, 0x89, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x6b, 0xff, 0x97, 0x01, 0x7d, 0x00, 0xfb, 0x02, 0x07, 0x01, 0x73, 0x00, 0x00, + 0xfe, 0x89, 0x00, 0x00, 0xff, 0xff, 0x00, 0x6a, 0xff, 0x90, 0x01, 0x8a, 0x01, 0x02, 0x02, 0x07, + 0x01, 0x74, 0x00, 0x00, 0xfe, 0x89, 0x00, 0x00, 0xff, 0xff, 0x00, 0x81, 0xff, 0x96, 0x01, 0x92, + 0x01, 0x02, 0x02, 0x07, 0x01, 0x75, 0x00, 0x00, 0xfe, 0x89, 0x00, 0x00, 0x00, 0x01, 0x00, 0xc4, + 0x01, 0xdb, 0x01, 0x31, 0x02, 0xb5, 0x00, 0x03, 0x00, 0x10, 0xb5, 0x00, 0x03, 0x04, 0x01, 0x03, + 0x9f, 0x00, 0x3f, 0xc5, 0x01, 0x10, 0xd6, 0xc5, 0x31, 0x30, 0x01, 0x07, 0x23, 0x35, 0x01, 0x31, + 0x1e, 0x4f, 0x02, 0xb5, 0xda, 0xda, 0x00, 0x00, 0x00, 0x01, 0x00, 0xa4, 0xff, 0x56, 0x01, 0x50, + 0xff, 0xd3, 0x00, 0x0f, 0x00, 0x12, 0xb6, 0x03, 0x00, 0x0a, 0x10, 0x01, 0x06, 0x92, 0x00, 0x3f, + 0xc5, 0x01, 0x10, 0xd6, 0xde, 0xcd, 0x31, 0x30, 0x17, 0x33, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, + 0x26, 0x27, 0x35, 0x32, 0x3e, 0x02, 0x35, 0xee, 0x5f, 0x03, 0x3d, 0x38, 0x0e, 0x23, 0x06, 0x11, + 0x1b, 0x14, 0x0a, 0x2d, 0x11, 0x0e, 0x30, 0x2e, 0x05, 0x02, 0x3b, 0x02, 0x0b, 0x15, 0x12, 0x00, + 0x00, 0x01, 0x00, 0xa1, 0x02, 0x17, 0x01, 0x4d, 0x02, 0xc4, 0x00, 0x08, 0x00, 0x12, 0xb6, 0x05, + 0x00, 0x01, 0x09, 0x00, 0x04, 0x8a, 0x00, 0x3f, 0xc4, 0x01, 0x10, 0xd6, 0xd5, 0xce, 0x31, 0x30, + 0x01, 0x23, 0x26, 0x36, 0x37, 0x17, 0x06, 0x06, 0x15, 0x01, 0x16, 0x6d, 0x08, 0x42, 0x3e, 0x2c, + 0x1c, 0x1b, 0x02, 0x17, 0x4a, 0x53, 0x10, 0x3d, 0x11, 0x2b, 0x28, 0x00, 0x00, 0x01, 0x00, 0xc4, + 0x02, 0x0a, 0x01, 0x2f, 0x02, 0xb5, 0x00, 0x03, 0x00, 0x10, 0xb5, 0x00, 0x03, 0x04, 0x01, 0x03, + 0x9f, 0x00, 0x3f, 0xc5, 0x01, 0x10, 0xd6, 0xc5, 0x31, 0x30, 0x01, 0x07, 0x23, 0x35, 0x01, 0x2f, + 0x1e, 0x4d, 0x02, 0xb5, 0xab, 0xab, 0x00, 0x00, 0xff, 0xff, 0x00, 0x5e, 0xff, 0x81, 0x01, 0xa1, + 0x02, 0xf1, 0x02, 0x06, 0x00, 0x0b, 0x00, 0x2b, 0xff, 0xff, 0x00, 0x55, 0xff, 0x81, 0x01, 0x98, + 0x02, 0xf1, 0x02, 0x06, 0x00, 0x0c, 0x00, 0x2b, 0xff, 0xff, 0x00, 0x71, 0x00, 0xf8, 0x01, 0x83, + 0x01, 0x71, 0x02, 0x06, 0x00, 0x10, 0x00, 0x34, 0xff, 0xff, 0x00, 0x2f, 0xff, 0x85, 0x01, 0xc5, + 0x02, 0xe5, 0x02, 0x06, 0x00, 0x12, 0x00, 0x2a, 0xff, 0xff, 0x00, 0x12, 0xff, 0xb5, 0x01, 0xd4, + 0x02, 0xb5, 0x02, 0x06, 0x00, 0x23, 0x00, 0x3c, 0xff, 0xff, 0x00, 0x71, 0xff, 0x85, 0x01, 0x86, + 0x02, 0xe5, 0x02, 0x06, 0x00, 0x3e, 0x00, 0x2a, 0xff, 0xff, 0x00, 0x31, 0xff, 0x85, 0x01, 0xc7, + 0x02, 0xe5, 0x02, 0x06, 0x00, 0x3f, 0x00, 0x2a, 0xff, 0xff, 0x00, 0x6d, 0xff, 0x85, 0x01, 0x83, + 0x02, 0xe5, 0x02, 0x06, 0x00, 0x40, 0x00, 0x2a, 0xff, 0xff, 0x00, 0x3f, 0xff, 0x85, 0x01, 0xb5, + 0x02, 0xe5, 0x02, 0x06, 0x00, 0x5e, 0x00, 0x2a, 0xff, 0xff, 0x00, 0x3f, 0xff, 0x85, 0x01, 0xb5, + 0x02, 0xe5, 0x02, 0x06, 0x00, 0x60, 0x00, 0x2a, 0xff, 0xff, 0x00, 0x84, 0x00, 0x5e, 0x01, 0x7c, + 0x02, 0x0b, 0x02, 0x06, 0x00, 0x6c, 0x00, 0x37, 0xff, 0xff, 0x00, 0x72, 0x00, 0xa7, 0x01, 0x82, + 0x01, 0xc5, 0x02, 0x06, 0x00, 0x72, 0x00, 0xfc, 0xff, 0xff, 0x00, 0x36, 0x01, 0x07, 0x01, 0xbf, + 0x01, 0x63, 0x02, 0x06, 0x00, 0x73, 0x00, 0x2a, 0xff, 0xff, 0x00, 0x00, 0x01, 0x07, 0x01, 0xf4, + 0x01, 0x63, 0x02, 0x06, 0x00, 0x74, 0x00, 0x2a, 0xff, 0xff, 0x00, 0x9b, 0x00, 0x5e, 0x01, 0x93, + 0x02, 0x0b, 0x02, 0x06, 0x00, 0x78, 0x00, 0x37, 0xff, 0xff, 0x00, 0xa9, 0xff, 0xfa, 0x01, 0x4f, + 0x02, 0x70, 0x02, 0x07, 0x00, 0x7c, 0x00, 0x02, 0x00, 0x9f, 0x00, 0x00, 0xff, 0xff, 0x00, 0x32, + 0x00, 0x64, 0x01, 0xc3, 0x02, 0x04, 0x02, 0x06, 0x00, 0x86, 0x00, 0x36, 0xff, 0xff, 0x00, 0x32, + 0x00, 0x64, 0x01, 0xc3, 0x02, 0x04, 0x02, 0x06, 0x00, 0x96, 0x00, 0x36, 0xff, 0xff, 0x00, 0x45, + 0xff, 0xf8, 0x01, 0xb2, 0x02, 0x74, 0x02, 0x07, 0x00, 0x9a, 0x00, 0x00, 0x00, 0xa2, 0x00, 0x00, + 0x00, 0x02, 0x00, 0x12, 0xff, 0xf5, 0x01, 0xd6, 0x02, 0xb6, 0x00, 0x0c, 0x00, 0x27, 0x00, 0x69, + 0x40, 0x42, 0x22, 0x40, 0x0c, 0x00, 0x4d, 0x21, 0x40, 0x0c, 0x00, 0x4d, 0x0f, 0x40, 0x0c, 0x00, + 0x4d, 0x0e, 0x40, 0x0c, 0x00, 0x4d, 0x00, 0x53, 0x18, 0x29, 0x06, 0x0f, 0x0f, 0x0e, 0x27, 0x51, + 0x21, 0x24, 0x25, 0x20, 0x22, 0x28, 0x26, 0x01, 0x25, 0x00, 0x23, 0x04, 0x0a, 0x57, 0x1d, 0x09, + 0x06, 0x55, 0x10, 0x03, 0x57, 0x10, 0x13, 0x30, 0x13, 0x02, 0x13, 0x0b, 0x21, 0x30, 0x0f, 0x01, + 0x0f, 0x73, 0x0d, 0x04, 0x00, 0x3f, 0xed, 0x5d, 0x32, 0x3f, 0x5d, 0xed, 0xd5, 0xed, 0x3f, 0xed, + 0x3f, 0x3f, 0x3f, 0x01, 0x10, 0xd6, 0xc6, 0xc4, 0xd5, 0x32, 0xfd, 0xc5, 0x33, 0x11, 0x33, 0x10, + 0xd6, 0xed, 0x31, 0x30, 0x00, 0x2b, 0x2b, 0x2b, 0x2b, 0x25, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, + 0x15, 0x16, 0x16, 0x33, 0x32, 0x36, 0x03, 0x15, 0x23, 0x15, 0x36, 0x36, 0x33, 0x32, 0x1e, 0x02, + 0x15, 0x14, 0x0e, 0x02, 0x23, 0x22, 0x26, 0x27, 0x11, 0x23, 0x35, 0x33, 0x35, 0x37, 0x15, 0x01, + 0x59, 0x27, 0x29, 0x14, 0x24, 0x0d, 0x0e, 0x1c, 0x0a, 0x2d, 0x34, 0x07, 0x8e, 0x1a, 0x2d, 0x17, + 0x2c, 0x44, 0x2d, 0x17, 0x1d, 0x38, 0x52, 0x34, 0x2f, 0x61, 0x22, 0x37, 0x37, 0x7b, 0xee, 0x42, + 0x46, 0x0b, 0x08, 0xff, 0x03, 0x02, 0x41, 0x01, 0xc7, 0x53, 0x49, 0x0c, 0x09, 0x23, 0x41, 0x5a, + 0x37, 0x38, 0x5b, 0x40, 0x23, 0x0e, 0x0b, 0x02, 0x06, 0x53, 0x3a, 0x15, 0x4f, 0x00, 0x00, 0x00, + 0x00, 0x03, 0x00, 0x00, 0xff, 0xf8, 0x01, 0xe7, 0x02, 0x72, 0x00, 0x21, 0x00, 0x2e, 0x00, 0x39, + 0x00, 0x47, 0x40, 0x25, 0x32, 0x4a, 0x17, 0x2b, 0x4a, 0x1d, 0x3b, 0x39, 0x23, 0x52, 0x03, 0x0a, + 0x0b, 0x3a, 0x04, 0x38, 0x57, 0x12, 0x23, 0x22, 0x39, 0x0b, 0x0a, 0x1a, 0x0a, 0x0b, 0x39, 0x1a, + 0x22, 0x05, 0x00, 0x12, 0x03, 0x26, 0x57, 0x00, 0x09, 0x00, 0x3f, 0xed, 0x3f, 0x12, 0x17, 0x39, + 0x3d, 0x2f, 0x18, 0x2f, 0x2f, 0x2f, 0x2f, 0x39, 0x10, 0xed, 0x32, 0x01, 0x10, 0xd6, 0xc5, 0xd6, + 0xed, 0x32, 0x10, 0xd6, 0xed, 0xd4, 0xed, 0x31, 0x30, 0x05, 0x22, 0x26, 0x27, 0x11, 0x23, 0x22, + 0x06, 0x15, 0x14, 0x17, 0x07, 0x26, 0x35, 0x34, 0x3e, 0x02, 0x33, 0x32, 0x1e, 0x02, 0x15, 0x14, + 0x06, 0x07, 0x16, 0x16, 0x15, 0x14, 0x0e, 0x02, 0x03, 0x15, 0x16, 0x16, 0x33, 0x32, 0x3e, 0x02, + 0x35, 0x34, 0x26, 0x23, 0x27, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x15, 0x01, + 0x1d, 0x23, 0x3d, 0x25, 0x05, 0x1d, 0x19, 0x0a, 0x5a, 0x0d, 0x24, 0x41, 0x5c, 0x39, 0x3c, 0x50, + 0x30, 0x14, 0x25, 0x26, 0x36, 0x32, 0x13, 0x2e, 0x4e, 0x57, 0x09, 0x19, 0x0a, 0x0f, 0x1c, 0x17, + 0x0e, 0x28, 0x21, 0x12, 0x1f, 0x20, 0x21, 0x16, 0x08, 0x19, 0x08, 0x08, 0x06, 0x08, 0x02, 0x0a, + 0x1e, 0x14, 0x1e, 0x17, 0x0c, 0x28, 0x22, 0x2b, 0x36, 0x1f, 0x0b, 0x17, 0x29, 0x3a, 0x24, 0x2b, + 0x47, 0x17, 0x10, 0x55, 0x37, 0x20, 0x42, 0x34, 0x21, 0x01, 0x17, 0xa8, 0x02, 0x02, 0x07, 0x13, + 0x23, 0x1b, 0x2d, 0x27, 0x66, 0x29, 0x24, 0x2c, 0x22, 0x01, 0x01, 0x99, 0x00, 0x02, 0x00, 0x36, + 0xff, 0xf8, 0x01, 0xd5, 0x02, 0x6b, 0x00, 0x10, 0x00, 0x1b, 0x00, 0x5e, 0xb9, 0x00, 0x10, 0xff, + 0xc0, 0xb3, 0x10, 0x00, 0x4d, 0x0f, 0xb8, 0xff, 0xc0, 0xb5, 0x10, 0x00, 0x4d, 0x14, 0x53, 0x07, + 0xb8, 0xff, 0xc0, 0xb6, 0x09, 0x0f, 0x48, 0x07, 0x1d, 0x10, 0x0e, 0xb8, 0xff, 0xc0, 0x40, 0x0a, + 0x0a, 0x0f, 0x48, 0x0e, 0x1c, 0x19, 0x51, 0x01, 0x51, 0x0d, 0xb8, 0xff, 0xc0, 0x40, 0x11, 0x0a, + 0x0f, 0x48, 0x0d, 0x17, 0x57, 0x02, 0x02, 0x0a, 0x10, 0x55, 0x0f, 0x02, 0x11, 0x57, 0x0a, 0x07, + 0x00, 0x3f, 0xed, 0x3f, 0xed, 0x12, 0x39, 0x2f, 0xed, 0x01, 0x2f, 0x2b, 0xed, 0xed, 0x10, 0xd6, + 0x2b, 0xc5, 0x10, 0xd6, 0x2b, 0xed, 0x31, 0x30, 0x2b, 0x2b, 0x13, 0x15, 0x33, 0x32, 0x1e, 0x02, + 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x27, 0x11, 0x21, 0x15, 0x03, 0x32, 0x36, 0x35, 0x34, 0x26, + 0x23, 0x23, 0x15, 0x16, 0x16, 0xb1, 0x2e, 0x38, 0x5b, 0x40, 0x23, 0x7d, 0x76, 0x23, 0x5c, 0x2d, + 0x01, 0x5f, 0xac, 0x36, 0x3d, 0x40, 0x41, 0x2a, 0x08, 0x22, 0x02, 0x05, 0x76, 0x15, 0x30, 0x4d, + 0x38, 0x67, 0x66, 0x08, 0x0a, 0x02, 0x61, 0x66, 0xfe, 0x5e, 0x2e, 0x33, 0x36, 0x2a, 0xbd, 0x01, + 0x03, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3f, 0xff, 0xf5, 0x01, 0xd7, 0x02, 0xaf, 0x00, 0x14, + 0x00, 0x21, 0x00, 0x5d, 0xb9, 0x00, 0x13, 0xff, 0xc0, 0xb3, 0x18, 0x00, 0x4d, 0x12, 0xb8, 0xff, + 0xc0, 0x40, 0x0b, 0x18, 0x00, 0x4d, 0x00, 0x40, 0x18, 0x00, 0x4d, 0x15, 0x53, 0x08, 0xb8, 0xff, + 0xc0, 0x40, 0x0a, 0x09, 0x10, 0x48, 0x08, 0x23, 0x1b, 0x00, 0x51, 0x13, 0x11, 0xb8, 0xff, 0xc0, + 0x40, 0x13, 0x09, 0x10, 0x48, 0x11, 0x22, 0x18, 0x57, 0x00, 0x03, 0x03, 0x0d, 0x13, 0x55, 0x12, + 0x9f, 0x1f, 0x57, 0x0d, 0x07, 0x00, 0x3f, 0xed, 0x3f, 0xed, 0x12, 0x39, 0x2f, 0xc5, 0xed, 0x01, + 0x10, 0xd6, 0x2b, 0xc5, 0xfd, 0xc0, 0x10, 0xd6, 0x2b, 0xed, 0x31, 0x30, 0x00, 0x2b, 0x01, 0x2b, + 0x2b, 0x13, 0x36, 0x36, 0x33, 0x32, 0x1e, 0x02, 0x15, 0x14, 0x0e, 0x02, 0x23, 0x22, 0x26, 0x27, + 0x11, 0x21, 0x15, 0x23, 0x13, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x15, 0x16, 0x16, 0x33, 0x32, + 0x36, 0xba, 0x1a, 0x30, 0x18, 0x2e, 0x46, 0x2f, 0x18, 0x1e, 0x3a, 0x54, 0x36, 0x30, 0x64, 0x22, + 0x01, 0x64, 0xe9, 0xa0, 0x2b, 0x2c, 0x14, 0x27, 0x0e, 0x0e, 0x1f, 0x0b, 0x30, 0x38, 0x01, 0xcb, + 0x0c, 0x09, 0x23, 0x41, 0x5a, 0x37, 0x38, 0x5b, 0x40, 0x23, 0x0e, 0x0b, 0x02, 0xa1, 0x66, 0xfe, + 0xa5, 0x42, 0x46, 0x0b, 0x08, 0xff, 0x03, 0x02, 0x41, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xf2, + 0xff, 0xf5, 0x01, 0xd6, 0x02, 0xb5, 0x00, 0x0c, 0x00, 0x22, 0x00, 0x41, 0x40, 0x27, 0x11, 0x20, + 0x18, 0x00, 0x4d, 0x0e, 0x40, 0x09, 0x0c, 0x00, 0x4c, 0x00, 0x53, 0x19, 0x40, 0x09, 0x0e, 0x48, + 0x19, 0x24, 0x10, 0x11, 0x06, 0x51, 0x0d, 0x21, 0x23, 0x0a, 0x57, 0x1e, 0x07, 0x11, 0x03, 0x57, + 0x14, 0x0b, 0x0d, 0x10, 0x9f, 0x00, 0x3f, 0xc5, 0x3f, 0xed, 0xc5, 0x3f, 0xed, 0x01, 0x10, 0xd6, + 0xce, 0xfd, 0xd0, 0xc0, 0x10, 0xde, 0x2b, 0xed, 0x31, 0x30, 0x00, 0x2b, 0x2b, 0x25, 0x34, 0x26, + 0x23, 0x22, 0x06, 0x07, 0x15, 0x16, 0x16, 0x33, 0x32, 0x36, 0x01, 0x36, 0x36, 0x37, 0x15, 0x36, + 0x36, 0x33, 0x32, 0x1e, 0x02, 0x15, 0x14, 0x0e, 0x02, 0x23, 0x22, 0x26, 0x27, 0x11, 0x01, 0x59, + 0x2b, 0x2c, 0x14, 0x27, 0x0e, 0x0e, 0x1f, 0x0b, 0x30, 0x38, 0xfe, 0x99, 0x2d, 0x5f, 0x3b, 0x1a, + 0x30, 0x18, 0x2e, 0x46, 0x2f, 0x18, 0x1e, 0x3a, 0x54, 0x36, 0x30, 0x64, 0x22, 0xee, 0x42, 0x46, + 0x0b, 0x08, 0xff, 0x03, 0x02, 0x41, 0x01, 0xc2, 0x19, 0x2a, 0x10, 0xea, 0x0c, 0x09, 0x23, 0x41, + 0x5a, 0x37, 0x38, 0x5b, 0x40, 0x23, 0x0e, 0x0b, 0x02, 0x04, 0x00, 0x00, 0x00, 0x02, 0xff, 0xfc, + 0xff, 0xfa, 0x01, 0xd4, 0x02, 0x74, 0x00, 0x11, 0x00, 0x1c, 0x00, 0x43, 0x40, 0x28, 0x01, 0x40, + 0x0b, 0x00, 0x4d, 0x01, 0x20, 0x0a, 0x00, 0x4d, 0x01, 0x30, 0x09, 0x00, 0x4d, 0x15, 0x53, 0x60, + 0x0a, 0x01, 0x0a, 0x1e, 0x04, 0x19, 0x51, 0x00, 0x10, 0x1d, 0x05, 0x57, 0x18, 0x18, 0x03, 0x12, + 0x57, 0x0d, 0x07, 0x00, 0x03, 0x8b, 0x00, 0x3f, 0xc5, 0x3f, 0xed, 0x12, 0x39, 0x2f, 0xed, 0x01, + 0x10, 0xd6, 0xce, 0xfd, 0xc0, 0x10, 0xd6, 0x5d, 0xed, 0x31, 0x30, 0x00, 0x2b, 0x2b, 0x2b, 0x03, + 0x36, 0x36, 0x37, 0x15, 0x33, 0x32, 0x1e, 0x02, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x27, 0x11, + 0x13, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x23, 0x15, 0x16, 0x16, 0x04, 0x2d, 0x5f, 0x3b, 0x22, + 0x37, 0x59, 0x3e, 0x21, 0x7e, 0x76, 0x22, 0x4b, 0x2c, 0xb2, 0x26, 0x3a, 0x3a, 0x34, 0x28, 0x07, + 0x22, 0x02, 0x21, 0x19, 0x2a, 0x10, 0xee, 0x13, 0x2c, 0x4b, 0x37, 0x67, 0x64, 0x06, 0x0b, 0x01, + 0xc6, 0xfe, 0x92, 0x2e, 0x33, 0x33, 0x26, 0xb6, 0x01, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x1b, + 0xff, 0xf3, 0x01, 0xd5, 0x02, 0x79, 0x00, 0x1f, 0x00, 0x30, 0xb5, 0x0a, 0x46, 0x60, 0x1d, 0x01, + 0x1d, 0xb8, 0xff, 0xc0, 0x40, 0x12, 0x09, 0x0d, 0x48, 0x1d, 0x21, 0x13, 0x03, 0x20, 0x12, 0x0f, + 0x4a, 0x18, 0x03, 0x04, 0x07, 0x4a, 0x00, 0x09, 0x00, 0x3f, 0xfd, 0xc6, 0x3f, 0xfd, 0xc6, 0x01, + 0x10, 0xd6, 0xc6, 0x10, 0xd6, 0x2b, 0x5d, 0xed, 0x31, 0x30, 0x17, 0x22, 0x26, 0x27, 0x37, 0x16, + 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x2e, 0x02, 0x23, 0x22, 0x06, 0x07, 0x27, 0x3e, 0x03, 0x33, + 0x32, 0x1e, 0x02, 0x15, 0x14, 0x06, 0xc7, 0x3a, 0x58, 0x1a, 0x1f, 0x12, 0x40, 0x30, 0x52, 0x4a, + 0x1b, 0x2c, 0x38, 0x1c, 0x29, 0x41, 0x17, 0x20, 0x07, 0x1e, 0x2b, 0x38, 0x20, 0x40, 0x65, 0x46, + 0x26, 0x8b, 0x0d, 0x1b, 0x10, 0x61, 0x0b, 0x16, 0x71, 0x6a, 0x3d, 0x52, 0x31, 0x15, 0x15, 0x0f, + 0x62, 0x04, 0x10, 0x0e, 0x0b, 0x28, 0x51, 0x79, 0x51, 0x9b, 0xa8, 0x00, 0x00, 0x01, 0x00, 0x1b, + 0xff, 0xf3, 0x02, 0x10, 0x02, 0xbe, 0x00, 0x2a, 0x00, 0x4d, 0xb9, 0x00, 0x0e, 0xff, 0xc0, 0xb4, + 0x14, 0x17, 0x48, 0x0e, 0x23, 0xb8, 0xff, 0xc0, 0xb7, 0x13, 0x17, 0x48, 0x23, 0x2c, 0x05, 0x46, + 0x16, 0xb8, 0xff, 0xc0, 0x40, 0x19, 0x13, 0x17, 0x48, 0x16, 0x2b, 0x24, 0x27, 0x4a, 0x0f, 0x20, + 0x01, 0x20, 0xab, 0x00, 0x02, 0x4a, 0x1b, 0x03, 0x0d, 0x4a, 0x0e, 0x0a, 0x4a, 0x11, 0x09, 0x00, + 0x3f, 0xed, 0xd5, 0xed, 0x3f, 0xfd, 0xc6, 0x3f, 0x5d, 0xfd, 0xc6, 0x01, 0x10, 0xd6, 0x2b, 0xed, + 0x10, 0xd6, 0x2b, 0xc6, 0x2b, 0x31, 0x30, 0x01, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x1e, 0x02, + 0x33, 0x32, 0x36, 0x37, 0x17, 0x06, 0x06, 0x23, 0x22, 0x2e, 0x02, 0x35, 0x34, 0x3e, 0x02, 0x33, + 0x32, 0x17, 0x36, 0x36, 0x33, 0x32, 0x16, 0x17, 0x07, 0x26, 0x26, 0x23, 0x22, 0x06, 0x07, 0x01, + 0x87, 0x38, 0x2f, 0x3f, 0x49, 0x13, 0x24, 0x32, 0x20, 0x23, 0x32, 0x1c, 0x1f, 0x2a, 0x49, 0x2c, + 0x39, 0x5b, 0x40, 0x23, 0x28, 0x45, 0x5c, 0x33, 0x21, 0x24, 0x11, 0x3c, 0x26, 0x0f, 0x21, 0x11, + 0x1b, 0x08, 0x0a, 0x0e, 0x10, 0x20, 0x0b, 0x01, 0xf1, 0x1d, 0x6c, 0x69, 0x3e, 0x54, 0x33, 0x16, + 0x12, 0x0f, 0x61, 0x16, 0x15, 0x2a, 0x53, 0x78, 0x4e, 0x52, 0x7a, 0x50, 0x27, 0x0b, 0x2c, 0x24, + 0x05, 0x05, 0x5e, 0x02, 0x03, 0x10, 0x20, 0x00, 0x00, 0x01, 0x00, 0x28, 0xff, 0xf3, 0x02, 0x09, + 0x02, 0x2b, 0x00, 0x2c, 0x00, 0x29, 0x40, 0x15, 0x25, 0x0e, 0x2e, 0x1e, 0x53, 0x00, 0x2d, 0x25, + 0x21, 0x57, 0x28, 0x07, 0x12, 0x57, 0x0b, 0xac, 0x16, 0x19, 0x57, 0x05, 0x0b, 0x00, 0x3f, 0xfd, + 0xc6, 0x3f, 0xed, 0x3f, 0xed, 0xc5, 0x01, 0x10, 0xd6, 0xed, 0x10, 0xd6, 0xc6, 0x31, 0x30, 0x37, + 0x34, 0x3e, 0x02, 0x33, 0x32, 0x16, 0x17, 0x36, 0x36, 0x33, 0x32, 0x16, 0x17, 0x07, 0x26, 0x26, + 0x23, 0x22, 0x06, 0x07, 0x07, 0x26, 0x26, 0x23, 0x22, 0x0e, 0x02, 0x15, 0x14, 0x16, 0x33, 0x32, + 0x36, 0x37, 0x17, 0x06, 0x06, 0x23, 0x22, 0x2e, 0x02, 0x28, 0x21, 0x3e, 0x5a, 0x39, 0x0d, 0x1e, + 0x0d, 0x0e, 0x31, 0x29, 0x19, 0x29, 0x0d, 0x1c, 0x0a, 0x12, 0x0d, 0x14, 0x19, 0x08, 0x0d, 0x13, + 0x2e, 0x1c, 0x1e, 0x2f, 0x22, 0x12, 0x42, 0x44, 0x18, 0x39, 0x17, 0x12, 0x18, 0x45, 0x2a, 0x41, + 0x5c, 0x3c, 0x1c, 0xeb, 0x33, 0x5a, 0x43, 0x27, 0x02, 0x02, 0x2d, 0x20, 0x0a, 0x07, 0x5a, 0x05, + 0x04, 0x17, 0x1b, 0x31, 0x08, 0x09, 0x16, 0x25, 0x33, 0x1e, 0x40, 0x4b, 0x09, 0x0a, 0x67, 0x0b, + 0x0e, 0x26, 0x43, 0x5b, 0xff, 0xff, 0x00, 0x12, 0xff, 0xf8, 0x01, 0xd9, 0x02, 0x72, 0x02, 0x06, + 0x00, 0xab, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0xff, 0xf9, 0x01, 0xe2, 0x02, 0x72, 0x00, 0x19, + 0x00, 0x2a, 0x00, 0x52, 0xb9, 0x00, 0x12, 0xff, 0xc0, 0xb3, 0x10, 0x00, 0x4d, 0x12, 0xb8, 0xff, + 0x80, 0xb3, 0x0f, 0x00, 0x4d, 0x10, 0xb8, 0xff, 0xc0, 0x40, 0x22, 0x0f, 0x00, 0x4d, 0x12, 0x40, + 0x10, 0x00, 0x4d, 0x22, 0x46, 0x03, 0x2c, 0x20, 0x1a, 0x30, 0x1a, 0x02, 0x1a, 0x44, 0x0b, 0x10, + 0x84, 0x15, 0x2b, 0x1d, 0x48, 0x08, 0x09, 0x0c, 0x27, 0x48, 0x13, 0x00, 0x02, 0x00, 0x3f, 0xc4, + 0xed, 0x32, 0x3f, 0xed, 0x01, 0x10, 0xd0, 0xed, 0xd4, 0xed, 0x5d, 0x10, 0xd6, 0xed, 0x31, 0x30, + 0x00, 0x2b, 0x01, 0x2b, 0x2b, 0x2b, 0x13, 0x32, 0x16, 0x15, 0x14, 0x0e, 0x02, 0x23, 0x22, 0x26, + 0x27, 0x11, 0x23, 0x22, 0x06, 0x15, 0x14, 0x17, 0x07, 0x26, 0x35, 0x34, 0x3e, 0x02, 0x13, 0x16, + 0x32, 0x33, 0x32, 0x3e, 0x02, 0x35, 0x34, 0x2e, 0x02, 0x23, 0x22, 0x06, 0x07, 0xfa, 0x76, 0x72, + 0x22, 0x3d, 0x54, 0x33, 0x17, 0x33, 0x1a, 0x05, 0x1d, 0x19, 0x0a, 0x5a, 0x0d, 0x27, 0x43, 0x5b, + 0x3c, 0x05, 0x0c, 0x06, 0x20, 0x26, 0x13, 0x06, 0x04, 0x12, 0x24, 0x20, 0x05, 0x12, 0x05, 0x02, + 0x72, 0x95, 0xa7, 0x58, 0x79, 0x4b, 0x21, 0x06, 0x08, 0x02, 0x09, 0x1e, 0x14, 0x1e, 0x17, 0x0c, + 0x28, 0x22, 0x2b, 0x36, 0x1f, 0x0b, 0xfd, 0xf2, 0x01, 0x21, 0x3a, 0x4f, 0x2d, 0x25, 0x4c, 0x3e, + 0x27, 0x01, 0x01, 0x00, 0x00, 0x02, 0x00, 0x1f, 0xff, 0xfa, 0x01, 0xbe, 0x02, 0x6b, 0x00, 0x10, + 0x00, 0x1d, 0x00, 0x40, 0x40, 0x28, 0x01, 0x40, 0x09, 0x0a, 0x00, 0x4c, 0x00, 0x40, 0x09, 0x0a, + 0x00, 0x4c, 0x16, 0x51, 0x0f, 0x51, 0x03, 0x1f, 0x00, 0x1f, 0x01, 0x1b, 0x53, 0x00, 0x09, 0x1e, + 0x11, 0x57, 0x06, 0x09, 0x18, 0x57, 0x4f, 0x0e, 0x01, 0x0e, 0x00, 0x48, 0x01, 0x02, 0x00, 0x3f, + 0xfd, 0xd6, 0x5d, 0xed, 0x3f, 0xed, 0x01, 0x10, 0xd6, 0xc4, 0xed, 0x5d, 0x10, 0xd6, 0xed, 0xed, + 0x31, 0x30, 0x2b, 0x2b, 0x13, 0x35, 0x21, 0x11, 0x06, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x3e, + 0x02, 0x33, 0x33, 0x35, 0x03, 0x32, 0x3e, 0x02, 0x33, 0x35, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, + 0x50, 0x01, 0x6e, 0x2d, 0x50, 0x23, 0x7c, 0x83, 0x23, 0x41, 0x5c, 0x3a, 0x29, 0x3d, 0x07, 0x12, + 0x12, 0x0e, 0x04, 0x2f, 0x38, 0x41, 0x40, 0x02, 0x05, 0x66, 0xfd, 0xa0, 0x0b, 0x06, 0x64, 0x67, + 0x37, 0x4b, 0x2c, 0x13, 0x7f, 0xfe, 0x5e, 0x01, 0x01, 0x02, 0xb6, 0x27, 0x32, 0x32, 0x2f, 0x00, + 0x00, 0x02, 0x00, 0x1c, 0xff, 0xf5, 0x01, 0xae, 0x02, 0xaf, 0x00, 0x0c, 0x00, 0x1d, 0x00, 0x36, + 0x40, 0x20, 0x0e, 0x40, 0x0a, 0x00, 0x4d, 0x0d, 0x40, 0x0a, 0x00, 0x4d, 0x1c, 0x07, 0x51, 0x10, + 0x1f, 0x0d, 0x00, 0x53, 0x16, 0x1e, 0x0a, 0x57, 0x19, 0x0b, 0x03, 0x57, 0x13, 0x09, 0x1d, 0x48, + 0x0f, 0x00, 0x00, 0x3f, 0xed, 0x3f, 0xed, 0x3f, 0xed, 0x01, 0x10, 0xd6, 0xed, 0xc4, 0x10, 0xd6, + 0xfd, 0xc0, 0x31, 0x30, 0x2b, 0x2b, 0x37, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x11, 0x26, 0x26, + 0x23, 0x22, 0x06, 0x03, 0x35, 0x21, 0x11, 0x06, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, + 0x32, 0x16, 0x17, 0x35, 0x99, 0x2f, 0x34, 0x0f, 0x1a, 0x0e, 0x0e, 0x24, 0x14, 0x2c, 0x28, 0x4e, + 0x01, 0x63, 0x22, 0x62, 0x2f, 0x6e, 0x71, 0x5f, 0x5d, 0x19, 0x30, 0x12, 0xee, 0x3f, 0x50, 0x02, + 0x02, 0x01, 0x00, 0x08, 0x0b, 0x46, 0x01, 0x19, 0x66, 0xfd, 0x5f, 0x0b, 0x0e, 0x82, 0x71, 0x73, + 0x85, 0x0b, 0x0a, 0x7e, 0x00, 0x02, 0x00, 0x1f, 0xff, 0x58, 0x01, 0xd7, 0x01, 0xe2, 0x00, 0x2a, + 0x00, 0x3a, 0x00, 0x5b, 0x40, 0x3c, 0x05, 0x40, 0x18, 0x19, 0x00, 0x4c, 0x04, 0x40, 0x18, 0x00, + 0x4d, 0x04, 0x20, 0x14, 0x00, 0x4d, 0x03, 0x20, 0x12, 0x13, 0x00, 0x4c, 0x19, 0x53, 0x08, 0x35, + 0x53, 0x00, 0x00, 0x20, 0x00, 0x40, 0x00, 0x60, 0x00, 0x04, 0x00, 0x3c, 0x2b, 0x53, 0x10, 0x21, + 0x3b, 0x30, 0x05, 0x1e, 0x1e, 0x05, 0x30, 0x03, 0x0d, 0x38, 0x57, 0x26, 0x07, 0x11, 0x14, 0x57, + 0x0d, 0x0f, 0x00, 0x3f, 0xfd, 0xc6, 0x3f, 0xed, 0x12, 0x17, 0x39, 0x2f, 0x2f, 0x2f, 0x01, 0x10, + 0xd6, 0xc4, 0xed, 0x10, 0xd6, 0x5d, 0xed, 0xd4, 0xed, 0x31, 0x30, 0x2b, 0x2b, 0x2b, 0x2b, 0x01, + 0x14, 0x0e, 0x02, 0x07, 0x16, 0x16, 0x15, 0x14, 0x0e, 0x02, 0x23, 0x22, 0x26, 0x27, 0x37, 0x16, + 0x16, 0x33, 0x32, 0x3e, 0x02, 0x35, 0x34, 0x2e, 0x02, 0x27, 0x26, 0x26, 0x35, 0x34, 0x3e, 0x02, + 0x33, 0x32, 0x1e, 0x02, 0x05, 0x14, 0x1e, 0x02, 0x17, 0x3e, 0x03, 0x35, 0x34, 0x26, 0x23, 0x22, + 0x06, 0x01, 0xd7, 0x0a, 0x1d, 0x32, 0x27, 0x1c, 0x25, 0x17, 0x2d, 0x43, 0x2b, 0x29, 0x4c, 0x22, + 0x19, 0x1a, 0x3a, 0x20, 0x09, 0x17, 0x13, 0x0e, 0x0f, 0x1f, 0x2f, 0x20, 0x3d, 0x44, 0x1f, 0x39, + 0x50, 0x32, 0x31, 0x52, 0x3a, 0x21, 0xfe, 0xc6, 0x11, 0x1d, 0x26, 0x15, 0x19, 0x21, 0x12, 0x07, + 0x35, 0x2a, 0x2a, 0x33, 0x01, 0x1c, 0x15, 0x37, 0x38, 0x37, 0x15, 0x15, 0x31, 0x23, 0x1d, 0x33, + 0x25, 0x16, 0x0a, 0x0f, 0x61, 0x0b, 0x0d, 0x02, 0x07, 0x0f, 0x0d, 0x0c, 0x12, 0x13, 0x1a, 0x14, + 0x25, 0x69, 0x48, 0x30, 0x4c, 0x36, 0x1c, 0x1b, 0x33, 0x49, 0x39, 0x1a, 0x2a, 0x23, 0x1d, 0x0d, + 0x0d, 0x24, 0x27, 0x28, 0x11, 0x34, 0x33, 0x32, 0x00, 0x01, 0x00, 0x3f, 0x00, 0x00, 0x01, 0xcc, + 0x02, 0x6b, 0x00, 0x0b, 0x00, 0x52, 0x40, 0x0e, 0x05, 0x40, 0x09, 0x00, 0x4d, 0x04, 0x40, 0x09, + 0x00, 0x4d, 0x06, 0x03, 0x44, 0x0b, 0xb8, 0xff, 0xc0, 0xb7, 0x09, 0x0c, 0x48, 0x0b, 0x0d, 0x08, + 0x05, 0x01, 0xb8, 0xff, 0xc0, 0x40, 0x17, 0x09, 0x0c, 0x48, 0x01, 0x0c, 0x40, 0x06, 0x01, 0x06, + 0x48, 0x03, 0x03, 0x0a, 0x02, 0x48, 0x0b, 0x08, 0x07, 0x48, 0x0a, 0x02, 0x00, 0x08, 0x00, 0x3f, + 0x3f, 0xed, 0x3f, 0xed, 0x12, 0x39, 0x2f, 0xed, 0x5d, 0x01, 0x10, 0xd6, 0x2b, 0xc6, 0xc6, 0x10, + 0xd6, 0x2b, 0xed, 0x32, 0x31, 0x30, 0x2b, 0x2b, 0x33, 0x35, 0x21, 0x35, 0x23, 0x35, 0x33, 0x35, + 0x23, 0x35, 0x21, 0x11, 0x3f, 0x01, 0x12, 0xdc, 0xdc, 0xfc, 0x01, 0x77, 0x66, 0xae, 0x66, 0x8b, + 0x66, 0xfd, 0x95, 0x00, 0x00, 0x02, 0x00, 0x19, 0xff, 0xf3, 0x01, 0xd5, 0x02, 0x79, 0x00, 0x1e, + 0x00, 0x27, 0x00, 0x54, 0xb5, 0x27, 0x40, 0x0d, 0x00, 0x4d, 0x24, 0xb8, 0xff, 0xc0, 0xb3, 0x0d, + 0x00, 0x4d, 0x21, 0xb8, 0xff, 0xc0, 0x40, 0x25, 0x0d, 0x00, 0x4d, 0x1f, 0x40, 0x0d, 0x00, 0x4d, + 0x27, 0x00, 0x53, 0x40, 0x13, 0x60, 0x13, 0x02, 0x13, 0x29, 0x1f, 0x53, 0x09, 0x1b, 0x28, 0x27, + 0x48, 0x00, 0x00, 0x0e, 0x22, 0x57, 0x16, 0x09, 0x08, 0x05, 0x57, 0x0e, 0x03, 0x00, 0x3f, 0xfd, + 0xc6, 0x3f, 0xed, 0x12, 0x39, 0x2f, 0xed, 0x01, 0x10, 0xd6, 0xc4, 0xed, 0x10, 0xd6, 0x5d, 0xed, + 0x32, 0x31, 0x30, 0x00, 0x2b, 0x2b, 0x2b, 0x2b, 0x01, 0x34, 0x2e, 0x02, 0x23, 0x22, 0x06, 0x07, + 0x27, 0x3e, 0x03, 0x33, 0x32, 0x1e, 0x02, 0x15, 0x14, 0x06, 0x23, 0x22, 0x2e, 0x02, 0x35, 0x34, + 0x36, 0x37, 0x17, 0x14, 0x16, 0x33, 0x32, 0x3e, 0x02, 0x37, 0x01, 0x63, 0x1c, 0x2e, 0x3d, 0x21, + 0x1f, 0x3c, 0x17, 0x1e, 0x12, 0x29, 0x2a, 0x27, 0x0f, 0x45, 0x66, 0x43, 0x21, 0x7a, 0x6a, 0x3a, + 0x52, 0x34, 0x18, 0x02, 0x02, 0x6d, 0x3b, 0x2d, 0x1b, 0x29, 0x1c, 0x0e, 0x01, 0x01, 0x59, 0x32, + 0x45, 0x2b, 0x13, 0x0c, 0x0b, 0x60, 0x09, 0x0c, 0x09, 0x04, 0x31, 0x56, 0x75, 0x44, 0x9e, 0xa8, + 0x31, 0x51, 0x68, 0x36, 0x11, 0x23, 0x12, 0x61, 0x51, 0x52, 0x1a, 0x2d, 0x3b, 0x21, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x1f, 0xff, 0xf3, 0x01, 0xe7, 0x02, 0x79, 0x00, 0x30, 0x00, 0x7f, 0xb6, 0x26, + 0x40, 0x0e, 0x0f, 0x00, 0x4c, 0x03, 0xb8, 0xff, 0xc0, 0xb3, 0x0d, 0x00, 0x4d, 0x01, 0xb8, 0xff, + 0xc0, 0xb3, 0x0d, 0x00, 0x4d, 0x00, 0xb8, 0xff, 0xc0, 0xb7, 0x0d, 0x00, 0x4d, 0x25, 0x40, 0x0f, + 0x01, 0x0f, 0xb8, 0xff, 0xc0, 0x40, 0x2f, 0x0f, 0x12, 0x48, 0x0f, 0x32, 0x30, 0x40, 0x09, 0x00, + 0x4d, 0x30, 0x1a, 0x2c, 0x63, 0x1d, 0x06, 0x63, 0x70, 0x17, 0x80, 0x17, 0x90, 0x17, 0x03, 0x17, + 0x31, 0x26, 0x29, 0x67, 0x22, 0x40, 0x30, 0x01, 0x30, 0x65, 0x00, 0x1a, 0x1a, 0x00, 0x12, 0x22, + 0x05, 0x0e, 0x0b, 0x67, 0x12, 0x0d, 0x00, 0x3f, 0xfd, 0xc6, 0x3f, 0x12, 0x39, 0x39, 0x3d, 0x2f, + 0x18, 0x2f, 0xed, 0x5d, 0x10, 0xfd, 0xc6, 0x01, 0x10, 0xd6, 0x5d, 0xed, 0xd4, 0xed, 0xd5, 0xc5, + 0x2b, 0x10, 0xd6, 0x2b, 0x5d, 0xc6, 0x31, 0x30, 0x00, 0x2b, 0x2b, 0x2b, 0x2b, 0x01, 0x23, 0x22, + 0x0e, 0x02, 0x15, 0x14, 0x1e, 0x02, 0x33, 0x32, 0x36, 0x37, 0x17, 0x06, 0x06, 0x23, 0x22, 0x2e, + 0x02, 0x35, 0x34, 0x36, 0x37, 0x26, 0x26, 0x35, 0x34, 0x3e, 0x02, 0x33, 0x32, 0x16, 0x17, 0x07, + 0x26, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x33, 0x01, 0x7e, 0x53, 0x1f, 0x34, 0x26, + 0x15, 0x13, 0x21, 0x2c, 0x19, 0x2c, 0x5c, 0x21, 0x28, 0x2a, 0x74, 0x3c, 0x2e, 0x56, 0x42, 0x28, + 0x3c, 0x29, 0x26, 0x24, 0x23, 0x3a, 0x4b, 0x29, 0x36, 0x67, 0x29, 0x2a, 0x1a, 0x53, 0x27, 0x26, + 0x37, 0x34, 0x37, 0x5d, 0x01, 0x10, 0x09, 0x15, 0x22, 0x1a, 0x17, 0x20, 0x15, 0x09, 0x18, 0x13, + 0x66, 0x17, 0x1c, 0x14, 0x2d, 0x48, 0x35, 0x3a, 0x4a, 0x15, 0x18, 0x4b, 0x22, 0x2e, 0x41, 0x28, + 0x13, 0x1c, 0x17, 0x5f, 0x0e, 0x16, 0x1f, 0x27, 0x23, 0x28, 0x00, 0x00, 0x00, 0x01, 0xff, 0xcc, + 0xff, 0x59, 0x01, 0xba, 0x02, 0x6b, 0x00, 0x17, 0x00, 0x2e, 0x40, 0x18, 0x14, 0x11, 0x19, 0x16, + 0x13, 0x44, 0x10, 0x0f, 0x01, 0x0f, 0x08, 0x18, 0x15, 0x48, 0x14, 0x11, 0x48, 0x0f, 0x02, 0x0c, + 0x4a, 0x08, 0x05, 0x0f, 0x00, 0x3f, 0xc5, 0xed, 0x3f, 0xfd, 0xd6, 0xed, 0x01, 0x10, 0xc4, 0xd6, + 0x5d, 0xfd, 0xc0, 0x10, 0xd6, 0xc6, 0x31, 0x30, 0x37, 0x14, 0x0e, 0x02, 0x23, 0x22, 0x26, 0x27, + 0x37, 0x16, 0x16, 0x33, 0x32, 0x35, 0x11, 0x21, 0x15, 0x21, 0x15, 0x33, 0x15, 0x23, 0x15, 0xba, + 0x10, 0x25, 0x3e, 0x2d, 0x0d, 0x2b, 0x16, 0x12, 0x0e, 0x10, 0x11, 0x32, 0x01, 0x7b, 0xff, 0x00, + 0xe0, 0xe0, 0x12, 0x2e, 0x45, 0x2f, 0x17, 0x04, 0x08, 0x63, 0x05, 0x02, 0x3f, 0x02, 0x6b, 0x66, + 0x96, 0x66, 0xc7, 0x00, 0x00, 0x01, 0x00, 0x1b, 0xff, 0xf3, 0x02, 0x10, 0x02, 0xbe, 0x00, 0x2c, + 0x00, 0x40, 0x40, 0x25, 0x1e, 0x44, 0x1f, 0xb0, 0x08, 0x01, 0x02, 0x90, 0x08, 0xa0, 0x08, 0x02, + 0x08, 0x2e, 0x17, 0x46, 0xb0, 0x28, 0x01, 0x28, 0x2d, 0x1f, 0x1f, 0x05, 0x1a, 0x4a, 0x23, 0x09, + 0x0c, 0x84, 0x05, 0xab, 0x10, 0x12, 0x4a, 0x00, 0x03, 0x00, 0x3f, 0xfd, 0xc6, 0x3f, 0xed, 0x3f, + 0xed, 0x12, 0x39, 0x2f, 0x01, 0x10, 0xd6, 0x5d, 0xed, 0x10, 0xd6, 0x5d, 0x5f, 0x5d, 0xd6, 0xed, + 0x31, 0x30, 0x01, 0x32, 0x17, 0x36, 0x36, 0x33, 0x32, 0x16, 0x17, 0x07, 0x26, 0x26, 0x23, 0x22, + 0x06, 0x07, 0x07, 0x26, 0x23, 0x22, 0x0e, 0x02, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x35, + 0x33, 0x11, 0x06, 0x06, 0x23, 0x22, 0x2e, 0x02, 0x35, 0x34, 0x3e, 0x02, 0x01, 0x17, 0x21, 0x24, + 0x11, 0x3c, 0x26, 0x0f, 0x21, 0x11, 0x1b, 0x08, 0x0a, 0x0e, 0x10, 0x21, 0x0a, 0x13, 0x38, 0x2f, + 0x27, 0x34, 0x20, 0x0d, 0x46, 0x44, 0x0b, 0x1a, 0x0b, 0x7b, 0x16, 0x5d, 0x42, 0x3a, 0x5d, 0x42, + 0x24, 0x26, 0x44, 0x5c, 0x02, 0x79, 0x0b, 0x2c, 0x24, 0x05, 0x05, 0x5e, 0x02, 0x03, 0x10, 0x20, + 0x3a, 0x1d, 0x25, 0x3c, 0x4e, 0x29, 0x6f, 0x69, 0x02, 0x02, 0xe2, 0xfe, 0xcb, 0x08, 0x14, 0x29, + 0x51, 0x79, 0x50, 0x4f, 0x79, 0x52, 0x29, 0x00, 0x00, 0x02, 0x00, 0x09, 0xff, 0x5b, 0x01, 0xeb, + 0x02, 0x6b, 0x00, 0x15, 0x00, 0x25, 0x00, 0x75, 0xb9, 0x00, 0x23, 0xff, 0xc0, 0x40, 0x0f, 0x0c, + 0x00, 0x4d, 0x20, 0x23, 0x01, 0x19, 0x40, 0x0c, 0x00, 0x4d, 0x2f, 0x19, 0x01, 0x11, 0xb8, 0xff, + 0xc0, 0x40, 0x32, 0x0d, 0x0e, 0x00, 0x4c, 0x01, 0x40, 0x0d, 0x0e, 0x00, 0x4c, 0x11, 0x01, 0x14, + 0x01, 0x14, 0x11, 0x03, 0x26, 0x27, 0x19, 0x64, 0x04, 0x15, 0x51, 0x00, 0x27, 0x23, 0x64, 0x0e, + 0x13, 0x51, 0x12, 0x26, 0x15, 0x14, 0x11, 0x01, 0x1e, 0x1e, 0x01, 0x11, 0x14, 0x04, 0x09, 0x13, + 0x02, 0x16, 0xa5, 0x09, 0x0e, 0x00, 0x3f, 0xed, 0x3f, 0x12, 0x17, 0x39, 0x2f, 0x2f, 0x2f, 0x2f, + 0x2f, 0x01, 0x10, 0xd6, 0xed, 0xd6, 0xed, 0x10, 0xd6, 0xed, 0xd6, 0xed, 0x11, 0x12, 0x17, 0x39, + 0x3d, 0x2f, 0x18, 0x2f, 0x2f, 0x31, 0x30, 0x2b, 0x2b, 0x5d, 0x2b, 0x5d, 0x2b, 0x01, 0x03, 0x16, + 0x16, 0x15, 0x14, 0x0e, 0x02, 0x23, 0x22, 0x2e, 0x02, 0x35, 0x34, 0x36, 0x37, 0x03, 0x33, 0x13, + 0x13, 0x03, 0x32, 0x36, 0x35, 0x34, 0x2e, 0x02, 0x27, 0x0e, 0x03, 0x15, 0x14, 0x16, 0x01, 0xeb, + 0xb0, 0x2a, 0x31, 0x11, 0x26, 0x3a, 0x2a, 0x2a, 0x3a, 0x26, 0x11, 0x31, 0x2a, 0xb2, 0x7c, 0x76, + 0x76, 0x76, 0x1a, 0x14, 0x09, 0x0d, 0x11, 0x07, 0x06, 0x11, 0x0e, 0x0a, 0x15, 0x02, 0x6b, 0xfe, + 0x63, 0x46, 0x6d, 0x36, 0x1e, 0x32, 0x25, 0x15, 0x15, 0x25, 0x32, 0x1d, 0x36, 0x6e, 0x46, 0x01, + 0x9d, 0xfe, 0xb7, 0x01, 0x49, 0xfd, 0x52, 0x1c, 0x14, 0x0f, 0x24, 0x22, 0x1d, 0x0a, 0x08, 0x1c, + 0x22, 0x26, 0x10, 0x14, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x1b, 0xff, 0xf3, 0x01, 0xe2, + 0x02, 0xb6, 0x00, 0x29, 0x00, 0x64, 0x40, 0x41, 0x1d, 0x20, 0x0c, 0x00, 0x4d, 0x40, 0x16, 0x50, + 0x16, 0x02, 0x16, 0x52, 0x29, 0x20, 0x1f, 0x30, 0x1f, 0x02, 0x1f, 0x52, 0x1c, 0x29, 0x1c, 0x29, + 0x1c, 0x2a, 0x2b, 0x80, 0x2b, 0x90, 0x2b, 0xa0, 0x2b, 0x03, 0x0d, 0x20, 0x09, 0x30, 0x09, 0x02, + 0x09, 0x52, 0xc0, 0x0a, 0xd0, 0x0a, 0x02, 0x0a, 0x2a, 0x19, 0x52, 0x24, 0x07, 0x1e, 0x0a, 0x05, + 0x52, 0x10, 0x0b, 0x0c, 0x01, 0x0b, 0x00, 0x09, 0x06, 0x00, 0x3f, 0x3f, 0x3f, 0x3f, 0xed, 0x3f, + 0x3f, 0xed, 0x01, 0x10, 0xd6, 0x5d, 0xed, 0x5d, 0x32, 0x5d, 0x11, 0x12, 0x39, 0x39, 0x2f, 0x2f, + 0x10, 0xed, 0x5d, 0x10, 0xed, 0x5d, 0x31, 0x30, 0x00, 0x2b, 0x13, 0x34, 0x2e, 0x02, 0x23, 0x22, + 0x06, 0x07, 0x11, 0x23, 0x11, 0x37, 0x15, 0x36, 0x36, 0x33, 0x32, 0x1e, 0x02, 0x15, 0x15, 0x14, + 0x16, 0x33, 0x32, 0x36, 0x35, 0x11, 0x33, 0x11, 0x14, 0x0e, 0x02, 0x23, 0x22, 0x2e, 0x02, 0x35, + 0xcc, 0x04, 0x09, 0x10, 0x0c, 0x0d, 0x14, 0x07, 0x60, 0x60, 0x0c, 0x1d, 0x0c, 0x29, 0x31, 0x1a, + 0x08, 0x10, 0x1c, 0x1b, 0x0f, 0x60, 0x0a, 0x1e, 0x36, 0x2c, 0x2c, 0x37, 0x1e, 0x0b, 0x01, 0x20, + 0x21, 0x28, 0x17, 0x07, 0x08, 0x03, 0xfe, 0x84, 0x02, 0xa1, 0x15, 0xe4, 0x05, 0x09, 0x1b, 0x33, + 0x48, 0x2d, 0x5e, 0x3e, 0x34, 0x34, 0x3e, 0x01, 0x17, 0xfe, 0xeb, 0x31, 0x4d, 0x34, 0x1c, 0x1c, + 0x34, 0x4d, 0x31, 0x00, 0x00, 0x01, 0x00, 0x20, 0xff, 0xf3, 0x01, 0xce, 0x02, 0x6b, 0x00, 0x15, + 0x00, 0x3c, 0xb9, 0x00, 0x08, 0xff, 0xc0, 0x40, 0x20, 0x09, 0x00, 0x4d, 0x10, 0x08, 0x20, 0x08, + 0x02, 0x08, 0x17, 0x0f, 0x15, 0x1f, 0x15, 0x02, 0x15, 0x00, 0x44, 0x11, 0x10, 0x13, 0x16, 0x11, + 0x00, 0x48, 0x14, 0x02, 0x07, 0x04, 0x4a, 0x0b, 0x09, 0x00, 0x3f, 0xfd, 0xc6, 0x3f, 0xed, 0x32, + 0x01, 0x10, 0xd6, 0xc4, 0xd5, 0xfd, 0xc5, 0x5d, 0x10, 0xc6, 0x5d, 0x31, 0x30, 0x2b, 0x01, 0x11, + 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x17, 0x06, 0x06, 0x23, 0x22, 0x2e, 0x02, 0x35, 0x11, 0x23, + 0x35, 0x21, 0x15, 0x01, 0x0f, 0x24, 0x2d, 0x15, 0x30, 0x11, 0x18, 0x14, 0x3a, 0x34, 0x37, 0x47, + 0x2a, 0x10, 0x74, 0x01, 0x77, 0x02, 0x05, 0xfe, 0xb4, 0x31, 0x28, 0x0c, 0x07, 0x65, 0x09, 0x12, + 0x20, 0x37, 0x48, 0x29, 0x01, 0x4a, 0x66, 0x66, 0x00, 0x01, 0x00, 0x36, 0x00, 0x00, 0x01, 0xbf, + 0x02, 0x6b, 0x00, 0x13, 0x00, 0x70, 0xb9, 0x00, 0x05, 0xff, 0xc0, 0x40, 0x40, 0x0b, 0x00, 0x4d, + 0x0e, 0x0e, 0x0b, 0x0c, 0x0d, 0x0d, 0x0c, 0x51, 0x07, 0x06, 0x06, 0x07, 0x05, 0x10, 0x08, 0x30, + 0x08, 0x40, 0x08, 0x50, 0x08, 0x04, 0x08, 0x14, 0x12, 0x11, 0x51, 0x02, 0x10, 0x00, 0x30, 0x00, + 0x40, 0x00, 0x50, 0x00, 0x04, 0x00, 0x14, 0x13, 0x08, 0x0a, 0x02, 0x0c, 0x07, 0x48, 0x09, 0x10, + 0x03, 0x48, 0x0d, 0x06, 0x06, 0x00, 0x09, 0x02, 0x11, 0x02, 0x48, 0x00, 0x08, 0x00, 0x3f, 0xed, + 0x32, 0x3f, 0x12, 0x39, 0x2f, 0x33, 0xed, 0x32, 0x10, 0xed, 0x32, 0x3f, 0x3f, 0x01, 0x10, 0xd6, + 0x5d, 0xd5, 0xfd, 0xc5, 0x10, 0xd6, 0x5d, 0xc6, 0xc5, 0x32, 0x2f, 0x10, 0xed, 0x32, 0x2f, 0x10, + 0xc5, 0x32, 0x2f, 0x31, 0x30, 0x2b, 0x33, 0x35, 0x33, 0x35, 0x23, 0x35, 0x33, 0x35, 0x23, 0x35, + 0x21, 0x15, 0x23, 0x15, 0x33, 0x15, 0x23, 0x15, 0x33, 0x15, 0x36, 0x87, 0x5a, 0x5a, 0x87, 0x01, + 0x89, 0x86, 0x5a, 0x5a, 0x86, 0x66, 0xa9, 0x63, 0x93, 0x66, 0x66, 0x93, 0x63, 0xa9, 0x66, 0x00, + 0x00, 0x01, 0x00, 0x2d, 0x00, 0x00, 0x02, 0x0a, 0x02, 0x78, 0x00, 0x1f, 0x00, 0x52, 0xb2, 0x00, + 0x44, 0x1f, 0xb8, 0xff, 0xc0, 0x40, 0x0c, 0x0b, 0x0e, 0x48, 0x1f, 0x15, 0x21, 0x1c, 0x1c, 0x0a, + 0x05, 0x44, 0x07, 0xb8, 0xff, 0xc0, 0x40, 0x18, 0x0b, 0x0e, 0x48, 0x07, 0x20, 0x16, 0x18, 0xad, + 0x10, 0x03, 0x05, 0x0a, 0x1c, 0x0a, 0x1c, 0x05, 0x03, 0x06, 0x08, 0x02, 0x06, 0x08, 0x00, 0x08, + 0x00, 0x3f, 0x3f, 0x3f, 0x12, 0x17, 0x39, 0x3d, 0x2f, 0x18, 0x2f, 0x2f, 0x3f, 0xfd, 0xc6, 0x01, + 0x10, 0xd6, 0x2b, 0xfd, 0xc0, 0x32, 0x3d, 0x2f, 0x18, 0x10, 0xd6, 0xd6, 0x2b, 0xed, 0x31, 0x30, + 0x21, 0x2e, 0x03, 0x27, 0x11, 0x23, 0x11, 0x33, 0x11, 0x37, 0x3e, 0x03, 0x33, 0x32, 0x1e, 0x02, + 0x17, 0x07, 0x26, 0x23, 0x22, 0x06, 0x07, 0x07, 0x16, 0x16, 0x17, 0x01, 0x5d, 0x0b, 0x24, 0x30, + 0x38, 0x1e, 0x7b, 0x7b, 0x6a, 0x10, 0x1f, 0x21, 0x24, 0x14, 0x0b, 0x18, 0x1b, 0x1f, 0x13, 0x36, + 0x15, 0x15, 0x11, 0x17, 0x0e, 0x5f, 0x47, 0x6d, 0x20, 0x1e, 0x4e, 0x4e, 0x48, 0x19, 0xfe, 0xe5, + 0x02, 0x6b, 0xfe, 0xff, 0x9a, 0x17, 0x2a, 0x20, 0x13, 0x02, 0x0b, 0x15, 0x12, 0x56, 0x11, 0x14, + 0x13, 0x8a, 0x42, 0xb1, 0x5b, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x3f, 0x00, 0x00, 0x01, 0xe7, + 0x02, 0xb5, 0x00, 0x25, 0x00, 0x5e, 0x40, 0x21, 0x1f, 0x00, 0x06, 0x01, 0x06, 0x11, 0x10, 0x10, + 0x20, 0x10, 0x30, 0x10, 0x50, 0x10, 0x60, 0x10, 0x70, 0x10, 0x06, 0x10, 0x27, 0x0b, 0x00, 0x16, + 0x44, 0x50, 0x18, 0x60, 0x18, 0x70, 0x18, 0x03, 0x18, 0xb8, 0xff, 0xc0, 0x40, 0x17, 0x09, 0x0c, + 0x48, 0x18, 0x26, 0x23, 0x57, 0x1c, 0xa6, 0x17, 0x06, 0x00, 0x16, 0x0b, 0x16, 0x0b, 0x00, 0x03, + 0x05, 0x11, 0x06, 0x05, 0x0a, 0x00, 0x3f, 0x3f, 0x12, 0x17, 0x39, 0x3d, 0x2f, 0x18, 0x2f, 0x2f, + 0x3f, 0x3f, 0xed, 0x01, 0x10, 0xd6, 0x2b, 0x5d, 0xfd, 0xc0, 0xc5, 0x10, 0xd6, 0x5d, 0xc5, 0xd6, + 0x5d, 0xc6, 0x31, 0x30, 0x13, 0x3e, 0x03, 0x37, 0x33, 0x0e, 0x03, 0x07, 0x1e, 0x03, 0x17, 0x23, + 0x2e, 0x03, 0x27, 0x15, 0x23, 0x11, 0x34, 0x36, 0x33, 0x32, 0x16, 0x17, 0x07, 0x26, 0x26, 0x23, + 0x22, 0x15, 0xbb, 0x12, 0x25, 0x23, 0x20, 0x0c, 0x94, 0x12, 0x2e, 0x31, 0x31, 0x14, 0x19, 0x3a, + 0x38, 0x2f, 0x0e, 0x8d, 0x0c, 0x27, 0x2c, 0x2d, 0x13, 0x7c, 0x4c, 0x5b, 0x0c, 0x1f, 0x14, 0x11, + 0x0a, 0x13, 0x0b, 0x31, 0x01, 0x1c, 0x15, 0x2f, 0x32, 0x2f, 0x15, 0x17, 0x36, 0x38, 0x34, 0x16, + 0x18, 0x43, 0x48, 0x48, 0x1c, 0x19, 0x3f, 0x3d, 0x37, 0x12, 0xde, 0x02, 0x10, 0x55, 0x50, 0x03, + 0x08, 0x5f, 0x02, 0x04, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x3b, 0xff, 0xf5, 0x01, 0xea, + 0x02, 0xb5, 0x00, 0x1b, 0x00, 0x48, 0x40, 0x14, 0x00, 0x00, 0x10, 0x00, 0x20, 0x00, 0x40, 0x00, + 0x04, 0x00, 0x1d, 0x14, 0x12, 0x11, 0x51, 0x0d, 0x09, 0x0c, 0x0e, 0x0b, 0xb8, 0xff, 0xc0, 0x40, + 0x13, 0x09, 0x0e, 0x48, 0x0b, 0x1c, 0x09, 0x14, 0x73, 0x0c, 0x11, 0x0d, 0x48, 0x10, 0x9f, 0x1b, + 0x18, 0x57, 0x05, 0x07, 0x00, 0x3f, 0xfd, 0xc6, 0x3f, 0xfd, 0xd5, 0x32, 0xed, 0x32, 0x01, 0x10, + 0xd6, 0x2b, 0xc6, 0xd5, 0x32, 0x32, 0xfd, 0xc5, 0x33, 0x10, 0xc6, 0x5d, 0x31, 0x30, 0x25, 0x0e, + 0x03, 0x23, 0x22, 0x26, 0x35, 0x35, 0x23, 0x35, 0x33, 0x35, 0x23, 0x35, 0x33, 0x11, 0x33, 0x15, + 0x23, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x01, 0xea, 0x03, 0x15, 0x22, 0x31, 0x1f, 0x55, + 0x4e, 0x81, 0x81, 0x82, 0xfe, 0x84, 0x84, 0x26, 0x1d, 0x24, 0x32, 0x08, 0x14, 0x02, 0x0a, 0x0b, + 0x08, 0x65, 0x61, 0x80, 0x55, 0xbf, 0x66, 0xfe, 0xdb, 0x55, 0x89, 0x30, 0x22, 0x14, 0x03, 0x00, + 0x00, 0x01, 0x00, 0x12, 0x00, 0x00, 0x01, 0xdd, 0x02, 0xb5, 0x00, 0x2a, 0x00, 0x4b, 0x40, 0x29, + 0x16, 0x19, 0x1c, 0x1a, 0x1b, 0x05, 0x11, 0x2a, 0x29, 0x00, 0x28, 0x04, 0x05, 0x0b, 0x0b, 0x11, + 0x06, 0x6f, 0x05, 0x2c, 0x21, 0x22, 0x10, 0x6f, 0x11, 0x2b, 0x28, 0x1c, 0x19, 0x00, 0x1a, 0x73, + 0x1b, 0x1f, 0x57, 0x25, 0xa6, 0x10, 0x06, 0x06, 0x06, 0x00, 0x3f, 0x3f, 0x3f, 0xfd, 0xd6, 0xed, + 0x32, 0x32, 0x32, 0x32, 0x01, 0x10, 0xd6, 0xed, 0xd6, 0xc5, 0x10, 0xd6, 0xed, 0x12, 0x39, 0x3d, + 0x2f, 0x12, 0x17, 0x39, 0x12, 0x17, 0x39, 0x31, 0x30, 0x01, 0x1e, 0x03, 0x17, 0x23, 0x2e, 0x03, + 0x27, 0x0e, 0x03, 0x07, 0x23, 0x3e, 0x03, 0x37, 0x26, 0x26, 0x27, 0x07, 0x27, 0x37, 0x26, 0x26, + 0x23, 0x22, 0x07, 0x27, 0x36, 0x36, 0x33, 0x32, 0x16, 0x17, 0x37, 0x17, 0x01, 0x30, 0x1c, 0x36, + 0x2d, 0x23, 0x0b, 0x8e, 0x08, 0x14, 0x15, 0x16, 0x0a, 0x0e, 0x1d, 0x1b, 0x16, 0x07, 0x88, 0x11, + 0x2d, 0x30, 0x33, 0x17, 0x04, 0x06, 0x04, 0x6b, 0x1c, 0x62, 0x0c, 0x1e, 0x16, 0x1e, 0x13, 0x15, + 0x11, 0x30, 0x20, 0x31, 0x4b, 0x1e, 0x6d, 0x1b, 0x02, 0x14, 0x42, 0x94, 0x90, 0x81, 0x2d, 0x24, + 0x51, 0x52, 0x4e, 0x21, 0x24, 0x52, 0x52, 0x4f, 0x1f, 0x40, 0x7d, 0x74, 0x68, 0x2c, 0x0b, 0x13, + 0x08, 0x26, 0x4a, 0x23, 0x0e, 0x0c, 0x08, 0x62, 0x05, 0x0a, 0x28, 0x31, 0x27, 0x4a, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x14, 0xff, 0xf4, 0x01, 0xe4, 0x02, 0x6b, 0x00, 0x26, 0x00, 0xa3, 0xb9, 0x00, + 0x16, 0xff, 0xc0, 0xb3, 0x0c, 0x00, 0x4d, 0x15, 0xb8, 0xff, 0xc0, 0xb3, 0x0e, 0x00, 0x4d, 0x15, + 0xb8, 0xff, 0xc0, 0xb3, 0x0c, 0x00, 0x4d, 0x14, 0xb8, 0xff, 0xc0, 0xb3, 0x0e, 0x00, 0x4d, 0x14, + 0xb8, 0xff, 0xc0, 0x40, 0x0a, 0x0c, 0x00, 0x4d, 0x1c, 0x40, 0x0b, 0x0c, 0x00, 0x4c, 0x15, 0xb8, + 0xff, 0x80, 0x40, 0x41, 0x0e, 0x00, 0x4d, 0x24, 0x07, 0x34, 0x07, 0x02, 0x07, 0x52, 0x06, 0x24, + 0x14, 0x44, 0x14, 0x02, 0x14, 0x52, 0x13, 0x20, 0x1d, 0x30, 0x1d, 0x02, 0x02, 0x1d, 0x52, 0x1c, + 0x90, 0x13, 0x01, 0x81, 0x13, 0x01, 0x80, 0x1c, 0x90, 0x1c, 0x02, 0x06, 0x13, 0x1c, 0x1c, 0x13, + 0x06, 0x03, 0x27, 0x28, 0x13, 0x14, 0x13, 0x14, 0x1c, 0x18, 0x4a, 0x21, 0x07, 0x1c, 0x06, 0x07, + 0x06, 0x0d, 0x4a, 0x00, 0x07, 0x00, 0x3f, 0xed, 0x3f, 0x3f, 0x3f, 0xed, 0x12, 0x39, 0x39, 0x2f, + 0x2f, 0x01, 0x11, 0x12, 0x17, 0x39, 0x2f, 0x2f, 0x2f, 0x5d, 0x5d, 0x5d, 0x10, 0xed, 0x5f, 0x5d, + 0x10, 0xed, 0x5d, 0x10, 0xed, 0x5d, 0x31, 0x30, 0x00, 0x2b, 0x2b, 0x01, 0x2b, 0x2b, 0x2b, 0x2b, + 0x2b, 0x17, 0x22, 0x2e, 0x02, 0x35, 0x11, 0x33, 0x11, 0x14, 0x1e, 0x02, 0x33, 0x32, 0x36, 0x37, + 0x26, 0x35, 0x35, 0x33, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x11, 0x33, 0x11, 0x06, 0x06, + 0x23, 0x22, 0x26, 0x27, 0x06, 0x06, 0x9a, 0x29, 0x34, 0x1e, 0x0b, 0x64, 0x08, 0x0d, 0x12, 0x09, + 0x0b, 0x15, 0x08, 0x06, 0x64, 0x15, 0x1a, 0x07, 0x12, 0x0a, 0x64, 0x2d, 0x49, 0x1e, 0x1d, 0x2b, + 0x11, 0x11, 0x32, 0x0c, 0x1b, 0x32, 0x48, 0x2d, 0x01, 0xb5, 0xfe, 0x46, 0x1c, 0x22, 0x13, 0x06, + 0x07, 0x04, 0x25, 0x34, 0xc2, 0xcf, 0x30, 0x27, 0x03, 0x04, 0x02, 0x0a, 0xfd, 0xa1, 0x0b, 0x0d, + 0x0d, 0x0f, 0x0a, 0x12, 0x00, 0x01, 0xff, 0xbc, 0xff, 0x59, 0x01, 0xc6, 0x02, 0x6b, 0x00, 0x1c, + 0x00, 0x56, 0x40, 0x36, 0x2f, 0x19, 0x3f, 0x19, 0x02, 0x19, 0x52, 0xcf, 0x1b, 0xdf, 0x1b, 0x02, + 0x1b, 0x40, 0x0b, 0x10, 0x48, 0x1b, 0x1e, 0x03, 0x52, 0x0f, 0x13, 0x1f, 0x13, 0x02, 0x13, 0x1d, + 0x0c, 0x0f, 0x12, 0x1f, 0x12, 0x02, 0x12, 0x1d, 0x0f, 0x1d, 0x01, 0x19, 0x03, 0x19, 0x03, 0x00, + 0x1a, 0x02, 0x13, 0x02, 0x0d, 0x10, 0x09, 0x92, 0x00, 0x08, 0x00, 0x3f, 0x3f, 0xd5, 0xc6, 0x3f, + 0x3f, 0x12, 0x39, 0x39, 0x2f, 0x2f, 0x01, 0x5d, 0x10, 0xd6, 0x5d, 0xcc, 0x10, 0xd6, 0x5d, 0xed, + 0x10, 0xd6, 0x2b, 0x5d, 0xed, 0x5d, 0x31, 0x30, 0x21, 0x26, 0x26, 0x27, 0x11, 0x14, 0x0e, 0x02, + 0x23, 0x22, 0x26, 0x27, 0x37, 0x16, 0x16, 0x33, 0x32, 0x35, 0x11, 0x33, 0x1e, 0x03, 0x17, 0x11, + 0x33, 0x11, 0x01, 0x63, 0x2a, 0x63, 0x39, 0x0c, 0x20, 0x3a, 0x2d, 0x0d, 0x2b, 0x16, 0x12, 0x0e, + 0x10, 0x11, 0x31, 0x63, 0x1c, 0x38, 0x35, 0x2d, 0x10, 0x6f, 0x67, 0xcd, 0x67, 0xfe, 0x77, 0x29, + 0x43, 0x32, 0x1b, 0x04, 0x08, 0x63, 0x05, 0x02, 0x3f, 0x02, 0x6b, 0x2c, 0x67, 0x66, 0x60, 0x24, + 0x01, 0x7d, 0xfd, 0x95, 0x00, 0x01, 0x00, 0x3f, 0xff, 0x5b, 0x01, 0xb9, 0x01, 0xe0, 0x00, 0x13, + 0x00, 0x2c, 0xb6, 0x0b, 0x51, 0x08, 0x15, 0x11, 0x51, 0x00, 0xb8, 0xff, 0xc0, 0x40, 0x0f, 0x09, + 0x0c, 0x48, 0x00, 0x14, 0x12, 0x06, 0x0a, 0x10, 0x09, 0x10, 0x0e, 0x57, 0x03, 0x07, 0x00, 0x3f, + 0xed, 0x3f, 0x3f, 0x3f, 0x01, 0x10, 0xd6, 0x2b, 0xed, 0x10, 0xd6, 0xed, 0x31, 0x30, 0x13, 0x36, + 0x36, 0x33, 0x32, 0x1e, 0x02, 0x15, 0x11, 0x23, 0x11, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x11, + 0x23, 0x3f, 0x21, 0x61, 0x39, 0x38, 0x4a, 0x2b, 0x12, 0x7b, 0x1e, 0x2e, 0x0e, 0x1b, 0x0f, 0x7b, + 0x01, 0xc7, 0x09, 0x10, 0x1f, 0x39, 0x4f, 0x30, 0xfe, 0x52, 0x01, 0x9e, 0x42, 0x3a, 0x02, 0x02, + 0xfe, 0x8f, 0x00, 0x00, 0x00, 0x03, 0x00, 0x1b, 0xff, 0xf3, 0x01, 0xd9, 0x02, 0x79, 0x00, 0x0b, + 0x00, 0x16, 0x00, 0x21, 0x00, 0x74, 0x40, 0x1f, 0x8f, 0x00, 0x9f, 0x00, 0x02, 0x00, 0x1c, 0x10, + 0x1c, 0x02, 0x00, 0x12, 0x10, 0x12, 0x02, 0x60, 0x1d, 0x70, 0x1d, 0x02, 0x60, 0x11, 0x70, 0x11, + 0x02, 0x00, 0x06, 0x10, 0x06, 0x02, 0x06, 0xb8, 0xff, 0xc0, 0x40, 0x2f, 0x0f, 0x12, 0x48, 0x00, + 0x1c, 0x12, 0x1d, 0x11, 0x06, 0x06, 0x11, 0x1d, 0x12, 0x1c, 0x00, 0x06, 0x22, 0x23, 0x2f, 0x0c, + 0x3f, 0x0c, 0x02, 0x0c, 0x4a, 0x09, 0x9e, 0x11, 0x48, 0x7f, 0x1c, 0x01, 0x1c, 0x40, 0x0a, 0x0d, + 0x48, 0x1c, 0x20, 0x17, 0x30, 0x17, 0x02, 0x17, 0x4a, 0x03, 0x03, 0x00, 0x3f, 0xfd, 0x5d, 0xd6, + 0x2b, 0x5d, 0xed, 0x3f, 0xed, 0x5d, 0x01, 0x11, 0x12, 0x17, 0x39, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, + 0x2f, 0x2b, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x31, 0x30, 0x13, 0x34, 0x36, 0x33, 0x32, 0x16, + 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x17, 0x32, 0x3e, 0x02, 0x37, 0x23, 0x1e, 0x03, 0x13, 0x22, + 0x0e, 0x02, 0x07, 0x33, 0x2e, 0x03, 0x1b, 0x76, 0x69, 0x6d, 0x72, 0x74, 0x6a, 0x6d, 0x73, 0xdf, + 0x1b, 0x24, 0x16, 0x0a, 0x02, 0xc2, 0x01, 0x0a, 0x16, 0x25, 0x1b, 0x1b, 0x23, 0x17, 0x0b, 0x01, + 0xc2, 0x02, 0x0a, 0x16, 0x24, 0x01, 0x36, 0xa0, 0xa3, 0xa3, 0xa0, 0xa0, 0xa3, 0xa3, 0x38, 0x1a, + 0x2d, 0x3e, 0x24, 0x25, 0x3e, 0x2d, 0x19, 0x01, 0xb0, 0x19, 0x2c, 0x3d, 0x23, 0x23, 0x3d, 0x2c, + 0x19, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1b, 0xff, 0xf3, 0x01, 0xf1, 0x02, 0xcb, 0x00, 0x19, + 0x00, 0x2d, 0x00, 0x28, 0x40, 0x15, 0x24, 0x53, 0x14, 0x08, 0x64, 0x0e, 0x2f, 0x1a, 0x53, 0x00, + 0x2e, 0x1f, 0x4a, 0x17, 0x09, 0x0b, 0x8a, 0x29, 0x4a, 0x03, 0x03, 0x00, 0x3f, 0xed, 0x3f, 0x3f, + 0xed, 0x01, 0x10, 0xd6, 0xed, 0x10, 0xd6, 0xed, 0xd4, 0xed, 0x31, 0x30, 0x13, 0x34, 0x36, 0x33, + 0x32, 0x17, 0x36, 0x36, 0x35, 0x34, 0x26, 0x35, 0x33, 0x16, 0x15, 0x14, 0x06, 0x07, 0x23, 0x16, + 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x37, 0x14, 0x1e, 0x02, 0x33, 0x32, 0x3e, 0x02, 0x35, 0x34, + 0x2e, 0x02, 0x23, 0x22, 0x0e, 0x02, 0x1b, 0x76, 0x69, 0x4d, 0x32, 0x07, 0x05, 0x01, 0x69, 0x04, + 0x1c, 0x22, 0x01, 0x27, 0x74, 0x6a, 0x6d, 0x73, 0x7d, 0x07, 0x15, 0x26, 0x20, 0x1f, 0x27, 0x15, + 0x07, 0x07, 0x15, 0x26, 0x20, 0x20, 0x26, 0x15, 0x07, 0x01, 0x36, 0xa0, 0xa3, 0x28, 0x12, 0x28, + 0x15, 0x0b, 0x15, 0x0b, 0x17, 0x19, 0x2a, 0x4a, 0x20, 0x50, 0x81, 0xa0, 0xa3, 0xa3, 0xa0, 0x2d, + 0x4f, 0x3a, 0x22, 0x22, 0x3b, 0x4e, 0x2d, 0x2d, 0x4f, 0x3a, 0x22, 0x22, 0x3b, 0x4e, 0x00, 0x00, + 0x00, 0x02, 0x00, 0x1d, 0xff, 0xf3, 0x01, 0xec, 0x02, 0x34, 0x00, 0x20, 0x00, 0x2c, 0x00, 0x32, + 0x40, 0x1e, 0x27, 0x53, 0x00, 0x14, 0x52, 0x00, 0x1b, 0x20, 0x1b, 0x40, 0x1b, 0x60, 0x1b, 0x04, + 0x1b, 0x2e, 0x21, 0x53, 0x0a, 0x2d, 0x18, 0xae, 0x2a, 0x57, 0x0f, 0x07, 0x24, 0x57, 0x05, 0x0b, + 0x00, 0x3f, 0xed, 0x3f, 0xed, 0x3f, 0x01, 0x10, 0xd6, 0xed, 0x10, 0xd6, 0x5d, 0xed, 0xd4, 0xed, + 0x31, 0x30, 0x25, 0x14, 0x0e, 0x02, 0x23, 0x22, 0x2e, 0x02, 0x35, 0x34, 0x3e, 0x02, 0x33, 0x32, + 0x17, 0x36, 0x36, 0x35, 0x34, 0x34, 0x27, 0x33, 0x16, 0x16, 0x15, 0x14, 0x06, 0x07, 0x16, 0x16, + 0x05, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x01, 0xd8, 0x20, 0x3a, + 0x51, 0x32, 0x32, 0x51, 0x3b, 0x20, 0x21, 0x3b, 0x52, 0x30, 0x46, 0x32, 0x07, 0x0a, 0x02, 0x66, + 0x03, 0x01, 0x1f, 0x1a, 0x11, 0x14, 0xfe, 0xc2, 0x2d, 0x32, 0x30, 0x31, 0x2d, 0x32, 0x30, 0x31, + 0xec, 0x38, 0x5b, 0x42, 0x24, 0x24, 0x42, 0x5b, 0x38, 0x37, 0x5b, 0x41, 0x23, 0x22, 0x0c, 0x1f, + 0x18, 0x0b, 0x17, 0x0f, 0x0e, 0x1a, 0x0d, 0x2a, 0x3c, 0x1d, 0x1d, 0x49, 0x2b, 0x3f, 0x4e, 0x4e, + 0x3f, 0x3f, 0x4d, 0x4d, 0x00, 0x02, 0x00, 0x1e, 0xff, 0xf3, 0x01, 0xdc, 0x02, 0x79, 0x00, 0x25, + 0x00, 0x39, 0x00, 0x43, 0xb9, 0x00, 0x11, 0xff, 0xc0, 0x40, 0x27, 0x15, 0x18, 0x48, 0x11, 0x52, + 0x12, 0x1c, 0x79, 0x26, 0x30, 0x79, 0x00, 0x00, 0x10, 0x00, 0x02, 0x80, 0x00, 0x90, 0x00, 0xa0, + 0x00, 0x03, 0x00, 0x3a, 0x35, 0x4a, 0x21, 0x09, 0x12, 0x08, 0x18, 0x4a, 0x0b, 0x03, 0x2b, 0x4a, + 0x05, 0x03, 0x00, 0x3f, 0xed, 0x3f, 0xed, 0x3f, 0x3f, 0xed, 0x01, 0x10, 0xd6, 0x5d, 0x71, 0xfd, + 0xd6, 0xfd, 0xd6, 0xed, 0x2b, 0x31, 0x30, 0x13, 0x34, 0x3e, 0x02, 0x33, 0x32, 0x16, 0x17, 0x36, + 0x36, 0x33, 0x32, 0x16, 0x16, 0x06, 0x15, 0x11, 0x23, 0x11, 0x34, 0x2e, 0x02, 0x23, 0x22, 0x07, + 0x16, 0x15, 0x14, 0x0e, 0x02, 0x23, 0x22, 0x2e, 0x02, 0x37, 0x34, 0x2e, 0x02, 0x23, 0x22, 0x0e, + 0x02, 0x15, 0x14, 0x1e, 0x02, 0x33, 0x32, 0x3e, 0x02, 0x1e, 0x10, 0x22, 0x37, 0x26, 0x1b, 0x2c, + 0x11, 0x15, 0x2c, 0x1b, 0x34, 0x34, 0x13, 0x01, 0x60, 0x05, 0x0b, 0x10, 0x0c, 0x13, 0x0f, 0x0f, + 0x11, 0x24, 0x36, 0x24, 0x25, 0x36, 0x23, 0x11, 0xbc, 0x02, 0x09, 0x12, 0x10, 0x10, 0x12, 0x08, + 0x02, 0x02, 0x09, 0x11, 0x10, 0x10, 0x12, 0x09, 0x02, 0x01, 0x37, 0x60, 0x7d, 0x48, 0x1d, 0x0f, + 0x13, 0x13, 0x0f, 0x34, 0x54, 0x6b, 0x37, 0xfe, 0xb1, 0x01, 0x95, 0x28, 0x30, 0x1a, 0x09, 0x13, + 0x47, 0x7f, 0x60, 0x7e, 0x49, 0x1d, 0x1d, 0x49, 0x7e, 0x60, 0x3e, 0x54, 0x32, 0x15, 0x15, 0x33, + 0x53, 0x3e, 0x3f, 0x53, 0x33, 0x15, 0x15, 0x33, 0x54, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x17, + 0xff, 0x5b, 0x01, 0xe2, 0x01, 0xe2, 0x00, 0x23, 0x00, 0x37, 0x00, 0x5f, 0x40, 0x0d, 0xc0, 0x1a, + 0x01, 0x1a, 0x52, 0x10, 0x1b, 0x01, 0x1b, 0xd0, 0x00, 0x01, 0x00, 0xb8, 0xff, 0xc0, 0x40, 0x1e, + 0x0b, 0x0e, 0x48, 0x00, 0x52, 0x50, 0x33, 0x60, 0x33, 0x70, 0x33, 0xe0, 0x33, 0xf0, 0x33, 0x05, + 0x33, 0x20, 0x29, 0x30, 0x29, 0x02, 0x29, 0x52, 0xa0, 0x0a, 0xb0, 0x0a, 0x02, 0x0a, 0xb8, 0xff, + 0xc0, 0x40, 0x10, 0x16, 0x1c, 0x48, 0x0a, 0x38, 0x1b, 0x92, 0x14, 0x07, 0x10, 0x0f, 0x01, 0x0f, + 0x07, 0x05, 0x0b, 0x00, 0x3f, 0x3f, 0x71, 0x3f, 0x3f, 0x01, 0x10, 0xd6, 0x2b, 0x71, 0xfd, 0x5d, + 0xd6, 0x5d, 0xfd, 0x2b, 0x5d, 0xd6, 0x71, 0xed, 0x5d, 0x31, 0x30, 0x25, 0x14, 0x0e, 0x02, 0x23, + 0x22, 0x2e, 0x02, 0x35, 0x34, 0x3e, 0x02, 0x33, 0x32, 0x17, 0x36, 0x36, 0x33, 0x32, 0x1e, 0x02, + 0x15, 0x11, 0x23, 0x11, 0x34, 0x26, 0x23, 0x22, 0x22, 0x07, 0x16, 0x27, 0x22, 0x0e, 0x02, 0x15, + 0x14, 0x1e, 0x02, 0x33, 0x32, 0x3e, 0x02, 0x35, 0x34, 0x2e, 0x02, 0x01, 0x48, 0x10, 0x25, 0x3b, + 0x2a, 0x2a, 0x39, 0x24, 0x10, 0x10, 0x25, 0x3b, 0x2a, 0x32, 0x20, 0x13, 0x2a, 0x16, 0x1b, 0x32, + 0x27, 0x18, 0x60, 0x14, 0x23, 0x05, 0x0b, 0x06, 0x13, 0x99, 0x0b, 0x13, 0x0f, 0x09, 0x09, 0x0f, + 0x14, 0x0b, 0x0b, 0x13, 0x0f, 0x09, 0x09, 0x0f, 0x14, 0xec, 0x3a, 0x5b, 0x40, 0x22, 0x22, 0x3f, + 0x5c, 0x3a, 0x37, 0x5b, 0x40, 0x24, 0x1a, 0x0b, 0x0d, 0x10, 0x29, 0x47, 0x37, 0xfe, 0x32, 0x01, + 0xb0, 0x3d, 0x34, 0x01, 0x3a, 0x3b, 0x0b, 0x20, 0x38, 0x2d, 0x2e, 0x39, 0x1f, 0x0b, 0x0b, 0x20, + 0x39, 0x2d, 0x2d, 0x39, 0x1f, 0x0b, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0xd8, + 0x02, 0x72, 0x00, 0x19, 0x00, 0x24, 0x00, 0x4d, 0xb9, 0x00, 0x12, 0xff, 0xc0, 0x40, 0x12, 0x0f, + 0x10, 0x00, 0x4c, 0x2f, 0x22, 0x3f, 0x22, 0x02, 0x22, 0x64, 0x05, 0x26, 0x1e, 0x09, 0x52, 0x0b, + 0x10, 0xb8, 0xff, 0xc0, 0x40, 0x15, 0x0b, 0x0e, 0x48, 0x10, 0x64, 0x15, 0x25, 0x1e, 0x48, 0x09, + 0x09, 0x00, 0x0a, 0x08, 0x13, 0x0c, 0x0c, 0x1d, 0x48, 0x00, 0x03, 0x00, 0x3f, 0xed, 0x32, 0x10, + 0xc4, 0x3f, 0x12, 0x39, 0x2f, 0xed, 0x01, 0x10, 0xd0, 0xfd, 0x2b, 0xdc, 0xfd, 0xc0, 0x10, 0xd6, + 0xed, 0x5d, 0x31, 0x30, 0x2b, 0x13, 0x32, 0x1e, 0x02, 0x15, 0x14, 0x06, 0x23, 0x23, 0x15, 0x23, + 0x11, 0x23, 0x22, 0x06, 0x15, 0x14, 0x17, 0x07, 0x26, 0x35, 0x34, 0x3e, 0x02, 0x17, 0x22, 0x22, + 0x07, 0x15, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0xfa, 0x3b, 0x54, 0x36, 0x19, 0x5f, 0x60, 0x18, + 0x69, 0x05, 0x1d, 0x19, 0x0a, 0x5a, 0x0d, 0x27, 0x43, 0x5b, 0x61, 0x05, 0x17, 0x09, 0x1e, 0x22, + 0x2b, 0x26, 0x02, 0x72, 0x16, 0x31, 0x4f, 0x39, 0x6f, 0x63, 0xd1, 0x02, 0x10, 0x1e, 0x14, 0x1e, + 0x17, 0x0c, 0x28, 0x22, 0x2b, 0x36, 0x1f, 0x0b, 0x62, 0x02, 0xd2, 0x2c, 0x3c, 0x36, 0x36, 0x00, + 0x00, 0x02, 0x00, 0x3f, 0xff, 0x5b, 0x01, 0xd5, 0x02, 0xb5, 0x00, 0x1e, 0x00, 0x2b, 0x00, 0x31, + 0x40, 0x1a, 0x1f, 0x46, 0x12, 0x00, 0x2d, 0x19, 0x26, 0x07, 0x51, 0x09, 0x2c, 0x22, 0x57, 0x1c, + 0x0b, 0x13, 0x15, 0x57, 0x0f, 0xa6, 0x08, 0x92, 0x29, 0x57, 0x05, 0x09, 0x00, 0x3f, 0xed, 0x3f, + 0x3f, 0xfd, 0xc6, 0x3f, 0xed, 0x01, 0x10, 0xd6, 0xfd, 0xd0, 0xc0, 0x10, 0xd6, 0xc4, 0xed, 0x31, + 0x30, 0x25, 0x14, 0x0e, 0x02, 0x23, 0x22, 0x27, 0x15, 0x23, 0x11, 0x34, 0x3e, 0x02, 0x33, 0x32, + 0x16, 0x17, 0x07, 0x26, 0x23, 0x22, 0x06, 0x15, 0x15, 0x36, 0x32, 0x33, 0x32, 0x16, 0x07, 0x34, + 0x26, 0x23, 0x22, 0x06, 0x07, 0x11, 0x16, 0x16, 0x33, 0x32, 0x36, 0x01, 0xd5, 0x18, 0x2e, 0x46, + 0x2e, 0x2f, 0x32, 0x7b, 0x17, 0x2a, 0x39, 0x22, 0x12, 0x21, 0x16, 0x11, 0x14, 0x0e, 0x18, 0x1f, + 0x0e, 0x1e, 0x0e, 0x6d, 0x74, 0x7d, 0x32, 0x33, 0x0e, 0x20, 0x0b, 0x0c, 0x28, 0x14, 0x2c, 0x2a, + 0xeb, 0x36, 0x5b, 0x41, 0x24, 0x17, 0xb1, 0x02, 0xb2, 0x30, 0x41, 0x27, 0x10, 0x04, 0x05, 0x60, + 0x05, 0x18, 0x27, 0x34, 0x02, 0x84, 0x75, 0x3f, 0x51, 0x03, 0x01, 0xfe, 0xfe, 0x08, 0x0a, 0x47, + 0x00, 0x02, 0x00, 0x36, 0xff, 0xa0, 0x02, 0x09, 0x02, 0xb5, 0x00, 0x1b, 0x00, 0x26, 0x00, 0x49, + 0x40, 0x12, 0x13, 0x0e, 0x44, 0x08, 0x0d, 0x28, 0x1c, 0x46, 0x00, 0x05, 0x01, 0x05, 0x28, 0x19, + 0x22, 0x14, 0x44, 0x16, 0xb8, 0xff, 0xc0, 0x40, 0x14, 0x0b, 0x0e, 0x48, 0x16, 0x27, 0x17, 0xa6, + 0x23, 0x48, 0x14, 0x14, 0x00, 0x15, 0x08, 0x0e, 0x87, 0x1f, 0x4a, 0x00, 0x03, 0x00, 0x3f, 0xed, + 0x3f, 0x3f, 0x12, 0x39, 0x2f, 0xed, 0x3f, 0x01, 0x10, 0xd6, 0x2b, 0xfd, 0xd0, 0xc0, 0x10, 0xd6, + 0x5d, 0xed, 0x10, 0xd6, 0xc5, 0xfd, 0xc6, 0x31, 0x30, 0x13, 0x32, 0x1e, 0x02, 0x15, 0x14, 0x06, + 0x07, 0x1e, 0x03, 0x17, 0x23, 0x2e, 0x03, 0x27, 0x23, 0x15, 0x23, 0x11, 0x33, 0x15, 0x36, 0x32, + 0x17, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x15, 0x33, 0x32, 0x36, 0xd6, 0x35, 0x56, 0x3e, 0x21, + 0x2f, 0x37, 0x1c, 0x34, 0x2d, 0x25, 0x0d, 0x82, 0x0b, 0x21, 0x2a, 0x30, 0x19, 0x37, 0x7b, 0x7b, + 0x0a, 0x13, 0x75, 0x3c, 0x31, 0x07, 0x14, 0x0a, 0x1b, 0x3f, 0x38, 0x02, 0x72, 0x18, 0x32, 0x4d, + 0x34, 0x39, 0x59, 0x16, 0x2a, 0x5f, 0x5e, 0x56, 0x22, 0x1e, 0x50, 0x59, 0x58, 0x25, 0xe4, 0x02, + 0xb5, 0x44, 0x01, 0xca, 0x31, 0x2e, 0x01, 0x02, 0xba, 0x31, 0x00, 0x00, 0x00, 0x01, 0x00, 0x28, + 0xff, 0xf3, 0x01, 0xcc, 0x02, 0x79, 0x00, 0x30, 0x00, 0x49, 0xb9, 0x00, 0x03, 0xff, 0xc0, 0x40, + 0x27, 0x0d, 0x00, 0x4d, 0x16, 0x46, 0x22, 0x20, 0x04, 0x30, 0x04, 0x02, 0x04, 0x32, 0x2c, 0x46, + 0x1c, 0x40, 0x0c, 0x50, 0x0c, 0x02, 0x0c, 0x31, 0x1b, 0x18, 0x4a, 0x1f, 0x27, 0x4a, 0x11, 0x11, + 0x09, 0x1f, 0x03, 0x03, 0x00, 0x4a, 0x09, 0x09, 0x00, 0x3f, 0xfd, 0xc6, 0x3f, 0x12, 0x39, 0x10, + 0xed, 0x10, 0xfd, 0xc6, 0x01, 0x10, 0xd6, 0x5d, 0xc4, 0xed, 0x10, 0xd6, 0x5d, 0xd6, 0xed, 0x31, + 0x30, 0x00, 0x2b, 0x25, 0x32, 0x36, 0x37, 0x17, 0x0e, 0x03, 0x23, 0x22, 0x26, 0x35, 0x34, 0x3e, + 0x02, 0x37, 0x3e, 0x03, 0x35, 0x34, 0x23, 0x22, 0x06, 0x07, 0x27, 0x36, 0x36, 0x33, 0x32, 0x16, + 0x15, 0x14, 0x0e, 0x02, 0x07, 0x0e, 0x03, 0x15, 0x14, 0x1e, 0x02, 0x01, 0x0c, 0x36, 0x4b, 0x1b, + 0x24, 0x0b, 0x22, 0x2f, 0x3d, 0x27, 0x73, 0x71, 0x22, 0x34, 0x40, 0x1d, 0x13, 0x27, 0x1f, 0x14, + 0x62, 0x28, 0x3c, 0x1a, 0x24, 0x1d, 0x55, 0x39, 0x63, 0x71, 0x20, 0x32, 0x3b, 0x1c, 0x15, 0x2a, + 0x22, 0x16, 0x09, 0x18, 0x29, 0x5a, 0x1c, 0x10, 0x64, 0x07, 0x11, 0x0e, 0x09, 0x5f, 0x57, 0x33, + 0x43, 0x2d, 0x1b, 0x0b, 0x07, 0x10, 0x15, 0x1b, 0x12, 0x47, 0x14, 0x0e, 0x5f, 0x10, 0x1a, 0x62, + 0x57, 0x2c, 0x3b, 0x28, 0x1a, 0x0a, 0x08, 0x13, 0x17, 0x1e, 0x13, 0x0f, 0x1d, 0x17, 0x0d, 0x00, + 0x00, 0x01, 0x00, 0x36, 0xff, 0xf5, 0x01, 0xba, 0x01, 0xe2, 0x00, 0x33, 0x00, 0x6f, 0x40, 0x0b, + 0x1c, 0x28, 0x14, 0x00, 0x4d, 0x1c, 0x20, 0x13, 0x00, 0x4d, 0x10, 0xb8, 0xff, 0xc0, 0xb3, 0x09, + 0x00, 0x4d, 0x0e, 0xb8, 0xff, 0xc0, 0xb3, 0x09, 0x00, 0x4d, 0x03, 0xb8, 0xff, 0xc0, 0x40, 0x2c, + 0x0d, 0x10, 0x00, 0x4c, 0x16, 0x53, 0x27, 0x04, 0x35, 0x31, 0x53, 0x1f, 0x10, 0x0c, 0x01, 0x0c, + 0x34, 0x50, 0x11, 0x60, 0x11, 0x02, 0x11, 0x57, 0x2c, 0x2c, 0x22, 0x07, 0x1e, 0x4f, 0x19, 0x01, + 0x19, 0x57, 0x22, 0x0b, 0x03, 0x40, 0x00, 0x01, 0x00, 0x57, 0x07, 0x07, 0x00, 0x3f, 0xfd, 0x5d, + 0xc6, 0x3f, 0xfd, 0x5d, 0xc6, 0x11, 0x12, 0x39, 0x2f, 0xed, 0x5d, 0x01, 0x10, 0xd6, 0x5d, 0xc4, + 0xed, 0x10, 0xd6, 0xd6, 0xed, 0x31, 0x30, 0x00, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x25, 0x32, 0x36, + 0x37, 0x17, 0x06, 0x06, 0x23, 0x22, 0x2e, 0x02, 0x35, 0x34, 0x3e, 0x02, 0x37, 0x3e, 0x03, 0x35, + 0x34, 0x26, 0x23, 0x22, 0x0e, 0x02, 0x07, 0x27, 0x36, 0x36, 0x33, 0x32, 0x1e, 0x02, 0x15, 0x14, + 0x0e, 0x02, 0x07, 0x0e, 0x03, 0x15, 0x14, 0x16, 0x01, 0x0c, 0x28, 0x50, 0x22, 0x14, 0x1a, 0x56, + 0x3d, 0x3c, 0x52, 0x33, 0x16, 0x1e, 0x2f, 0x39, 0x1b, 0x13, 0x21, 0x1a, 0x0f, 0x21, 0x2f, 0x16, + 0x2a, 0x23, 0x1b, 0x08, 0x14, 0x1d, 0x50, 0x2e, 0x35, 0x4c, 0x31, 0x17, 0x1e, 0x2e, 0x38, 0x1b, + 0x14, 0x22, 0x1b, 0x0f, 0x2f, 0x5d, 0x18, 0x0e, 0x67, 0x0b, 0x1c, 0x16, 0x26, 0x34, 0x1d, 0x25, + 0x33, 0x21, 0x16, 0x09, 0x06, 0x0d, 0x0e, 0x11, 0x0b, 0x0e, 0x16, 0x07, 0x09, 0x09, 0x03, 0x68, + 0x0d, 0x0e, 0x17, 0x29, 0x35, 0x1e, 0x25, 0x31, 0x20, 0x15, 0x08, 0x06, 0x0c, 0x0d, 0x12, 0x0d, + 0x14, 0x0d, 0x00, 0x00, 0xff, 0xff, 0x00, 0x1c, 0x00, 0x00, 0x01, 0xd6, 0x02, 0x6b, 0x02, 0x06, + 0x03, 0xa2, 0x00, 0x00, 0x00, 0x02, 0x00, 0x09, 0xff, 0x59, 0x01, 0xcb, 0x02, 0xb9, 0x00, 0x1d, + 0x00, 0x2a, 0x00, 0x55, 0xb4, 0x1e, 0x52, 0x09, 0x51, 0x17, 0xb8, 0xff, 0xc0, 0x40, 0x0c, 0x09, + 0x0c, 0x48, 0x17, 0x00, 0x2c, 0xc0, 0x24, 0xd0, 0x24, 0x02, 0x24, 0xb8, 0xff, 0xc0, 0xb7, 0x0b, + 0x0e, 0x48, 0x24, 0x52, 0x11, 0x2b, 0x27, 0xb8, 0xff, 0x98, 0x40, 0x14, 0x0f, 0x49, 0x40, 0x27, + 0x50, 0x27, 0x02, 0x27, 0x55, 0x0c, 0x0c, 0x03, 0x21, 0x55, 0x14, 0xa6, 0x1d, 0x57, 0x03, 0x92, + 0x00, 0x3f, 0xed, 0x3f, 0xed, 0x12, 0x39, 0x2f, 0xed, 0x5d, 0x2b, 0x01, 0x10, 0xd6, 0xed, 0x2b, + 0x5d, 0x10, 0xd6, 0xdc, 0x2b, 0xed, 0xed, 0x31, 0x30, 0x05, 0x06, 0x06, 0x23, 0x22, 0x2e, 0x02, + 0x35, 0x11, 0x06, 0x06, 0x23, 0x22, 0x2e, 0x02, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x11, + 0x14, 0x1e, 0x02, 0x33, 0x03, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, + 0x37, 0x01, 0xcb, 0x0f, 0x23, 0x0d, 0x37, 0x47, 0x29, 0x10, 0x0b, 0x23, 0x1a, 0x1a, 0x2f, 0x25, + 0x16, 0x57, 0x4c, 0x4d, 0x57, 0x0b, 0x1b, 0x30, 0x25, 0xf6, 0x18, 0x1a, 0x18, 0x19, 0x1a, 0x17, + 0x0d, 0x1a, 0x0b, 0xa4, 0x02, 0x01, 0x1b, 0x30, 0x40, 0x26, 0x01, 0x9b, 0x06, 0x0c, 0x12, 0x24, + 0x34, 0x21, 0x49, 0x52, 0x5a, 0x62, 0xfe, 0x11, 0x15, 0x1f, 0x13, 0x09, 0x02, 0x60, 0x1a, 0x25, + 0x20, 0x16, 0x1b, 0x1e, 0x0c, 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x24, 0xff, 0x59, 0x01, 0xdd, + 0x02, 0x60, 0x00, 0x2d, 0x00, 0x51, 0x40, 0x0f, 0x0d, 0x13, 0x79, 0x40, 0x06, 0x01, 0x06, 0x2f, + 0x27, 0x40, 0x03, 0x01, 0x03, 0x2f, 0x2f, 0xb8, 0xff, 0xc0, 0x40, 0x1c, 0x09, 0x0c, 0x48, 0x25, + 0x29, 0x51, 0x22, 0x1e, 0x20, 0x2e, 0x1f, 0x28, 0x48, 0x26, 0x06, 0x24, 0x08, 0x21, 0x06, 0x03, + 0x00, 0x57, 0x19, 0x07, 0x0d, 0x10, 0x09, 0x92, 0x00, 0x3f, 0xd5, 0xc6, 0x3f, 0xfd, 0xc6, 0x3f, + 0x3f, 0x3f, 0xfd, 0xc0, 0x01, 0x10, 0xd6, 0xd6, 0xc0, 0xfd, 0xc0, 0x2b, 0x10, 0xd6, 0x5d, 0xc6, + 0x10, 0xd6, 0x5d, 0xfd, 0xce, 0x31, 0x30, 0x25, 0x32, 0x36, 0x37, 0x16, 0x16, 0x15, 0x14, 0x06, + 0x23, 0x22, 0x26, 0x27, 0x37, 0x16, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x34, 0x27, 0x06, 0x06, + 0x23, 0x22, 0x2e, 0x02, 0x35, 0x35, 0x23, 0x35, 0x33, 0x35, 0x37, 0x15, 0x33, 0x15, 0x23, 0x15, + 0x14, 0x1e, 0x02, 0x01, 0x50, 0x27, 0x46, 0x14, 0x05, 0x07, 0x4f, 0x48, 0x0b, 0x35, 0x18, 0x10, + 0x0d, 0x28, 0x10, 0x18, 0x1c, 0x01, 0x05, 0x21, 0x0e, 0x2b, 0x44, 0x2f, 0x19, 0x67, 0x67, 0x7c, + 0xc1, 0xc1, 0x0b, 0x13, 0x1b, 0x60, 0x0a, 0x08, 0x26, 0x3b, 0x25, 0x4c, 0x47, 0x07, 0x08, 0x57, + 0x05, 0x06, 0x16, 0x1b, 0x03, 0x0b, 0x05, 0x01, 0x02, 0x13, 0x2e, 0x4f, 0x3b, 0xb0, 0x66, 0x76, + 0x14, 0x8a, 0x66, 0xbe, 0x1a, 0x20, 0x12, 0x06, 0x00, 0x01, 0x00, 0x0a, 0x00, 0x00, 0x01, 0xdb, + 0x02, 0x6b, 0x00, 0x11, 0x00, 0x24, 0x40, 0x12, 0x0d, 0x0e, 0x44, 0x10, 0x05, 0x08, 0x12, 0x0f, + 0x08, 0x0e, 0x48, 0x0c, 0x02, 0x06, 0x11, 0x48, 0x0b, 0x02, 0x00, 0x3f, 0xfd, 0xc4, 0x3f, 0xed, + 0x3f, 0x01, 0x10, 0xd6, 0xc5, 0xd4, 0xfd, 0xc5, 0x31, 0x30, 0x13, 0x22, 0x06, 0x15, 0x14, 0x17, + 0x07, 0x26, 0x35, 0x34, 0x36, 0x33, 0x21, 0x15, 0x23, 0x11, 0x23, 0x11, 0xb3, 0x27, 0x1e, 0x08, + 0x5f, 0x0d, 0x5f, 0x6a, 0x01, 0x08, 0x91, 0x7c, 0x02, 0x05, 0x1c, 0x19, 0x12, 0x1d, 0x0d, 0x2e, + 0x27, 0x45, 0x3d, 0x66, 0xfd, 0xfb, 0x02, 0x05, 0x00, 0x01, 0x00, 0x24, 0xff, 0xf5, 0x01, 0xe0, + 0x02, 0xb5, 0x00, 0x29, 0x00, 0x43, 0x40, 0x27, 0x0c, 0x21, 0x2b, 0x16, 0x17, 0x14, 0x51, 0x03, + 0x29, 0x01, 0x2a, 0x20, 0x1b, 0x57, 0x24, 0x07, 0x20, 0x17, 0x30, 0x17, 0x02, 0x17, 0x55, 0x15, + 0x0a, 0x0d, 0x10, 0x57, 0x09, 0x01, 0x20, 0x00, 0x30, 0x00, 0x02, 0x00, 0x55, 0x02, 0x0a, 0x00, + 0x3f, 0xed, 0x5d, 0x3f, 0xfd, 0xc6, 0x3f, 0xed, 0x5d, 0x3f, 0xfd, 0xc6, 0x01, 0x10, 0xd6, 0xc6, + 0xd5, 0xfd, 0xd0, 0xc5, 0x10, 0xd6, 0xc6, 0x31, 0x30, 0x13, 0x23, 0x35, 0x33, 0x35, 0x34, 0x3e, + 0x02, 0x33, 0x32, 0x16, 0x17, 0x07, 0x26, 0x26, 0x23, 0x22, 0x06, 0x15, 0x15, 0x33, 0x15, 0x23, + 0x15, 0x14, 0x16, 0x33, 0x32, 0x3e, 0x02, 0x37, 0x17, 0x06, 0x06, 0x23, 0x22, 0x2e, 0x02, 0x35, + 0x8b, 0x67, 0x67, 0x18, 0x33, 0x4e, 0x37, 0x2a, 0x42, 0x12, 0x1a, 0x14, 0x2e, 0x14, 0x38, 0x2a, + 0xc1, 0xc1, 0x1f, 0x2a, 0x13, 0x20, 0x1d, 0x1e, 0x11, 0x11, 0x22, 0x50, 0x2c, 0x2a, 0x44, 0x30, + 0x19, 0x01, 0x70, 0x66, 0x19, 0x2d, 0x4a, 0x33, 0x1c, 0x0e, 0x07, 0x6b, 0x08, 0x07, 0x2d, 0x23, + 0x1e, 0x66, 0xb4, 0x34, 0x28, 0x03, 0x07, 0x0a, 0x08, 0x69, 0x0f, 0x0f, 0x13, 0x2e, 0x4f, 0x3b, + 0x00, 0x01, 0x00, 0x19, 0xff, 0x59, 0x01, 0xdb, 0x02, 0x6b, 0x00, 0x11, 0x00, 0x3b, 0x40, 0x22, + 0x60, 0x0b, 0x01, 0x0b, 0x13, 0x0f, 0x04, 0x01, 0x04, 0x05, 0x44, 0x0f, 0x00, 0x01, 0x00, 0x0f, + 0x11, 0x01, 0x11, 0xd0, 0x01, 0x01, 0x01, 0x12, 0x0a, 0x08, 0x57, 0x0e, 0x92, 0x05, 0x00, 0x48, + 0x02, 0x02, 0x00, 0x3f, 0xfd, 0xc0, 0x3f, 0xfd, 0xc6, 0x01, 0x10, 0xd6, 0x5d, 0xc6, 0x5d, 0xd5, + 0x5d, 0xfd, 0xc5, 0x5d, 0x10, 0xc6, 0x5d, 0x31, 0x30, 0x13, 0x23, 0x35, 0x21, 0x15, 0x23, 0x11, + 0x14, 0x33, 0x32, 0x37, 0x17, 0x06, 0x06, 0x23, 0x22, 0x26, 0x35, 0xbc, 0xa3, 0x01, 0xc2, 0xa3, + 0x31, 0x1a, 0x16, 0x11, 0x16, 0x2b, 0x0d, 0x4f, 0x51, 0x02, 0x05, 0x66, 0x66, 0xfe, 0x03, 0x44, + 0x07, 0x66, 0x08, 0x04, 0x58, 0x5e, 0x00, 0x00, 0x00, 0x01, 0x00, 0x27, 0xff, 0xf3, 0x02, 0x01, + 0x02, 0xcb, 0x00, 0x22, 0x00, 0x34, 0x40, 0x1e, 0x13, 0x40, 0x0e, 0x00, 0x4d, 0x0e, 0x44, 0x1e, + 0x13, 0xa9, 0x1a, 0x24, 0x08, 0x44, 0x40, 0x05, 0x01, 0x05, 0x23, 0x1d, 0x16, 0x8a, 0x0f, 0x02, + 0x07, 0x02, 0x0b, 0x74, 0x00, 0x09, 0x00, 0x3f, 0xed, 0x3f, 0x3f, 0x3f, 0xc4, 0x01, 0x10, 0xd6, + 0x5d, 0xed, 0x10, 0xd4, 0xed, 0xd4, 0xed, 0x31, 0x30, 0x2b, 0x17, 0x22, 0x2e, 0x02, 0x35, 0x11, + 0x33, 0x11, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x11, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x27, + 0x33, 0x16, 0x16, 0x15, 0x14, 0x06, 0x07, 0x11, 0x14, 0x0e, 0x02, 0xdd, 0x35, 0x46, 0x2a, 0x11, + 0x73, 0x1f, 0x26, 0x25, 0x21, 0x33, 0x27, 0x1a, 0x01, 0x01, 0x66, 0x02, 0x02, 0x2d, 0x3d, 0x12, + 0x2b, 0x47, 0x0d, 0x21, 0x3e, 0x58, 0x36, 0x01, 0x8b, 0xfe, 0x74, 0x4e, 0x3c, 0x3e, 0x4d, 0x01, + 0x8b, 0x20, 0x1d, 0x08, 0x12, 0x09, 0x0c, 0x17, 0x0b, 0x2f, 0x3d, 0x09, 0xfe, 0xb8, 0x36, 0x58, + 0x3e, 0x21, 0x00, 0x00, 0x00, 0x01, 0x00, 0x29, 0xff, 0xf5, 0x01, 0xe8, 0x02, 0x34, 0x00, 0x20, + 0x00, 0x31, 0x40, 0x1c, 0x04, 0x40, 0x0b, 0x0e, 0x00, 0x4c, 0x20, 0x51, 0x0f, 0x07, 0x52, 0x0b, + 0x22, 0x1a, 0x51, 0x17, 0x21, 0x18, 0x07, 0x1d, 0x57, 0x12, 0x0b, 0x0e, 0x07, 0xa8, 0x00, 0x07, + 0x00, 0x3f, 0x3f, 0xc4, 0x3f, 0xed, 0x3f, 0x01, 0x10, 0xd6, 0xed, 0x10, 0xd6, 0xed, 0xd4, 0xed, + 0x31, 0x30, 0x2b, 0x01, 0x33, 0x36, 0x36, 0x35, 0x34, 0x26, 0x27, 0x33, 0x16, 0x16, 0x15, 0x14, + 0x06, 0x07, 0x11, 0x06, 0x06, 0x23, 0x22, 0x2e, 0x02, 0x35, 0x11, 0x33, 0x15, 0x14, 0x16, 0x33, + 0x32, 0x36, 0x37, 0x01, 0x0e, 0x39, 0x23, 0x17, 0x01, 0x01, 0x66, 0x02, 0x01, 0x2d, 0x3b, 0x1e, + 0x59, 0x33, 0x35, 0x43, 0x26, 0x0f, 0x72, 0x18, 0x22, 0x0a, 0x25, 0x0a, 0x01, 0xd6, 0x02, 0x20, + 0x1b, 0x08, 0x10, 0x09, 0x0c, 0x15, 0x0b, 0x2f, 0x3d, 0x09, 0xfe, 0x7d, 0x09, 0x12, 0x20, 0x3b, + 0x50, 0x30, 0x01, 0x06, 0xff, 0x41, 0x3e, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x09, + 0xff, 0xf3, 0x01, 0xeb, 0x02, 0x6c, 0x00, 0x27, 0x00, 0x3c, 0x40, 0x23, 0x1e, 0x46, 0x00, 0x3f, + 0x22, 0x01, 0x22, 0x60, 0x24, 0xf0, 0x24, 0x02, 0x24, 0x29, 0x14, 0x46, 0x0a, 0x30, 0x10, 0x01, + 0x10, 0x0e, 0x28, 0x24, 0x48, 0x23, 0x02, 0x0e, 0x48, 0x0f, 0x02, 0x19, 0x4a, 0x05, 0x09, 0x00, + 0x3f, 0xed, 0x3f, 0xed, 0x3f, 0xed, 0x01, 0x10, 0xd6, 0xc5, 0x5d, 0xd6, 0xed, 0x10, 0xd6, 0x5d, + 0xc5, 0x5d, 0xd6, 0xed, 0x31, 0x30, 0x01, 0x14, 0x0e, 0x02, 0x23, 0x22, 0x2e, 0x02, 0x35, 0x34, + 0x36, 0x37, 0x23, 0x35, 0x33, 0x15, 0x06, 0x06, 0x15, 0x14, 0x1e, 0x02, 0x33, 0x32, 0x3e, 0x02, + 0x35, 0x34, 0x26, 0x27, 0x35, 0x33, 0x15, 0x23, 0x16, 0x16, 0x01, 0xe6, 0x29, 0x42, 0x55, 0x2d, + 0x2c, 0x55, 0x42, 0x29, 0x22, 0x2b, 0x51, 0xd7, 0x22, 0x34, 0x0a, 0x19, 0x2b, 0x20, 0x20, 0x2b, + 0x1b, 0x0b, 0x31, 0x26, 0xd9, 0x55, 0x2b, 0x25, 0x01, 0x0a, 0x4b, 0x6a, 0x43, 0x1f, 0x1f, 0x43, + 0x6a, 0x4b, 0x41, 0x7f, 0x3c, 0x66, 0x57, 0x29, 0x77, 0x50, 0x27, 0x47, 0x38, 0x21, 0x21, 0x37, + 0x48, 0x27, 0x50, 0x77, 0x29, 0x57, 0x66, 0x3c, 0x81, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x27, + 0xff, 0xf3, 0x01, 0xd9, 0x02, 0x72, 0x00, 0x25, 0x00, 0x40, 0xb7, 0x23, 0x20, 0x0c, 0x00, 0x4d, + 0x1a, 0x51, 0x05, 0xb8, 0xff, 0xc0, 0x40, 0x09, 0x0d, 0x12, 0x48, 0x05, 0x27, 0x23, 0x0f, 0x44, + 0x0e, 0xb8, 0xff, 0xc0, 0x40, 0x10, 0x0d, 0x12, 0x48, 0x0e, 0x26, 0x0e, 0x02, 0x15, 0x4a, 0x08, + 0x09, 0x22, 0x1f, 0x4a, 0x00, 0x03, 0x00, 0x3f, 0xfd, 0xc6, 0x3f, 0xed, 0x3f, 0x01, 0x10, 0xd6, + 0x2b, 0xfd, 0xc6, 0x10, 0xd6, 0x2b, 0xed, 0x31, 0x30, 0x2b, 0x01, 0x32, 0x1e, 0x02, 0x15, 0x14, + 0x06, 0x23, 0x22, 0x2e, 0x02, 0x35, 0x11, 0x33, 0x11, 0x14, 0x1e, 0x02, 0x33, 0x32, 0x3e, 0x02, + 0x35, 0x34, 0x2e, 0x02, 0x23, 0x22, 0x06, 0x07, 0x27, 0x36, 0x36, 0x01, 0x18, 0x3a, 0x4a, 0x2c, + 0x11, 0x6b, 0x73, 0x3e, 0x51, 0x31, 0x14, 0x7c, 0x08, 0x12, 0x1f, 0x18, 0x22, 0x29, 0x16, 0x07, + 0x05, 0x11, 0x22, 0x1d, 0x09, 0x14, 0x08, 0x06, 0x0d, 0x22, 0x02, 0x72, 0x2a, 0x52, 0x7a, 0x50, + 0xa0, 0x99, 0x21, 0x3f, 0x5a, 0x38, 0x01, 0x86, 0xfe, 0x85, 0x29, 0x38, 0x22, 0x0f, 0x1e, 0x37, + 0x4c, 0x2d, 0x37, 0x52, 0x37, 0x1b, 0x03, 0x03, 0x6b, 0x03, 0x03, 0x00, 0x00, 0x01, 0x00, 0x0d, + 0x00, 0x00, 0x02, 0x07, 0x02, 0x74, 0x00, 0x1c, 0x00, 0x7c, 0xb9, 0x00, 0x16, 0xff, 0xc0, 0xb3, + 0x09, 0x00, 0x4d, 0x15, 0xb8, 0xff, 0xf0, 0xb3, 0x09, 0x00, 0x4d, 0x14, 0xb8, 0xff, 0xe0, 0xb3, + 0x09, 0x00, 0x4d, 0x08, 0xb8, 0xff, 0xc0, 0xb3, 0x10, 0x00, 0x4d, 0x08, 0xb8, 0xff, 0xc0, 0x40, + 0x2e, 0x0c, 0x00, 0x4d, 0x10, 0xaf, 0x08, 0xbf, 0x08, 0x02, 0x08, 0x11, 0x44, 0x16, 0x12, 0x17, + 0x1d, 0x13, 0x0f, 0x00, 0x1c, 0x03, 0x12, 0x1e, 0x13, 0x12, 0x13, 0x12, 0x1d, 0x1e, 0x13, 0x10, + 0x1c, 0x1c, 0x10, 0x13, 0x03, 0x12, 0x17, 0x02, 0x12, 0x08, 0x09, 0x0c, 0x4a, 0x05, 0x03, 0x00, + 0x3f, 0xfd, 0xc6, 0x3f, 0x3f, 0x12, 0x17, 0x39, 0x2f, 0x2f, 0x2f, 0x01, 0x11, 0x12, 0x39, 0x39, + 0x2f, 0x2f, 0x11, 0x12, 0x17, 0x39, 0x11, 0x12, 0x39, 0x10, 0xc6, 0xfd, 0xc6, 0x5d, 0x33, 0x31, + 0x30, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x01, 0x3e, 0x03, 0x33, 0x32, 0x16, 0x17, 0x07, 0x26, 0x26, + 0x23, 0x22, 0x06, 0x07, 0x07, 0x15, 0x23, 0x35, 0x26, 0x26, 0x27, 0x33, 0x1e, 0x03, 0x17, 0x01, + 0x28, 0x0a, 0x13, 0x1c, 0x29, 0x1e, 0x1d, 0x2b, 0x17, 0x37, 0x07, 0x10, 0x09, 0x0e, 0x13, 0x09, + 0x5e, 0x7b, 0x33, 0x4d, 0x20, 0x83, 0x09, 0x16, 0x17, 0x1a, 0x0e, 0x01, 0xf1, 0x1b, 0x30, 0x23, + 0x15, 0x0d, 0x13, 0x58, 0x08, 0x05, 0x1a, 0x16, 0xec, 0xed, 0xeb, 0x60, 0xc4, 0x5c, 0x1f, 0x48, + 0x4b, 0x49, 0x20, 0x00, 0x00, 0x01, 0x00, 0x14, 0xff, 0x58, 0x01, 0xf9, 0x01, 0xdd, 0x00, 0x2c, + 0x00, 0x6b, 0xb9, 0x00, 0x2c, 0xff, 0xe0, 0xb4, 0x0d, 0x0e, 0x00, 0x4c, 0x29, 0xb8, 0xff, 0xe0, + 0x40, 0x37, 0x0d, 0x0e, 0x00, 0x4c, 0x16, 0x20, 0x0d, 0x00, 0x4d, 0x15, 0x20, 0x10, 0x00, 0x4d, + 0x15, 0x18, 0x0e, 0x0f, 0x00, 0x4c, 0x00, 0x51, 0x2c, 0x2c, 0x2d, 0x29, 0x0f, 0x0b, 0x15, 0x03, + 0x1a, 0x2e, 0x29, 0x08, 0x1a, 0x05, 0x1a, 0x08, 0x05, 0x29, 0x04, 0x2d, 0x0e, 0x2e, 0x22, 0x2d, + 0x2c, 0x0a, 0x23, 0x26, 0x67, 0x1f, 0x0f, 0x0b, 0x0b, 0x00, 0x3f, 0x3f, 0xfd, 0xc6, 0x3f, 0x01, + 0x10, 0xc6, 0x10, 0xc6, 0x12, 0x17, 0x39, 0x3d, 0x2f, 0x18, 0x2f, 0x2f, 0x2f, 0x11, 0x12, 0x17, + 0x39, 0x11, 0x12, 0x39, 0x10, 0xed, 0x31, 0x30, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x13, 0x1e, 0x03, + 0x17, 0x36, 0x36, 0x37, 0x36, 0x36, 0x33, 0x32, 0x16, 0x17, 0x07, 0x26, 0x26, 0x23, 0x22, 0x06, + 0x07, 0x0e, 0x03, 0x07, 0x0e, 0x03, 0x23, 0x22, 0x26, 0x27, 0x37, 0x16, 0x16, 0x33, 0x32, 0x36, + 0x37, 0x26, 0x26, 0x27, 0x98, 0x07, 0x14, 0x19, 0x1d, 0x11, 0x14, 0x14, 0x08, 0x0e, 0x38, 0x39, + 0x13, 0x26, 0x17, 0x15, 0x0c, 0x18, 0x07, 0x0e, 0x16, 0x06, 0x0c, 0x14, 0x15, 0x18, 0x11, 0x10, + 0x24, 0x2f, 0x3d, 0x29, 0x1c, 0x2a, 0x0e, 0x17, 0x11, 0x16, 0x0e, 0x20, 0x30, 0x0f, 0x3b, 0x4b, + 0x22, 0x01, 0xd6, 0x1d, 0x4c, 0x53, 0x58, 0x29, 0x4f, 0x6a, 0x22, 0x36, 0x33, 0x08, 0x0a, 0x61, + 0x06, 0x02, 0x14, 0x18, 0x30, 0x52, 0x4d, 0x4d, 0x2a, 0x27, 0x3f, 0x2b, 0x17, 0x0b, 0x08, 0x66, + 0x08, 0x08, 0x2a, 0x26, 0x73, 0xdf, 0x73, 0x00, 0x00, 0x01, 0x00, 0x2e, 0x00, 0x00, 0x01, 0xc6, + 0x02, 0x6b, 0x00, 0x16, 0x00, 0xb1, 0x40, 0x0c, 0x16, 0x40, 0x09, 0x0a, 0x00, 0x4c, 0x12, 0x40, + 0x0a, 0x00, 0x4d, 0x0d, 0xb8, 0xff, 0xe0, 0xb4, 0x11, 0x12, 0x00, 0x4c, 0x0c, 0xb8, 0xff, 0xc0, + 0x40, 0x66, 0x0b, 0x00, 0x4d, 0x07, 0x40, 0x0b, 0x0c, 0x00, 0x4c, 0x06, 0x20, 0x0d, 0x00, 0x4d, + 0x06, 0x60, 0x0c, 0x00, 0x4d, 0x06, 0x40, 0x0b, 0x00, 0x4d, 0x05, 0x40, 0x0b, 0x00, 0x4d, 0x03, + 0x40, 0x09, 0x0a, 0x00, 0x4c, 0x01, 0x20, 0x0f, 0x00, 0x4d, 0x00, 0x40, 0x0a, 0x00, 0x4d, 0x0c, + 0x11, 0x10, 0x14, 0x15, 0x0f, 0x08, 0x12, 0x05, 0x13, 0x02, 0x04, 0x03, 0x00, 0x16, 0x09, 0x09, + 0x16, 0x00, 0x03, 0x04, 0x02, 0x13, 0x05, 0x12, 0x08, 0x0f, 0x15, 0x14, 0x10, 0x11, 0x0c, 0x10, + 0x17, 0x18, 0x16, 0x02, 0x14, 0x48, 0x15, 0x02, 0x0b, 0x08, 0x12, 0x02, 0x48, 0x0f, 0x40, 0x05, + 0x70, 0x05, 0x02, 0x05, 0x08, 0x48, 0x0a, 0x08, 0x00, 0x3f, 0xfd, 0xd6, 0x5d, 0xc0, 0xfd, 0xc0, + 0x3f, 0x3f, 0xed, 0x3f, 0x01, 0x11, 0x12, 0x17, 0x39, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, + 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x31, 0x30, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, + 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x01, 0x06, 0x07, 0x33, 0x15, 0x23, 0x06, 0x06, 0x07, + 0x21, 0x15, 0x21, 0x35, 0x36, 0x36, 0x37, 0x23, 0x35, 0x33, 0x37, 0x23, 0x35, 0x21, 0x01, 0xbd, + 0x3b, 0x30, 0x6a, 0xa4, 0x1a, 0x2d, 0x15, 0x01, 0x0a, 0xfe, 0x68, 0x16, 0x33, 0x20, 0x60, 0x98, + 0x5a, 0xee, 0x01, 0x82, 0x02, 0x15, 0x5a, 0x4e, 0x62, 0x2c, 0x52, 0x27, 0x66, 0x47, 0x2c, 0x60, + 0x38, 0x62, 0x98, 0x66, 0x00, 0x01, 0x00, 0x43, 0x00, 0x00, 0x01, 0xb4, 0x01, 0xd6, 0x00, 0x18, + 0x00, 0xd3, 0xb9, 0x00, 0x11, 0xff, 0xc0, 0x40, 0x0e, 0x11, 0x00, 0x4d, 0x0f, 0x40, 0x0c, 0x00, + 0x4d, 0x06, 0x40, 0x0c, 0x00, 0x4d, 0x09, 0xb8, 0xff, 0xc0, 0xb3, 0x0d, 0x00, 0x4d, 0x08, 0xb8, + 0xff, 0xc0, 0x40, 0x77, 0x0d, 0x00, 0x4d, 0x50, 0x0f, 0x01, 0x0f, 0x11, 0x12, 0xaf, 0x0c, 0x01, + 0xaf, 0x0b, 0x01, 0xb0, 0x16, 0xc0, 0x16, 0xd0, 0x16, 0x03, 0xb0, 0x17, 0xc0, 0x17, 0xd0, 0x17, + 0x03, 0xb0, 0x10, 0xc0, 0x10, 0xd0, 0x10, 0x03, 0x90, 0x11, 0xb0, 0x11, 0xc0, 0x11, 0xd0, 0x11, + 0x04, 0xbf, 0x05, 0x01, 0xbf, 0x04, 0x01, 0xc0, 0x0a, 0xd0, 0x0a, 0x02, 0xc0, 0x09, 0xd0, 0x09, + 0x02, 0x0c, 0x0b, 0x16, 0x17, 0x10, 0x11, 0x12, 0x08, 0x15, 0x06, 0x03, 0x05, 0x04, 0x00, 0x18, + 0x0a, 0x09, 0x09, 0x0a, 0x18, 0x00, 0x04, 0x05, 0x03, 0x06, 0x15, 0x08, 0x12, 0x11, 0x10, 0x17, + 0x16, 0x0b, 0x0c, 0x11, 0x19, 0x1a, 0x18, 0x0a, 0x05, 0x0f, 0x7d, 0x04, 0x11, 0x4f, 0x15, 0x01, + 0x15, 0x55, 0x17, 0x0a, 0x0b, 0x06, 0x08, 0x09, 0x55, 0x0a, 0x06, 0x00, 0x3f, 0xed, 0x32, 0x3f, + 0x3f, 0xfd, 0x5d, 0xd6, 0x32, 0xed, 0x32, 0x3f, 0x01, 0x11, 0x12, 0x17, 0x39, 0x2f, 0x2f, 0x2f, + 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x5d, 0x5d, + 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x11, 0x12, 0x39, 0x5d, 0x31, 0x30, 0x00, 0x2b, + 0x2b, 0x01, 0x2b, 0x2b, 0x2b, 0x01, 0x06, 0x06, 0x07, 0x33, 0x15, 0x23, 0x06, 0x07, 0x33, 0x15, + 0x21, 0x35, 0x36, 0x36, 0x37, 0x23, 0x35, 0x33, 0x36, 0x36, 0x37, 0x23, 0x35, 0x21, 0x01, 0xaa, + 0x0e, 0x2d, 0x1b, 0x51, 0x8c, 0x26, 0x1d, 0xde, 0xfe, 0x8f, 0x12, 0x29, 0x15, 0x3f, 0x78, 0x12, + 0x22, 0x0f, 0xc2, 0x01, 0x5d, 0x01, 0x7c, 0x0e, 0x37, 0x22, 0x4f, 0x33, 0x2d, 0x66, 0x4b, 0x1d, + 0x3f, 0x1f, 0x4f, 0x1a, 0x2d, 0x14, 0x66, 0x00, 0x00, 0x01, 0x00, 0x1a, 0xff, 0xf3, 0x01, 0xe1, + 0x02, 0x6b, 0x00, 0x26, 0x00, 0x51, 0xb9, 0x00, 0x1d, 0xff, 0xe0, 0x40, 0x29, 0x0f, 0x00, 0x4d, + 0x22, 0x53, 0x09, 0x60, 0x13, 0x01, 0x13, 0x28, 0x0e, 0x26, 0x1b, 0x05, 0x06, 0x1b, 0x27, 0x1c, + 0x1f, 0x4a, 0x16, 0x00, 0x73, 0x26, 0x09, 0x0e, 0x26, 0x26, 0x0e, 0x09, 0x03, 0x08, 0x16, 0x09, + 0x08, 0x02, 0x06, 0x48, 0x07, 0x02, 0x00, 0x3f, 0xed, 0x3f, 0x3f, 0x12, 0x17, 0x39, 0x2f, 0x2f, + 0x2f, 0x10, 0xed, 0x10, 0xfd, 0xc6, 0x01, 0x10, 0xd6, 0xd6, 0xc5, 0x10, 0xd4, 0xc5, 0x10, 0xd6, + 0x5d, 0xc4, 0xed, 0x31, 0x30, 0x00, 0x2b, 0x13, 0x3e, 0x03, 0x37, 0x21, 0x35, 0x21, 0x15, 0x0e, + 0x03, 0x07, 0x1e, 0x03, 0x15, 0x14, 0x06, 0x23, 0x22, 0x2e, 0x02, 0x27, 0x37, 0x16, 0x16, 0x33, + 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x23, 0xa8, 0x11, 0x2b, 0x2b, 0x26, 0x0d, 0xfe, 0xf0, 0x01, + 0xa1, 0x0b, 0x27, 0x2e, 0x31, 0x14, 0x32, 0x44, 0x2a, 0x13, 0x8a, 0x79, 0x20, 0x3b, 0x33, 0x29, + 0x0d, 0x27, 0x1d, 0x4e, 0x31, 0x3c, 0x4a, 0x4b, 0x44, 0x2c, 0x01, 0x5e, 0x11, 0x2c, 0x2f, 0x2b, + 0x10, 0x66, 0x4b, 0x0e, 0x2e, 0x36, 0x36, 0x15, 0x08, 0x1e, 0x2c, 0x3a, 0x24, 0x66, 0x5a, 0x09, + 0x0e, 0x10, 0x07, 0x64, 0x0f, 0x18, 0x2b, 0x2b, 0x37, 0x26, 0x00, 0x00, 0x00, 0x01, 0x00, 0x28, + 0xff, 0xf3, 0x01, 0xef, 0x02, 0x6b, 0x00, 0x24, 0x00, 0x72, 0x40, 0x10, 0x22, 0x20, 0x10, 0x00, + 0x4d, 0x22, 0x20, 0x0e, 0x00, 0x4d, 0x21, 0x40, 0x0e, 0x00, 0x4d, 0x21, 0xb8, 0xff, 0xc0, 0x40, + 0x38, 0x0c, 0x00, 0x4d, 0x20, 0x21, 0x01, 0x02, 0x20, 0x40, 0x10, 0x00, 0x4d, 0x20, 0x40, 0x0e, + 0x00, 0x4d, 0x20, 0x20, 0x01, 0x1f, 0x40, 0x10, 0x00, 0x4d, 0x30, 0x24, 0x01, 0x24, 0x1e, 0x0b, + 0x26, 0x1b, 0x04, 0x53, 0x13, 0x25, 0x16, 0x24, 0x00, 0x00, 0x24, 0x16, 0x03, 0x0e, 0x1e, 0x48, + 0x1d, 0x02, 0x1c, 0x02, 0x0a, 0x07, 0x4a, 0x0e, 0x09, 0x00, 0x3f, 0xfd, 0xc6, 0x3f, 0x3f, 0xed, + 0x12, 0x17, 0x39, 0x2f, 0x2f, 0x2f, 0x01, 0x10, 0xd6, 0xed, 0xc4, 0x10, 0xd6, 0xd6, 0xc6, 0x5d, + 0x31, 0x30, 0x2b, 0x5d, 0x2b, 0x2b, 0x5f, 0x5d, 0x2b, 0x2b, 0x2b, 0x2b, 0x01, 0x23, 0x22, 0x06, + 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x17, 0x06, 0x06, 0x23, 0x22, 0x2e, 0x02, 0x35, 0x34, + 0x36, 0x37, 0x2e, 0x03, 0x27, 0x35, 0x21, 0x15, 0x21, 0x1e, 0x03, 0x17, 0x01, 0x62, 0x23, 0x50, + 0x49, 0x42, 0x3b, 0x34, 0x54, 0x1d, 0x27, 0x1a, 0x69, 0x4a, 0x39, 0x5c, 0x42, 0x23, 0x50, 0x60, + 0x14, 0x2f, 0x2d, 0x25, 0x0b, 0x01, 0x97, 0xfe, 0xf8, 0x0d, 0x27, 0x2b, 0x2b, 0x11, 0x01, 0x1e, + 0x31, 0x34, 0x2b, 0x30, 0x18, 0x10, 0x63, 0x0e, 0x22, 0x17, 0x30, 0x4a, 0x33, 0x44, 0x5c, 0x11, + 0x15, 0x32, 0x30, 0x2b, 0x0e, 0x53, 0x66, 0x10, 0x2b, 0x2f, 0x2c, 0x11, 0x00, 0x01, 0x00, 0x36, + 0xff, 0x5b, 0x01, 0xd9, 0x01, 0xd6, 0x00, 0x22, 0x00, 0x56, 0xb5, 0x1e, 0x20, 0x0e, 0x00, 0x4d, + 0x15, 0xb8, 0xff, 0xe0, 0x40, 0x29, 0x1c, 0x00, 0x4d, 0x22, 0x1c, 0x24, 0x18, 0x1d, 0x1d, 0x23, + 0x00, 0x0b, 0x01, 0x0b, 0x24, 0x14, 0x19, 0x04, 0x53, 0x30, 0x11, 0x01, 0x11, 0x23, 0x00, 0x22, + 0x14, 0x14, 0x22, 0x00, 0x03, 0x0e, 0x1c, 0x48, 0x1b, 0x06, 0x0a, 0x07, 0x4a, 0x0e, 0x92, 0x00, + 0x3f, 0xfd, 0xc6, 0x3f, 0xed, 0x12, 0x17, 0x39, 0x2f, 0x2f, 0x2f, 0x01, 0x10, 0xd6, 0x71, 0xed, + 0xd4, 0xc5, 0x10, 0xc6, 0x5d, 0x12, 0x39, 0x2f, 0x39, 0x10, 0xd6, 0xc6, 0x31, 0x30, 0x2b, 0x2b, + 0x25, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x17, 0x06, 0x06, 0x23, 0x22, + 0x26, 0x35, 0x34, 0x36, 0x37, 0x2e, 0x03, 0x27, 0x35, 0x21, 0x15, 0x23, 0x1e, 0x03, 0x17, 0x01, + 0x66, 0x27, 0x40, 0x4c, 0x40, 0x38, 0x23, 0x53, 0x1d, 0x1b, 0x1f, 0x65, 0x33, 0x6f, 0x7d, 0x4d, + 0x58, 0x15, 0x2b, 0x28, 0x21, 0x0a, 0x01, 0x71, 0xd8, 0x0c, 0x22, 0x24, 0x24, 0x0f, 0x88, 0x2e, + 0x35, 0x30, 0x2f, 0x0f, 0x0d, 0x63, 0x0f, 0x15, 0x61, 0x63, 0x44, 0x5a, 0x12, 0x17, 0x32, 0x30, + 0x2b, 0x10, 0x53, 0x66, 0x10, 0x2d, 0x2e, 0x2d, 0x10, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x2d, + 0xff, 0x56, 0x01, 0xc1, 0x01, 0xd6, 0x00, 0x33, 0x00, 0x47, 0x40, 0x25, 0x19, 0x0a, 0x53, 0x23, + 0x35, 0x1e, 0x1e, 0x34, 0x35, 0x10, 0x16, 0x34, 0x2d, 0x53, 0x00, 0x34, 0x05, 0x0a, 0x31, 0x0f, + 0x10, 0x1e, 0x19, 0x19, 0x1e, 0x10, 0x0f, 0x04, 0x18, 0x31, 0x92, 0x18, 0x06, 0x16, 0x48, 0x17, + 0x06, 0x00, 0x3f, 0xed, 0x3f, 0x3f, 0x12, 0x17, 0x39, 0x2f, 0x2f, 0x2f, 0x2f, 0x12, 0x39, 0x39, + 0x01, 0x10, 0xd6, 0xed, 0x10, 0xd6, 0xc6, 0x11, 0x12, 0x39, 0x2f, 0x10, 0xd6, 0xed, 0xc4, 0x31, + 0x30, 0x17, 0x34, 0x3e, 0x02, 0x37, 0x3e, 0x03, 0x35, 0x34, 0x2e, 0x02, 0x23, 0x35, 0x3e, 0x03, + 0x37, 0x23, 0x35, 0x21, 0x15, 0x0e, 0x03, 0x07, 0x1e, 0x03, 0x15, 0x14, 0x0e, 0x02, 0x07, 0x0e, + 0x03, 0x15, 0x14, 0x16, 0x17, 0x07, 0x26, 0x26, 0x2d, 0x17, 0x2a, 0x3c, 0x24, 0x19, 0x2d, 0x23, + 0x15, 0x0d, 0x25, 0x43, 0x36, 0x0d, 0x22, 0x21, 0x1f, 0x0a, 0xe2, 0x01, 0x7a, 0x0c, 0x20, 0x22, + 0x23, 0x10, 0x22, 0x36, 0x25, 0x13, 0x1d, 0x38, 0x52, 0x35, 0x18, 0x1c, 0x0e, 0x04, 0x06, 0x05, + 0x64, 0x08, 0x11, 0x5b, 0x20, 0x2c, 0x1e, 0x15, 0x09, 0x06, 0x0b, 0x0e, 0x15, 0x10, 0x11, 0x1b, + 0x12, 0x09, 0x45, 0x0d, 0x20, 0x20, 0x1c, 0x0a, 0x66, 0x5b, 0x0c, 0x1f, 0x21, 0x20, 0x0f, 0x08, + 0x16, 0x21, 0x2f, 0x22, 0x27, 0x33, 0x23, 0x1a, 0x0e, 0x06, 0x0c, 0x0c, 0x0e, 0x07, 0x09, 0x1d, + 0x09, 0x13, 0x10, 0x25, 0x00, 0x01, 0x00, 0x1c, 0x00, 0x00, 0x01, 0xc8, 0x02, 0x79, 0x00, 0x28, + 0x00, 0x77, 0xb9, 0x00, 0x12, 0xff, 0xe0, 0x40, 0x46, 0x19, 0x00, 0x4d, 0x22, 0x40, 0x0d, 0x0f, + 0x00, 0x4c, 0x21, 0x20, 0x0f, 0x00, 0x4d, 0x21, 0x40, 0x0e, 0x00, 0x4d, 0x21, 0x20, 0x0d, 0x00, + 0x4d, 0x1a, 0x63, 0x00, 0x04, 0x20, 0x0a, 0x01, 0x0a, 0x2a, 0x14, 0x17, 0x06, 0x03, 0x03, 0x06, + 0x17, 0x14, 0x04, 0x29, 0x2a, 0x16, 0x15, 0x09, 0x63, 0x11, 0x23, 0x29, 0x22, 0x1d, 0x67, 0x26, + 0x05, 0x0c, 0x0c, 0x17, 0x40, 0x04, 0x01, 0x04, 0x65, 0x05, 0x15, 0x09, 0x65, 0x0b, 0x0c, 0x00, + 0x3f, 0xfd, 0xc4, 0xd6, 0xfd, 0x5d, 0xc0, 0x3f, 0x3f, 0xfd, 0xc6, 0x01, 0x10, 0xd6, 0xd6, 0xed, + 0xd4, 0xc0, 0x11, 0x12, 0x17, 0x39, 0x2f, 0x2f, 0x2f, 0x2f, 0x10, 0xd6, 0x5d, 0xd6, 0xd6, 0xed, + 0x31, 0x30, 0x00, 0x2b, 0x2b, 0x2b, 0x2b, 0x01, 0x2b, 0x01, 0x14, 0x06, 0x07, 0x33, 0x15, 0x23, + 0x06, 0x06, 0x07, 0x21, 0x15, 0x21, 0x26, 0x26, 0x34, 0x34, 0x35, 0x34, 0x36, 0x37, 0x23, 0x35, + 0x33, 0x36, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x0e, 0x02, 0x07, 0x27, 0x36, 0x36, 0x33, 0x32, + 0x16, 0x01, 0xb6, 0x1c, 0x16, 0x3e, 0x9a, 0x2c, 0x42, 0x02, 0x01, 0x10, 0xfe, 0x66, 0x01, 0x01, + 0x38, 0x26, 0x49, 0xaf, 0x1e, 0x28, 0x2f, 0x25, 0x19, 0x29, 0x23, 0x1a, 0x0a, 0x3d, 0x27, 0x68, + 0x3c, 0x70, 0x5f, 0x01, 0xc8, 0x1f, 0x3a, 0x1d, 0x63, 0x29, 0x46, 0x1a, 0x66, 0x05, 0x10, 0x11, + 0x0e, 0x03, 0x36, 0x5a, 0x28, 0x63, 0x1d, 0x36, 0x1a, 0x28, 0x27, 0x0b, 0x10, 0x13, 0x09, 0x55, + 0x25, 0x28, 0x5f, 0x00, 0x00, 0x01, 0x00, 0x1b, 0xff, 0xf3, 0x01, 0xcd, 0x02, 0x6b, 0x00, 0x20, + 0x00, 0x56, 0xb5, 0x14, 0x40, 0x0d, 0x00, 0x4d, 0x1f, 0xb8, 0xff, 0xe8, 0x40, 0x2a, 0x0d, 0x00, + 0x4d, 0x1b, 0x0f, 0x53, 0x00, 0x00, 0x01, 0x00, 0x22, 0x1c, 0x61, 0x14, 0x40, 0x09, 0x0c, 0x48, + 0x14, 0x08, 0x90, 0x17, 0x01, 0x17, 0x18, 0x21, 0x17, 0x1c, 0x65, 0x1a, 0x1f, 0x65, 0x14, 0x14, + 0x03, 0x1a, 0x04, 0x09, 0x0c, 0x67, 0x03, 0x0d, 0x00, 0x3f, 0xfd, 0xc6, 0x3f, 0x12, 0x39, 0x10, + 0xed, 0x10, 0xfd, 0xc0, 0x01, 0x10, 0xd6, 0xcd, 0x5d, 0xd6, 0xd6, 0x2b, 0xed, 0x10, 0xd6, 0x5d, + 0xed, 0xc4, 0x31, 0x30, 0x00, 0x2b, 0x01, 0x2b, 0x25, 0x14, 0x06, 0x23, 0x22, 0x2e, 0x02, 0x27, + 0x37, 0x16, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x2e, 0x02, 0x23, 0x36, 0x36, 0x37, 0x23, 0x35, + 0x21, 0x15, 0x23, 0x06, 0x06, 0x07, 0x04, 0x01, 0xcd, 0x75, 0x76, 0x1b, 0x35, 0x2f, 0x24, 0x09, + 0x19, 0x19, 0x47, 0x30, 0x42, 0x3a, 0x1b, 0x3c, 0x62, 0x47, 0x08, 0x09, 0x04, 0x55, 0x01, 0xac, + 0xf2, 0x02, 0x04, 0x03, 0x01, 0x01, 0xbb, 0x5e, 0x6a, 0x07, 0x0b, 0x0b, 0x05, 0x69, 0x0b, 0x15, + 0x2f, 0x29, 0x1e, 0x2b, 0x1b, 0x0d, 0x40, 0x68, 0x36, 0x66, 0x66, 0x1d, 0x47, 0x1d, 0x0a, 0x00, + 0x00, 0x01, 0x00, 0x24, 0xff, 0xf3, 0x01, 0xc5, 0x01, 0xd6, 0x00, 0x23, 0x00, 0x5b, 0xb5, 0x16, + 0x40, 0x09, 0x00, 0x4d, 0x22, 0xb8, 0xff, 0xc0, 0xb3, 0x12, 0x00, 0x4d, 0x21, 0xb8, 0xff, 0xc0, + 0x40, 0x27, 0x12, 0x00, 0x4d, 0x0f, 0x53, 0x00, 0x00, 0x01, 0x00, 0x00, 0x1c, 0x01, 0x1c, 0x25, + 0x20, 0x52, 0x15, 0x06, 0x19, 0x24, 0x18, 0x4f, 0x1c, 0x01, 0x1c, 0x65, 0x1b, 0x20, 0x73, 0x14, + 0x14, 0x03, 0x1b, 0x0a, 0x07, 0x0c, 0x67, 0x03, 0x0d, 0x00, 0x3f, 0xfd, 0xc6, 0x3f, 0x12, 0x39, + 0x2f, 0xed, 0x10, 0xfd, 0x5d, 0xc0, 0x01, 0x10, 0xd6, 0xc6, 0xd6, 0xed, 0x10, 0xc6, 0x5d, 0xd6, + 0x5d, 0xed, 0x31, 0x30, 0x00, 0x2b, 0x2b, 0x01, 0x2b, 0x25, 0x14, 0x06, 0x23, 0x22, 0x26, 0x27, + 0x37, 0x1e, 0x03, 0x33, 0x32, 0x36, 0x35, 0x34, 0x2e, 0x02, 0x23, 0x23, 0x36, 0x36, 0x37, 0x23, + 0x35, 0x21, 0x15, 0x23, 0x06, 0x06, 0x07, 0x33, 0x32, 0x16, 0x01, 0xc5, 0x6e, 0x71, 0x3d, 0x5e, + 0x11, 0x16, 0x09, 0x1e, 0x27, 0x2e, 0x18, 0x32, 0x34, 0x0d, 0x22, 0x3c, 0x2f, 0x5a, 0x05, 0x08, + 0x03, 0x42, 0x01, 0x98, 0xf1, 0x01, 0x04, 0x02, 0x38, 0x5f, 0x6a, 0x93, 0x4c, 0x54, 0x13, 0x07, + 0x69, 0x03, 0x08, 0x07, 0x06, 0x17, 0x1d, 0x11, 0x18, 0x10, 0x08, 0x2c, 0x4b, 0x26, 0x66, 0x66, + 0x10, 0x28, 0x10, 0x47, 0x00, 0x01, 0x00, 0x35, 0xff, 0xf3, 0x01, 0xd8, 0x02, 0x60, 0x00, 0x2b, + 0x00, 0x6b, 0xb9, 0x00, 0x0b, 0xff, 0xc0, 0xb5, 0x10, 0x00, 0x4d, 0x11, 0x53, 0x00, 0xb8, 0xff, + 0xc0, 0x40, 0x11, 0x0b, 0x11, 0x48, 0x00, 0x2d, 0x22, 0x1a, 0x51, 0x23, 0x20, 0x51, 0x1e, 0x0a, + 0x70, 0x1b, 0x01, 0x1b, 0xb8, 0xff, 0xc0, 0x40, 0x20, 0x0b, 0x0e, 0x48, 0x1b, 0x2c, 0x1a, 0x4f, + 0x22, 0x01, 0x22, 0x65, 0x1d, 0x30, 0x21, 0x01, 0x0f, 0x21, 0x01, 0x21, 0x0a, 0x27, 0x16, 0x27, + 0x16, 0x05, 0x1f, 0x02, 0x0b, 0x0e, 0x67, 0x05, 0x07, 0x00, 0x3f, 0xfd, 0xc6, 0x3f, 0x12, 0x39, + 0x39, 0x2f, 0x2f, 0x3f, 0x5d, 0x5d, 0x33, 0xfd, 0x5d, 0xc0, 0x01, 0x10, 0xd6, 0x2b, 0x5d, 0xc6, + 0xd4, 0xfd, 0xd0, 0xed, 0xc5, 0x10, 0xd6, 0x2b, 0xed, 0x31, 0x30, 0x00, 0x2b, 0x25, 0x14, 0x0e, + 0x02, 0x23, 0x22, 0x2e, 0x02, 0x27, 0x37, 0x16, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x2e, 0x02, + 0x27, 0x26, 0x26, 0x35, 0x35, 0x23, 0x35, 0x33, 0x35, 0x37, 0x15, 0x33, 0x15, 0x23, 0x15, 0x14, + 0x16, 0x17, 0x1e, 0x03, 0x01, 0xd8, 0x1f, 0x39, 0x4f, 0x30, 0x1f, 0x38, 0x2d, 0x21, 0x08, 0x14, + 0x22, 0x4d, 0x2b, 0x25, 0x38, 0x13, 0x1e, 0x28, 0x15, 0x3c, 0x34, 0x4c, 0x4c, 0x7c, 0xb4, 0xb4, + 0x1c, 0x1d, 0x22, 0x3b, 0x2c, 0x19, 0x82, 0x23, 0x35, 0x24, 0x13, 0x0a, 0x0d, 0x0e, 0x04, 0x67, + 0x0e, 0x18, 0x0c, 0x15, 0x0e, 0x12, 0x0e, 0x0c, 0x08, 0x18, 0x4d, 0x38, 0x13, 0x66, 0x75, 0x15, + 0x8a, 0x66, 0x12, 0x17, 0x25, 0x0b, 0x0c, 0x17, 0x20, 0x2e, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3f, + 0xff, 0x5b, 0x01, 0xd3, 0x01, 0xe0, 0x00, 0x0b, 0x00, 0x19, 0x00, 0x39, 0x40, 0x24, 0x09, 0x40, + 0x09, 0x00, 0x4d, 0x00, 0x53, 0x00, 0x0c, 0x20, 0x0c, 0x40, 0x0c, 0x03, 0x0c, 0x1b, 0x07, 0x11, + 0x51, 0x00, 0x13, 0x10, 0x13, 0x20, 0x13, 0x03, 0x13, 0x1a, 0x03, 0x57, 0x17, 0x0a, 0x07, 0x11, + 0x12, 0x0e, 0x00, 0x3f, 0xd5, 0xc5, 0x3f, 0xed, 0x01, 0x10, 0xd6, 0x5d, 0xfd, 0xc0, 0x10, 0xd6, + 0x5d, 0xed, 0x31, 0x30, 0x2b, 0x01, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x11, 0x3e, 0x03, 0x37, + 0x14, 0x0e, 0x02, 0x07, 0x15, 0x23, 0x11, 0x36, 0x36, 0x33, 0x32, 0x16, 0x01, 0x54, 0x32, 0x2d, + 0x13, 0x1d, 0x0b, 0x27, 0x39, 0x27, 0x13, 0x7f, 0x2b, 0x4c, 0x67, 0x3b, 0x7b, 0x20, 0x5b, 0x3c, + 0x6b, 0x72, 0x01, 0x0f, 0x2d, 0x3b, 0x05, 0x02, 0xfe, 0xd6, 0x10, 0x24, 0x2f, 0x3d, 0x28, 0x43, + 0x62, 0x48, 0x35, 0x15, 0x7c, 0x02, 0x60, 0x0d, 0x18, 0x70, 0x00, 0x00, 0xff, 0xff, 0x00, 0xbd, + 0xff, 0x5b, 0x01, 0x39, 0x02, 0xbb, 0x02, 0x06, 0x00, 0x5f, 0x00, 0x00, 0xff, 0xff, 0x00, 0x5c, + 0xff, 0x5b, 0x01, 0x99, 0x02, 0xbb, 0x02, 0x36, 0x00, 0x5f, 0x9f, 0x00, 0x00, 0x06, 0x00, 0x5f, + 0x60, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x16, 0xff, 0x5b, 0x01, 0xdd, 0x02, 0xbb, 0x00, 0x13, + 0x00, 0x64, 0x40, 0x3f, 0x0d, 0x40, 0x15, 0x00, 0x4d, 0x0c, 0x40, 0x15, 0x00, 0x4d, 0x09, 0x40, + 0x15, 0x00, 0x4d, 0x08, 0x40, 0x15, 0x00, 0x4d, 0x6f, 0x08, 0x01, 0x08, 0x07, 0x44, 0x04, 0x01, + 0x02, 0x13, 0x12, 0x0a, 0x0b, 0x6f, 0x0d, 0x01, 0x0d, 0x0e, 0x44, 0x10, 0x12, 0x14, 0x07, 0x04, + 0x48, 0x0a, 0x01, 0x00, 0x0b, 0x48, 0x11, 0x40, 0x0e, 0x60, 0x0e, 0xa0, 0x0e, 0x03, 0x0e, 0x0f, + 0x0e, 0x06, 0x8a, 0x00, 0x3f, 0x3f, 0xd5, 0x5d, 0xc0, 0xfd, 0xd0, 0xd6, 0xc0, 0xfd, 0xc0, 0x01, + 0x10, 0xd6, 0xd6, 0xfd, 0xc5, 0x5d, 0xd0, 0xc0, 0x10, 0xd0, 0xd0, 0xc5, 0xd5, 0xfd, 0xc5, 0x5d, + 0x31, 0x30, 0x2b, 0x2b, 0x2b, 0x2b, 0x37, 0x35, 0x23, 0x35, 0x33, 0x11, 0x33, 0x11, 0x33, 0x15, + 0x23, 0x15, 0x33, 0x15, 0x23, 0x11, 0x23, 0x11, 0x23, 0x35, 0xbd, 0xa7, 0xa7, 0x7c, 0xa4, 0xa4, + 0xa4, 0xa4, 0x7c, 0xa7, 0xe7, 0x51, 0x60, 0x01, 0x23, 0xfe, 0xdd, 0x60, 0x51, 0x60, 0xfe, 0xd4, + 0x01, 0x2c, 0x60, 0x00, 0xff, 0xff, 0x00, 0xa7, 0xff, 0xf4, 0x01, 0x4d, 0x02, 0x6b, 0x02, 0x06, + 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x12, 0xff, 0xfa, 0x02, 0x0a, 0x03, 0x2b, 0x00, 0x10, + 0x00, 0x22, 0x00, 0x2f, 0x00, 0x35, 0x00, 0x92, 0x40, 0x23, 0x30, 0x34, 0x37, 0x16, 0x1f, 0x21, + 0x22, 0x17, 0x00, 0x21, 0x10, 0x21, 0x02, 0x21, 0x70, 0x20, 0x01, 0x20, 0x2f, 0x28, 0x3f, 0x28, + 0x02, 0x28, 0x52, 0x20, 0x00, 0x30, 0x00, 0x60, 0x00, 0x80, 0x00, 0x04, 0x00, 0xb8, 0xff, 0xc0, + 0x40, 0x13, 0x15, 0x19, 0x48, 0x1f, 0x00, 0x01, 0x00, 0x10, 0x19, 0x80, 0x19, 0x02, 0x19, 0x17, + 0x37, 0x80, 0x23, 0x01, 0x23, 0xb8, 0xff, 0xc0, 0xb3, 0x14, 0x18, 0x48, 0x23, 0xb8, 0xff, 0xc0, + 0x40, 0x1c, 0x0b, 0x0f, 0x48, 0x23, 0x52, 0x08, 0x36, 0x35, 0x32, 0x33, 0x31, 0xb0, 0x1f, 0xa4, + 0x21, 0x02, 0x17, 0xa4, 0x19, 0x08, 0x2d, 0xa5, 0x0c, 0x03, 0x25, 0xa5, 0x05, 0x09, 0x00, 0x3f, + 0xed, 0x3f, 0xed, 0x3f, 0xed, 0x3f, 0xed, 0x3f, 0xc6, 0xdd, 0xcd, 0x01, 0x10, 0xd6, 0xed, 0x2b, + 0x2b, 0x5d, 0x10, 0xd6, 0xd5, 0x5d, 0xd6, 0x5d, 0x2b, 0x5d, 0xed, 0x5d, 0xde, 0x5d, 0xc0, 0x5d, + 0x10, 0xc0, 0x11, 0x39, 0x39, 0x10, 0xd6, 0xcc, 0x31, 0x30, 0x01, 0x14, 0x0e, 0x02, 0x23, 0x22, + 0x26, 0x27, 0x11, 0x36, 0x36, 0x33, 0x32, 0x1e, 0x02, 0x37, 0x0e, 0x03, 0x07, 0x33, 0x15, 0x23, + 0x35, 0x3e, 0x03, 0x37, 0x23, 0x35, 0x33, 0x01, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x2e, 0x02, + 0x23, 0x22, 0x07, 0x37, 0x37, 0x17, 0x37, 0x17, 0x07, 0x01, 0x1b, 0x1a, 0x2d, 0x3e, 0x25, 0x13, + 0x35, 0x17, 0x19, 0x2d, 0x15, 0x2a, 0x40, 0x2d, 0x17, 0xd0, 0x0c, 0x1e, 0x1e, 0x1e, 0x0c, 0x72, + 0xcb, 0x12, 0x1c, 0x19, 0x19, 0x10, 0x5e, 0xb9, 0xfe, 0x7e, 0x05, 0x06, 0x2f, 0x1f, 0x07, 0x11, + 0x1e, 0x17, 0x08, 0x04, 0xaf, 0x22, 0x56, 0x55, 0x25, 0x7a, 0x01, 0x36, 0x5e, 0x7a, 0x48, 0x1c, + 0x03, 0x07, 0x02, 0x63, 0x05, 0x06, 0x1f, 0x49, 0x79, 0x8c, 0x2a, 0x6e, 0x78, 0x7a, 0x36, 0x5d, + 0x4c, 0x48, 0x71, 0x66, 0x66, 0x3d, 0x5d, 0xfd, 0xed, 0x01, 0x74, 0x6b, 0x43, 0x58, 0x35, 0x16, + 0x01, 0xe6, 0x29, 0x3f, 0x40, 0x2b, 0x69, 0x00, 0x00, 0x04, 0x00, 0x12, 0xff, 0xfa, 0x02, 0x09, + 0x02, 0xa0, 0x00, 0x10, 0x00, 0x22, 0x00, 0x2f, 0x00, 0x35, 0x00, 0x97, 0x40, 0x1e, 0x30, 0x34, + 0x37, 0x11, 0x17, 0x37, 0x1f, 0x1f, 0x01, 0x1f, 0x16, 0x19, 0x03, 0x37, 0x10, 0x1a, 0x01, 0x1a, + 0x1a, 0x36, 0x37, 0x20, 0xc0, 0x00, 0xd0, 0x00, 0xe0, 0x00, 0x03, 0x00, 0xb8, 0xff, 0xc0, 0x40, + 0x13, 0x0b, 0x0e, 0x48, 0x00, 0x52, 0x40, 0x28, 0x50, 0x28, 0x02, 0x80, 0x28, 0x90, 0x28, 0xb0, + 0x28, 0x03, 0x28, 0x23, 0xb8, 0xff, 0xc0, 0xb3, 0x15, 0x1a, 0x48, 0x23, 0xb8, 0xff, 0xc0, 0x40, + 0x25, 0x0b, 0x10, 0x48, 0x23, 0x52, 0x30, 0x08, 0x40, 0x08, 0x50, 0x08, 0x03, 0x08, 0x36, 0x16, + 0xa4, 0x37, 0x35, 0x32, 0x33, 0xa0, 0x31, 0xa0, 0x20, 0xa4, 0x22, 0x0a, 0x18, 0x06, 0x2d, 0xa5, + 0x0c, 0x03, 0x25, 0xa5, 0x05, 0x09, 0x00, 0x3f, 0xed, 0x3f, 0xed, 0x3f, 0x3f, 0xed, 0x3f, 0x3f, + 0xdd, 0xc5, 0x10, 0xec, 0x01, 0x10, 0xd6, 0x71, 0xfd, 0x2b, 0x2b, 0xd6, 0x5d, 0x71, 0xfd, 0x2b, + 0x5d, 0xce, 0x11, 0x12, 0x39, 0x2f, 0x5d, 0x12, 0x17, 0x39, 0x5d, 0x10, 0xd6, 0xc0, 0x10, 0xd6, + 0xc4, 0x31, 0x30, 0x01, 0x14, 0x0e, 0x02, 0x23, 0x22, 0x26, 0x27, 0x11, 0x36, 0x36, 0x33, 0x32, + 0x1e, 0x02, 0x17, 0x0e, 0x03, 0x07, 0x33, 0x15, 0x23, 0x35, 0x3e, 0x03, 0x37, 0x23, 0x35, 0x33, + 0x01, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x2e, 0x02, 0x23, 0x22, 0x07, 0x37, 0x37, 0x17, 0x37, + 0x17, 0x07, 0x01, 0x1b, 0x1a, 0x2d, 0x3e, 0x25, 0x13, 0x35, 0x17, 0x19, 0x2d, 0x15, 0x2a, 0x40, + 0x2d, 0x17, 0xd0, 0x0c, 0x1b, 0x1b, 0x1a, 0x0b, 0x67, 0xc2, 0x0f, 0x19, 0x17, 0x17, 0x0e, 0x5b, + 0xb9, 0xfe, 0x7e, 0x05, 0x06, 0x2f, 0x1f, 0x07, 0x11, 0x1e, 0x17, 0x08, 0x04, 0xaf, 0x21, 0x56, + 0x55, 0x25, 0x7a, 0x01, 0x36, 0x5e, 0x7a, 0x48, 0x1c, 0x03, 0x07, 0x02, 0x63, 0x05, 0x06, 0x1f, + 0x49, 0x79, 0x0d, 0x1d, 0x48, 0x4e, 0x50, 0x24, 0x5d, 0x47, 0x30, 0x50, 0x48, 0x45, 0x25, 0x5d, + 0xfe, 0x82, 0x01, 0x74, 0x6b, 0x43, 0x58, 0x35, 0x16, 0x01, 0x5b, 0x29, 0x40, 0x41, 0x2b, 0x6a, + 0x00, 0x04, 0x00, 0x09, 0xff, 0xf3, 0x02, 0x09, 0x02, 0xb5, 0x00, 0x0f, 0x00, 0x21, 0x00, 0x30, + 0x00, 0x36, 0x00, 0xad, 0x40, 0x1d, 0x2f, 0x40, 0x0d, 0x00, 0x4d, 0x2e, 0x40, 0x0d, 0x00, 0x4d, + 0x10, 0x20, 0x0f, 0x00, 0x4d, 0x31, 0x04, 0x35, 0x01, 0x35, 0x21, 0x38, 0x15, 0x1e, 0x15, 0x1e, + 0x37, 0x17, 0x27, 0xb8, 0xff, 0xc0, 0xb7, 0x16, 0x19, 0x48, 0xc2, 0x27, 0x01, 0x02, 0x27, 0xb8, + 0xff, 0xc0, 0x40, 0x4b, 0x0b, 0x10, 0x48, 0x27, 0x52, 0x2f, 0x06, 0x01, 0x06, 0x37, 0x2f, 0x0d, + 0x4f, 0x0d, 0x02, 0x0d, 0x2f, 0x2e, 0x3f, 0x2e, 0x5f, 0x2e, 0xcf, 0x2e, 0x04, 0x2e, 0x52, 0x00, + 0x20, 0x19, 0x2f, 0x17, 0x4f, 0x17, 0x02, 0x0f, 0x17, 0x2f, 0x17, 0x4f, 0x17, 0x6f, 0x17, 0x8f, + 0x17, 0xaf, 0x17, 0x06, 0x17, 0x36, 0x33, 0x34, 0xa0, 0x32, 0xa0, 0x1e, 0xa4, 0x21, 0x0a, 0x15, + 0xa4, 0x18, 0x06, 0x0f, 0x01, 0x0e, 0x00, 0x22, 0xa5, 0x0b, 0x0b, 0x2c, 0xa5, 0x03, 0x07, 0x00, + 0x3f, 0xed, 0x3f, 0xed, 0x3f, 0x3f, 0x3f, 0xed, 0x3f, 0xed, 0x3f, 0x3f, 0xdd, 0xc5, 0x01, 0x2f, + 0x5d, 0x71, 0xd5, 0xc6, 0xde, 0xfd, 0x5d, 0xc0, 0x5d, 0x10, 0xd6, 0x71, 0xed, 0x2b, 0x5f, 0x5d, + 0x2b, 0x11, 0x12, 0x39, 0x39, 0x2f, 0x2f, 0x10, 0xc6, 0xd6, 0x71, 0xc4, 0x31, 0x30, 0x2b, 0x2b, + 0x2b, 0x25, 0x06, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x3e, 0x02, 0x33, 0x32, 0x17, 0x35, 0x37, + 0x13, 0x0e, 0x03, 0x07, 0x33, 0x15, 0x23, 0x35, 0x3e, 0x03, 0x37, 0x23, 0x35, 0x33, 0x05, 0x22, + 0x0e, 0x02, 0x15, 0x14, 0x1e, 0x02, 0x33, 0x32, 0x37, 0x11, 0x26, 0x37, 0x37, 0x17, 0x37, 0x17, + 0x07, 0x01, 0x08, 0x1f, 0x33, 0x1a, 0x4a, 0x49, 0x0e, 0x1c, 0x2b, 0x1d, 0x19, 0x1d, 0x57, 0xe3, + 0x0c, 0x1b, 0x1b, 0x1a, 0x0b, 0x67, 0xc2, 0x0f, 0x19, 0x17, 0x17, 0x0e, 0x5b, 0xb9, 0xfe, 0xa2, + 0x0e, 0x11, 0x09, 0x04, 0x03, 0x0b, 0x17, 0x14, 0x0c, 0x0b, 0x16, 0x7d, 0x21, 0x56, 0x55, 0x25, + 0x7a, 0x0e, 0x0e, 0x0d, 0x86, 0x74, 0x34, 0x5a, 0x40, 0x25, 0x11, 0xd3, 0x13, 0xfe, 0xcf, 0x1d, + 0x48, 0x4e, 0x50, 0x24, 0x5d, 0x47, 0x30, 0x50, 0x48, 0x45, 0x25, 0x5d, 0x53, 0x20, 0x31, 0x3e, + 0x1e, 0x1a, 0x30, 0x26, 0x16, 0x05, 0x01, 0x1b, 0x13, 0xf3, 0x29, 0x40, 0x41, 0x2b, 0x6a, 0x00, + 0x00, 0x02, 0x00, 0x12, 0xff, 0xf3, 0x01, 0xe1, 0x02, 0x6b, 0x00, 0x05, 0x00, 0x13, 0x00, 0x52, + 0x40, 0x39, 0x4f, 0x0b, 0x5f, 0x0b, 0xcf, 0x0b, 0xdf, 0x0b, 0x04, 0x0b, 0x52, 0x0e, 0x40, 0x09, + 0x14, 0x48, 0x0e, 0x15, 0x06, 0x00, 0x05, 0x01, 0x20, 0x05, 0x30, 0x05, 0x80, 0x05, 0xf0, 0x05, + 0x04, 0x05, 0x20, 0x04, 0x30, 0x04, 0xc0, 0x04, 0xd0, 0x04, 0x04, 0x04, 0x52, 0x01, 0x04, 0x55, + 0x14, 0x06, 0x4a, 0x13, 0x09, 0x0c, 0x02, 0x03, 0x02, 0x01, 0x08, 0x00, 0x3f, 0x3f, 0x3f, 0x3f, + 0xed, 0x10, 0xec, 0x01, 0x2f, 0xfd, 0x5d, 0xd5, 0x5d, 0x71, 0xce, 0x10, 0xde, 0x2b, 0xed, 0x5d, + 0x31, 0x30, 0x33, 0x23, 0x11, 0x33, 0x11, 0x33, 0x17, 0x32, 0x3e, 0x02, 0x35, 0x11, 0x33, 0x11, + 0x14, 0x0e, 0x02, 0x23, 0xfd, 0xeb, 0x57, 0x94, 0x2b, 0x15, 0x23, 0x1b, 0x0f, 0x57, 0x0e, 0x28, + 0x48, 0x3b, 0x02, 0x6b, 0xfd, 0xeb, 0x0e, 0x04, 0x11, 0x23, 0x20, 0x01, 0xcb, 0xfe, 0x48, 0x32, + 0x48, 0x2f, 0x17, 0x00, 0x00, 0x03, 0x00, 0x2d, 0xff, 0x56, 0x01, 0xe3, 0x02, 0x97, 0x00, 0x05, + 0x00, 0x17, 0x00, 0x23, 0x00, 0x6f, 0x40, 0x2e, 0x1e, 0x53, 0x18, 0x0f, 0x06, 0xdf, 0x0c, 0x01, + 0x0c, 0x52, 0x5f, 0x0f, 0x01, 0x0f, 0x25, 0x10, 0x05, 0x01, 0x20, 0x05, 0x60, 0x05, 0x70, 0x05, + 0xc0, 0x05, 0xe0, 0x05, 0xf0, 0x05, 0x06, 0x05, 0x30, 0x04, 0x40, 0x04, 0x50, 0x04, 0xc0, 0x04, + 0xd0, 0x04, 0x05, 0x04, 0x52, 0x01, 0xb8, 0xff, 0xc0, 0x40, 0x1b, 0x0b, 0x12, 0x48, 0x01, 0x24, + 0x1b, 0x53, 0xb0, 0x21, 0xd0, 0x21, 0x02, 0x21, 0x98, 0x06, 0x09, 0x4a, 0x14, 0x92, 0x0e, 0x0a, + 0x03, 0x02, 0x05, 0x55, 0x01, 0x08, 0x00, 0x3f, 0xed, 0x3f, 0x3f, 0x3f, 0xfd, 0xc6, 0x3f, 0x5d, + 0xed, 0x01, 0x10, 0xd6, 0x2b, 0xfd, 0x5d, 0xc5, 0x5d, 0x71, 0x10, 0xd6, 0x5d, 0xfd, 0x5d, 0xc6, + 0x10, 0xd4, 0xed, 0x31, 0x30, 0x21, 0x21, 0x11, 0x33, 0x11, 0x33, 0x07, 0x16, 0x16, 0x33, 0x32, + 0x36, 0x35, 0x11, 0x33, 0x11, 0x14, 0x0e, 0x02, 0x23, 0x22, 0x26, 0x27, 0x13, 0x14, 0x06, 0x23, + 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x01, 0x31, 0xfe, 0xfc, 0x57, 0xad, 0x39, 0x0e, + 0x1d, 0x0e, 0x26, 0x20, 0x58, 0x15, 0x29, 0x3b, 0x25, 0x10, 0x2b, 0x0d, 0xfa, 0x28, 0x1c, 0x1a, + 0x29, 0x29, 0x1a, 0x1c, 0x28, 0x02, 0x6b, 0xfd, 0xeb, 0x9e, 0x04, 0x05, 0x2d, 0x32, 0x01, 0xc8, + 0xfe, 0x43, 0x38, 0x4a, 0x2e, 0x13, 0x08, 0x05, 0x02, 0xef, 0x1f, 0x25, 0x25, 0x1f, 0x20, 0x25, + 0x25, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x37, 0xff, 0x56, 0x01, 0xd1, 0x02, 0xb5, 0x00, 0x11, + 0x00, 0x1d, 0x00, 0x2b, 0x00, 0x9c, 0x40, 0x0d, 0x18, 0x53, 0x20, 0x12, 0x01, 0x11, 0x12, 0x01, + 0x00, 0x12, 0x01, 0x12, 0x06, 0xb8, 0xff, 0xc0, 0xb3, 0x15, 0x1b, 0x48, 0x06, 0xb8, 0xff, 0xc0, + 0x40, 0x5a, 0x0d, 0x10, 0x48, 0x06, 0xa4, 0x09, 0x40, 0x0d, 0x10, 0x48, 0x09, 0x2d, 0x6f, 0x2b, + 0x7f, 0x2b, 0xcf, 0x2b, 0xdf, 0x2b, 0x04, 0x2b, 0x40, 0x18, 0x1b, 0x48, 0x2b, 0x25, 0x40, 0x15, + 0x1b, 0x48, 0x25, 0x40, 0x0d, 0x10, 0x48, 0x25, 0xa4, 0x00, 0x23, 0x10, 0x23, 0x40, 0x23, 0x50, + 0x23, 0x60, 0x23, 0x05, 0x23, 0xd0, 0x00, 0xf0, 0x00, 0x02, 0x5f, 0x00, 0x6f, 0x00, 0x02, 0x00, + 0x2c, 0x25, 0x9f, 0x2b, 0x40, 0x0d, 0x10, 0x48, 0x2b, 0xa5, 0x1e, 0x07, 0x15, 0x53, 0x1b, 0x98, + 0x00, 0x03, 0x40, 0x0d, 0x10, 0x48, 0x03, 0xa5, 0x0e, 0x92, 0x08, 0x0a, 0x00, 0x3f, 0x3f, 0xfd, + 0x2b, 0xc6, 0x3f, 0xed, 0x3f, 0xed, 0x2b, 0x3f, 0x01, 0x10, 0xc6, 0x5d, 0x5d, 0xd6, 0x5d, 0xed, + 0x2b, 0x2b, 0xc4, 0x2b, 0x5d, 0x10, 0xd6, 0x2b, 0xed, 0x2b, 0x2b, 0xd4, 0x71, 0x71, 0x71, 0xed, + 0x31, 0x30, 0x17, 0x16, 0x16, 0x33, 0x32, 0x36, 0x35, 0x11, 0x33, 0x11, 0x14, 0x0e, 0x02, 0x23, + 0x22, 0x26, 0x27, 0x13, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x03, + 0x2e, 0x03, 0x35, 0x11, 0x37, 0x11, 0x14, 0x1e, 0x02, 0x17, 0xe6, 0x0e, 0x1d, 0x0e, 0x26, 0x20, + 0x58, 0x15, 0x29, 0x3b, 0x25, 0x10, 0x2b, 0x0d, 0xfa, 0x28, 0x1c, 0x1a, 0x29, 0x29, 0x1a, 0x1c, + 0x28, 0xde, 0x3a, 0x49, 0x2a, 0x0f, 0x58, 0x0d, 0x1d, 0x2b, 0x1e, 0x48, 0x04, 0x05, 0x2d, 0x32, + 0x01, 0xc8, 0xfe, 0x43, 0x38, 0x4a, 0x2e, 0x13, 0x08, 0x05, 0x02, 0xef, 0x1f, 0x25, 0x25, 0x1f, + 0x20, 0x25, 0x25, 0xfd, 0x85, 0x01, 0x1a, 0x2c, 0x3a, 0x22, 0x02, 0x0c, 0x0f, 0xfe, 0x00, 0x21, + 0x28, 0x17, 0x09, 0x02, 0x00, 0x02, 0x00, 0x12, 0xff, 0xf3, 0x01, 0xe1, 0x02, 0x6b, 0x00, 0x0d, + 0x00, 0x1b, 0x00, 0x52, 0x40, 0x34, 0x16, 0x40, 0x0e, 0x11, 0x48, 0x16, 0x8f, 0x13, 0x2f, 0x0e, + 0x3f, 0x0e, 0x4f, 0x0e, 0x03, 0x0e, 0x8f, 0x0c, 0x01, 0x0c, 0x8f, 0x0b, 0x40, 0x0d, 0x12, 0x48, + 0x0b, 0x90, 0x06, 0x01, 0x06, 0x8f, 0x07, 0x1c, 0x0e, 0xa5, 0x1b, 0x09, 0x14, 0x02, 0x0b, 0x02, + 0x05, 0x0a, 0x05, 0x0a, 0x09, 0x02, 0x06, 0x08, 0x00, 0x08, 0x00, 0x3f, 0x3f, 0x3f, 0x39, 0x39, + 0x2f, 0x2f, 0x3f, 0x3f, 0x3f, 0xed, 0x01, 0x10, 0xd6, 0xfd, 0x5d, 0xd4, 0x2b, 0xfd, 0x5d, 0xd6, + 0x5d, 0xd6, 0xed, 0x2b, 0x31, 0x30, 0x33, 0x2e, 0x03, 0x27, 0x11, 0x23, 0x11, 0x33, 0x13, 0x11, + 0x33, 0x11, 0x37, 0x32, 0x3e, 0x02, 0x35, 0x11, 0x33, 0x11, 0x14, 0x0e, 0x02, 0x07, 0xc7, 0x0f, + 0x17, 0x15, 0x16, 0x0d, 0x57, 0x4b, 0x5e, 0x57, 0x22, 0x12, 0x20, 0x17, 0x0d, 0x57, 0x0d, 0x25, + 0x44, 0x37, 0x3a, 0x5b, 0x59, 0x5e, 0x3d, 0xfe, 0x77, 0x02, 0x6b, 0xfe, 0x95, 0x01, 0x6b, 0xfd, + 0x95, 0x48, 0x06, 0x13, 0x22, 0x1d, 0x01, 0xcb, 0xfe, 0x48, 0x31, 0x47, 0x2f, 0x18, 0x01, 0x00, + 0x00, 0x03, 0x00, 0x12, 0xff, 0x56, 0x01, 0xd1, 0x02, 0x97, 0x00, 0x0d, 0x00, 0x1f, 0x00, 0x2b, + 0x00, 0x99, 0x40, 0x17, 0x20, 0x53, 0x1f, 0x26, 0x01, 0x26, 0x0c, 0x16, 0x40, 0x15, 0x1d, 0x48, + 0x16, 0x40, 0x0b, 0x11, 0x48, 0x16, 0x8f, 0x4f, 0x15, 0x01, 0x15, 0xb8, 0xff, 0xc0, 0x40, 0x50, + 0x12, 0x19, 0x48, 0x15, 0x0c, 0x40, 0x11, 0x00, 0x4d, 0x2f, 0x0c, 0x3f, 0x0c, 0x4f, 0x0c, 0x03, + 0x0c, 0x8f, 0x0b, 0x40, 0x17, 0x1a, 0x48, 0x0b, 0x40, 0x0d, 0x12, 0x48, 0x0b, 0x06, 0x40, 0x11, + 0x00, 0x4d, 0x2f, 0x06, 0x3f, 0x06, 0x4f, 0x06, 0x03, 0x06, 0x8f, 0x30, 0x07, 0x40, 0x07, 0x02, + 0x07, 0x9f, 0x0e, 0xaf, 0x0e, 0x02, 0x0e, 0x2c, 0x23, 0x53, 0x29, 0x98, 0x0e, 0x11, 0xa5, 0x1c, + 0x92, 0x15, 0x0a, 0x0d, 0x08, 0x0c, 0x02, 0x05, 0x0a, 0x05, 0x0a, 0x06, 0x09, 0x02, 0x06, 0x08, + 0x00, 0x3f, 0x3f, 0x12, 0x39, 0x39, 0x2f, 0x2f, 0x3f, 0x3f, 0x3f, 0x3f, 0xfd, 0xc6, 0x3f, 0xed, + 0x01, 0x10, 0xc6, 0x5d, 0xd6, 0x71, 0xfd, 0x71, 0x2b, 0xd4, 0x2b, 0x2b, 0xfd, 0x71, 0x2b, 0xd6, + 0x2b, 0x71, 0xed, 0x2b, 0x2b, 0x10, 0xd6, 0x71, 0xed, 0x31, 0x30, 0x33, 0x2e, 0x03, 0x27, 0x11, + 0x23, 0x11, 0x33, 0x13, 0x11, 0x33, 0x11, 0x07, 0x16, 0x16, 0x33, 0x32, 0x36, 0x35, 0x11, 0x33, + 0x11, 0x14, 0x0e, 0x02, 0x23, 0x22, 0x26, 0x27, 0x13, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, + 0x36, 0x33, 0x32, 0x16, 0xc7, 0x0f, 0x17, 0x15, 0x16, 0x0d, 0x57, 0x4b, 0x5e, 0x57, 0x2c, 0x0e, + 0x1d, 0x0e, 0x26, 0x20, 0x58, 0x15, 0x29, 0x3b, 0x25, 0x10, 0x2b, 0x0d, 0xfa, 0x28, 0x1c, 0x1a, + 0x29, 0x29, 0x1a, 0x1c, 0x28, 0x3a, 0x5b, 0x59, 0x5e, 0x3d, 0xfe, 0x77, 0x02, 0x6b, 0xfe, 0x95, + 0x01, 0x6b, 0xfd, 0x95, 0x48, 0x04, 0x05, 0x2d, 0x32, 0x01, 0xc8, 0xfe, 0x43, 0x38, 0x4a, 0x2e, + 0x13, 0x08, 0x05, 0x02, 0xef, 0x1f, 0x25, 0x25, 0x1f, 0x20, 0x25, 0x25, 0x00, 0x03, 0x00, 0x12, + 0xff, 0x56, 0x01, 0xe3, 0x02, 0x97, 0x00, 0x15, 0x00, 0x27, 0x00, 0x33, 0x00, 0xab, 0x40, 0x22, + 0x27, 0x40, 0x16, 0x00, 0x4d, 0x27, 0x40, 0x13, 0x00, 0x4d, 0x16, 0x40, 0x16, 0x00, 0x4d, 0x16, + 0x40, 0x13, 0x00, 0x4d, 0x2e, 0x53, 0x20, 0x28, 0x01, 0x02, 0x60, 0x28, 0x80, 0x28, 0xa0, 0x28, + 0x03, 0x28, 0xb8, 0xff, 0xc0, 0x40, 0x12, 0x17, 0x1a, 0x48, 0x28, 0x35, 0x1f, 0x40, 0x17, 0x1d, + 0x48, 0x1f, 0x40, 0x0d, 0x11, 0x48, 0x1f, 0x8f, 0x1c, 0xb8, 0xff, 0xc0, 0x40, 0x13, 0x16, 0x1d, + 0x48, 0x1c, 0x09, 0x40, 0x19, 0x1d, 0x48, 0x09, 0x8f, 0x40, 0x0a, 0x50, 0x0a, 0x60, 0x0a, 0x03, + 0x0a, 0xb8, 0xff, 0xc0, 0x40, 0x29, 0x17, 0x1b, 0x48, 0x0a, 0x14, 0x40, 0x17, 0x1d, 0x48, 0x14, + 0x40, 0x0d, 0x11, 0x48, 0x14, 0x8f, 0x40, 0x15, 0x01, 0x15, 0x27, 0x34, 0x2b, 0x53, 0x31, 0x97, + 0x16, 0x19, 0xa5, 0x24, 0x92, 0x1d, 0x0b, 0x14, 0x06, 0x0a, 0x06, 0x10, 0xa5, 0x03, 0x0b, 0x00, + 0x3f, 0xed, 0x3f, 0x3f, 0x3f, 0x3f, 0xfd, 0xc6, 0x3f, 0xed, 0x01, 0x10, 0xc6, 0xd6, 0x71, 0xfd, + 0x2b, 0x2b, 0xd6, 0x2b, 0x5d, 0xfd, 0x2b, 0xd6, 0x2b, 0xed, 0x2b, 0x2b, 0x10, 0xd6, 0x2b, 0x5d, + 0x5f, 0x71, 0xed, 0x31, 0x30, 0x2b, 0x2b, 0x2b, 0x2b, 0x13, 0x36, 0x36, 0x33, 0x32, 0x1e, 0x02, + 0x15, 0x11, 0x23, 0x11, 0x34, 0x2e, 0x02, 0x23, 0x22, 0x06, 0x07, 0x11, 0x23, 0x17, 0x16, 0x16, + 0x33, 0x32, 0x36, 0x35, 0x11, 0x33, 0x11, 0x14, 0x0e, 0x02, 0x23, 0x22, 0x26, 0x27, 0x13, 0x14, + 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x12, 0x1a, 0x4b, 0x2d, 0x28, 0x37, + 0x21, 0x0f, 0x57, 0x09, 0x10, 0x18, 0x0f, 0x0f, 0x1f, 0x05, 0x57, 0xe6, 0x0e, 0x1d, 0x0e, 0x26, + 0x20, 0x58, 0x15, 0x29, 0x3b, 0x25, 0x10, 0x2b, 0x0d, 0xfa, 0x28, 0x1c, 0x1a, 0x29, 0x29, 0x1a, + 0x1c, 0x28, 0x01, 0xc7, 0x09, 0x10, 0x14, 0x2a, 0x44, 0x30, 0xfe, 0xd2, 0x01, 0x26, 0x21, 0x28, + 0x16, 0x07, 0x08, 0x02, 0xfe, 0x7e, 0x48, 0x04, 0x05, 0x2d, 0x32, 0x01, 0xc8, 0xfe, 0x43, 0x38, + 0x4a, 0x2e, 0x13, 0x08, 0x05, 0x02, 0xef, 0x1f, 0x25, 0x25, 0x1f, 0x20, 0x25, 0x25, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x09, 0x00, 0x00, 0x01, 0xeb, 0x03, 0x3e, 0x02, 0x26, 0x00, 0x24, 0x00, 0x00, + 0x01, 0x07, 0x01, 0x5f, 0x00, 0x00, 0x00, 0x8b, 0x00, 0x10, 0x40, 0x0b, 0x02, 0x01, 0x17, 0x1b, + 0x04, 0x0b, 0x50, 0x02, 0x07, 0x1c, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0x00, 0xff, 0xff, 0x00, 0x2c, + 0xff, 0xf5, 0x01, 0xb9, 0x02, 0xb3, 0x02, 0x26, 0x00, 0x44, 0x00, 0x00, 0x01, 0x06, 0x01, 0x5f, + 0x00, 0x00, 0x00, 0x10, 0x40, 0x0b, 0x02, 0x08, 0x2f, 0x33, 0x1c, 0x13, 0x50, 0x02, 0x0f, 0x34, + 0x4f, 0x2b, 0x2b, 0x34, 0xff, 0xff, 0x00, 0x36, 0x00, 0x00, 0x01, 0xbf, 0x03, 0x3e, 0x02, 0x26, + 0x00, 0x2c, 0x00, 0x00, 0x01, 0x07, 0x01, 0x5f, 0x00, 0x00, 0x00, 0x8b, 0x00, 0x10, 0x40, 0x0b, + 0x01, 0x00, 0x0c, 0x10, 0x00, 0x06, 0x50, 0x01, 0x05, 0x11, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x24, 0xff, 0xf5, 0x01, 0xd3, 0x02, 0xb3, 0x02, 0x26, 0x01, 0x0c, 0x00, 0x00, + 0x01, 0x06, 0x01, 0x5f, 0xef, 0x00, 0x00, 0x13, 0xb9, 0x00, 0x01, 0xff, 0xef, 0x40, 0x09, 0x14, + 0x18, 0x0a, 0x00, 0x50, 0x01, 0x0b, 0x19, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0xff, 0xff, 0x00, 0x1b, + 0xff, 0xf3, 0x01, 0xd9, 0x03, 0x3e, 0x02, 0x26, 0x00, 0x32, 0x00, 0x00, 0x01, 0x07, 0x01, 0x5f, + 0x00, 0x00, 0x00, 0x8b, 0x00, 0x10, 0x40, 0x0b, 0x02, 0x01, 0x20, 0x24, 0x14, 0x19, 0x50, 0x02, + 0x16, 0x25, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0x00, 0xff, 0xff, 0x00, 0x1d, 0xff, 0xf3, 0x01, 0xd8, + 0x02, 0xb3, 0x02, 0x26, 0x00, 0x52, 0x00, 0x00, 0x01, 0x06, 0x01, 0x5f, 0x00, 0x00, 0x00, 0x10, + 0x40, 0x0b, 0x02, 0x00, 0x20, 0x24, 0x09, 0x00, 0x50, 0x02, 0x0e, 0x25, 0x4f, 0x2b, 0x2b, 0x34, + 0xff, 0xff, 0x00, 0x27, 0xff, 0xf3, 0x01, 0xcd, 0x03, 0x3e, 0x02, 0x26, 0x00, 0x38, 0x00, 0x00, + 0x01, 0x07, 0x01, 0x5f, 0x00, 0x00, 0x00, 0x8b, 0x00, 0x10, 0x40, 0x0b, 0x01, 0x01, 0x1a, 0x1e, + 0x04, 0x14, 0x50, 0x01, 0x06, 0x1f, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0x00, 0xff, 0xff, 0x00, 0x3b, + 0xff, 0xf5, 0x01, 0xb6, 0x02, 0xb3, 0x02, 0x26, 0x00, 0x58, 0x00, 0x00, 0x01, 0x06, 0x01, 0x5f, + 0x00, 0x00, 0x00, 0x10, 0x40, 0x0b, 0x01, 0x02, 0x13, 0x17, 0x07, 0x00, 0x50, 0x01, 0x09, 0x18, + 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0x04, 0x00, 0x27, 0xff, 0xf3, 0x01, 0xcd, 0x03, 0x3e, 0x00, 0x19, + 0x00, 0x25, 0x00, 0x31, 0x00, 0x35, 0x00, 0x78, 0x40, 0x4f, 0x13, 0x44, 0x20, 0x14, 0x01, 0x14, + 0x37, 0xef, 0x34, 0x01, 0x34, 0xb0, 0x35, 0x01, 0x35, 0x36, 0x26, 0xb3, 0x2c, 0x1a, 0xb3, 0xcf, + 0x20, 0x01, 0x50, 0x20, 0x60, 0x20, 0x02, 0x4f, 0x20, 0x01, 0x20, 0x36, 0x07, 0x44, 0xa0, 0x06, + 0xb0, 0x06, 0x02, 0x06, 0x36, 0x2f, 0x34, 0x01, 0xdf, 0x34, 0xef, 0x34, 0xff, 0x34, 0x03, 0x34, + 0x99, 0x32, 0x86, 0x2f, 0xb2, 0xbf, 0x29, 0x01, 0x29, 0x02, 0x23, 0xb2, 0xbf, 0x1d, 0x01, 0x1d, + 0x02, 0x14, 0xb1, 0x07, 0xb1, 0x0d, 0x4a, 0x00, 0x09, 0x00, 0x3f, 0xed, 0x3f, 0x3f, 0x3f, 0x5d, + 0xed, 0x3f, 0x5d, 0xed, 0x3f, 0xed, 0x5d, 0x71, 0x01, 0x10, 0xd6, 0x5d, 0xed, 0x10, 0xd4, 0x5d, + 0x5d, 0x5d, 0xfd, 0xd6, 0xed, 0x10, 0xd4, 0x5d, 0xc5, 0x5d, 0x10, 0xd6, 0x5d, 0xed, 0x31, 0x30, + 0x17, 0x22, 0x2e, 0x02, 0x35, 0x11, 0x33, 0x11, 0x14, 0x1e, 0x02, 0x33, 0x32, 0x3e, 0x02, 0x35, + 0x11, 0x33, 0x11, 0x14, 0x0e, 0x02, 0x03, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, + 0x32, 0x16, 0x17, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x25, 0x33, + 0x15, 0x23, 0xf8, 0x3c, 0x51, 0x30, 0x14, 0x7c, 0x08, 0x13, 0x22, 0x1a, 0x1a, 0x22, 0x14, 0x08, + 0x7b, 0x14, 0x32, 0x52, 0x56, 0x22, 0x17, 0x18, 0x21, 0x21, 0x18, 0x17, 0x22, 0xa8, 0x22, 0x17, + 0x17, 0x22, 0x22, 0x17, 0x17, 0x22, 0xfe, 0xfe, 0xe8, 0xe8, 0x0d, 0x21, 0x3e, 0x58, 0x36, 0x01, + 0x63, 0xfe, 0xa5, 0x27, 0x35, 0x20, 0x0e, 0x0e, 0x21, 0x35, 0x27, 0x01, 0x5a, 0xfe, 0x9d, 0x36, + 0x58, 0x3e, 0x21, 0x02, 0xb3, 0x1a, 0x1f, 0x1f, 0x1a, 0x1a, 0x1e, 0x1e, 0x1a, 0x1a, 0x1f, 0x1f, + 0x1a, 0x1a, 0x1e, 0x1e, 0x7e, 0x47, 0x00, 0x00, 0xff, 0xff, 0x00, 0x3b, 0xff, 0xf5, 0x01, 0xb6, + 0x02, 0xdc, 0x02, 0x26, 0x00, 0x58, 0x00, 0x00, 0x01, 0x06, 0x02, 0xa7, 0x00, 0x00, 0x00, 0x1e, + 0x40, 0x15, 0x03, 0x02, 0x01, 0x01, 0x18, 0x1f, 0x07, 0x00, 0x50, 0x03, 0x09, 0x2d, 0x4f, 0x02, + 0x09, 0x21, 0x4f, 0x01, 0x09, 0x15, 0x4f, 0x2b, 0x2b, 0x2b, 0x2b, 0x34, 0x34, 0x34, 0x00, 0x00, + 0x00, 0x04, 0x00, 0x27, 0xff, 0xf3, 0x01, 0xcd, 0x03, 0x3e, 0x00, 0x19, 0x00, 0x25, 0x00, 0x31, + 0x00, 0x35, 0x00, 0x6b, 0x40, 0x47, 0x0f, 0x2c, 0x1f, 0x2c, 0x2f, 0x2c, 0x03, 0x2c, 0xb3, 0xbf, + 0x26, 0xdf, 0x26, 0x02, 0x26, 0x37, 0x12, 0x44, 0x00, 0x15, 0x20, 0x15, 0x02, 0x15, 0x37, 0x32, + 0x34, 0x36, 0x1a, 0xb3, 0x00, 0x20, 0x10, 0x20, 0x50, 0x20, 0xd0, 0x20, 0xe0, 0x20, 0x05, 0x20, + 0x36, 0x08, 0x44, 0x40, 0x05, 0x50, 0x05, 0x02, 0x05, 0x36, 0x33, 0x35, 0x86, 0x2f, 0xb2, 0x29, + 0x9e, 0x23, 0xb2, 0x1d, 0x9e, 0x14, 0xb1, 0x07, 0xb1, 0x0d, 0x4a, 0x00, 0x09, 0x00, 0x3f, 0xed, + 0x3f, 0x3f, 0x3f, 0xed, 0x3f, 0xed, 0x3f, 0xc5, 0x01, 0x10, 0xd6, 0x5d, 0xed, 0x10, 0xd4, 0x5d, + 0xed, 0x10, 0xd4, 0xc5, 0x10, 0xd6, 0x5d, 0xed, 0x10, 0xd4, 0x5d, 0xed, 0x5d, 0x31, 0x30, 0x17, + 0x22, 0x2e, 0x02, 0x35, 0x11, 0x33, 0x11, 0x14, 0x1e, 0x02, 0x33, 0x32, 0x3e, 0x02, 0x35, 0x11, + 0x33, 0x11, 0x14, 0x0e, 0x02, 0x03, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, + 0x16, 0x17, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x27, 0x07, 0x27, + 0x37, 0xf8, 0x3c, 0x51, 0x30, 0x14, 0x7c, 0x08, 0x13, 0x22, 0x1a, 0x1a, 0x22, 0x14, 0x08, 0x7b, + 0x14, 0x32, 0x52, 0x76, 0x22, 0x17, 0x18, 0x21, 0x21, 0x18, 0x17, 0x22, 0xe8, 0x22, 0x17, 0x17, + 0x22, 0x22, 0x17, 0x17, 0x22, 0x5f, 0x5d, 0x2d, 0x55, 0x0d, 0x21, 0x3e, 0x58, 0x36, 0x01, 0x77, + 0xfe, 0x91, 0x27, 0x35, 0x20, 0x0e, 0x0e, 0x21, 0x35, 0x27, 0x01, 0x6e, 0xfe, 0x89, 0x36, 0x58, + 0x3e, 0x21, 0x02, 0xc9, 0x1a, 0x1e, 0x1e, 0x1a, 0x1a, 0x1e, 0x1e, 0x1a, 0x1a, 0x1e, 0x1e, 0x1a, + 0x1a, 0x1e, 0x1e, 0x28, 0x45, 0x35, 0x50, 0x00, 0xff, 0xff, 0x00, 0x3b, 0xff, 0xf5, 0x01, 0xb6, + 0x03, 0x12, 0x02, 0x26, 0x00, 0x58, 0x00, 0x00, 0x01, 0x06, 0x02, 0xaa, 0x00, 0x00, 0x00, 0x1e, + 0x40, 0x15, 0x03, 0x02, 0x01, 0x01, 0x1c, 0x23, 0x07, 0x00, 0x50, 0x03, 0x09, 0x25, 0x4f, 0x02, + 0x09, 0x19, 0x4f, 0x01, 0x09, 0x14, 0x4f, 0x2b, 0x2b, 0x2b, 0x2b, 0x34, 0x34, 0x34, 0x00, 0x00, + 0x00, 0x04, 0x00, 0x27, 0xff, 0xf3, 0x01, 0xcd, 0x03, 0x3e, 0x00, 0x19, 0x00, 0x25, 0x00, 0x31, + 0x00, 0x37, 0x00, 0xaa, 0xb9, 0x00, 0x31, 0xff, 0xe0, 0x40, 0x0e, 0x16, 0x00, 0x4d, 0x2d, 0x20, + 0x16, 0x00, 0x4d, 0x2b, 0x20, 0x16, 0x00, 0x4d, 0x27, 0xb8, 0xff, 0xe0, 0xb3, 0x16, 0x00, 0x4d, + 0x25, 0xb8, 0xff, 0xe0, 0x40, 0x0e, 0x16, 0x00, 0x4d, 0x21, 0x20, 0x16, 0x00, 0x4d, 0x1f, 0x20, + 0x16, 0x00, 0x4d, 0x1b, 0xb8, 0xff, 0xe0, 0x40, 0x20, 0x16, 0x00, 0x4d, 0x2c, 0xb3, 0xdf, 0x26, + 0xef, 0x26, 0xff, 0x26, 0x03, 0x26, 0x39, 0x12, 0x44, 0x00, 0x15, 0x20, 0x15, 0x02, 0x15, 0x39, + 0x36, 0x32, 0x38, 0x1a, 0xb3, 0x50, 0x20, 0x01, 0x20, 0xb8, 0xff, 0xc0, 0x40, 0x24, 0x14, 0x1a, + 0x48, 0x20, 0x38, 0x08, 0x44, 0x40, 0x05, 0x50, 0x05, 0x02, 0x05, 0x38, 0x35, 0x86, 0x37, 0x34, + 0x33, 0x86, 0x2f, 0xb2, 0x29, 0x9e, 0x23, 0xb2, 0x1d, 0x9e, 0x14, 0xb1, 0x07, 0xb1, 0x0d, 0x4a, + 0x00, 0x09, 0x00, 0x3f, 0xed, 0x3f, 0x3f, 0x3f, 0xed, 0x3f, 0xed, 0x3f, 0xd5, 0xc5, 0x3f, 0x01, + 0x10, 0xd6, 0x5d, 0xed, 0x10, 0xd4, 0x2b, 0x5d, 0xed, 0x10, 0xd4, 0xc5, 0x10, 0xd6, 0x5d, 0xed, + 0x10, 0xd4, 0x5d, 0xed, 0x31, 0x30, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x17, 0x22, + 0x2e, 0x02, 0x35, 0x11, 0x33, 0x11, 0x14, 0x1e, 0x02, 0x33, 0x32, 0x3e, 0x02, 0x35, 0x11, 0x33, + 0x11, 0x14, 0x0e, 0x02, 0x03, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, + 0x17, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x25, 0x37, 0x17, 0x37, + 0x17, 0x07, 0xf8, 0x3c, 0x51, 0x30, 0x14, 0x7c, 0x08, 0x13, 0x22, 0x1a, 0x1a, 0x22, 0x14, 0x08, + 0x7b, 0x14, 0x32, 0x52, 0x76, 0x22, 0x17, 0x18, 0x21, 0x21, 0x18, 0x17, 0x22, 0xe8, 0x22, 0x17, + 0x17, 0x22, 0x22, 0x17, 0x17, 0x22, 0xfe, 0xfd, 0x25, 0x31, 0x2f, 0x27, 0x56, 0x0d, 0x21, 0x3e, + 0x58, 0x36, 0x01, 0x77, 0xfe, 0x91, 0x27, 0x35, 0x20, 0x0e, 0x0e, 0x21, 0x35, 0x27, 0x01, 0x6e, + 0xfe, 0x89, 0x36, 0x58, 0x3e, 0x21, 0x02, 0xc9, 0x1a, 0x1e, 0x1e, 0x1a, 0x1a, 0x1e, 0x1e, 0x1a, + 0x1a, 0x1e, 0x1e, 0x1a, 0x1a, 0x1e, 0x1e, 0x3a, 0x2e, 0x23, 0x23, 0x2e, 0x4e, 0x00, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x3b, 0xff, 0xf5, 0x01, 0xb6, 0x03, 0x00, 0x02, 0x26, 0x00, 0x58, 0x00, 0x00, + 0x01, 0x06, 0x02, 0xab, 0x00, 0x00, 0x00, 0x1e, 0x40, 0x15, 0x03, 0x02, 0x01, 0x01, 0x18, 0x1f, + 0x07, 0x00, 0x50, 0x03, 0x09, 0x30, 0x4f, 0x02, 0x09, 0x21, 0x4f, 0x01, 0x09, 0x15, 0x4f, 0x2b, + 0x2b, 0x2b, 0x2b, 0x34, 0x34, 0x34, 0x00, 0x00, 0x00, 0x04, 0x00, 0x27, 0xff, 0xf3, 0x01, 0xcd, + 0x03, 0x3e, 0x00, 0x19, 0x00, 0x25, 0x00, 0x31, 0x00, 0x35, 0x00, 0x9c, 0xb5, 0x31, 0x20, 0x16, + 0x00, 0x4d, 0x2d, 0xb8, 0xff, 0xe0, 0xb3, 0x16, 0x00, 0x4d, 0x2b, 0xb8, 0xff, 0xe0, 0x40, 0x0e, + 0x16, 0x00, 0x4d, 0x27, 0x20, 0x16, 0x00, 0x4d, 0x25, 0x20, 0x16, 0x00, 0x4d, 0x21, 0xb8, 0xff, + 0xe0, 0xb3, 0x16, 0x00, 0x4d, 0x1f, 0xb8, 0xff, 0xe0, 0x40, 0x44, 0x16, 0x00, 0x4d, 0x1b, 0x20, + 0x16, 0x00, 0x4d, 0x1a, 0xb3, 0xdf, 0x20, 0x01, 0x20, 0x37, 0x12, 0x44, 0x00, 0x15, 0x20, 0x15, + 0x30, 0x15, 0x03, 0x15, 0x37, 0x33, 0x0f, 0x35, 0x01, 0x35, 0x36, 0x2c, 0xb3, 0xb0, 0x26, 0xd0, + 0x26, 0xe0, 0x26, 0xf0, 0x26, 0x04, 0x26, 0x36, 0x08, 0x44, 0x05, 0x36, 0x34, 0x32, 0x86, 0x29, + 0xb2, 0x2f, 0x9e, 0x1d, 0xb2, 0x23, 0x9e, 0x14, 0xb1, 0x06, 0xb1, 0x0d, 0x4a, 0x00, 0x09, 0x00, + 0x3f, 0xed, 0x3f, 0x3f, 0x3f, 0xed, 0x3f, 0xed, 0x3f, 0xc5, 0x01, 0x10, 0xd6, 0xed, 0x10, 0xd4, + 0x5d, 0xed, 0x10, 0xd4, 0x71, 0xc5, 0x10, 0xd6, 0x5d, 0xed, 0x10, 0xd4, 0x5d, 0xed, 0x31, 0x30, + 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x17, 0x22, 0x2e, 0x02, 0x35, 0x11, 0x33, 0x11, + 0x14, 0x1e, 0x02, 0x33, 0x32, 0x3e, 0x02, 0x35, 0x11, 0x33, 0x11, 0x14, 0x0e, 0x02, 0x11, 0x34, + 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x27, 0x34, 0x36, 0x33, 0x32, 0x16, + 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x37, 0x17, 0x07, 0x27, 0xf8, 0x3c, 0x51, 0x30, 0x14, 0x7c, + 0x08, 0x13, 0x22, 0x1a, 0x1a, 0x22, 0x14, 0x08, 0x7b, 0x14, 0x32, 0x52, 0x22, 0x17, 0x18, 0x21, + 0x21, 0x18, 0x17, 0x22, 0xe8, 0x22, 0x17, 0x17, 0x22, 0x22, 0x17, 0x17, 0x22, 0x93, 0x56, 0x2d, + 0x5e, 0x0d, 0x21, 0x3e, 0x58, 0x36, 0x01, 0x77, 0xfe, 0x91, 0x27, 0x35, 0x20, 0x0e, 0x0e, 0x21, + 0x35, 0x27, 0x01, 0x6e, 0xfe, 0x89, 0x36, 0x58, 0x3e, 0x21, 0x02, 0xc9, 0x1a, 0x1e, 0x1e, 0x1a, + 0x1a, 0x1e, 0x1e, 0x1a, 0x1a, 0x1e, 0x1e, 0x1a, 0x1a, 0x1e, 0x1e, 0x9c, 0x50, 0x35, 0x45, 0x00, + 0xff, 0xff, 0x00, 0x3b, 0xff, 0xf5, 0x01, 0xb6, 0x03, 0x12, 0x02, 0x26, 0x00, 0x58, 0x00, 0x00, + 0x01, 0x06, 0x02, 0xa9, 0x00, 0x00, 0x00, 0x1e, 0x40, 0x15, 0x03, 0x02, 0x01, 0x01, 0x23, 0x1c, + 0x07, 0x00, 0x50, 0x03, 0x09, 0x2b, 0x4f, 0x02, 0x09, 0x1f, 0x4f, 0x01, 0x09, 0x15, 0x4f, 0x2b, + 0x2b, 0x2b, 0x2b, 0x34, 0x34, 0x34, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1f, 0xff, 0xf5, 0x01, 0xd1, + 0x01, 0xe2, 0x00, 0x19, 0x00, 0x22, 0x00, 0x81, 0xb9, 0x00, 0x20, 0xff, 0xc0, 0xb3, 0x0d, 0x00, + 0x4d, 0x1f, 0xb8, 0xff, 0xc0, 0xb3, 0x0d, 0x00, 0x4d, 0x1e, 0xb8, 0xff, 0xc0, 0xb3, 0x0d, 0x00, + 0x4d, 0x1d, 0xb8, 0xff, 0xc0, 0x40, 0x40, 0x0d, 0x00, 0x4d, 0x11, 0x40, 0x0d, 0x00, 0x4d, 0x10, + 0x40, 0x0d, 0x00, 0x4d, 0x0f, 0x40, 0x0d, 0x00, 0x4d, 0x0e, 0x40, 0x0d, 0x00, 0x4d, 0x0d, 0x40, + 0x0d, 0x00, 0x4d, 0x4f, 0x0c, 0x01, 0x0b, 0x22, 0x53, 0x20, 0x00, 0x40, 0x00, 0x50, 0x00, 0x03, + 0x00, 0x24, 0x1a, 0x53, 0x12, 0x70, 0x08, 0x01, 0x08, 0x23, 0x1a, 0x0b, 0x1a, 0x0b, 0x05, 0x0e, + 0x57, 0x15, 0x0b, 0x1f, 0x57, 0x05, 0x07, 0x00, 0x3f, 0xed, 0x3f, 0xed, 0x12, 0x39, 0x39, 0x2f, + 0x2f, 0x01, 0x10, 0xd6, 0x5d, 0xc4, 0xed, 0x10, 0xd6, 0x5d, 0xfd, 0xc0, 0x31, 0x30, 0x00, 0x5d, + 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x25, 0x14, 0x0e, 0x02, 0x23, 0x22, 0x26, + 0x35, 0x34, 0x37, 0x21, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x27, 0x36, 0x36, 0x33, 0x32, 0x1e, + 0x02, 0x05, 0x14, 0x1e, 0x02, 0x33, 0x32, 0x36, 0x37, 0x01, 0xd1, 0x26, 0x3d, 0x50, 0x2a, 0x69, + 0x6c, 0x03, 0x01, 0x30, 0x4b, 0x3c, 0x25, 0x44, 0x16, 0x12, 0x20, 0x48, 0x2d, 0x3c, 0x5f, 0x43, + 0x24, 0xfe, 0xc5, 0x0a, 0x16, 0x23, 0x19, 0x2f, 0x2d, 0x04, 0xf0, 0x3e, 0x5e, 0x3f, 0x20, 0x7b, + 0x76, 0x1a, 0x15, 0x2e, 0x34, 0x0f, 0x08, 0x68, 0x0c, 0x0e, 0x1f, 0x3d, 0x5a, 0x6d, 0x12, 0x24, + 0x1b, 0x11, 0x3b, 0x27, 0x00, 0x05, 0x00, 0x09, 0x00, 0x00, 0x01, 0xeb, 0x03, 0x3e, 0x00, 0x0f, + 0x00, 0x1a, 0x00, 0x26, 0x00, 0x32, 0x00, 0x36, 0x01, 0x5f, 0xb5, 0x35, 0x40, 0x12, 0x00, 0x4d, + 0x32, 0xb8, 0xff, 0xe0, 0xb3, 0x1b, 0x00, 0x4d, 0x32, 0xb8, 0xff, 0xe0, 0x40, 0x26, 0x17, 0x18, + 0x00, 0x4c, 0xd4, 0x32, 0x01, 0x2e, 0x20, 0x1b, 0x00, 0x4d, 0x2e, 0x20, 0x17, 0x00, 0x4d, 0xdb, + 0x2e, 0xfb, 0x2e, 0x02, 0x2c, 0x20, 0x1b, 0x00, 0x4d, 0x2c, 0x20, 0x17, 0x00, 0x4d, 0xdb, 0x2c, + 0xfb, 0x2c, 0x02, 0x28, 0xb8, 0xff, 0xe0, 0xb3, 0x1b, 0x00, 0x4d, 0x28, 0xb8, 0xff, 0xe0, 0x40, + 0x09, 0x17, 0x00, 0x4d, 0xd4, 0x28, 0xf4, 0x28, 0x02, 0x26, 0xb8, 0xff, 0xe0, 0xb3, 0x1b, 0x00, + 0x4d, 0x26, 0xb8, 0xff, 0xe0, 0x40, 0x26, 0x17, 0x00, 0x4d, 0xd4, 0x26, 0xf4, 0x26, 0x02, 0x22, + 0x20, 0x1b, 0x00, 0x4d, 0x22, 0x20, 0x17, 0x18, 0x00, 0x4c, 0xdb, 0x22, 0x01, 0x20, 0x20, 0x1b, + 0x00, 0x4d, 0x20, 0x20, 0x17, 0x00, 0x4d, 0xdb, 0x20, 0xfb, 0x20, 0x02, 0x1c, 0xb8, 0xff, 0xe0, + 0xb3, 0x1b, 0x00, 0x4d, 0x1c, 0xb8, 0xff, 0xe0, 0x40, 0x09, 0x17, 0x00, 0x4d, 0xd4, 0x1c, 0xf4, + 0x1c, 0x02, 0x05, 0xb8, 0xff, 0xe0, 0xb4, 0x0d, 0x0e, 0x00, 0x4c, 0x05, 0xb8, 0xff, 0xc0, 0x40, + 0x66, 0x0b, 0x0c, 0x00, 0x4c, 0x2d, 0xb3, 0xc0, 0x27, 0x01, 0x5f, 0x27, 0x01, 0x40, 0x27, 0x01, + 0x27, 0x38, 0x10, 0x15, 0x16, 0x03, 0x02, 0x09, 0x15, 0x16, 0x0a, 0x01, 0x00, 0x00, 0x01, 0x0a, + 0x16, 0x15, 0x09, 0x02, 0x03, 0x08, 0x37, 0x0f, 0x38, 0x35, 0x36, 0x37, 0x1b, 0xb3, 0xe0, 0x21, + 0xf0, 0x21, 0x02, 0xcf, 0x21, 0x01, 0x50, 0x21, 0x60, 0x21, 0x70, 0x21, 0x03, 0x4f, 0x21, 0x01, + 0x21, 0x04, 0x37, 0xdf, 0x35, 0x01, 0x35, 0x99, 0xb0, 0x33, 0x01, 0x33, 0x86, 0x30, 0xb2, 0x00, + 0x2a, 0x01, 0x2a, 0x02, 0x24, 0xb2, 0x00, 0x1e, 0x01, 0x1e, 0x02, 0x15, 0x48, 0x02, 0x10, 0x02, + 0x10, 0x09, 0xb1, 0x03, 0x08, 0x00, 0x08, 0x00, 0x3f, 0x3f, 0x3f, 0x39, 0x39, 0x2f, 0x2f, 0xed, + 0x3f, 0x5d, 0xed, 0x3f, 0x5d, 0xed, 0x3f, 0x5d, 0xed, 0x5d, 0x01, 0x10, 0xc6, 0xd6, 0x5d, 0x5d, + 0x5d, 0x5d, 0xed, 0x10, 0xd4, 0xc5, 0x10, 0xc6, 0x12, 0x17, 0x39, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, + 0x2f, 0x2f, 0x2f, 0x11, 0x12, 0x39, 0x10, 0xd6, 0x5d, 0x5d, 0x5d, 0xed, 0x31, 0x30, 0x2b, 0x2b, + 0x5d, 0x2b, 0x2b, 0x5d, 0x2b, 0x2b, 0x5d, 0x2b, 0x2b, 0x5d, 0x2b, 0x2b, 0x5d, 0x2b, 0x2b, 0x5d, + 0x2b, 0x2b, 0x5d, 0x2b, 0x2b, 0x5d, 0x2b, 0x2b, 0x2b, 0x21, 0x27, 0x23, 0x07, 0x23, 0x3e, 0x03, + 0x37, 0x33, 0x1e, 0x03, 0x17, 0x03, 0x0e, 0x03, 0x07, 0x33, 0x2e, 0x03, 0x27, 0x14, 0x06, 0x23, + 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x17, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, + 0x36, 0x33, 0x32, 0x16, 0x25, 0x33, 0x15, 0x23, 0x01, 0x67, 0x1d, 0xa5, 0x1c, 0x80, 0x16, 0x2d, + 0x2c, 0x2c, 0x15, 0x86, 0x16, 0x2c, 0x2b, 0x2b, 0x14, 0xf2, 0x0a, 0x11, 0x0f, 0x0d, 0x06, 0x79, + 0x06, 0x0c, 0x0f, 0x11, 0x24, 0x22, 0x17, 0x18, 0x21, 0x21, 0x18, 0x17, 0x22, 0xa8, 0x22, 0x17, + 0x17, 0x22, 0x22, 0x17, 0x17, 0x22, 0xfe, 0xfe, 0xe8, 0xe8, 0x7b, 0x7b, 0x5b, 0x9a, 0x89, 0x81, + 0x44, 0x44, 0x83, 0x8b, 0x99, 0x58, 0x01, 0xcb, 0x23, 0x39, 0x36, 0x37, 0x21, 0x21, 0x37, 0x36, + 0x39, 0xfe, 0x1a, 0x1f, 0x1f, 0x1a, 0x1a, 0x1e, 0x1e, 0x1a, 0x1a, 0x1f, 0x1f, 0x1a, 0x1a, 0x1e, + 0x1e, 0x7e, 0x47, 0x00, 0xff, 0xff, 0x00, 0x2c, 0xff, 0xf5, 0x01, 0xb9, 0x02, 0xdc, 0x02, 0x26, + 0x00, 0x44, 0x00, 0x00, 0x01, 0x06, 0x02, 0xa7, 0x00, 0x00, 0x00, 0x1e, 0x40, 0x15, 0x04, 0x03, + 0x02, 0x07, 0x34, 0x3b, 0x1c, 0x13, 0x50, 0x04, 0x0f, 0x49, 0x4f, 0x03, 0x0f, 0x3d, 0x4f, 0x02, + 0x0f, 0x31, 0x4f, 0x2b, 0x2b, 0x2b, 0x2b, 0x34, 0x34, 0x34, 0x00, 0x00, 0x00, 0x04, 0x00, 0x09, + 0x00, 0x00, 0x01, 0xeb, 0x03, 0x3e, 0x00, 0x0f, 0x00, 0x1a, 0x00, 0x26, 0x00, 0x2a, 0x00, 0xab, + 0xb9, 0x00, 0x26, 0xff, 0xe0, 0xb3, 0x1b, 0x00, 0x4d, 0x26, 0xb8, 0xff, 0xe0, 0x40, 0x1b, 0x16, + 0x18, 0x00, 0x4c, 0x22, 0x20, 0x1b, 0x00, 0x4d, 0x22, 0x20, 0x16, 0x18, 0x00, 0x4c, 0x20, 0x20, + 0x1b, 0x00, 0x4d, 0x20, 0x20, 0x16, 0x18, 0x00, 0x4c, 0x1c, 0xb8, 0xff, 0xe0, 0xb3, 0x1b, 0x00, + 0x4d, 0x1c, 0xb8, 0xff, 0xe0, 0x40, 0x41, 0x16, 0x18, 0x00, 0x4c, 0x10, 0x15, 0x16, 0x03, 0x02, + 0x09, 0x15, 0x16, 0x0a, 0x01, 0x00, 0x00, 0x01, 0x0a, 0x16, 0x15, 0x09, 0x02, 0x03, 0x08, 0x2b, + 0x0f, 0x2c, 0x28, 0x2a, 0x2b, 0x1b, 0xb3, 0x21, 0x04, 0x2b, 0xdf, 0x29, 0x01, 0x29, 0x99, 0x27, + 0x86, 0x24, 0xb2, 0xbf, 0x1e, 0x01, 0x00, 0x1e, 0x01, 0x1e, 0x02, 0x16, 0x48, 0x01, 0x10, 0x01, + 0x10, 0x01, 0x09, 0xb1, 0x03, 0x08, 0x00, 0x08, 0x00, 0x3f, 0x3f, 0x3f, 0x39, 0x39, 0x2f, 0x2f, + 0x10, 0xed, 0x3f, 0x5d, 0x5d, 0xed, 0x3f, 0xe5, 0x5d, 0x01, 0x10, 0xc6, 0xd6, 0xed, 0x10, 0xd6, + 0xc5, 0x10, 0xc6, 0x12, 0x17, 0x39, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x11, 0x12, + 0x39, 0x31, 0x30, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x21, 0x27, 0x23, 0x07, 0x23, + 0x3e, 0x03, 0x37, 0x33, 0x1e, 0x03, 0x17, 0x03, 0x0e, 0x03, 0x07, 0x33, 0x2e, 0x03, 0x37, 0x14, + 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x27, 0x33, 0x15, 0x23, 0x01, 0x67, + 0x1d, 0xa5, 0x1c, 0x80, 0x16, 0x2d, 0x2c, 0x2c, 0x15, 0x86, 0x16, 0x2c, 0x2b, 0x2b, 0x14, 0xf2, + 0x0a, 0x11, 0x0f, 0x0d, 0x06, 0x79, 0x06, 0x0c, 0x0f, 0x11, 0x30, 0x22, 0x17, 0x17, 0x22, 0x22, + 0x17, 0x17, 0x22, 0xad, 0xe8, 0xe8, 0x7b, 0x7b, 0x5b, 0x9a, 0x89, 0x81, 0x44, 0x44, 0x83, 0x8b, + 0x99, 0x58, 0x01, 0xcb, 0x23, 0x39, 0x36, 0x37, 0x21, 0x21, 0x37, 0x36, 0x39, 0xfe, 0x1a, 0x1e, + 0x1e, 0x1a, 0x1a, 0x1f, 0x1f, 0x7e, 0x47, 0x00, 0xff, 0xff, 0x00, 0x2c, 0xff, 0xf5, 0x01, 0xb9, + 0x02, 0xdc, 0x02, 0x26, 0x00, 0x44, 0x00, 0x00, 0x01, 0x06, 0x02, 0xa8, 0x00, 0x00, 0x00, 0x17, + 0x40, 0x10, 0x03, 0x02, 0x07, 0x3b, 0x3c, 0x1c, 0x13, 0x50, 0x03, 0x0f, 0x3d, 0x4f, 0x02, 0x0f, + 0x31, 0x4f, 0x2b, 0x2b, 0x2b, 0x34, 0x34, 0x00, 0xff, 0xff, 0x00, 0x09, 0x00, 0x00, 0x01, 0xeb, + 0x03, 0x12, 0x02, 0x26, 0x00, 0xa1, 0x00, 0x00, 0x01, 0x07, 0x00, 0x8a, 0x00, 0x47, 0x00, 0x8b, + 0x00, 0x10, 0x40, 0x0b, 0x02, 0x49, 0x19, 0x1a, 0x03, 0x11, 0x50, 0x02, 0x08, 0x1b, 0x4f, 0x2b, + 0x2b, 0x34, 0x00, 0x00, 0xff, 0xff, 0x00, 0x17, 0xff, 0xf5, 0x01, 0xe8, 0x02, 0x87, 0x02, 0x26, + 0x00, 0xc1, 0x00, 0x00, 0x01, 0x06, 0x00, 0x8a, 0x09, 0x00, 0x00, 0x10, 0x40, 0x0b, 0x03, 0x05, + 0x50, 0x51, 0x25, 0x0a, 0x50, 0x03, 0x00, 0x52, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0x01, 0x00, 0x1b, + 0xff, 0xf3, 0x01, 0xdf, 0x02, 0x79, 0x00, 0x29, 0x00, 0x7f, 0xb9, 0x00, 0x26, 0xff, 0xc0, 0x40, + 0x4d, 0x0b, 0x0c, 0x00, 0x4c, 0x0e, 0x40, 0x0b, 0x0c, 0x00, 0x4c, 0x0d, 0x40, 0x0b, 0x0c, 0x00, + 0x4c, 0x13, 0x40, 0x10, 0x11, 0x00, 0x4c, 0x11, 0x40, 0x18, 0x00, 0x4d, 0x10, 0x40, 0x18, 0x00, + 0x4d, 0x0e, 0x40, 0x10, 0x11, 0x00, 0x4c, 0x0f, 0x0d, 0x0c, 0x44, 0x12, 0x15, 0x26, 0xff, 0x14, + 0x01, 0x14, 0x2b, 0x05, 0x46, 0x1c, 0x2a, 0x12, 0x0f, 0x73, 0x0c, 0x15, 0x0b, 0x0c, 0x19, 0x10, + 0x0c, 0x10, 0x0c, 0x21, 0x19, 0x27, 0x00, 0x4a, 0x21, 0x03, 0x08, 0x4a, 0x19, 0x09, 0x00, 0x3f, + 0xed, 0x3f, 0xfd, 0xc6, 0x11, 0x12, 0x39, 0x39, 0x2f, 0x2f, 0x11, 0x12, 0x39, 0x32, 0x10, 0xed, + 0x32, 0x01, 0x10, 0xd6, 0xed, 0x10, 0xd6, 0x5d, 0xc4, 0xd5, 0xc0, 0xfd, 0xc5, 0xc0, 0x31, 0x30, + 0x00, 0x2b, 0x2b, 0x2b, 0x2b, 0x01, 0x2b, 0x2b, 0x2b, 0x01, 0x22, 0x0e, 0x02, 0x15, 0x14, 0x16, + 0x33, 0x32, 0x36, 0x37, 0x35, 0x23, 0x35, 0x33, 0x35, 0x33, 0x15, 0x33, 0x15, 0x23, 0x15, 0x06, + 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x3e, 0x02, 0x33, 0x32, 0x1e, 0x02, 0x17, 0x07, 0x26, 0x26, + 0x01, 0x28, 0x27, 0x37, 0x23, 0x0f, 0x3f, 0x3c, 0x08, 0x14, 0x08, 0x48, 0x48, 0x7b, 0x2d, 0x2d, + 0x14, 0x58, 0x3d, 0x6d, 0x81, 0x27, 0x44, 0x5d, 0x35, 0x22, 0x35, 0x27, 0x19, 0x07, 0x21, 0x14, + 0x39, 0x02, 0x0e, 0x20, 0x39, 0x4f, 0x30, 0x6f, 0x69, 0x02, 0x02, 0x5b, 0x5a, 0x42, 0x42, 0x5a, + 0xae, 0x08, 0x14, 0xa2, 0xa1, 0x4f, 0x79, 0x52, 0x29, 0x0b, 0x0e, 0x10, 0x04, 0x62, 0x0e, 0x16, + 0x00, 0x02, 0x00, 0x21, 0xff, 0x58, 0x01, 0xd9, 0x01, 0xe0, 0x00, 0x1f, 0x00, 0x2f, 0x00, 0x89, + 0x40, 0x15, 0x29, 0x40, 0x16, 0x00, 0x4d, 0x28, 0x40, 0x16, 0x00, 0x4d, 0x28, 0x40, 0x0b, 0x00, + 0x4d, 0x01, 0x40, 0x09, 0x00, 0x4d, 0x0b, 0xb8, 0xff, 0xc0, 0x40, 0x3f, 0x11, 0x12, 0x00, 0x4c, + 0x29, 0x2a, 0x26, 0x14, 0x51, 0x04, 0x03, 0x00, 0x02, 0x01, 0x02, 0x31, 0x20, 0x20, 0x30, 0x20, + 0x02, 0x20, 0x53, 0x0a, 0x1a, 0x30, 0x01, 0x29, 0x7d, 0x28, 0x02, 0x28, 0x50, 0x23, 0x60, 0x23, + 0x02, 0x3f, 0x23, 0x01, 0x23, 0x57, 0x17, 0x28, 0x17, 0x28, 0x17, 0x07, 0x4f, 0x2e, 0x01, 0x2e, + 0x57, 0x1d, 0x0b, 0x0b, 0x40, 0x0e, 0x01, 0x0e, 0x57, 0x07, 0x0f, 0x00, 0x3f, 0xfd, 0x5d, 0xc6, + 0x3f, 0xed, 0x5d, 0x12, 0x39, 0x39, 0x2f, 0x2f, 0x10, 0xed, 0x5d, 0x5d, 0x11, 0x33, 0x10, 0xed, + 0x32, 0x01, 0x10, 0xd6, 0xc4, 0xed, 0x5d, 0x10, 0xd6, 0x5d, 0xc5, 0xd6, 0xfd, 0xd0, 0xd0, 0xc5, + 0x31, 0x30, 0x00, 0x2b, 0x01, 0x2b, 0x2b, 0x2b, 0x2b, 0x01, 0x33, 0x15, 0x23, 0x15, 0x14, 0x06, + 0x23, 0x22, 0x26, 0x27, 0x37, 0x16, 0x16, 0x33, 0x32, 0x3e, 0x02, 0x35, 0x35, 0x06, 0x06, 0x23, + 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x17, 0x05, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x35, + 0x23, 0x35, 0x33, 0x35, 0x26, 0x26, 0x23, 0x22, 0x01, 0xa4, 0x35, 0x35, 0x6a, 0x77, 0x2a, 0x4c, + 0x23, 0x17, 0x1a, 0x3d, 0x2c, 0x1e, 0x27, 0x16, 0x09, 0x17, 0x28, 0x17, 0x57, 0x5a, 0x7b, 0x69, + 0x4a, 0x55, 0xfe, 0xfa, 0x25, 0x28, 0x12, 0x1f, 0x0c, 0x47, 0x47, 0x0c, 0x11, 0x0b, 0x62, 0x01, + 0x2c, 0x50, 0xa3, 0x73, 0x6e, 0x12, 0x0c, 0x68, 0x0b, 0x13, 0x0f, 0x1a, 0x23, 0x14, 0x13, 0x0a, + 0x0a, 0x74, 0x67, 0x74, 0x72, 0x19, 0xcd, 0x3a, 0x3d, 0x0a, 0x08, 0x47, 0x50, 0x4b, 0x03, 0x02, + 0xff, 0xff, 0x00, 0x1b, 0xff, 0xf3, 0x01, 0xd0, 0x03, 0x3e, 0x02, 0x26, 0x00, 0x2a, 0x00, 0x00, + 0x01, 0x07, 0x01, 0x5f, 0x00, 0x24, 0x00, 0x8b, 0x00, 0x10, 0x40, 0x0b, 0x01, 0x29, 0x24, 0x28, + 0x15, 0x20, 0x50, 0x01, 0x1a, 0x29, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0x00, 0xff, 0xff, 0x00, 0x21, + 0xff, 0x58, 0x01, 0xb6, 0x02, 0xb3, 0x02, 0x26, 0x00, 0x4a, 0x00, 0x00, 0x01, 0x06, 0x01, 0x5f, + 0x09, 0x00, 0x00, 0x10, 0x40, 0x0b, 0x02, 0x18, 0x28, 0x2c, 0x21, 0x0c, 0x50, 0x02, 0x24, 0x2d, + 0x4f, 0x2b, 0x2b, 0x34, 0xff, 0xff, 0x00, 0x2d, 0x00, 0x00, 0x01, 0xe9, 0x03, 0x3e, 0x02, 0x26, + 0x00, 0x2e, 0x00, 0x00, 0x01, 0x07, 0x01, 0x5f, 0x00, 0x00, 0x00, 0x8b, 0x00, 0x13, 0xb9, 0x00, + 0x01, 0xff, 0xf0, 0x40, 0x09, 0x1b, 0x1f, 0x07, 0x1a, 0x50, 0x01, 0x08, 0x20, 0x4f, 0x2b, 0x2b, + 0x34, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x37, 0x00, 0x00, 0x01, 0xe7, 0x03, 0x3d, 0x00, 0x1a, + 0x00, 0x20, 0x00, 0x5c, 0x40, 0x34, 0x05, 0x06, 0x11, 0x10, 0x22, 0x20, 0x1c, 0x21, 0x0b, 0x00, + 0x16, 0x51, 0x18, 0x21, 0x0f, 0x1f, 0x01, 0x1f, 0x86, 0x1b, 0x1e, 0x0f, 0x1d, 0x01, 0x1d, 0x86, + 0x4f, 0x00, 0x01, 0x00, 0x40, 0x13, 0x17, 0x48, 0x00, 0x16, 0x0b, 0x16, 0x0b, 0x00, 0x03, 0x17, + 0x1a, 0x03, 0x19, 0x02, 0x17, 0x06, 0x11, 0x06, 0x05, 0x0a, 0x00, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, + 0x12, 0x17, 0x39, 0x3d, 0x2f, 0x18, 0x2f, 0x2f, 0x2b, 0x5d, 0x3f, 0x5d, 0xdd, 0xc5, 0x3f, 0x5d, + 0x01, 0x10, 0xd6, 0xfd, 0xd0, 0xc5, 0x10, 0xd6, 0xc5, 0x10, 0xd6, 0xc5, 0xd6, 0xc5, 0x31, 0x30, + 0x13, 0x3e, 0x03, 0x37, 0x33, 0x0e, 0x03, 0x07, 0x1e, 0x03, 0x17, 0x23, 0x2e, 0x03, 0x27, 0x15, + 0x23, 0x11, 0x37, 0x35, 0x27, 0x37, 0x17, 0x37, 0x17, 0xbb, 0x12, 0x25, 0x23, 0x20, 0x0c, 0x94, + 0x12, 0x2e, 0x31, 0x31, 0x14, 0x19, 0x3a, 0x38, 0x2f, 0x0e, 0x8d, 0x0c, 0x27, 0x2c, 0x2d, 0x13, + 0x7c, 0x7c, 0x84, 0x26, 0x5e, 0x5c, 0x26, 0x01, 0x1c, 0x15, 0x2f, 0x32, 0x2f, 0x15, 0x17, 0x36, + 0x38, 0x34, 0x16, 0x18, 0x43, 0x48, 0x48, 0x1c, 0x19, 0x3f, 0x3d, 0x37, 0x12, 0xde, 0x02, 0x65, + 0x15, 0x2b, 0x60, 0x38, 0x36, 0x36, 0x38, 0x00, 0x00, 0x02, 0x00, 0x1b, 0xff, 0x56, 0x01, 0xd9, + 0x02, 0x79, 0x00, 0x20, 0x00, 0x34, 0x00, 0x39, 0x40, 0x21, 0x2b, 0x46, 0x40, 0x12, 0x60, 0x12, + 0x80, 0x12, 0x90, 0x12, 0x04, 0x12, 0x36, 0x06, 0x1a, 0x00, 0x36, 0x21, 0x46, 0x0c, 0x35, 0x30, + 0x4a, 0x0f, 0x03, 0x26, 0x4a, 0x09, 0x09, 0x1d, 0x00, 0x03, 0x92, 0x00, 0x3f, 0xc5, 0xc5, 0x3f, + 0xed, 0x3f, 0xed, 0x01, 0x10, 0xd6, 0xed, 0x10, 0xd6, 0xdc, 0xc5, 0x10, 0xd6, 0x5d, 0xed, 0x31, + 0x30, 0x05, 0x06, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x37, 0x26, 0x26, 0x35, 0x34, 0x36, + 0x33, 0x32, 0x16, 0x15, 0x14, 0x0e, 0x02, 0x07, 0x06, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, + 0x37, 0x03, 0x14, 0x1e, 0x02, 0x33, 0x32, 0x3e, 0x02, 0x35, 0x34, 0x2e, 0x02, 0x23, 0x22, 0x0e, + 0x02, 0x01, 0x5a, 0x0e, 0x33, 0x1c, 0x30, 0x2a, 0x1b, 0x17, 0x5b, 0x5f, 0x76, 0x69, 0x6d, 0x72, + 0x1f, 0x31, 0x3d, 0x1d, 0x0a, 0x1a, 0x0b, 0x10, 0x08, 0x16, 0x0f, 0xbb, 0x07, 0x15, 0x26, 0x20, + 0x1f, 0x27, 0x15, 0x07, 0x07, 0x15, 0x26, 0x20, 0x20, 0x26, 0x15, 0x07, 0x9c, 0x05, 0x09, 0x25, + 0x1b, 0x17, 0x33, 0x15, 0x0e, 0xa1, 0x92, 0xa0, 0xa3, 0xa3, 0xa0, 0x5b, 0x6c, 0x44, 0x2c, 0x19, + 0x08, 0x1e, 0x11, 0x0a, 0x0e, 0x02, 0x05, 0x01, 0x98, 0x2d, 0x4f, 0x3a, 0x22, 0x22, 0x3b, 0x4e, + 0x2d, 0x2d, 0x4f, 0x3a, 0x22, 0x22, 0x3b, 0x4e, 0x00, 0x02, 0x00, 0x1d, 0xff, 0x56, 0x01, 0xd8, + 0x01, 0xe2, 0x00, 0x26, 0x00, 0x32, 0x00, 0x3f, 0x40, 0x26, 0x2d, 0x53, 0x00, 0x22, 0x20, 0x22, + 0x40, 0x22, 0x60, 0x22, 0x80, 0x22, 0x05, 0x22, 0x34, 0x10, 0x03, 0x0a, 0x34, 0x27, 0x53, 0x80, + 0x18, 0x01, 0x18, 0x33, 0x30, 0x57, 0x1d, 0x0b, 0x2a, 0x57, 0x13, 0x07, 0x09, 0x06, 0x0d, 0x92, + 0x00, 0x3f, 0xd5, 0xc6, 0x3f, 0xed, 0x3f, 0xed, 0x01, 0x10, 0xd6, 0x5d, 0xed, 0x10, 0xd6, 0xdc, + 0xc5, 0x10, 0xd6, 0x5d, 0xed, 0x31, 0x30, 0x05, 0x06, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, + 0x37, 0x17, 0x06, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x37, 0x2e, 0x03, 0x35, 0x34, 0x3e, + 0x02, 0x33, 0x32, 0x1e, 0x02, 0x15, 0x14, 0x0e, 0x02, 0x27, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, + 0x34, 0x26, 0x23, 0x22, 0x06, 0x01, 0x3d, 0x0a, 0x1a, 0x0b, 0x10, 0x08, 0x16, 0x0f, 0x07, 0x0e, + 0x33, 0x1c, 0x30, 0x2a, 0x1b, 0x17, 0x2d, 0x49, 0x34, 0x1c, 0x21, 0x3b, 0x52, 0x30, 0x31, 0x51, + 0x3b, 0x20, 0x1a, 0x2c, 0x37, 0xc1, 0x2d, 0x32, 0x30, 0x31, 0x2d, 0x32, 0x30, 0x31, 0x1a, 0x09, + 0x1d, 0x11, 0x0a, 0x0e, 0x02, 0x05, 0x3a, 0x05, 0x09, 0x25, 0x1b, 0x17, 0x33, 0x15, 0x04, 0x27, + 0x41, 0x56, 0x35, 0x37, 0x5b, 0x41, 0x23, 0x23, 0x41, 0x5b, 0x37, 0x38, 0x4b, 0x39, 0x2e, 0xe9, + 0x3f, 0x4e, 0x4e, 0x3f, 0x3f, 0x4d, 0x4d, 0x00, 0xff, 0xff, 0x00, 0x1b, 0xff, 0x56, 0x01, 0xd9, + 0x03, 0x12, 0x02, 0x26, 0x02, 0x42, 0x00, 0x00, 0x01, 0x07, 0x00, 0x8a, 0x00, 0x00, 0x00, 0x8b, + 0x00, 0x10, 0x40, 0x0b, 0x02, 0x02, 0x35, 0x36, 0x0b, 0x11, 0x50, 0x02, 0x0e, 0x37, 0x4f, 0x2b, + 0x2b, 0x34, 0x00, 0x00, 0xff, 0xff, 0x00, 0x1d, 0xff, 0x56, 0x01, 0xd8, 0x02, 0x87, 0x02, 0x26, + 0x00, 0x8a, 0x00, 0x00, 0x01, 0x06, 0x02, 0x43, 0x00, 0x00, 0x00, 0x0f, 0xb1, 0x02, 0x01, 0xb8, + 0xff, 0xff, 0xb4, 0x1b, 0x25, 0x00, 0x01, 0x50, 0x2b, 0x34, 0x34, 0x00, 0xff, 0xff, 0x00, 0x1a, + 0xff, 0xf3, 0x01, 0xe1, 0x03, 0x3e, 0x02, 0x26, 0x02, 0x0f, 0x00, 0x00, 0x01, 0x07, 0x01, 0x5f, + 0x00, 0x00, 0x00, 0x8b, 0x00, 0x13, 0xb9, 0x00, 0x01, 0xff, 0xfe, 0x40, 0x09, 0x27, 0x2b, 0x1b, + 0x12, 0x50, 0x01, 0x07, 0x2c, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x1f, + 0xff, 0x5b, 0x01, 0xba, 0x02, 0xb3, 0x02, 0x26, 0x02, 0xa3, 0x00, 0x00, 0x01, 0x06, 0x01, 0x5f, + 0x00, 0x00, 0x00, 0x10, 0x40, 0x0b, 0x01, 0x0e, 0x26, 0x2a, 0x1b, 0x12, 0x50, 0x01, 0x07, 0x2b, + 0x4f, 0x2b, 0x2b, 0x34, 0xff, 0xff, 0x00, 0x31, 0xff, 0x56, 0x01, 0x90, 0x02, 0xb3, 0x02, 0x26, + 0x01, 0x5d, 0x00, 0x00, 0x01, 0x06, 0x01, 0x5f, 0x00, 0x00, 0x00, 0x10, 0x40, 0x0b, 0x01, 0x1a, + 0x14, 0x18, 0x08, 0x00, 0x50, 0x01, 0x12, 0x19, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0x03, 0x00, 0x12, + 0xff, 0xfa, 0x01, 0xeb, 0x02, 0x72, 0x00, 0x10, 0x00, 0x22, 0x00, 0x2f, 0x00, 0x60, 0x40, 0x3b, + 0x21, 0x22, 0x31, 0x16, 0x1f, 0x1a, 0x1f, 0x1a, 0x1f, 0x30, 0x31, 0x00, 0x28, 0x20, 0x28, 0x02, + 0x28, 0xa4, 0x19, 0x20, 0x00, 0x60, 0x00, 0x70, 0x00, 0x03, 0x00, 0x17, 0x31, 0x2f, 0x40, 0x17, + 0x1b, 0x48, 0x2f, 0x40, 0x0d, 0x10, 0x48, 0x2f, 0xa4, 0x09, 0x30, 0x20, 0xa5, 0x21, 0x02, 0x16, + 0xa5, 0x19, 0x08, 0x2f, 0xa5, 0x0c, 0x03, 0x25, 0xa5, 0x05, 0x09, 0x00, 0x3f, 0xed, 0x3f, 0xed, + 0x3f, 0xed, 0x3f, 0xed, 0x01, 0x10, 0xd6, 0xed, 0x2b, 0x2b, 0x10, 0xc6, 0xd4, 0x5d, 0xc6, 0xed, + 0x71, 0x11, 0x12, 0x39, 0x39, 0x2f, 0x2f, 0x12, 0x39, 0x10, 0xd6, 0xc5, 0x31, 0x30, 0x01, 0x14, + 0x0e, 0x02, 0x23, 0x22, 0x26, 0x27, 0x11, 0x36, 0x36, 0x33, 0x32, 0x1e, 0x02, 0x37, 0x0e, 0x03, + 0x07, 0x33, 0x15, 0x23, 0x35, 0x3e, 0x03, 0x37, 0x23, 0x35, 0x33, 0x01, 0x16, 0x33, 0x32, 0x36, + 0x35, 0x34, 0x2e, 0x02, 0x23, 0x22, 0x07, 0x01, 0x1b, 0x1a, 0x2d, 0x3e, 0x25, 0x13, 0x35, 0x17, + 0x19, 0x2d, 0x15, 0x2a, 0x40, 0x2d, 0x17, 0xd0, 0x0c, 0x1e, 0x1e, 0x1e, 0x0c, 0x72, 0xcb, 0x12, + 0x1c, 0x19, 0x19, 0x10, 0x5e, 0xb9, 0xfe, 0x7e, 0x05, 0x06, 0x2f, 0x1f, 0x07, 0x11, 0x1e, 0x17, + 0x08, 0x04, 0x01, 0x36, 0x5e, 0x7a, 0x48, 0x1c, 0x03, 0x07, 0x02, 0x63, 0x05, 0x06, 0x1f, 0x49, + 0x79, 0x8c, 0x2a, 0x6e, 0x78, 0x7a, 0x36, 0x5d, 0x4c, 0x48, 0x71, 0x66, 0x66, 0x3d, 0x5d, 0xfd, + 0xed, 0x01, 0x74, 0x6b, 0x43, 0x58, 0x35, 0x16, 0x01, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x12, + 0xff, 0xfa, 0x01, 0xeb, 0x02, 0x72, 0x00, 0x10, 0x00, 0x22, 0x00, 0x2f, 0x00, 0x7e, 0x40, 0x1e, + 0x20, 0x1a, 0x30, 0x1a, 0x90, 0x1a, 0x03, 0x1a, 0x17, 0x31, 0x16, 0x1f, 0x16, 0x1f, 0x30, 0x31, + 0x30, 0x20, 0x40, 0x20, 0x90, 0x20, 0x03, 0x21, 0x20, 0x01, 0x20, 0x11, 0x31, 0x28, 0xb8, 0xff, + 0xc0, 0x40, 0x33, 0x17, 0x1b, 0x48, 0x9f, 0x28, 0x01, 0x28, 0xa4, 0x00, 0x00, 0x01, 0x20, 0x00, + 0x60, 0x00, 0x70, 0x00, 0x90, 0x00, 0xa0, 0x00, 0xb0, 0x00, 0x06, 0x00, 0x31, 0x2f, 0x40, 0x0d, + 0x10, 0x48, 0x2f, 0xa4, 0x09, 0x30, 0x1f, 0xa5, 0x22, 0x0a, 0x16, 0xa5, 0x19, 0x06, 0x2f, 0xa5, + 0x0c, 0x03, 0x25, 0xa5, 0x05, 0x09, 0x00, 0x3f, 0xed, 0x3f, 0xed, 0x3f, 0xed, 0x3f, 0xed, 0x01, + 0x10, 0xd6, 0xed, 0x2b, 0x10, 0xd4, 0x5d, 0x71, 0xed, 0x5d, 0x2b, 0x10, 0xd6, 0xc5, 0x5d, 0x5d, + 0x11, 0x12, 0x39, 0x39, 0x2f, 0x2f, 0x10, 0xd6, 0xc5, 0x5d, 0x31, 0x30, 0x01, 0x14, 0x0e, 0x02, + 0x23, 0x22, 0x26, 0x27, 0x11, 0x36, 0x36, 0x33, 0x32, 0x1e, 0x02, 0x17, 0x0e, 0x03, 0x07, 0x33, + 0x15, 0x23, 0x35, 0x3e, 0x03, 0x37, 0x23, 0x35, 0x33, 0x01, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, + 0x2e, 0x02, 0x23, 0x22, 0x07, 0x01, 0x1b, 0x1a, 0x2d, 0x3e, 0x25, 0x13, 0x35, 0x17, 0x19, 0x2d, + 0x15, 0x2a, 0x40, 0x2d, 0x17, 0xd0, 0x0c, 0x1b, 0x1b, 0x1a, 0x0b, 0x67, 0xc2, 0x0f, 0x19, 0x17, + 0x17, 0x0e, 0x5b, 0xb9, 0xfe, 0x7e, 0x05, 0x06, 0x2f, 0x1f, 0x07, 0x11, 0x1e, 0x17, 0x08, 0x04, + 0x01, 0x36, 0x5e, 0x7a, 0x48, 0x1c, 0x03, 0x07, 0x02, 0x63, 0x05, 0x06, 0x1f, 0x49, 0x79, 0x0d, + 0x1d, 0x48, 0x4e, 0x50, 0x24, 0x5d, 0x47, 0x30, 0x50, 0x48, 0x45, 0x25, 0x5d, 0xfe, 0x82, 0x01, + 0x74, 0x6b, 0x43, 0x58, 0x35, 0x16, 0x01, 0x00, 0x00, 0x03, 0x00, 0x09, 0xff, 0xf3, 0x01, 0xeb, + 0x02, 0xb5, 0x00, 0x0f, 0x00, 0x21, 0x00, 0x30, 0x00, 0x6c, 0x40, 0x45, 0x0d, 0x2e, 0xa4, 0x00, + 0x20, 0x19, 0x30, 0x19, 0x02, 0x19, 0x32, 0x15, 0x1e, 0x15, 0x1e, 0x31, 0x17, 0x32, 0x20, 0x20, + 0x30, 0x20, 0x40, 0x20, 0x90, 0x20, 0xe0, 0x20, 0x05, 0x20, 0x10, 0x32, 0x30, 0x27, 0x01, 0x90, + 0x27, 0x01, 0x4f, 0x27, 0x5f, 0x27, 0x6f, 0x27, 0x03, 0x27, 0x85, 0x06, 0x31, 0x1e, 0xa5, 0x21, + 0x0a, 0x15, 0xa5, 0x18, 0x06, 0x0f, 0x10, 0x0e, 0x98, 0x22, 0xa5, 0x0b, 0x0b, 0x2c, 0xa5, 0x03, + 0x07, 0x00, 0x3f, 0xed, 0x3f, 0xed, 0x3f, 0x3f, 0x3f, 0xed, 0x3f, 0xed, 0x01, 0x10, 0xd6, 0xed, + 0x5d, 0x5d, 0x71, 0x10, 0xd6, 0xc5, 0x5d, 0x10, 0xc6, 0x11, 0x39, 0x39, 0x2f, 0x2f, 0x10, 0xd4, + 0x5d, 0xd6, 0xfd, 0xc0, 0x31, 0x30, 0x25, 0x06, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x3e, 0x02, + 0x33, 0x32, 0x17, 0x35, 0x37, 0x13, 0x0e, 0x03, 0x07, 0x33, 0x15, 0x23, 0x35, 0x3e, 0x03, 0x37, + 0x23, 0x35, 0x33, 0x05, 0x22, 0x0e, 0x02, 0x15, 0x14, 0x1e, 0x02, 0x33, 0x32, 0x37, 0x11, 0x26, + 0x01, 0x08, 0x1f, 0x33, 0x1a, 0x4a, 0x49, 0x0e, 0x1c, 0x2b, 0x1d, 0x19, 0x1d, 0x57, 0xe3, 0x0c, + 0x1b, 0x1b, 0x1a, 0x0b, 0x67, 0xc2, 0x0f, 0x19, 0x17, 0x17, 0x0e, 0x5b, 0xb9, 0xfe, 0xa2, 0x0e, + 0x11, 0x09, 0x04, 0x03, 0x0b, 0x17, 0x14, 0x0c, 0x0b, 0x16, 0x0e, 0x0e, 0x0d, 0x86, 0x74, 0x34, + 0x5a, 0x40, 0x25, 0x11, 0xd3, 0x13, 0xfe, 0xcf, 0x1d, 0x48, 0x4e, 0x50, 0x24, 0x5d, 0x47, 0x30, + 0x50, 0x48, 0x45, 0x25, 0x5d, 0x53, 0x20, 0x31, 0x3e, 0x1e, 0x1a, 0x30, 0x26, 0x16, 0x05, 0x01, + 0x1b, 0x13, 0x00, 0x00, 0xff, 0xff, 0x00, 0x1b, 0xff, 0xf3, 0x01, 0xd0, 0x03, 0x3e, 0x02, 0x26, + 0x00, 0x2a, 0x00, 0x00, 0x01, 0x07, 0x00, 0x8f, 0x00, 0x09, 0x00, 0x8b, 0x00, 0x10, 0x40, 0x0b, + 0x01, 0x19, 0x26, 0x24, 0x15, 0x20, 0x50, 0x01, 0x1a, 0x25, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x21, 0xff, 0x58, 0x01, 0xb6, 0x02, 0xb3, 0x02, 0x26, 0x00, 0x4a, 0x00, 0x00, + 0x01, 0x06, 0x00, 0x8f, 0x00, 0x00, 0x00, 0x10, 0x40, 0x0b, 0x02, 0x1a, 0x2a, 0x28, 0x21, 0x0c, + 0x50, 0x02, 0x24, 0x29, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0x01, 0x00, 0x1e, 0xff, 0xf3, 0x01, 0xdf, + 0x02, 0x6b, 0x00, 0x21, 0x00, 0x73, 0x40, 0x1b, 0x2f, 0x1a, 0x3f, 0x1a, 0x02, 0x1a, 0x40, 0x15, + 0x1a, 0x48, 0x1a, 0x52, 0xc0, 0x1d, 0xd0, 0x1d, 0xe0, 0x1d, 0x03, 0x1d, 0x23, 0xc0, 0x10, 0xd0, + 0x10, 0x02, 0x10, 0xb8, 0xff, 0xc0, 0x40, 0x14, 0x0b, 0x0e, 0x48, 0x10, 0x52, 0x9f, 0x0d, 0x01, + 0x0d, 0x9f, 0x06, 0x01, 0x06, 0x07, 0x0c, 0x52, 0x90, 0x0a, 0x01, 0x0a, 0xb8, 0xff, 0xc0, 0x40, + 0x16, 0x15, 0x18, 0x48, 0x0a, 0x22, 0x1b, 0x0a, 0x0f, 0x02, 0x0c, 0x07, 0x0c, 0x07, 0x08, 0x0b, + 0x02, 0x08, 0x08, 0x15, 0xa5, 0x00, 0x07, 0x00, 0x3f, 0xed, 0x3f, 0x3f, 0x12, 0x39, 0x39, 0x2f, + 0x2f, 0x3f, 0x3f, 0x01, 0x10, 0xd6, 0x2b, 0x5d, 0xfd, 0xd0, 0xd6, 0x5d, 0xc0, 0x5d, 0xed, 0x2b, + 0x5d, 0x10, 0xd6, 0x5d, 0xed, 0x2b, 0x5d, 0x31, 0x30, 0x05, 0x22, 0x2e, 0x02, 0x35, 0x35, 0x23, + 0x11, 0x23, 0x11, 0x33, 0x15, 0x33, 0x35, 0x33, 0x11, 0x14, 0x1e, 0x02, 0x33, 0x32, 0x3e, 0x02, + 0x35, 0x35, 0x33, 0x15, 0x14, 0x0e, 0x02, 0x01, 0x54, 0x2d, 0x34, 0x1b, 0x07, 0x52, 0x61, 0x61, + 0x52, 0x60, 0x02, 0x08, 0x10, 0x0e, 0x0e, 0x0f, 0x07, 0x01, 0x61, 0x09, 0x1d, 0x37, 0x0d, 0x21, + 0x3e, 0x58, 0x36, 0x31, 0xfe, 0xef, 0x02, 0x6b, 0xf4, 0xf4, 0xfe, 0x7d, 0x2d, 0x3c, 0x24, 0x0f, + 0x0f, 0x25, 0x3c, 0x2d, 0xf4, 0xfd, 0x36, 0x58, 0x3e, 0x21, 0x00, 0x00, 0x00, 0x02, 0x00, 0x36, + 0xff, 0x5b, 0x01, 0xdb, 0x02, 0x72, 0x00, 0x0d, 0x00, 0x19, 0x00, 0x3a, 0x40, 0x24, 0x13, 0x53, + 0x00, 0x08, 0x60, 0x08, 0x80, 0x08, 0x90, 0x08, 0xa0, 0x08, 0x05, 0x08, 0x1b, 0x0d, 0x19, 0x44, + 0x20, 0x02, 0x30, 0x02, 0x02, 0x02, 0x1a, 0x0d, 0x48, 0x0e, 0x0e, 0x00, 0x16, 0x4a, 0x05, 0x03, + 0x00, 0x86, 0x00, 0x3f, 0x3f, 0xed, 0x12, 0x39, 0x10, 0xed, 0x01, 0x10, 0xd6, 0x5d, 0xfd, 0xc0, + 0x10, 0xd6, 0x5d, 0xed, 0x31, 0x30, 0x17, 0x23, 0x11, 0x36, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, + 0x0e, 0x02, 0x07, 0x35, 0x3e, 0x03, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0xb1, 0x7b, 0x23, + 0x60, 0x39, 0x79, 0x70, 0x2b, 0x4e, 0x6e, 0x43, 0x26, 0x3f, 0x2e, 0x1a, 0x39, 0x32, 0x16, 0x21, + 0x0b, 0xa5, 0x02, 0xf5, 0x0e, 0x14, 0x75, 0x73, 0x4a, 0x79, 0x60, 0x4b, 0x1c, 0x74, 0x15, 0x30, + 0x41, 0x57, 0x3c, 0x37, 0x43, 0x06, 0x03, 0x00, 0xff, 0xff, 0x00, 0x2e, 0x00, 0x00, 0x01, 0xc6, + 0x03, 0x3e, 0x02, 0x26, 0x00, 0x31, 0x00, 0x00, 0x01, 0x07, 0x00, 0x43, 0xff, 0xef, 0x00, 0x8b, + 0x00, 0x13, 0xb9, 0x00, 0x01, 0xff, 0xfb, 0x40, 0x09, 0x13, 0x11, 0x05, 0x0e, 0x50, 0x01, 0x06, + 0x12, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x3f, 0x00, 0x00, 0x01, 0xb9, + 0x02, 0xb3, 0x02, 0x26, 0x00, 0x51, 0x00, 0x00, 0x01, 0x06, 0x00, 0x43, 0xdd, 0x00, 0x00, 0x13, + 0xb9, 0x00, 0x01, 0xff, 0xe7, 0x40, 0x09, 0x17, 0x15, 0x00, 0x07, 0x50, 0x01, 0x02, 0x16, 0x4f, + 0x2b, 0x2b, 0x34, 0x00, 0x00, 0x04, 0x00, 0x09, 0x00, 0x00, 0x01, 0xeb, 0x03, 0x3e, 0x00, 0x1c, + 0x00, 0x27, 0x00, 0x33, 0x00, 0x37, 0x00, 0xa3, 0xb9, 0x00, 0x25, 0xff, 0xe0, 0x40, 0x11, 0x0c, + 0x00, 0x4d, 0x20, 0x20, 0x0c, 0x00, 0x4d, 0x40, 0x31, 0x01, 0x2b, 0x40, 0x1a, 0x00, 0x4d, 0x1d, + 0xb8, 0xff, 0xc0, 0x40, 0x4c, 0x0e, 0x00, 0x4d, 0x28, 0x82, 0x7f, 0x15, 0x01, 0x60, 0x15, 0x01, + 0x1f, 0x15, 0x2f, 0x15, 0x3f, 0x15, 0x03, 0x15, 0x39, 0x09, 0x02, 0x03, 0x03, 0x38, 0x22, 0x00, + 0x01, 0x17, 0x03, 0x23, 0x39, 0x22, 0x23, 0x1d, 0x23, 0x1d, 0x22, 0x03, 0x38, 0x1c, 0x39, 0x34, + 0x36, 0x38, 0x2e, 0x82, 0x0b, 0x04, 0x38, 0x2b, 0x80, 0x10, 0x23, 0x48, 0x01, 0x3f, 0x10, 0x01, + 0x10, 0x31, 0x1d, 0x01, 0x01, 0x1d, 0x31, 0x10, 0x04, 0x00, 0x35, 0x37, 0x86, 0x03, 0x08, 0x00, + 0x08, 0x00, 0x3f, 0x3f, 0x3f, 0xc5, 0x12, 0x17, 0x39, 0x2f, 0x2f, 0x2f, 0x2f, 0x5d, 0x10, 0xed, + 0x10, 0xed, 0x01, 0x10, 0xc6, 0xd6, 0xed, 0x10, 0xd6, 0xc5, 0x10, 0xc6, 0x12, 0x17, 0x39, 0x3d, + 0x2f, 0x18, 0x2f, 0x2f, 0x11, 0x12, 0x17, 0x39, 0x11, 0x12, 0x17, 0x39, 0x10, 0xd6, 0x5d, 0x5d, + 0x5d, 0xed, 0x31, 0x30, 0x00, 0x2b, 0x2b, 0x5d, 0x01, 0x2b, 0x2b, 0x21, 0x27, 0x23, 0x07, 0x23, + 0x3e, 0x03, 0x37, 0x26, 0x35, 0x34, 0x3e, 0x02, 0x33, 0x32, 0x1e, 0x02, 0x15, 0x14, 0x07, 0x1e, + 0x03, 0x17, 0x03, 0x0e, 0x03, 0x07, 0x33, 0x2e, 0x03, 0x37, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, + 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x07, 0x27, 0x37, 0x01, 0x67, 0x1d, 0xa5, 0x1c, 0x80, 0x18, + 0x2b, 0x28, 0x26, 0x14, 0x0f, 0x0f, 0x19, 0x21, 0x11, 0x12, 0x20, 0x1a, 0x0f, 0x0c, 0x15, 0x26, + 0x27, 0x2a, 0x17, 0xf2, 0x0a, 0x10, 0x0e, 0x0d, 0x08, 0x79, 0x08, 0x0d, 0x0d, 0x10, 0x19, 0x15, + 0x0e, 0x0d, 0x16, 0x16, 0x0d, 0x0e, 0x15, 0x36, 0x98, 0x18, 0x91, 0x85, 0x85, 0x56, 0x93, 0x85, + 0x7e, 0x40, 0x13, 0x21, 0x15, 0x21, 0x17, 0x0b, 0x0b, 0x17, 0x21, 0x15, 0x1b, 0x15, 0x41, 0x80, + 0x88, 0x93, 0x54, 0x01, 0xd5, 0x23, 0x39, 0x36, 0x37, 0x21, 0x21, 0x37, 0x36, 0x39, 0xae, 0x12, + 0x12, 0x12, 0x12, 0x13, 0x12, 0x12, 0xb0, 0x39, 0x2f, 0x4b, 0x00, 0x00, 0xff, 0xff, 0x00, 0x2c, + 0xff, 0xf5, 0x01, 0xb9, 0x03, 0x3e, 0x02, 0x26, 0x00, 0x44, 0x00, 0x00, 0x01, 0x06, 0x02, 0xa6, + 0x00, 0x00, 0x00, 0x0f, 0x40, 0x09, 0x04, 0x03, 0x02, 0x09, 0x3c, 0x33, 0x1c, 0x13, 0x50, 0x2b, + 0x34, 0x34, 0x34, 0x00, 0xff, 0xff, 0x00, 0x09, 0x00, 0x00, 0x01, 0xeb, 0x03, 0x3e, 0x02, 0x26, + 0x00, 0xa1, 0x00, 0x00, 0x01, 0x07, 0x00, 0x8f, 0x00, 0x47, 0x00, 0x8b, 0x00, 0x10, 0x40, 0x0b, + 0x02, 0x52, 0x1b, 0x19, 0x03, 0x11, 0x50, 0x02, 0x08, 0x1a, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x17, 0xff, 0xf5, 0x01, 0xe8, 0x02, 0xb3, 0x02, 0x26, 0x00, 0xc1, 0x00, 0x00, + 0x01, 0x06, 0x00, 0x8f, 0x14, 0x00, 0x00, 0x10, 0x40, 0x0b, 0x03, 0x1a, 0x52, 0x50, 0x25, 0x0a, + 0x50, 0x03, 0x00, 0x51, 0x4f, 0x2b, 0x2b, 0x34, 0xff, 0xff, 0x00, 0x1b, 0xff, 0xd8, 0x01, 0xd9, + 0x03, 0x3e, 0x02, 0x26, 0x00, 0xb3, 0x00, 0x00, 0x01, 0x07, 0x00, 0x8f, 0x00, 0x00, 0x00, 0x8b, + 0x00, 0x0a, 0xb6, 0x03, 0x0b, 0x2b, 0x29, 0x00, 0x09, 0x50, 0x2b, 0x34, 0xff, 0xff, 0x00, 0x1d, + 0xff, 0xda, 0x01, 0xd8, 0x02, 0xb3, 0x02, 0x26, 0x00, 0x8f, 0x00, 0x00, 0x01, 0x06, 0x00, 0xd3, + 0x00, 0x00, 0x00, 0x11, 0xb2, 0x03, 0x02, 0x01, 0xb8, 0xff, 0xf5, 0xb4, 0x11, 0x04, 0x02, 0x00, + 0x50, 0x2b, 0x34, 0x34, 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x09, 0x00, 0x00, 0x01, 0xeb, + 0x03, 0x3d, 0x02, 0x26, 0x00, 0x24, 0x00, 0x00, 0x01, 0x07, 0x02, 0xa5, 0xff, 0xed, 0x00, 0x8b, + 0x00, 0x1a, 0xb1, 0x03, 0x02, 0xb8, 0xff, 0xf0, 0x40, 0x0d, 0x1e, 0x18, 0x04, 0x0b, 0x50, 0x03, + 0x07, 0x1d, 0x4f, 0x02, 0x07, 0x19, 0x4f, 0x2b, 0x2b, 0x2b, 0x34, 0x34, 0xff, 0xff, 0x00, 0x2c, + 0xff, 0xf5, 0x01, 0xb9, 0x02, 0xb2, 0x02, 0x26, 0x00, 0x44, 0x00, 0x00, 0x01, 0x06, 0x02, 0xa5, + 0xf7, 0x00, 0x00, 0x17, 0x40, 0x10, 0x03, 0x02, 0x01, 0x36, 0x30, 0x1c, 0x13, 0x50, 0x03, 0x0f, + 0x35, 0x4f, 0x02, 0x0f, 0x31, 0x4f, 0x2b, 0x2b, 0x2b, 0x34, 0x34, 0x00, 0xff, 0xff, 0x00, 0x09, + 0x00, 0x00, 0x01, 0xeb, 0x03, 0x2e, 0x02, 0x26, 0x00, 0x24, 0x00, 0x00, 0x01, 0x07, 0x02, 0xa4, + 0x00, 0x00, 0x00, 0x8b, 0x00, 0x10, 0x40, 0x0b, 0x02, 0x00, 0x25, 0x1b, 0x04, 0x0b, 0x50, 0x02, + 0x07, 0x1d, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0x00, 0xff, 0xff, 0x00, 0x2c, 0xff, 0xf5, 0x01, 0xb9, + 0x02, 0xa3, 0x02, 0x26, 0x00, 0x44, 0x00, 0x00, 0x01, 0x06, 0x02, 0xa4, 0x00, 0x00, 0x00, 0x10, + 0x40, 0x0b, 0x02, 0x07, 0x3d, 0x33, 0x1c, 0x13, 0x50, 0x02, 0x0f, 0x35, 0x4f, 0x2b, 0x2b, 0x34, + 0xff, 0xff, 0x00, 0x3c, 0x00, 0x00, 0x01, 0xcc, 0x03, 0x3d, 0x02, 0x26, 0x00, 0x28, 0x00, 0x00, + 0x01, 0x07, 0x02, 0xa5, 0xff, 0xed, 0x00, 0x8b, 0x00, 0x1a, 0xb1, 0x02, 0x01, 0xb8, 0xff, 0xe4, + 0x40, 0x0d, 0x13, 0x0d, 0x00, 0x0a, 0x50, 0x02, 0x01, 0x12, 0x4f, 0x01, 0x01, 0x0e, 0x4f, 0x2b, + 0x2b, 0x2b, 0x34, 0x34, 0xff, 0xff, 0x00, 0x1f, 0xff, 0xf5, 0x01, 0xd1, 0x02, 0xb2, 0x02, 0x26, + 0x00, 0x48, 0x00, 0x00, 0x01, 0x06, 0x02, 0xa5, 0xf7, 0x00, 0x00, 0x1a, 0xb1, 0x03, 0x02, 0xb8, + 0xff, 0xfc, 0x40, 0x0d, 0x2d, 0x27, 0x00, 0x07, 0x50, 0x03, 0x04, 0x2c, 0x4f, 0x02, 0x04, 0x28, + 0x4f, 0x2b, 0x2b, 0x2b, 0x34, 0x34, 0x00, 0x00, 0xff, 0xff, 0x00, 0x3f, 0x00, 0x00, 0x01, 0xcc, + 0x03, 0x2e, 0x02, 0x26, 0x00, 0x28, 0x00, 0x00, 0x01, 0x07, 0x02, 0xa4, 0x00, 0x09, 0x00, 0x8b, + 0x00, 0x13, 0xb9, 0x00, 0x01, 0xff, 0xfe, 0x40, 0x09, 0x1a, 0x10, 0x00, 0x0a, 0x50, 0x01, 0x01, + 0x12, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x1f, 0xff, 0xf5, 0x01, 0xd1, + 0x02, 0xa3, 0x02, 0x26, 0x00, 0x48, 0x00, 0x00, 0x01, 0x06, 0x02, 0xa4, 0x00, 0x00, 0x00, 0x10, + 0x40, 0x0b, 0x02, 0x02, 0x34, 0x2a, 0x00, 0x07, 0x50, 0x02, 0x04, 0x2c, 0x4f, 0x2b, 0x2b, 0x34, + 0xff, 0xff, 0x00, 0x36, 0x00, 0x00, 0x01, 0xbf, 0x03, 0x3d, 0x02, 0x26, 0x00, 0x2c, 0x00, 0x00, + 0x01, 0x07, 0x02, 0xa5, 0xff, 0xed, 0x00, 0x8b, 0x00, 0x1a, 0xb1, 0x02, 0x01, 0xb8, 0xff, 0xef, + 0x40, 0x0d, 0x13, 0x0d, 0x00, 0x06, 0x50, 0x02, 0x05, 0x12, 0x4f, 0x01, 0x05, 0x0e, 0x4f, 0x2b, + 0x2b, 0x2b, 0x34, 0x34, 0xff, 0xff, 0x00, 0x24, 0xff, 0xf5, 0x01, 0xd3, 0x02, 0xb2, 0x02, 0x26, + 0x01, 0x0c, 0x00, 0x00, 0x01, 0x06, 0x02, 0xa5, 0xd9, 0x00, 0x00, 0x1a, 0xb1, 0x02, 0x01, 0xb8, + 0xff, 0xda, 0x40, 0x0d, 0x1b, 0x15, 0x0a, 0x00, 0x50, 0x02, 0x0b, 0x1a, 0x4f, 0x01, 0x0b, 0x16, + 0x4f, 0x2b, 0x2b, 0x2b, 0x34, 0x34, 0x00, 0x00, 0xff, 0xff, 0x00, 0x36, 0x00, 0x00, 0x01, 0xbf, + 0x03, 0x2e, 0x02, 0x26, 0x00, 0x2c, 0x00, 0x00, 0x01, 0x07, 0x02, 0xa4, 0x00, 0x00, 0x00, 0x8b, + 0x00, 0x10, 0x40, 0x0b, 0x01, 0x00, 0x1a, 0x10, 0x00, 0x06, 0x50, 0x01, 0x05, 0x12, 0x4f, 0x2b, + 0x2b, 0x34, 0x00, 0x00, 0xff, 0xff, 0x00, 0x24, 0xff, 0xf5, 0x01, 0xd3, 0x02, 0xa3, 0x02, 0x26, + 0x01, 0x0c, 0x00, 0x00, 0x01, 0x06, 0x02, 0xa4, 0xdd, 0x00, 0x00, 0x13, 0xb9, 0x00, 0x01, 0xff, + 0xdc, 0x40, 0x09, 0x22, 0x18, 0x0a, 0x00, 0x50, 0x01, 0x0b, 0x1a, 0x4f, 0x2b, 0x2b, 0x34, 0x00, + 0xff, 0xff, 0x00, 0x1b, 0xff, 0xf3, 0x01, 0xd9, 0x03, 0x3d, 0x02, 0x26, 0x00, 0x32, 0x00, 0x00, + 0x01, 0x07, 0x02, 0xa5, 0xff, 0xef, 0x00, 0x8b, 0x00, 0x1a, 0xb1, 0x03, 0x02, 0xb8, 0xff, 0xf2, + 0x40, 0x0d, 0x27, 0x21, 0x14, 0x19, 0x50, 0x03, 0x16, 0x26, 0x4f, 0x02, 0x16, 0x22, 0x4f, 0x2b, + 0x2b, 0x2b, 0x34, 0x34, 0xff, 0xff, 0x00, 0x1d, 0xff, 0xf3, 0x01, 0xd8, 0x02, 0xb2, 0x02, 0x26, + 0x00, 0x52, 0x00, 0x00, 0x01, 0x06, 0x02, 0xa5, 0xef, 0x00, 0x00, 0x1a, 0xb1, 0x03, 0x02, 0xb8, + 0xff, 0xf1, 0x40, 0x0d, 0x27, 0x21, 0x09, 0x00, 0x50, 0x03, 0x0e, 0x26, 0x4f, 0x02, 0x0e, 0x22, + 0x4f, 0x2b, 0x2b, 0x2b, 0x34, 0x34, 0x00, 0x00, 0xff, 0xff, 0x00, 0x1b, 0xff, 0xf3, 0x01, 0xd9, + 0x03, 0x2e, 0x02, 0x26, 0x00, 0x32, 0x00, 0x00, 0x01, 0x07, 0x02, 0xa4, 0x00, 0x00, 0x00, 0x8b, + 0x00, 0x10, 0x40, 0x0b, 0x02, 0x00, 0x2e, 0x24, 0x14, 0x19, 0x50, 0x02, 0x16, 0x26, 0x4f, 0x2b, + 0x2b, 0x34, 0x00, 0x00, 0xff, 0xff, 0x00, 0x1d, 0xff, 0xf3, 0x01, 0xd8, 0x02, 0xa3, 0x02, 0x26, + 0x00, 0x52, 0x00, 0x00, 0x01, 0x06, 0x02, 0xa4, 0x00, 0x00, 0x00, 0x10, 0x40, 0x0b, 0x02, 0x00, + 0x2e, 0x24, 0x09, 0x00, 0x50, 0x02, 0x0e, 0x26, 0x4f, 0x2b, 0x2b, 0x34, 0xff, 0xff, 0x00, 0x2c, + 0x00, 0x00, 0x01, 0xe9, 0x03, 0x3d, 0x02, 0x26, 0x00, 0x35, 0x00, 0x00, 0x01, 0x07, 0x02, 0xa5, + 0xff, 0xdd, 0x00, 0x8b, 0x00, 0x1a, 0xb1, 0x03, 0x02, 0xb8, 0xff, 0xca, 0x40, 0x0d, 0x2c, 0x26, + 0x14, 0x0d, 0x50, 0x03, 0x00, 0x2b, 0x4f, 0x02, 0x00, 0x27, 0x4f, 0x2b, 0x2b, 0x2b, 0x34, 0x34, + 0xff, 0xff, 0x00, 0x4f, 0x00, 0x00, 0x01, 0xcb, 0x02, 0xb2, 0x02, 0x26, 0x00, 0x55, 0x00, 0x00, + 0x01, 0x06, 0x02, 0xa5, 0x00, 0x00, 0x00, 0x1a, 0xb1, 0x02, 0x01, 0xb8, 0xff, 0xeb, 0x40, 0x0d, + 0x1b, 0x15, 0x0a, 0x13, 0x50, 0x02, 0x0d, 0x1a, 0x4f, 0x01, 0x0d, 0x16, 0x4f, 0x2b, 0x2b, 0x2b, + 0x34, 0x34, 0x00, 0x00, 0xff, 0xff, 0x00, 0x36, 0x00, 0x00, 0x01, 0xe9, 0x03, 0x2e, 0x02, 0x26, + 0x00, 0x35, 0x00, 0x00, 0x01, 0x07, 0x02, 0xa4, 0xff, 0xef, 0x00, 0x8b, 0x00, 0x13, 0xb9, 0x00, + 0x02, 0xff, 0xda, 0x40, 0x09, 0x33, 0x29, 0x14, 0x0d, 0x50, 0x02, 0x00, 0x2b, 0x4f, 0x2b, 0x2b, + 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x59, 0x00, 0x00, 0x01, 0xcb, 0x02, 0xa3, 0x02, 0x26, + 0x00, 0x55, 0x00, 0x00, 0x01, 0x06, 0x02, 0xa4, 0x1b, 0x00, 0x00, 0x10, 0x40, 0x0b, 0x01, 0x03, + 0x22, 0x18, 0x0a, 0x13, 0x50, 0x01, 0x0d, 0x1a, 0x4f, 0x2b, 0x2b, 0x34, 0xff, 0xff, 0x00, 0x27, + 0xff, 0xf3, 0x01, 0xcd, 0x03, 0x3d, 0x02, 0x26, 0x00, 0x38, 0x00, 0x00, 0x01, 0x07, 0x02, 0xa5, + 0xff, 0xef, 0x00, 0x8b, 0x00, 0x1a, 0xb1, 0x02, 0x01, 0xb8, 0xff, 0xf2, 0x40, 0x0d, 0x21, 0x1b, + 0x04, 0x14, 0x50, 0x02, 0x06, 0x20, 0x4f, 0x01, 0x06, 0x1c, 0x4f, 0x2b, 0x2b, 0x2b, 0x34, 0x34, + 0xff, 0xff, 0x00, 0x3b, 0xff, 0xf5, 0x01, 0xb6, 0x02, 0xb2, 0x02, 0x26, 0x00, 0x58, 0x00, 0x00, + 0x01, 0x06, 0x02, 0xa5, 0xef, 0x00, 0x00, 0x1a, 0xb1, 0x02, 0x01, 0xb8, 0xff, 0xf3, 0x40, 0x0d, + 0x1a, 0x14, 0x07, 0x00, 0x50, 0x02, 0x09, 0x19, 0x4f, 0x01, 0x09, 0x15, 0x4f, 0x2b, 0x2b, 0x2b, + 0x34, 0x34, 0x00, 0x00, 0xff, 0xff, 0x00, 0x27, 0xff, 0xf3, 0x01, 0xcd, 0x03, 0x2e, 0x02, 0x26, + 0x00, 0x38, 0x00, 0x00, 0x01, 0x07, 0x02, 0xa4, 0x00, 0x00, 0x00, 0x8b, 0x00, 0x10, 0x40, 0x0b, + 0x01, 0x00, 0x28, 0x1e, 0x04, 0x14, 0x50, 0x01, 0x06, 0x20, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x3b, 0xff, 0xf5, 0x01, 0xb6, 0x02, 0xa3, 0x02, 0x26, 0x00, 0x58, 0x00, 0x00, + 0x01, 0x06, 0x02, 0xa4, 0x00, 0x00, 0x00, 0x10, 0x40, 0x0b, 0x01, 0x01, 0x21, 0x17, 0x07, 0x00, + 0x50, 0x01, 0x09, 0x19, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0x01, 0x00, 0x22, 0xff, 0x5a, 0x01, 0xd0, + 0x02, 0x79, 0x00, 0x30, 0x00, 0x57, 0xb9, 0x00, 0x23, 0xff, 0xc0, 0x40, 0x2e, 0x0b, 0x0c, 0x00, + 0x4c, 0x22, 0x40, 0x0d, 0x00, 0x4d, 0x0a, 0x22, 0x25, 0x10, 0x63, 0x1f, 0x05, 0x63, 0x40, 0x25, + 0x01, 0x25, 0x32, 0x2d, 0x17, 0x31, 0x0a, 0x65, 0x40, 0x09, 0x01, 0x09, 0x22, 0x09, 0x22, 0x2a, + 0x1a, 0x2e, 0x00, 0x67, 0x2a, 0x12, 0x16, 0x13, 0x67, 0x1a, 0x05, 0x00, 0x3f, 0xfd, 0xc6, 0x3f, + 0xfd, 0xc6, 0x11, 0x12, 0x39, 0x39, 0x3d, 0x2f, 0x18, 0x2f, 0x5d, 0xed, 0x01, 0x10, 0xc6, 0xc6, + 0x10, 0xd6, 0x5d, 0xed, 0xd4, 0xed, 0x10, 0xd5, 0xc5, 0x31, 0x30, 0x2b, 0x2b, 0x17, 0x32, 0x3e, + 0x02, 0x35, 0x34, 0x26, 0x23, 0x23, 0x35, 0x33, 0x32, 0x3e, 0x02, 0x35, 0x34, 0x26, 0x23, 0x22, + 0x06, 0x07, 0x27, 0x36, 0x36, 0x33, 0x32, 0x1e, 0x02, 0x15, 0x14, 0x06, 0x07, 0x16, 0x16, 0x15, + 0x14, 0x0e, 0x02, 0x23, 0x22, 0x26, 0x27, 0x37, 0x16, 0x16, 0x77, 0x30, 0x52, 0x3d, 0x22, 0x5a, + 0x4c, 0x3a, 0x2e, 0x20, 0x38, 0x29, 0x18, 0x42, 0x2e, 0x23, 0x45, 0x1b, 0x2a, 0x26, 0x54, 0x34, + 0x31, 0x54, 0x3e, 0x24, 0x2e, 0x2e, 0x3c, 0x39, 0x3b, 0x63, 0x82, 0x48, 0x0b, 0x25, 0x15, 0x09, + 0x11, 0x2f, 0x3b, 0x11, 0x24, 0x37, 0x27, 0x44, 0x39, 0x6b, 0x0b, 0x19, 0x28, 0x1d, 0x31, 0x34, + 0x0f, 0x0e, 0x61, 0x13, 0x14, 0x17, 0x32, 0x4c, 0x36, 0x2e, 0x50, 0x1c, 0x1c, 0x62, 0x38, 0x49, + 0x64, 0x3d, 0x1a, 0x01, 0x03, 0x6b, 0x02, 0x02, 0x00, 0x01, 0x00, 0x4b, 0xff, 0x5a, 0x01, 0xbd, + 0x01, 0xe2, 0x00, 0x26, 0x00, 0x53, 0xb5, 0x09, 0x40, 0x13, 0x00, 0x4d, 0x1c, 0xb8, 0xff, 0xc0, + 0xb3, 0x0d, 0x00, 0x4d, 0x1b, 0xb8, 0xff, 0xc0, 0x40, 0x1f, 0x0d, 0x00, 0x4d, 0x1b, 0x08, 0x1e, + 0x63, 0x05, 0x16, 0x63, 0x0b, 0x28, 0x24, 0x11, 0x27, 0x1b, 0x65, 0x1a, 0x08, 0x08, 0x1a, 0x00, + 0x11, 0x67, 0x10, 0x92, 0x23, 0x21, 0x67, 0x00, 0x0b, 0x00, 0x3f, 0xfd, 0xc6, 0x3f, 0xed, 0x12, + 0x39, 0x39, 0x3d, 0x2f, 0x18, 0x2f, 0xed, 0x01, 0x10, 0xd6, 0xc6, 0x10, 0xd6, 0xed, 0xd4, 0xed, + 0xd5, 0xc5, 0x31, 0x30, 0x00, 0x2b, 0x2b, 0x01, 0x2b, 0x13, 0x32, 0x1e, 0x02, 0x15, 0x14, 0x06, + 0x07, 0x16, 0x16, 0x15, 0x14, 0x0e, 0x02, 0x07, 0x27, 0x3e, 0x03, 0x35, 0x34, 0x26, 0x23, 0x23, + 0x35, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x07, 0x27, 0x36, 0x36, 0xd7, 0x2e, 0x4d, 0x39, + 0x20, 0x29, 0x30, 0x33, 0x38, 0x38, 0x62, 0x84, 0x4c, 0x08, 0x2d, 0x55, 0x44, 0x29, 0x46, 0x33, + 0x17, 0x43, 0x3e, 0x25, 0x26, 0x3f, 0x34, 0x1b, 0x16, 0x45, 0x01, 0xe2, 0x12, 0x27, 0x3c, 0x2a, + 0x23, 0x42, 0x1a, 0x12, 0x4c, 0x33, 0x3c, 0x52, 0x33, 0x17, 0x01, 0x67, 0x02, 0x0b, 0x19, 0x2c, + 0x22, 0x2c, 0x24, 0x63, 0x2b, 0x26, 0x1a, 0x27, 0x15, 0x64, 0x08, 0x11, 0xff, 0xff, 0x00, 0x2d, + 0x00, 0x00, 0x01, 0xc7, 0x03, 0x3e, 0x02, 0x26, 0x00, 0x2b, 0x00, 0x00, 0x01, 0x07, 0x01, 0x5f, + 0x00, 0x00, 0x00, 0x8b, 0x00, 0x10, 0x40, 0x0b, 0x01, 0x01, 0x0c, 0x10, 0x06, 0x00, 0x50, 0x01, + 0x00, 0x11, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0x00, 0x00, 0x02, 0x00, 0x37, 0x00, 0x00, 0x01, 0xb9, + 0x03, 0x3d, 0x00, 0x15, 0x00, 0x1b, 0x00, 0x48, 0x40, 0x2b, 0xa0, 0x0e, 0xb0, 0x0e, 0x02, 0x0e, + 0x51, 0x80, 0x0b, 0x01, 0x0b, 0x1d, 0x1b, 0x17, 0x1c, 0x14, 0x03, 0x51, 0x20, 0x01, 0x30, 0x01, + 0x02, 0x01, 0x1c, 0x1a, 0x86, 0x16, 0x19, 0x18, 0x86, 0x15, 0x06, 0x0d, 0x06, 0x11, 0x57, 0x06, + 0x0b, 0x02, 0x03, 0x01, 0x02, 0x00, 0x3f, 0x3f, 0x3f, 0xed, 0x3f, 0x3f, 0x3f, 0xd5, 0xcd, 0x3f, + 0x01, 0x10, 0xd6, 0x5d, 0xfd, 0xc0, 0x10, 0xd6, 0xc5, 0x10, 0xd6, 0x5d, 0xed, 0x5d, 0x31, 0x30, + 0x33, 0x11, 0x37, 0x15, 0x36, 0x36, 0x33, 0x32, 0x1e, 0x02, 0x15, 0x11, 0x23, 0x35, 0x34, 0x26, + 0x23, 0x22, 0x06, 0x07, 0x11, 0x13, 0x27, 0x37, 0x17, 0x37, 0x17, 0x3f, 0x7b, 0x0f, 0x2a, 0x10, + 0x34, 0x46, 0x2a, 0x12, 0x7b, 0x1e, 0x2a, 0x11, 0x21, 0x0a, 0x01, 0x84, 0x26, 0x5e, 0x5c, 0x26, + 0x02, 0x65, 0x15, 0xa8, 0x05, 0x09, 0x1f, 0x39, 0x4f, 0x30, 0xfe, 0xf7, 0xf9, 0x42, 0x3a, 0x08, + 0x03, 0xfe, 0x96, 0x02, 0xa5, 0x60, 0x38, 0x36, 0x36, 0x38, 0x00, 0x00, 0x00, 0x01, 0x00, 0x2d, + 0xff, 0x5b, 0x01, 0xc7, 0x02, 0x79, 0x00, 0x14, 0x00, 0x2c, 0x40, 0x1a, 0x0b, 0x51, 0x00, 0x08, + 0x10, 0x08, 0x02, 0x08, 0x16, 0x12, 0x51, 0x20, 0x14, 0x30, 0x14, 0x02, 0x14, 0x15, 0x13, 0x08, + 0x09, 0x92, 0x10, 0x57, 0x03, 0x03, 0x00, 0x3f, 0xed, 0x3f, 0x3f, 0x01, 0x10, 0xd6, 0x5d, 0xed, + 0x10, 0xd6, 0x5d, 0xed, 0x31, 0x30, 0x13, 0x36, 0x36, 0x33, 0x32, 0x1e, 0x02, 0x15, 0x11, 0x23, + 0x11, 0x34, 0x2e, 0x02, 0x23, 0x22, 0x07, 0x11, 0x23, 0x2d, 0x25, 0x69, 0x3e, 0x3d, 0x50, 0x2f, + 0x12, 0x7b, 0x07, 0x14, 0x24, 0x1c, 0x21, 0x28, 0x7b, 0x02, 0x5d, 0x0b, 0x11, 0x23, 0x3c, 0x53, + 0x30, 0xfd, 0xc4, 0x02, 0x37, 0x21, 0x2f, 0x1e, 0x0e, 0x06, 0xfd, 0xf8, 0x00, 0x03, 0x00, 0x11, + 0xff, 0x5b, 0x02, 0x08, 0x02, 0xb6, 0x00, 0x21, 0x00, 0x32, 0x00, 0x3e, 0x00, 0x52, 0x40, 0x2f, + 0x33, 0x39, 0x7c, 0x07, 0x40, 0x1f, 0x2f, 0x52, 0x00, 0x40, 0x30, 0x27, 0x01, 0x27, 0x64, 0x19, + 0x3f, 0x0f, 0x11, 0x3f, 0x21, 0x10, 0x20, 0x98, 0x30, 0x22, 0x01, 0x22, 0x57, 0x1c, 0x0b, 0x3f, + 0x2c, 0x01, 0x2c, 0x57, 0x12, 0x14, 0x09, 0x02, 0x7d, 0x3c, 0x36, 0x7d, 0x10, 0x0c, 0x92, 0x00, + 0x3f, 0xc4, 0xfd, 0xd6, 0xed, 0x3f, 0xc5, 0xed, 0x5d, 0x3f, 0xed, 0x5d, 0x3f, 0x3f, 0x01, 0x10, + 0xd6, 0xc5, 0x10, 0xd6, 0xed, 0x5d, 0x10, 0xd5, 0xfd, 0xc0, 0x10, 0xd5, 0xfd, 0xc6, 0x31, 0x30, + 0x25, 0x36, 0x33, 0x32, 0x1e, 0x02, 0x15, 0x14, 0x0e, 0x02, 0x23, 0x22, 0x26, 0x27, 0x07, 0x27, + 0x37, 0x06, 0x23, 0x22, 0x2e, 0x02, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x17, 0x35, 0x37, 0x03, + 0x22, 0x0e, 0x02, 0x15, 0x14, 0x1e, 0x02, 0x33, 0x32, 0x36, 0x37, 0x11, 0x26, 0x26, 0x13, 0x14, + 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x07, 0x01, 0x70, 0x16, 0x10, 0x1d, 0x2b, + 0x1c, 0x0e, 0x14, 0x21, 0x2b, 0x16, 0x27, 0x3e, 0x0d, 0x53, 0x3b, 0x64, 0x27, 0x1e, 0x27, 0x3b, + 0x29, 0x15, 0x50, 0x4d, 0x14, 0x2f, 0x16, 0x69, 0xad, 0x12, 0x1b, 0x13, 0x09, 0x07, 0x15, 0x26, + 0x1f, 0x09, 0x16, 0x0d, 0x12, 0x24, 0x9f, 0x17, 0x0e, 0x13, 0x11, 0x11, 0x13, 0x0d, 0x18, 0x76, + 0x05, 0x18, 0x27, 0x32, 0x1a, 0x25, 0x38, 0x25, 0x13, 0x2f, 0x33, 0x59, 0x38, 0x6f, 0x0e, 0x23, + 0x3f, 0x56, 0x33, 0x73, 0x85, 0x0a, 0x0b, 0xd8, 0x13, 0xfe, 0xc5, 0x18, 0x28, 0x33, 0x1b, 0x21, + 0x37, 0x27, 0x15, 0x01, 0x03, 0x01, 0x0b, 0x08, 0x0b, 0xfe, 0x72, 0x23, 0x1c, 0x22, 0x1e, 0x1c, + 0x22, 0x0d, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1b, 0xff, 0xf3, 0x01, 0xd9, 0x02, 0x6b, 0x00, 0x2d, + 0x00, 0x41, 0x00, 0x5a, 0xb9, 0x00, 0x20, 0xff, 0xc0, 0x40, 0x35, 0x0f, 0x00, 0x4d, 0x38, 0x53, + 0x60, 0x2b, 0x01, 0x2b, 0x43, 0x2f, 0x1a, 0x3f, 0x1a, 0x02, 0x1a, 0x53, 0x60, 0x23, 0x01, 0x23, + 0x28, 0x43, 0x20, 0x14, 0x30, 0x14, 0x02, 0x14, 0x53, 0x0b, 0x42, 0x2e, 0x53, 0x03, 0x06, 0x42, + 0x1f, 0x02, 0x0f, 0x02, 0x2f, 0x17, 0x3f, 0x17, 0x02, 0x17, 0x4a, 0x3d, 0x33, 0x4a, 0x00, 0x09, + 0x00, 0x3f, 0xfd, 0xd6, 0xed, 0x5d, 0x3f, 0x3f, 0x01, 0x10, 0xc4, 0xd6, 0xed, 0x10, 0xd4, 0xed, + 0x5d, 0x10, 0xc4, 0xd4, 0x5d, 0xed, 0x5d, 0x10, 0xd6, 0x5d, 0xed, 0x31, 0x30, 0x2b, 0x17, 0x22, + 0x26, 0x35, 0x34, 0x36, 0x37, 0x2e, 0x03, 0x35, 0x34, 0x36, 0x37, 0x33, 0x0e, 0x03, 0x15, 0x14, + 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x2e, 0x02, 0x27, 0x33, 0x16, 0x16, 0x15, 0x14, 0x0e, 0x02, + 0x07, 0x16, 0x16, 0x15, 0x14, 0x06, 0x27, 0x14, 0x1e, 0x02, 0x33, 0x32, 0x3e, 0x02, 0x35, 0x34, + 0x2e, 0x02, 0x23, 0x22, 0x0e, 0x02, 0xfa, 0x68, 0x77, 0x3b, 0x2f, 0x16, 0x1a, 0x0e, 0x04, 0x07, + 0x0b, 0x75, 0x05, 0x05, 0x03, 0x01, 0x1d, 0x21, 0x21, 0x1d, 0x01, 0x03, 0x06, 0x04, 0x75, 0x09, + 0x09, 0x04, 0x0e, 0x1a, 0x16, 0x2f, 0x3b, 0x77, 0xca, 0x11, 0x1b, 0x24, 0x12, 0x12, 0x24, 0x1b, + 0x11, 0x11, 0x1b, 0x24, 0x12, 0x12, 0x24, 0x1b, 0x11, 0x0d, 0x63, 0x5d, 0x40, 0x4c, 0x18, 0x0d, + 0x21, 0x25, 0x25, 0x11, 0x29, 0x3d, 0x25, 0x16, 0x21, 0x1e, 0x1c, 0x12, 0x2c, 0x38, 0x38, 0x2c, + 0x12, 0x1c, 0x1e, 0x21, 0x16, 0x25, 0x3d, 0x29, 0x11, 0x25, 0x25, 0x21, 0x0d, 0x18, 0x4c, 0x40, + 0x5d, 0x63, 0xc9, 0x17, 0x23, 0x18, 0x0c, 0x0c, 0x18, 0x23, 0x17, 0x18, 0x23, 0x17, 0x0c, 0x0c, + 0x18, 0x23, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1b, 0xff, 0xf3, 0x01, 0xd8, 0x02, 0xb5, 0x00, 0x28, + 0x00, 0x34, 0x00, 0x7d, 0xb9, 0x00, 0x1d, 0xff, 0xc0, 0xb3, 0x0d, 0x00, 0x4d, 0x1d, 0xb8, 0xff, + 0xe0, 0x40, 0x4d, 0x0c, 0x00, 0x4d, 0x0d, 0x40, 0x0c, 0x00, 0x4d, 0x0d, 0x20, 0x0b, 0x00, 0x4d, + 0x2c, 0x46, 0x00, 0x10, 0x40, 0x10, 0x60, 0x10, 0x80, 0x10, 0x04, 0x10, 0x36, 0x2f, 0x03, 0x3f, + 0x03, 0x4f, 0x03, 0x03, 0x03, 0x46, 0x40, 0x0a, 0x60, 0x0a, 0x80, 0x0a, 0x03, 0x0a, 0x0d, 0x36, + 0x20, 0x26, 0x30, 0x26, 0x40, 0x26, 0x03, 0x26, 0x46, 0x20, 0x35, 0x32, 0x46, 0x1a, 0x1d, 0x35, + 0x23, 0x10, 0x2f, 0x00, 0x3f, 0x00, 0x02, 0x00, 0x4a, 0x2f, 0x29, 0x4a, 0x15, 0x09, 0x06, 0x10, + 0x00, 0x3f, 0x3f, 0xfd, 0xd6, 0xed, 0x5d, 0x3f, 0x01, 0x10, 0xc4, 0xd6, 0xed, 0x10, 0xd6, 0xed, + 0x5d, 0x10, 0xc4, 0xd6, 0x5d, 0xed, 0x5d, 0x10, 0xd6, 0x5d, 0xed, 0x31, 0x30, 0x2b, 0x2b, 0x2b, + 0x2b, 0x13, 0x32, 0x36, 0x35, 0x34, 0x26, 0x27, 0x33, 0x16, 0x16, 0x15, 0x14, 0x06, 0x07, 0x16, + 0x16, 0x15, 0x14, 0x0e, 0x02, 0x23, 0x22, 0x2e, 0x02, 0x35, 0x34, 0x36, 0x37, 0x26, 0x26, 0x35, + 0x34, 0x37, 0x33, 0x06, 0x06, 0x15, 0x14, 0x16, 0x13, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, + 0x06, 0x15, 0x14, 0x16, 0xf9, 0x1f, 0x22, 0x03, 0x06, 0x7d, 0x07, 0x08, 0x23, 0x2e, 0x38, 0x34, + 0x20, 0x3a, 0x52, 0x33, 0x33, 0x52, 0x3a, 0x1f, 0x33, 0x38, 0x2e, 0x22, 0x0f, 0x7d, 0x06, 0x04, + 0x22, 0x1f, 0x2d, 0x33, 0x38, 0x28, 0x28, 0x37, 0x32, 0x01, 0xb5, 0x36, 0x36, 0x1a, 0x50, 0x2a, + 0x23, 0x49, 0x26, 0x39, 0x48, 0x19, 0x1b, 0x68, 0x39, 0x31, 0x51, 0x39, 0x1f, 0x21, 0x3a, 0x50, + 0x2f, 0x39, 0x68, 0x1b, 0x19, 0x48, 0x39, 0x4b, 0x47, 0x2a, 0x50, 0x1a, 0x36, 0x36, 0xfe, 0xa9, + 0x3f, 0x36, 0x39, 0x3f, 0x3f, 0x39, 0x36, 0x3f, 0x00, 0x01, 0x00, 0x2e, 0xff, 0x59, 0x01, 0xc6, + 0x02, 0x6b, 0x00, 0x20, 0x00, 0x5c, 0xb9, 0x00, 0x19, 0xff, 0xe0, 0xb3, 0x15, 0x00, 0x4d, 0x19, + 0xb8, 0xff, 0xe0, 0x40, 0x2f, 0x11, 0x12, 0x00, 0x4c, 0x0f, 0x16, 0x00, 0x07, 0x10, 0x07, 0x02, + 0x07, 0x22, 0x00, 0x1e, 0x10, 0x1e, 0x02, 0x18, 0x1e, 0x05, 0x1d, 0x00, 0x00, 0x1d, 0x05, 0x1e, + 0x18, 0x05, 0x22, 0x17, 0x21, 0x20, 0x02, 0x1e, 0x48, 0x1f, 0x02, 0x05, 0x48, 0x17, 0x08, 0x13, + 0xa5, 0x0f, 0x0c, 0x92, 0x00, 0x3f, 0xc5, 0xed, 0x3f, 0xed, 0x3f, 0xed, 0x3f, 0x01, 0x10, 0xc6, + 0x12, 0x17, 0x39, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x5d, 0x10, 0xd6, 0x5d, 0xd5, 0xcc, 0x31, 0x30, + 0x2b, 0x2b, 0x01, 0x0e, 0x03, 0x07, 0x21, 0x15, 0x14, 0x0e, 0x02, 0x23, 0x22, 0x26, 0x27, 0x37, + 0x16, 0x16, 0x33, 0x32, 0x35, 0x35, 0x21, 0x35, 0x3e, 0x03, 0x37, 0x23, 0x35, 0x21, 0x01, 0xbd, + 0x2b, 0x48, 0x3e, 0x37, 0x19, 0x01, 0x0a, 0x0e, 0x23, 0x3b, 0x2c, 0x0d, 0x2b, 0x16, 0x12, 0x0e, + 0x1a, 0x12, 0x33, 0xfe, 0xcf, 0x16, 0x32, 0x3e, 0x49, 0x2c, 0xee, 0x01, 0x82, 0x02, 0x15, 0x42, + 0x74, 0x69, 0x61, 0x2f, 0x57, 0x2f, 0x44, 0x2d, 0x16, 0x04, 0x08, 0x56, 0x05, 0x02, 0x3a, 0x12, + 0x47, 0x2b, 0x5f, 0x6c, 0x7e, 0x4a, 0x66, 0x00, 0x00, 0x01, 0x00, 0x43, 0xff, 0x5b, 0x01, 0xb4, + 0x01, 0xd6, 0x00, 0x1e, 0x00, 0x4e, 0xb9, 0x00, 0x17, 0xff, 0xe0, 0xb3, 0x10, 0x00, 0x4d, 0x17, + 0xb8, 0xff, 0xc0, 0x40, 0x22, 0x0d, 0x00, 0x4d, 0x0c, 0x13, 0x07, 0x20, 0x05, 0x1b, 0x05, 0x1b, + 0x1f, 0x00, 0x20, 0x1c, 0x16, 0x1f, 0x1e, 0x0a, 0x1b, 0x55, 0x1d, 0x0a, 0x15, 0x06, 0x05, 0x55, + 0x14, 0x06, 0x10, 0xa5, 0x0c, 0x09, 0x92, 0x00, 0x3f, 0xc5, 0xed, 0x3f, 0xed, 0x3f, 0x3f, 0xed, + 0x3f, 0x01, 0x10, 0xc6, 0xc6, 0x10, 0xc6, 0x12, 0x39, 0x39, 0x2f, 0x2f, 0x10, 0xd6, 0xd5, 0xcc, + 0x31, 0x30, 0x2b, 0x2b, 0x01, 0x0e, 0x03, 0x07, 0x33, 0x15, 0x14, 0x23, 0x22, 0x26, 0x27, 0x37, + 0x16, 0x16, 0x33, 0x32, 0x36, 0x35, 0x35, 0x21, 0x35, 0x3e, 0x03, 0x37, 0x23, 0x35, 0x21, 0x01, + 0xaa, 0x0e, 0x34, 0x3d, 0x3d, 0x18, 0xde, 0x8e, 0x0b, 0x2f, 0x15, 0x11, 0x0d, 0x15, 0x10, 0x17, + 0x1d, 0xfe, 0xf5, 0x17, 0x36, 0x36, 0x34, 0x15, 0xc2, 0x01, 0x5d, 0x01, 0x7c, 0x10, 0x3f, 0x4e, + 0x55, 0x24, 0x7a, 0x91, 0x04, 0x07, 0x57, 0x05, 0x02, 0x14, 0x18, 0x1e, 0x4b, 0x26, 0x50, 0x4d, + 0x46, 0x1c, 0x66, 0x00, 0xff, 0xff, 0x00, 0x09, 0x00, 0x00, 0x01, 0xeb, 0x03, 0x2e, 0x02, 0x26, + 0x00, 0x24, 0x00, 0x00, 0x01, 0x07, 0x01, 0x62, 0x00, 0x00, 0x00, 0x8b, 0x00, 0x10, 0x40, 0x0b, + 0x02, 0x00, 0x19, 0x1f, 0x04, 0x0b, 0x50, 0x02, 0x07, 0x17, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x2c, 0xff, 0xf5, 0x01, 0xb9, 0x02, 0xa3, 0x02, 0x26, 0x00, 0x44, 0x00, 0x00, + 0x01, 0x06, 0x01, 0x62, 0x00, 0x00, 0x00, 0x10, 0x40, 0x0b, 0x02, 0x07, 0x31, 0x37, 0x1c, 0x13, + 0x50, 0x02, 0x0f, 0x2f, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0x01, 0x00, 0x3f, 0xff, 0x56, 0x01, 0xcc, + 0x02, 0x6b, 0x00, 0x24, 0x00, 0x69, 0x40, 0x43, 0x1a, 0x40, 0x09, 0x0b, 0x00, 0x4c, 0x4f, 0x1e, + 0x5f, 0x1e, 0x02, 0x1e, 0x00, 0x22, 0x10, 0x22, 0x02, 0x22, 0x3f, 0x1a, 0x01, 0x00, 0x1a, 0x10, + 0x1a, 0x02, 0x1a, 0x26, 0x1b, 0x1c, 0x1f, 0x44, 0x00, 0x17, 0x10, 0x17, 0x02, 0x17, 0x25, 0x03, + 0x10, 0x10, 0x0a, 0x01, 0x0a, 0x25, 0x22, 0x08, 0x1d, 0x48, 0x40, 0x1e, 0x01, 0x1e, 0x1e, 0x17, + 0x1a, 0x48, 0x19, 0x02, 0x20, 0x48, 0x17, 0x08, 0x0e, 0x08, 0x92, 0x00, 0x3f, 0xc5, 0x3f, 0xed, + 0x3f, 0xed, 0x12, 0x39, 0x2f, 0x5d, 0xed, 0x3f, 0x01, 0x10, 0xd6, 0x5d, 0xdc, 0xc5, 0x10, 0xd6, + 0x5d, 0xfd, 0xd0, 0xc0, 0x10, 0xc6, 0x5d, 0x5d, 0xd6, 0x5d, 0xc4, 0x5d, 0x31, 0x30, 0x2b, 0x05, + 0x16, 0x16, 0x15, 0x14, 0x0e, 0x02, 0x23, 0x22, 0x27, 0x37, 0x16, 0x16, 0x33, 0x32, 0x35, 0x34, + 0x27, 0x27, 0x36, 0x36, 0x37, 0x23, 0x11, 0x21, 0x15, 0x23, 0x15, 0x33, 0x15, 0x23, 0x15, 0x21, + 0x15, 0x23, 0x06, 0x01, 0x2b, 0x21, 0x1a, 0x15, 0x21, 0x2c, 0x16, 0x2d, 0x23, 0x0d, 0x06, 0x22, + 0x10, 0x29, 0x24, 0x14, 0x03, 0x09, 0x05, 0xa6, 0x01, 0x77, 0xfc, 0xdb, 0xdb, 0x01, 0x12, 0x97, + 0x05, 0x18, 0x0a, 0x27, 0x12, 0x17, 0x1e, 0x12, 0x08, 0x0b, 0x3f, 0x02, 0x07, 0x19, 0x13, 0x0c, + 0x06, 0x0b, 0x17, 0x09, 0x02, 0x6b, 0x66, 0x8b, 0x66, 0xae, 0x66, 0x08, 0x00, 0x02, 0x00, 0x1f, + 0xff, 0x56, 0x01, 0xd1, 0x01, 0xe2, 0x00, 0x2f, 0x00, 0x3a, 0x00, 0x4f, 0x40, 0x2d, 0x30, 0x53, + 0x20, 0x24, 0x40, 0x24, 0x02, 0x24, 0x2c, 0x3c, 0x25, 0x3a, 0x53, 0x70, 0x19, 0x01, 0x19, 0x3b, + 0x03, 0x10, 0x0a, 0x3b, 0x2f, 0x07, 0x3a, 0x73, 0x25, 0x25, 0x16, 0x35, 0x57, 0x1e, 0x0b, 0x2b, + 0x40, 0x28, 0x01, 0x28, 0x57, 0x16, 0x07, 0x0e, 0x0a, 0x08, 0x92, 0x00, 0x3f, 0xc5, 0xc5, 0x3f, + 0xfd, 0x5d, 0xc6, 0x3f, 0xed, 0x12, 0x39, 0x2f, 0xed, 0x3f, 0x01, 0x10, 0xd6, 0xdc, 0xc5, 0x10, + 0xd6, 0x5d, 0xfd, 0xc0, 0x10, 0xc6, 0xd6, 0x5d, 0xed, 0x31, 0x30, 0x05, 0x16, 0x16, 0x15, 0x14, + 0x0e, 0x02, 0x23, 0x22, 0x27, 0x37, 0x16, 0x16, 0x33, 0x32, 0x35, 0x34, 0x27, 0x27, 0x36, 0x36, + 0x37, 0x26, 0x26, 0x35, 0x34, 0x3e, 0x02, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x07, 0x21, 0x14, + 0x16, 0x33, 0x32, 0x36, 0x37, 0x17, 0x06, 0x06, 0x07, 0x13, 0x34, 0x2e, 0x02, 0x23, 0x22, 0x0e, + 0x02, 0x07, 0x01, 0x2c, 0x21, 0x1a, 0x15, 0x21, 0x2c, 0x16, 0x2d, 0x23, 0x0d, 0x06, 0x22, 0x10, + 0x29, 0x24, 0x14, 0x03, 0x07, 0x05, 0x5d, 0x68, 0x26, 0x3e, 0x50, 0x2a, 0x68, 0x6c, 0x01, 0x01, + 0xfe, 0xcf, 0x4c, 0x3c, 0x25, 0x43, 0x17, 0x11, 0x1d, 0x42, 0x26, 0x29, 0x0a, 0x16, 0x22, 0x19, + 0x18, 0x23, 0x17, 0x0d, 0x02, 0x18, 0x0a, 0x27, 0x12, 0x17, 0x1e, 0x12, 0x08, 0x0b, 0x3f, 0x02, + 0x07, 0x19, 0x13, 0x0c, 0x06, 0x0a, 0x14, 0x08, 0x0e, 0x77, 0x67, 0x3e, 0x5e, 0x3f, 0x20, 0x7b, + 0x76, 0x0c, 0x1a, 0x08, 0x2e, 0x35, 0x10, 0x08, 0x69, 0x0b, 0x0d, 0x02, 0x01, 0x23, 0x13, 0x23, + 0x1c, 0x11, 0x10, 0x1c, 0x24, 0x13, 0x00, 0x00, 0x00, 0x05, 0x00, 0x1b, 0xff, 0xf3, 0x01, 0xd9, + 0x03, 0x3e, 0x00, 0x13, 0x00, 0x1f, 0x00, 0x2b, 0x00, 0x37, 0x00, 0x3b, 0x01, 0x24, 0xb9, 0x00, + 0x37, 0xff, 0xe0, 0xb3, 0x1b, 0x00, 0x4d, 0x37, 0xb8, 0xff, 0xe0, 0x40, 0x1b, 0x16, 0x19, 0x00, + 0x4c, 0x33, 0x20, 0x1b, 0x00, 0x4d, 0x33, 0x20, 0x16, 0x19, 0x00, 0x4c, 0x31, 0x20, 0x1b, 0x00, + 0x4d, 0x31, 0x20, 0x16, 0x19, 0x00, 0x4c, 0x2d, 0xb8, 0xff, 0xe0, 0xb3, 0x1b, 0x00, 0x4d, 0x2d, + 0xb8, 0xff, 0xe0, 0xb4, 0x16, 0x19, 0x00, 0x4c, 0x2b, 0xb8, 0xff, 0xe0, 0xb3, 0x1b, 0x00, 0x4d, + 0x2b, 0xb8, 0xff, 0xe0, 0x40, 0x1b, 0x16, 0x19, 0x00, 0x4c, 0x27, 0x20, 0x1b, 0x00, 0x4d, 0x27, + 0x20, 0x16, 0x19, 0x00, 0x4c, 0x25, 0x20, 0x1b, 0x00, 0x4d, 0x25, 0x20, 0x16, 0x19, 0x00, 0x4c, + 0x21, 0xb8, 0xff, 0xe0, 0xb3, 0x1b, 0x00, 0x4d, 0x21, 0xb8, 0xff, 0xe0, 0xb3, 0x19, 0x00, 0x4d, + 0x21, 0xb8, 0xff, 0xe8, 0xb3, 0x18, 0x00, 0x4d, 0x21, 0xb8, 0xff, 0xe0, 0x40, 0x67, 0x16, 0x17, + 0x00, 0x4c, 0x32, 0xb3, 0x5f, 0x2c, 0x6f, 0x2c, 0x7f, 0x2c, 0xef, 0x2c, 0xff, 0x2c, 0x05, 0x40, + 0x2c, 0x01, 0x2c, 0x3d, 0x0a, 0x46, 0x00, 0x1a, 0x60, 0x1a, 0x80, 0x1a, 0x03, 0x1a, 0x3d, 0x6f, + 0x3a, 0x01, 0x3a, 0x38, 0x3c, 0xf5, 0x20, 0x01, 0x20, 0xb3, 0x50, 0x26, 0x60, 0x26, 0x02, 0x4f, + 0x26, 0x01, 0x26, 0x3c, 0x00, 0x46, 0x14, 0x3c, 0xdf, 0x3a, 0x01, 0x3a, 0x99, 0x39, 0x86, 0x35, + 0xb2, 0xa0, 0x2f, 0x01, 0x9f, 0x2f, 0xbf, 0x2f, 0x02, 0x00, 0x2f, 0x01, 0x2f, 0x02, 0x29, 0xb2, + 0xa0, 0x23, 0x01, 0x9f, 0x23, 0xbf, 0x23, 0x02, 0x00, 0x23, 0x01, 0x23, 0x02, 0x05, 0x4a, 0x1d, + 0x09, 0x0f, 0x4a, 0x17, 0xb4, 0x00, 0x3f, 0xed, 0x3f, 0xed, 0x3f, 0x5d, 0x5d, 0x72, 0xed, 0x3f, + 0x5d, 0x5d, 0x72, 0xed, 0x3f, 0xed, 0x5d, 0x01, 0x10, 0xd6, 0xed, 0x10, 0xd4, 0x5d, 0x5d, 0xed, + 0x5d, 0x10, 0xd4, 0xc5, 0x5d, 0x10, 0xd6, 0x5d, 0xed, 0x10, 0xd4, 0x5d, 0x5d, 0xed, 0x31, 0x30, + 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, + 0x2b, 0x2b, 0x13, 0x14, 0x1e, 0x02, 0x33, 0x32, 0x3e, 0x02, 0x35, 0x34, 0x2e, 0x02, 0x23, 0x22, + 0x0e, 0x02, 0x07, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x13, 0x14, + 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x17, 0x14, 0x06, 0x23, 0x22, 0x26, + 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x25, 0x33, 0x15, 0x23, 0x98, 0x07, 0x15, 0x26, 0x20, 0x1f, + 0x27, 0x15, 0x07, 0x07, 0x15, 0x26, 0x20, 0x20, 0x26, 0x15, 0x07, 0x7d, 0x76, 0x69, 0x6d, 0x72, + 0x74, 0x6a, 0x6d, 0x73, 0xc4, 0x22, 0x17, 0x18, 0x21, 0x21, 0x18, 0x17, 0x22, 0xa8, 0x22, 0x17, + 0x17, 0x22, 0x22, 0x17, 0x17, 0x22, 0xfe, 0xfe, 0xe8, 0xe8, 0x01, 0x22, 0x29, 0x48, 0x35, 0x1e, + 0x1f, 0x35, 0x47, 0x29, 0x29, 0x48, 0x35, 0x1e, 0x1f, 0x35, 0x47, 0x29, 0x98, 0x97, 0x97, 0x98, + 0x98, 0x97, 0x97, 0x02, 0x1c, 0x1a, 0x1f, 0x1f, 0x1a, 0x1a, 0x1e, 0x1e, 0x1a, 0x1a, 0x1f, 0x1f, + 0x1a, 0x1a, 0x1e, 0x1e, 0x7e, 0x47, 0x00, 0x00, 0xff, 0xff, 0x00, 0x1d, 0xff, 0xf3, 0x01, 0xd8, + 0x02, 0xdc, 0x02, 0x26, 0x00, 0x52, 0x00, 0x00, 0x01, 0x06, 0x02, 0xa7, 0x00, 0x00, 0x00, 0x1e, + 0x40, 0x15, 0x04, 0x03, 0x02, 0x00, 0x25, 0x2c, 0x09, 0x00, 0x50, 0x04, 0x0e, 0x3a, 0x4f, 0x03, + 0x0e, 0x2e, 0x4f, 0x02, 0x0e, 0x22, 0x4f, 0x2b, 0x2b, 0x2b, 0x2b, 0x34, 0x34, 0x34, 0x00, 0x00, + 0x00, 0x04, 0x00, 0x1b, 0xff, 0xf3, 0x01, 0xd9, 0x03, 0x3e, 0x00, 0x13, 0x00, 0x1f, 0x00, 0x3b, + 0x00, 0x3f, 0x00, 0xa7, 0xb5, 0x38, 0x60, 0x0d, 0x00, 0x4d, 0x31, 0xb8, 0xff, 0xc0, 0xb3, 0x0d, + 0x00, 0x4d, 0x2e, 0xb8, 0xff, 0xe0, 0x40, 0x26, 0x14, 0x00, 0x4d, 0x2a, 0x20, 0x0f, 0x14, 0x00, + 0x4c, 0x2a, 0x40, 0x0e, 0x00, 0x4d, 0x29, 0x20, 0x14, 0x00, 0x4d, 0x29, 0x40, 0x0f, 0x00, 0x4d, + 0x28, 0x20, 0x15, 0x16, 0x00, 0x4c, 0x0a, 0x46, 0x00, 0x1a, 0x40, 0x1a, 0x02, 0x1a, 0xb8, 0xff, + 0xc0, 0x40, 0x3a, 0x0f, 0x12, 0x48, 0x1a, 0x41, 0x3e, 0x3c, 0x40, 0x20, 0x2e, 0x40, 0x00, 0x46, + 0x14, 0x40, 0x2f, 0x3e, 0x01, 0x3e, 0x40, 0x16, 0x19, 0x48, 0x3e, 0x99, 0x0f, 0x3d, 0x01, 0x3d, + 0x86, 0x38, 0x33, 0x2e, 0x0f, 0x2d, 0x01, 0xbf, 0x2d, 0x01, 0x2d, 0x03, 0x3b, 0x0f, 0x25, 0x01, + 0xbf, 0x25, 0x01, 0x25, 0x03, 0x05, 0x4a, 0x1d, 0x09, 0x0f, 0x4a, 0x17, 0xb4, 0x00, 0x3f, 0xed, + 0x3f, 0xed, 0x3f, 0x5d, 0x71, 0xc5, 0x3f, 0x5d, 0x71, 0xc5, 0xd5, 0xcc, 0x3f, 0x5d, 0xed, 0x2b, + 0x71, 0x01, 0x10, 0xd6, 0xed, 0x10, 0xd4, 0xc5, 0x10, 0xd4, 0xc5, 0x10, 0xd6, 0x2b, 0x5d, 0xed, + 0x31, 0x30, 0x00, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x13, 0x14, 0x1e, 0x02, 0x33, + 0x32, 0x3e, 0x02, 0x35, 0x34, 0x2e, 0x02, 0x23, 0x22, 0x0e, 0x02, 0x07, 0x34, 0x36, 0x33, 0x32, + 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x01, 0x0e, 0x03, 0x23, 0x22, 0x2e, 0x02, 0x23, 0x22, + 0x06, 0x07, 0x27, 0x3e, 0x03, 0x33, 0x32, 0x1e, 0x02, 0x33, 0x32, 0x36, 0x37, 0x27, 0x33, 0x15, + 0x23, 0x98, 0x07, 0x15, 0x26, 0x20, 0x1f, 0x27, 0x15, 0x07, 0x07, 0x15, 0x26, 0x20, 0x20, 0x26, + 0x15, 0x07, 0x7d, 0x76, 0x69, 0x6d, 0x72, 0x74, 0x6a, 0x6d, 0x73, 0x01, 0x6a, 0x05, 0x10, 0x16, + 0x1e, 0x12, 0x0d, 0x18, 0x17, 0x18, 0x0c, 0x10, 0x12, 0x08, 0x31, 0x04, 0x10, 0x18, 0x1e, 0x12, + 0x0d, 0x18, 0x16, 0x17, 0x0d, 0x10, 0x13, 0x08, 0xcf, 0xe8, 0xe8, 0x01, 0x22, 0x29, 0x48, 0x35, + 0x1e, 0x1f, 0x35, 0x47, 0x29, 0x29, 0x48, 0x35, 0x1e, 0x1f, 0x35, 0x47, 0x29, 0x98, 0x97, 0x97, + 0x98, 0x98, 0x97, 0x97, 0x02, 0x3a, 0x0c, 0x1b, 0x17, 0x10, 0x08, 0x0a, 0x08, 0x13, 0x0e, 0x27, + 0x0c, 0x1a, 0x14, 0x0d, 0x08, 0x0b, 0x08, 0x13, 0x0e, 0x5b, 0x47, 0x00, 0xff, 0xff, 0x00, 0x1d, + 0xff, 0xf3, 0x01, 0xd8, 0x02, 0xdc, 0x02, 0x26, 0x00, 0x52, 0x00, 0x00, 0x01, 0x06, 0x02, 0xac, + 0x00, 0x00, 0x00, 0x17, 0x40, 0x10, 0x03, 0x02, 0x00, 0x2e, 0x20, 0x09, 0x00, 0x50, 0x03, 0x0e, + 0x3e, 0x4f, 0x02, 0x0e, 0x2d, 0x4f, 0x2b, 0x2b, 0x2b, 0x34, 0x34, 0x00, 0xff, 0xff, 0x00, 0x1b, + 0xff, 0xf3, 0x01, 0xd9, 0x03, 0x2e, 0x02, 0x26, 0x00, 0x32, 0x00, 0x00, 0x01, 0x07, 0x01, 0x62, + 0x00, 0x00, 0x00, 0x8b, 0x00, 0x10, 0x40, 0x0b, 0x02, 0x00, 0x22, 0x28, 0x14, 0x19, 0x50, 0x02, + 0x16, 0x20, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0x00, 0xff, 0xff, 0x00, 0x1d, 0xff, 0xf3, 0x01, 0xd8, + 0x02, 0xa3, 0x02, 0x26, 0x00, 0x52, 0x00, 0x00, 0x01, 0x06, 0x01, 0x62, 0x00, 0x00, 0x00, 0x10, + 0x40, 0x0b, 0x02, 0x00, 0x22, 0x28, 0x09, 0x00, 0x50, 0x02, 0x0e, 0x20, 0x4f, 0x2b, 0x2b, 0x34, + 0x00, 0x04, 0x00, 0x1b, 0xff, 0xf3, 0x01, 0xd9, 0x03, 0x3e, 0x00, 0x13, 0x00, 0x1f, 0x00, 0x2b, + 0x00, 0x2f, 0x00, 0x98, 0xb9, 0x00, 0x2b, 0xff, 0xe0, 0xb3, 0x1b, 0x00, 0x4d, 0x2b, 0xb8, 0xff, + 0xe0, 0x40, 0x1b, 0x16, 0x19, 0x00, 0x4c, 0x27, 0x20, 0x1b, 0x00, 0x4d, 0x27, 0x20, 0x16, 0x19, + 0x00, 0x4c, 0x25, 0x20, 0x1b, 0x00, 0x4d, 0x25, 0x20, 0x16, 0x19, 0x00, 0x4c, 0x21, 0xb8, 0xff, + 0xe0, 0xb3, 0x1b, 0x00, 0x4d, 0x21, 0xb8, 0xff, 0xe0, 0x40, 0x0a, 0x16, 0x19, 0x00, 0x4c, 0x0a, + 0x46, 0x00, 0x1a, 0x01, 0x1a, 0xb8, 0xff, 0xc0, 0x40, 0x2c, 0x0d, 0x12, 0x48, 0x1a, 0x31, 0x2e, + 0x2f, 0x30, 0x20, 0xb3, 0x50, 0x26, 0x01, 0x26, 0x30, 0x00, 0x46, 0x14, 0x30, 0xdf, 0x2e, 0x01, + 0x2e, 0x99, 0x2d, 0x86, 0x29, 0xb2, 0xbf, 0x23, 0x01, 0x00, 0x23, 0x01, 0x23, 0x02, 0x05, 0x4a, + 0x1d, 0x09, 0x0f, 0x4a, 0x17, 0xb4, 0x00, 0x3f, 0xed, 0x3f, 0xed, 0x3f, 0x5d, 0x5d, 0xed, 0x3f, + 0xed, 0x5d, 0x01, 0x10, 0xd6, 0xed, 0x10, 0xd4, 0x5d, 0xed, 0x10, 0xd4, 0xc5, 0x10, 0xd6, 0x2b, + 0x5d, 0xed, 0x31, 0x30, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x13, 0x14, 0x1e, 0x02, + 0x33, 0x32, 0x3e, 0x02, 0x35, 0x34, 0x2e, 0x02, 0x23, 0x22, 0x0e, 0x02, 0x07, 0x34, 0x36, 0x33, + 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x01, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, + 0x36, 0x33, 0x32, 0x16, 0x27, 0x33, 0x15, 0x23, 0x98, 0x07, 0x15, 0x26, 0x20, 0x1f, 0x27, 0x15, + 0x07, 0x07, 0x15, 0x26, 0x20, 0x20, 0x26, 0x15, 0x07, 0x7d, 0x76, 0x69, 0x6d, 0x72, 0x74, 0x6a, + 0x6d, 0x73, 0x01, 0x18, 0x22, 0x17, 0x17, 0x22, 0x22, 0x17, 0x17, 0x22, 0xad, 0xe8, 0xe8, 0x01, + 0x22, 0x29, 0x48, 0x35, 0x1e, 0x1f, 0x35, 0x47, 0x29, 0x29, 0x48, 0x35, 0x1e, 0x1f, 0x35, 0x47, + 0x29, 0x98, 0x97, 0x97, 0x98, 0x98, 0x97, 0x97, 0x02, 0x1c, 0x1a, 0x1e, 0x1e, 0x1a, 0x1a, 0x1f, + 0x1f, 0x7e, 0x47, 0x00, 0xff, 0xff, 0x00, 0x1d, 0xff, 0xf3, 0x01, 0xd8, 0x02, 0xdc, 0x02, 0x26, + 0x00, 0x52, 0x00, 0x00, 0x01, 0x06, 0x02, 0xa8, 0x00, 0x00, 0x00, 0x17, 0x40, 0x10, 0x03, 0x02, + 0x00, 0x2c, 0x2d, 0x09, 0x00, 0x50, 0x03, 0x0e, 0x2e, 0x4f, 0x02, 0x0e, 0x22, 0x4f, 0x2b, 0x2b, + 0x2b, 0x34, 0x34, 0x00, 0xff, 0xff, 0x00, 0x0d, 0x00, 0x00, 0x01, 0xe8, 0x03, 0x12, 0x02, 0x26, + 0x00, 0x3c, 0x00, 0x00, 0x01, 0x07, 0x00, 0x8a, 0x00, 0x00, 0x00, 0x8b, 0x00, 0x10, 0x40, 0x0b, + 0x01, 0x01, 0x15, 0x16, 0x11, 0x06, 0x50, 0x01, 0x05, 0x17, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x14, 0xff, 0x58, 0x01, 0xd8, 0x02, 0x87, 0x02, 0x26, 0x00, 0x5c, 0x00, 0x00, + 0x01, 0x06, 0x00, 0x8a, 0x00, 0x00, 0x00, 0x10, 0x40, 0x0b, 0x01, 0x06, 0x23, 0x24, 0x0d, 0x00, + 0x50, 0x01, 0x00, 0x25, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0x02, 0x00, 0x24, 0xff, 0x5b, 0x01, 0xe6, + 0x02, 0xb5, 0x00, 0x17, 0x00, 0x26, 0x00, 0x48, 0xb9, 0x00, 0x20, 0xff, 0xe0, 0x40, 0x27, 0x0d, + 0x10, 0x48, 0x20, 0xa4, 0x60, 0x0e, 0xa0, 0x0e, 0xb0, 0x0e, 0x03, 0x0e, 0x28, 0x26, 0x06, 0x51, + 0x01, 0x03, 0x00, 0x27, 0x09, 0xa5, 0x23, 0x16, 0x17, 0x17, 0x16, 0x23, 0x03, 0x04, 0x1d, 0xa5, + 0x11, 0x92, 0x03, 0x48, 0x04, 0x10, 0x00, 0x3f, 0xed, 0x3f, 0xed, 0x12, 0x17, 0x39, 0x2f, 0x2f, + 0x2f, 0xed, 0x01, 0x10, 0xc6, 0xc6, 0xd6, 0xfd, 0xc0, 0x10, 0xd6, 0x5d, 0xed, 0x2b, 0x31, 0x30, + 0x17, 0x37, 0x11, 0x23, 0x35, 0x33, 0x11, 0x36, 0x36, 0x33, 0x32, 0x1e, 0x02, 0x15, 0x14, 0x06, + 0x23, 0x22, 0x2e, 0x02, 0x27, 0x07, 0x37, 0x14, 0x1e, 0x02, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, + 0x23, 0x22, 0x06, 0x07, 0x3b, 0x6b, 0x82, 0xfd, 0x14, 0x1e, 0x0d, 0x1b, 0x31, 0x24, 0x16, 0x55, + 0x47, 0x18, 0x29, 0x21, 0x18, 0x08, 0x49, 0xa2, 0x04, 0x0b, 0x13, 0x10, 0x17, 0x1b, 0x1b, 0x17, + 0x08, 0x20, 0x0a, 0x5c, 0x76, 0x02, 0x35, 0x66, 0xfd, 0xc6, 0x09, 0x06, 0x11, 0x24, 0x39, 0x27, + 0x4e, 0x4c, 0x0f, 0x19, 0x1f, 0x10, 0x4e, 0x9a, 0x0e, 0x1a, 0x15, 0x0d, 0x22, 0x1a, 0x1d, 0x21, + 0x0b, 0x08, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1b, 0xff, 0x5b, 0x02, 0x08, 0x01, 0xe0, 0x00, 0x24, + 0x00, 0x30, 0x00, 0x90, 0xb9, 0x00, 0x30, 0xff, 0xe0, 0xb3, 0x12, 0x00, 0x4d, 0x2e, 0xb8, 0xff, + 0xc0, 0xb4, 0x10, 0x12, 0x00, 0x4c, 0x12, 0xb8, 0xff, 0xe0, 0xb3, 0x0d, 0x00, 0x4d, 0x10, 0xb8, + 0xff, 0xf0, 0x40, 0x09, 0x13, 0x14, 0x00, 0x4c, 0x20, 0x30, 0x01, 0x30, 0x13, 0xb8, 0xff, 0xc0, + 0x40, 0x3a, 0x0b, 0x0e, 0x48, 0x13, 0x79, 0x00, 0x24, 0x10, 0x24, 0x80, 0x24, 0x90, 0x24, 0x04, + 0x24, 0x32, 0x80, 0x2b, 0x90, 0x2b, 0x02, 0x2b, 0x7c, 0x07, 0x32, 0x4f, 0x1a, 0x01, 0x1a, 0x79, + 0x1b, 0x11, 0x31, 0x02, 0x7d, 0x2e, 0x10, 0x11, 0x0f, 0x12, 0x2e, 0x2e, 0x12, 0x0f, 0x11, 0x10, + 0x05, 0x0c, 0x16, 0x55, 0x1f, 0x0b, 0x1a, 0x06, 0x28, 0x7d, 0x0c, 0x92, 0x00, 0x3f, 0xed, 0x3f, + 0x3f, 0xed, 0x12, 0x17, 0x39, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x10, 0xed, 0x01, 0x10, 0xc6, 0xd6, + 0xed, 0x5d, 0x10, 0xd5, 0xed, 0x5d, 0x10, 0xd4, 0x5d, 0xed, 0x2b, 0xc0, 0x5d, 0x31, 0x30, 0x00, + 0x2b, 0x2b, 0x2b, 0x2b, 0x25, 0x36, 0x33, 0x32, 0x1e, 0x02, 0x15, 0x14, 0x0e, 0x02, 0x23, 0x22, + 0x26, 0x27, 0x07, 0x27, 0x37, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x11, 0x23, 0x11, 0x36, + 0x36, 0x33, 0x32, 0x1e, 0x02, 0x15, 0x11, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, + 0x22, 0x07, 0x01, 0x70, 0x16, 0x10, 0x1d, 0x2b, 0x1c, 0x0e, 0x14, 0x21, 0x2b, 0x16, 0x27, 0x3e, + 0x0d, 0x53, 0x3b, 0x75, 0x24, 0x23, 0x0a, 0x27, 0x0b, 0x69, 0x1f, 0x59, 0x35, 0x33, 0x42, 0x25, + 0x0e, 0x17, 0x0e, 0x13, 0x11, 0x11, 0x13, 0x0d, 0x18, 0x76, 0x05, 0x18, 0x27, 0x32, 0x1a, 0x25, + 0x38, 0x25, 0x13, 0x30, 0x33, 0x5a, 0x38, 0x81, 0xe4, 0x42, 0x38, 0x05, 0x03, 0xfe, 0x8d, 0x01, + 0xc7, 0x09, 0x10, 0x1f, 0x39, 0x4f, 0x30, 0xfe, 0xe4, 0x23, 0x1c, 0x22, 0x1e, 0x1c, 0x22, 0x0d, + 0x00, 0x02, 0x00, 0x24, 0xff, 0x5b, 0x01, 0xcf, 0x02, 0x60, 0x00, 0x1b, 0x00, 0x2a, 0x00, 0x90, + 0x40, 0x60, 0x2f, 0x24, 0xcf, 0x24, 0xdf, 0x24, 0xff, 0x24, 0x04, 0x24, 0x51, 0x5f, 0x08, 0x01, + 0x00, 0x08, 0x10, 0x08, 0x20, 0x08, 0x40, 0x08, 0x04, 0x08, 0x5f, 0x1a, 0x01, 0x00, 0x1a, 0x10, + 0x1a, 0x20, 0x1a, 0x40, 0x1a, 0x04, 0x1a, 0x2c, 0x2a, 0x18, 0x1b, 0x51, 0x15, 0x12, 0x50, 0x13, + 0x60, 0x13, 0x70, 0x13, 0x03, 0x13, 0x50, 0x10, 0x60, 0x10, 0x70, 0x10, 0x03, 0x10, 0x2b, 0x1a, + 0x13, 0x12, 0x1b, 0x72, 0x18, 0x18, 0x19, 0x06, 0x03, 0xa5, 0x27, 0x16, 0x27, 0x11, 0x0e, 0x10, + 0x0f, 0x0f, 0x10, 0x0e, 0x11, 0x27, 0x16, 0x06, 0x0b, 0x17, 0x02, 0x15, 0x14, 0x06, 0x21, 0xa5, + 0x0b, 0x92, 0x00, 0x3f, 0xed, 0x3f, 0x33, 0x3f, 0x12, 0x17, 0x39, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, + 0x2f, 0x10, 0xed, 0x3f, 0x33, 0x2f, 0xed, 0x32, 0x32, 0x32, 0x01, 0x10, 0xc6, 0x5d, 0xd6, 0x5d, + 0xd5, 0xc0, 0xfd, 0xc0, 0xc0, 0x10, 0xc6, 0x5d, 0x5d, 0xd6, 0x5d, 0x5d, 0xed, 0x5d, 0x31, 0x30, + 0x25, 0x36, 0x36, 0x33, 0x32, 0x1e, 0x02, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x27, 0x07, 0x27, + 0x37, 0x11, 0x23, 0x35, 0x33, 0x35, 0x37, 0x15, 0x33, 0x15, 0x23, 0x11, 0x14, 0x1e, 0x02, 0x33, + 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x01, 0x0a, 0x11, 0x1a, 0x0c, 0x1b, 0x33, + 0x28, 0x18, 0x55, 0x47, 0x30, 0x48, 0x10, 0x43, 0x44, 0x6b, 0x6b, 0x6b, 0x7b, 0xc5, 0xc5, 0x04, + 0x0b, 0x13, 0x10, 0x17, 0x1b, 0x1b, 0x17, 0x08, 0x20, 0x0a, 0x7b, 0x08, 0x07, 0x11, 0x24, 0x39, + 0x27, 0x4e, 0x4c, 0x30, 0x21, 0x48, 0x40, 0x76, 0x01, 0x56, 0x66, 0x76, 0x14, 0x8a, 0x66, 0xfe, + 0x8e, 0x0e, 0x1a, 0x15, 0x0d, 0x22, 0x1a, 0x1d, 0x21, 0x0b, 0x08, 0x00, 0x00, 0x03, 0x00, 0x18, + 0xff, 0xf3, 0x01, 0xdb, 0x02, 0xb5, 0x00, 0x20, 0x00, 0x2e, 0x00, 0x3b, 0x00, 0x5b, 0x40, 0x3b, + 0x40, 0x24, 0x50, 0x24, 0x02, 0x24, 0x84, 0x80, 0x19, 0x90, 0x19, 0xa0, 0x19, 0x03, 0x19, 0x3d, + 0x2b, 0x2f, 0x12, 0x3f, 0x12, 0x02, 0x12, 0x79, 0x3a, 0x90, 0x10, 0x01, 0x10, 0x3c, 0x4f, 0x34, + 0x5f, 0x34, 0x02, 0x34, 0x84, 0x08, 0x3c, 0x21, 0xa5, 0x1e, 0x07, 0x29, 0xa5, 0x14, 0x0b, 0x11, + 0x00, 0x10, 0x00, 0x2f, 0xa5, 0x0d, 0x0b, 0x36, 0xa5, 0x03, 0x07, 0x00, 0x3f, 0xed, 0x3f, 0xed, + 0x3f, 0x3f, 0x3f, 0xed, 0x3f, 0xed, 0x01, 0x10, 0xd6, 0xed, 0x5d, 0x10, 0xd4, 0x5d, 0x32, 0xed, + 0x5d, 0x32, 0x10, 0xd6, 0x5d, 0xed, 0x5d, 0x31, 0x30, 0x37, 0x06, 0x06, 0x23, 0x22, 0x2e, 0x02, + 0x35, 0x34, 0x3e, 0x02, 0x33, 0x32, 0x17, 0x35, 0x37, 0x15, 0x36, 0x33, 0x32, 0x1e, 0x02, 0x15, + 0x14, 0x0e, 0x02, 0x23, 0x22, 0x26, 0x37, 0x32, 0x36, 0x35, 0x34, 0x2e, 0x02, 0x23, 0x22, 0x07, + 0x11, 0x16, 0x16, 0x03, 0x22, 0x0e, 0x02, 0x15, 0x14, 0x33, 0x32, 0x36, 0x37, 0x11, 0x26, 0xfa, + 0x13, 0x26, 0x14, 0x26, 0x38, 0x25, 0x12, 0x10, 0x20, 0x2e, 0x1d, 0x19, 0x1d, 0x60, 0x1d, 0x1b, + 0x1d, 0x2e, 0x1f, 0x10, 0x12, 0x24, 0x38, 0x27, 0x12, 0x28, 0x39, 0x1a, 0x1a, 0x05, 0x0b, 0x11, + 0x0c, 0x0f, 0x14, 0x05, 0x0e, 0x97, 0x0b, 0x0f, 0x0b, 0x05, 0x33, 0x08, 0x0e, 0x05, 0x14, 0x0a, + 0x0b, 0x0c, 0x26, 0x43, 0x5c, 0x35, 0x34, 0x5a, 0x40, 0x25, 0x11, 0xd1, 0x15, 0xe6, 0x11, 0x24, + 0x41, 0x59, 0x34, 0x35, 0x5c, 0x44, 0x26, 0x0c, 0x55, 0x52, 0x50, 0x1b, 0x32, 0x27, 0x17, 0x13, + 0xfe, 0xea, 0x02, 0x02, 0x01, 0x2d, 0x17, 0x26, 0x32, 0x1a, 0xa4, 0x02, 0x02, 0x01, 0x16, 0x13, + 0x00, 0x03, 0x00, 0x18, 0xff, 0x5b, 0x01, 0xdb, 0x01, 0xe2, 0x00, 0x21, 0x00, 0x2e, 0x00, 0x3a, + 0x00, 0x5a, 0x40, 0x3b, 0x40, 0x34, 0x50, 0x34, 0x02, 0x34, 0x84, 0x20, 0x08, 0x80, 0x08, 0x90, + 0x08, 0xa0, 0x08, 0x04, 0x08, 0x3c, 0x4f, 0x25, 0x5f, 0x25, 0x02, 0x25, 0x84, 0x1a, 0x3b, 0x39, + 0x3f, 0x10, 0x01, 0x10, 0x79, 0x2c, 0x90, 0x13, 0xa0, 0x13, 0x02, 0x13, 0x3b, 0x22, 0xa5, 0x1f, + 0x0b, 0x2a, 0xa5, 0x15, 0x07, 0x11, 0x0e, 0x2f, 0xa5, 0x0d, 0x07, 0x36, 0xa5, 0x03, 0x0b, 0x00, + 0x3f, 0xed, 0x3f, 0xed, 0x3f, 0x3f, 0xed, 0x3f, 0xed, 0x01, 0x10, 0xd4, 0x5d, 0x32, 0xed, 0x5d, + 0x32, 0x10, 0xd6, 0xed, 0x5d, 0x10, 0xd6, 0x5d, 0xed, 0x5d, 0x31, 0x30, 0x13, 0x36, 0x36, 0x33, + 0x32, 0x1e, 0x02, 0x15, 0x14, 0x0e, 0x02, 0x23, 0x22, 0x26, 0x27, 0x15, 0x23, 0x35, 0x06, 0x23, + 0x22, 0x2e, 0x02, 0x35, 0x34, 0x3e, 0x02, 0x33, 0x32, 0x16, 0x07, 0x22, 0x06, 0x15, 0x14, 0x1e, + 0x02, 0x33, 0x32, 0x37, 0x11, 0x26, 0x13, 0x32, 0x3e, 0x02, 0x35, 0x34, 0x23, 0x22, 0x07, 0x11, + 0x16, 0xf9, 0x13, 0x26, 0x14, 0x27, 0x38, 0x24, 0x12, 0x11, 0x1f, 0x2e, 0x1d, 0x0d, 0x1b, 0x0e, + 0x60, 0x1e, 0x1a, 0x1d, 0x2e, 0x1f, 0x10, 0x12, 0x25, 0x38, 0x26, 0x12, 0x28, 0x39, 0x1a, 0x1a, + 0x06, 0x0b, 0x11, 0x0b, 0x0f, 0x14, 0x0a, 0x8e, 0x0b, 0x10, 0x0a, 0x05, 0x33, 0x0f, 0x0c, 0x16, + 0x01, 0xcc, 0x0a, 0x0c, 0x26, 0x43, 0x5b, 0x35, 0x35, 0x59, 0x40, 0x25, 0x08, 0x07, 0xaa, 0xab, + 0x10, 0x24, 0x41, 0x58, 0x34, 0x36, 0x5b, 0x44, 0x26, 0x0c, 0x54, 0x52, 0x50, 0x1b, 0x32, 0x27, + 0x17, 0x13, 0x01, 0x15, 0x05, 0xfe, 0xd3, 0x17, 0x26, 0x31, 0x1a, 0xa5, 0x05, 0xfe, 0xeb, 0x13, + 0x00, 0x03, 0x00, 0x09, 0xff, 0xa9, 0x01, 0xeb, 0x02, 0xbf, 0x00, 0x12, 0x00, 0x1a, 0x00, 0x1f, + 0x00, 0x46, 0x40, 0x2d, 0x09, 0x0e, 0x0a, 0x0f, 0x08, 0x1b, 0x07, 0x1e, 0x1f, 0x18, 0x10, 0x13, + 0x17, 0x11, 0x00, 0x16, 0x06, 0x01, 0x12, 0x02, 0x14, 0x20, 0x0d, 0x21, 0x03, 0x20, 0x17, 0x1f, + 0x48, 0x00, 0x13, 0x18, 0x1e, 0x03, 0x10, 0x10, 0x07, 0x0e, 0x08, 0x07, 0x02, 0x06, 0x02, 0x02, + 0x08, 0x00, 0x3f, 0x3f, 0x3f, 0x3f, 0x12, 0x39, 0x2f, 0x17, 0x39, 0x33, 0xed, 0x32, 0x01, 0x10, + 0xc6, 0x10, 0xc6, 0x12, 0x17, 0x39, 0x31, 0x30, 0x37, 0x23, 0x07, 0x23, 0x36, 0x12, 0x37, 0x33, + 0x37, 0x17, 0x07, 0x16, 0x12, 0x17, 0x23, 0x27, 0x23, 0x07, 0x27, 0x13, 0x06, 0x06, 0x07, 0x33, + 0x37, 0x26, 0x26, 0x17, 0x26, 0x26, 0x27, 0x07, 0xc9, 0x24, 0x1c, 0x80, 0x2c, 0x5a, 0x2a, 0x7b, + 0x14, 0x38, 0x26, 0x26, 0x49, 0x22, 0x7d, 0x1e, 0x4e, 0x34, 0x36, 0x64, 0x14, 0x20, 0x0c, 0x24, + 0x2e, 0x05, 0x08, 0x3c, 0x04, 0x08, 0x05, 0x13, 0x8f, 0x8f, 0xb7, 0x01, 0x2d, 0x87, 0x54, 0x09, + 0xa4, 0x76, 0xfe, 0xf9, 0x95, 0x8f, 0xe6, 0x0a, 0x02, 0x4e, 0x47, 0x82, 0x43, 0xcb, 0x11, 0x1f, + 0xfb, 0x14, 0x2a, 0x15, 0x53, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1b, 0xff, 0xa8, 0x01, 0xf0, + 0x02, 0xc1, 0x00, 0x24, 0x00, 0x2f, 0x00, 0x6b, 0xb9, 0x00, 0x13, 0xff, 0xc0, 0xb3, 0x0b, 0x00, + 0x4d, 0x04, 0xb8, 0xff, 0xd8, 0x40, 0x38, 0x0b, 0x00, 0x4d, 0x14, 0x1b, 0x11, 0x29, 0x1c, 0x03, + 0x28, 0x06, 0x08, 0x30, 0x40, 0x22, 0x01, 0x22, 0x40, 0x17, 0x01, 0x17, 0x30, 0x13, 0x01, 0x13, + 0x31, 0x25, 0x46, 0x09, 0x05, 0x30, 0x1c, 0x28, 0x1b, 0x14, 0x04, 0x12, 0x06, 0x03, 0x06, 0x03, + 0x04, 0x12, 0x10, 0x18, 0x2b, 0x4a, 0x0e, 0x03, 0x04, 0x87, 0x21, 0x1e, 0x4a, 0x00, 0x09, 0x00, + 0x3f, 0xfd, 0xc6, 0x3f, 0x3f, 0xfd, 0xc0, 0x3f, 0x12, 0x39, 0x39, 0x2f, 0x2f, 0x12, 0x17, 0x39, + 0x01, 0x10, 0xc2, 0xd6, 0xed, 0x10, 0xc0, 0x5d, 0xc6, 0x5d, 0xc6, 0x5d, 0x12, 0x17, 0x39, 0x31, + 0x30, 0x2b, 0x2b, 0x05, 0x22, 0x26, 0x27, 0x07, 0x27, 0x37, 0x26, 0x26, 0x35, 0x34, 0x3e, 0x02, + 0x33, 0x32, 0x16, 0x17, 0x37, 0x17, 0x07, 0x16, 0x16, 0x17, 0x07, 0x26, 0x26, 0x27, 0x03, 0x16, + 0x33, 0x32, 0x36, 0x37, 0x17, 0x06, 0x06, 0x03, 0x14, 0x16, 0x17, 0x13, 0x26, 0x23, 0x22, 0x0e, + 0x02, 0x01, 0x28, 0x11, 0x1f, 0x0f, 0x1b, 0x4f, 0x1c, 0x3f, 0x41, 0x2a, 0x4b, 0x67, 0x3d, 0x0c, + 0x18, 0x0b, 0x19, 0x51, 0x18, 0x16, 0x1f, 0x06, 0x24, 0x0e, 0x1c, 0x0e, 0x88, 0x12, 0x16, 0x30, + 0x3f, 0x13, 0x1f, 0x1a, 0x59, 0xca, 0x14, 0x17, 0x7e, 0x05, 0x0a, 0x1d, 0x37, 0x2b, 0x1b, 0x0d, + 0x02, 0x04, 0x51, 0x17, 0x56, 0x26, 0x91, 0x6a, 0x4d, 0x78, 0x53, 0x2b, 0x02, 0x01, 0x4b, 0x17, + 0x4a, 0x08, 0x0f, 0x05, 0x62, 0x09, 0x0e, 0x05, 0xfe, 0x63, 0x03, 0x16, 0x0b, 0x61, 0x10, 0x1b, + 0x01, 0x46, 0x39, 0x56, 0x1c, 0x01, 0x7f, 0x01, 0x15, 0x31, 0x52, 0x00, 0x00, 0x02, 0x00, 0x27, + 0xff, 0xb1, 0x01, 0xd7, 0x02, 0x23, 0x00, 0x25, 0x00, 0x2e, 0x00, 0x5e, 0x40, 0x3a, 0x20, 0x10, + 0x0c, 0x00, 0x4d, 0x1f, 0x29, 0x23, 0x03, 0x2f, 0x08, 0x09, 0x10, 0x07, 0x06, 0x2a, 0x06, 0x30, + 0x12, 0x12, 0x2f, 0x20, 0x19, 0x60, 0x19, 0x70, 0x19, 0x03, 0x19, 0x5f, 0x0c, 0x01, 0x20, 0x0c, + 0x01, 0x0c, 0x30, 0x26, 0x53, 0x00, 0x22, 0x2f, 0x21, 0xb6, 0x18, 0x15, 0x57, 0x1c, 0x07, 0x07, + 0xac, 0x2a, 0x0d, 0x10, 0x57, 0x09, 0x05, 0x0b, 0x00, 0x3f, 0xc5, 0xfd, 0xc6, 0xc5, 0x3f, 0x3f, + 0xfd, 0xc6, 0x3f, 0x01, 0x10, 0xc6, 0xd6, 0xed, 0x10, 0xc6, 0x5d, 0x5d, 0xc6, 0x5d, 0x12, 0x39, + 0x2f, 0x12, 0x17, 0x39, 0x12, 0x17, 0x39, 0x31, 0x30, 0x2b, 0x37, 0x34, 0x3e, 0x02, 0x33, 0x33, + 0x37, 0x17, 0x07, 0x16, 0x16, 0x17, 0x07, 0x26, 0x26, 0x27, 0x07, 0x03, 0x16, 0x16, 0x33, 0x32, + 0x36, 0x37, 0x17, 0x06, 0x06, 0x23, 0x22, 0x26, 0x27, 0x07, 0x07, 0x27, 0x37, 0x26, 0x26, 0x37, + 0x14, 0x16, 0x17, 0x37, 0x0e, 0x03, 0x27, 0x20, 0x44, 0x68, 0x47, 0x0c, 0x15, 0x48, 0x13, 0x10, + 0x1e, 0x11, 0x1b, 0x0e, 0x21, 0x15, 0x04, 0x55, 0x0b, 0x1a, 0x0e, 0x1f, 0x44, 0x1a, 0x10, 0x1a, + 0x4d, 0x33, 0x14, 0x23, 0x11, 0x01, 0x17, 0x46, 0x17, 0x47, 0x40, 0x7d, 0x16, 0x19, 0x4f, 0x23, + 0x30, 0x1e, 0x0d, 0xeb, 0x33, 0x5a, 0x43, 0x27, 0x41, 0x14, 0x38, 0x05, 0x0a, 0x06, 0x63, 0x05, + 0x0b, 0x04, 0x0a, 0xfe, 0xfb, 0x02, 0x02, 0x09, 0x08, 0x65, 0x0a, 0x0d, 0x04, 0x03, 0x03, 0x48, + 0x14, 0x49, 0x1e, 0x74, 0x4b, 0x23, 0x37, 0x12, 0xf6, 0x04, 0x17, 0x24, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x12, 0x00, 0x00, 0x01, 0xcc, 0x02, 0x6b, 0x00, 0x0d, 0x00, 0x35, 0x40, 0x1c, + 0x20, 0x00, 0x01, 0x00, 0x0c, 0x0b, 0x09, 0x08, 0x51, 0x02, 0x05, 0x04, 0x0e, 0x07, 0x02, 0x06, + 0x02, 0x05, 0x08, 0x55, 0x02, 0x0b, 0x0c, 0x55, 0x01, 0x08, 0x00, 0x08, 0x00, 0x3f, 0x3f, 0xfd, + 0xd6, 0xc0, 0xfd, 0xc0, 0x3f, 0x3f, 0x01, 0x10, 0xd6, 0xd5, 0xc0, 0xfd, 0xc5, 0xd0, 0xd0, 0xc5, + 0x5d, 0x31, 0x30, 0x21, 0x21, 0x11, 0x23, 0x35, 0x33, 0x35, 0x33, 0x15, 0x33, 0x15, 0x23, 0x15, + 0x33, 0x01, 0xcc, 0xfe, 0x96, 0x50, 0x50, 0x7b, 0x83, 0x83, 0xef, 0x01, 0x1a, 0x62, 0xef, 0xef, + 0x62, 0xb4, 0x00, 0x00, 0x00, 0x02, 0xff, 0xfc, 0xff, 0xc1, 0x02, 0x0b, 0x02, 0xbb, 0x00, 0x0c, + 0x00, 0x0f, 0x00, 0x43, 0x40, 0x25, 0x0e, 0x40, 0x15, 0x00, 0x4d, 0x07, 0x10, 0x01, 0x00, 0x0e, + 0x03, 0x11, 0x0d, 0x0d, 0x10, 0x11, 0x03, 0x0f, 0x51, 0x09, 0x06, 0x0a, 0x0c, 0x10, 0x0c, 0x02, + 0x07, 0xb6, 0x05, 0x08, 0x01, 0x00, 0x0a, 0x0f, 0x48, 0x00, 0x02, 0x00, 0x3f, 0xfd, 0xc0, 0x3f, + 0x3f, 0x3f, 0x3f, 0x01, 0x10, 0xd6, 0xd5, 0xc0, 0xc0, 0xfd, 0xc0, 0x11, 0x12, 0x39, 0x2f, 0x12, + 0x17, 0x39, 0x12, 0x39, 0x31, 0x30, 0x2b, 0x01, 0x37, 0x17, 0x03, 0x11, 0x23, 0x35, 0x07, 0x27, + 0x37, 0x11, 0x23, 0x35, 0x17, 0x37, 0x23, 0x01, 0x94, 0x33, 0x44, 0xf3, 0x7b, 0x5e, 0x43, 0xa1, + 0x84, 0xff, 0x3a, 0x3a, 0x02, 0x6b, 0x50, 0x2d, 0xfe, 0x84, 0xfe, 0xee, 0x52, 0x91, 0x2d, 0xfc, + 0x01, 0x1b, 0x66, 0xc1, 0x5b, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x24, 0xff, 0x5b, 0x01, 0xba, + 0x01, 0xe2, 0x00, 0x44, 0x00, 0x4e, 0x40, 0x2d, 0x3d, 0x40, 0x0e, 0x00, 0x4d, 0x2c, 0x35, 0x46, + 0x15, 0x03, 0x53, 0x26, 0x46, 0x1c, 0x53, 0x0d, 0x50, 0x3f, 0x01, 0x3f, 0x45, 0x3f, 0x06, 0x34, + 0x31, 0x38, 0x92, 0x21, 0x08, 0x12, 0x40, 0x00, 0x01, 0x00, 0x57, 0x2b, 0x07, 0x16, 0x4f, 0x19, + 0x01, 0x19, 0x57, 0x12, 0x0b, 0x00, 0x3f, 0xfd, 0x5d, 0xc6, 0x3f, 0xed, 0x5d, 0x12, 0x39, 0x39, + 0x3f, 0xd5, 0xc6, 0x3f, 0x01, 0x10, 0xd6, 0x5d, 0xd6, 0xed, 0x10, 0xd6, 0xed, 0xc4, 0x10, 0xd6, + 0xcc, 0x31, 0x30, 0x2b, 0x37, 0x32, 0x36, 0x35, 0x34, 0x2e, 0x02, 0x27, 0x2e, 0x03, 0x35, 0x34, + 0x3e, 0x02, 0x33, 0x32, 0x16, 0x17, 0x07, 0x26, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x1e, 0x02, + 0x17, 0x1e, 0x03, 0x15, 0x14, 0x0e, 0x02, 0x23, 0x23, 0x1e, 0x03, 0x33, 0x32, 0x36, 0x37, 0x17, + 0x06, 0x06, 0x23, 0x22, 0x2e, 0x04, 0x27, 0x37, 0x1e, 0x03, 0xe4, 0x2d, 0x30, 0x0f, 0x1b, 0x23, + 0x13, 0x1b, 0x38, 0x2e, 0x1e, 0x17, 0x31, 0x4c, 0x35, 0x2e, 0x4f, 0x1d, 0x13, 0x11, 0x48, 0x2d, + 0x2f, 0x21, 0x0f, 0x19, 0x21, 0x13, 0x1b, 0x3a, 0x2f, 0x1e, 0x16, 0x33, 0x52, 0x3c, 0x15, 0x19, + 0x26, 0x1e, 0x19, 0x0e, 0x0d, 0x20, 0x15, 0x0b, 0x19, 0x37, 0x0d, 0x23, 0x37, 0x2d, 0x27, 0x28, + 0x2c, 0x1c, 0x23, 0x11, 0x2a, 0x2b, 0x28, 0x5d, 0x0d, 0x14, 0x0d, 0x12, 0x0d, 0x0c, 0x06, 0x08, + 0x15, 0x20, 0x31, 0x25, 0x1e, 0x35, 0x29, 0x17, 0x0e, 0x0d, 0x68, 0x05, 0x17, 0x17, 0x0d, 0x0b, + 0x11, 0x0e, 0x0d, 0x06, 0x09, 0x16, 0x21, 0x33, 0x25, 0x1d, 0x30, 0x22, 0x13, 0x15, 0x1a, 0x0f, + 0x05, 0x03, 0x02, 0x5c, 0x07, 0x04, 0x15, 0x21, 0x2a, 0x2a, 0x28, 0x0e, 0x5c, 0x07, 0x0a, 0x06, + 0x03, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x43, 0xff, 0x5b, 0x01, 0xd9, 0x01, 0xd6, 0x00, 0x21, + 0x00, 0x3d, 0x40, 0x22, 0x05, 0x40, 0x0c, 0x00, 0x4d, 0x19, 0x1f, 0x05, 0x1e, 0x00, 0x00, 0x1e, + 0x05, 0x1f, 0x19, 0x05, 0x22, 0x21, 0x0d, 0x23, 0x20, 0x22, 0x1e, 0x55, 0x21, 0x0a, 0x19, 0x18, + 0x06, 0x0d, 0x0a, 0x4a, 0x10, 0x0e, 0x00, 0x3f, 0xed, 0xc5, 0x3f, 0xc5, 0x3f, 0xed, 0x01, 0x10, + 0xc6, 0x10, 0xc6, 0xc6, 0x12, 0x17, 0x39, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x31, 0x30, 0x2b, 0x01, + 0x0e, 0x03, 0x07, 0x1e, 0x03, 0x33, 0x32, 0x37, 0x17, 0x06, 0x06, 0x23, 0x22, 0x2e, 0x04, 0x23, + 0x23, 0x35, 0x3e, 0x03, 0x37, 0x23, 0x35, 0x21, 0x01, 0xaa, 0x0e, 0x38, 0x43, 0x44, 0x19, 0x21, + 0x34, 0x2f, 0x2f, 0x1c, 0x1e, 0x1d, 0x0b, 0x16, 0x31, 0x0b, 0x21, 0x34, 0x2d, 0x2a, 0x2f, 0x39, + 0x24, 0x0c, 0x17, 0x36, 0x36, 0x34, 0x15, 0xc2, 0x01, 0x5d, 0x01, 0x7c, 0x0f, 0x45, 0x57, 0x60, + 0x28, 0x0c, 0x2d, 0x2b, 0x21, 0x06, 0x64, 0x07, 0x04, 0x18, 0x25, 0x2b, 0x25, 0x18, 0x4b, 0x26, + 0x50, 0x4d, 0x46, 0x1c, 0x66, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x37, 0x00, 0x00, 0x01, 0xcc, + 0x02, 0x78, 0x00, 0x23, 0x00, 0x21, 0x40, 0x10, 0x0a, 0x46, 0x1b, 0x25, 0x00, 0x51, 0x01, 0x13, + 0x24, 0x12, 0x0d, 0x67, 0x16, 0x03, 0x00, 0x06, 0x00, 0x3f, 0x3f, 0xfd, 0xc6, 0x01, 0x10, 0xc6, + 0xd6, 0xed, 0x10, 0xd6, 0xed, 0x31, 0x30, 0x21, 0x23, 0x35, 0x34, 0x36, 0x37, 0x3e, 0x03, 0x35, + 0x34, 0x26, 0x23, 0x22, 0x0e, 0x02, 0x07, 0x27, 0x36, 0x36, 0x33, 0x32, 0x1e, 0x02, 0x15, 0x14, + 0x06, 0x07, 0x0e, 0x03, 0x15, 0x01, 0x11, 0x7c, 0x34, 0x23, 0x19, 0x26, 0x18, 0x0c, 0x37, 0x26, + 0x14, 0x2a, 0x27, 0x22, 0x0c, 0x28, 0x2c, 0x62, 0x30, 0x35, 0x50, 0x36, 0x1c, 0x29, 0x2c, 0x14, + 0x24, 0x1d, 0x11, 0xc4, 0x3a, 0x47, 0x15, 0x0f, 0x19, 0x18, 0x19, 0x11, 0x29, 0x1e, 0x06, 0x0b, + 0x0c, 0x06, 0x62, 0x17, 0x17, 0x1d, 0x30, 0x3e, 0x22, 0x2c, 0x53, 0x1a, 0x0c, 0x1a, 0x20, 0x27, + 0x18, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x3c, 0x00, 0x00, 0x01, 0xbf, 0x01, 0xe2, 0x00, 0x25, + 0x00, 0x25, 0x40, 0x13, 0x0c, 0x53, 0x00, 0x1b, 0x01, 0x1b, 0x27, 0x00, 0x6e, 0x01, 0x13, 0x26, + 0x12, 0x0f, 0x57, 0x18, 0x0b, 0x00, 0x06, 0x00, 0x3f, 0x3f, 0xfd, 0xc6, 0x01, 0x10, 0xc6, 0xd6, + 0xed, 0x10, 0xd6, 0x5d, 0xed, 0x31, 0x30, 0x21, 0x23, 0x35, 0x34, 0x3e, 0x02, 0x37, 0x3e, 0x03, + 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x27, 0x3e, 0x03, 0x33, 0x32, 0x16, 0x15, 0x14, 0x0e, + 0x02, 0x07, 0x0e, 0x03, 0x15, 0x01, 0x11, 0x7c, 0x0e, 0x18, 0x1f, 0x12, 0x0f, 0x1f, 0x18, 0x10, + 0x25, 0x2a, 0x23, 0x4d, 0x20, 0x27, 0x0a, 0x27, 0x32, 0x38, 0x1d, 0x63, 0x68, 0x0c, 0x14, 0x1a, + 0x0e, 0x14, 0x24, 0x1d, 0x11, 0x71, 0x1a, 0x29, 0x21, 0x1a, 0x0b, 0x0a, 0x10, 0x11, 0x14, 0x0e, + 0x17, 0x18, 0x15, 0x11, 0x62, 0x05, 0x11, 0x0f, 0x0b, 0x4a, 0x44, 0x1a, 0x27, 0x1d, 0x16, 0x09, + 0x0c, 0x16, 0x1a, 0x20, 0x15, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x12, 0xff, 0xf8, 0x01, 0xd5, + 0x02, 0x72, 0x00, 0x1a, 0x00, 0x2b, 0x00, 0x38, 0x00, 0x76, 0xb9, 0x00, 0x0c, 0xff, 0xd8, 0xb3, + 0x0a, 0x00, 0x4d, 0x0c, 0xb8, 0xff, 0xd0, 0x40, 0x3e, 0x09, 0x00, 0x4d, 0x0b, 0x40, 0x09, 0x00, + 0x4d, 0x2f, 0x46, 0x15, 0x28, 0x46, 0x60, 0x00, 0x01, 0x00, 0x3a, 0x38, 0x44, 0x0d, 0x0a, 0x1c, + 0x1f, 0x44, 0x09, 0x0c, 0x0a, 0x39, 0x40, 0x2c, 0x01, 0x2c, 0x48, 0xd0, 0x1e, 0x01, 0xd0, 0x09, + 0x01, 0x2b, 0x1d, 0x0c, 0x1e, 0x09, 0x18, 0x09, 0x1e, 0x0c, 0x1d, 0x2b, 0x18, 0x06, 0x05, 0x34, + 0x4a, 0x10, 0x03, 0x23, 0x4a, 0x05, 0x09, 0x00, 0x3f, 0xed, 0x3f, 0xed, 0x12, 0x17, 0x39, 0x3d, + 0x2f, 0x18, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x5d, 0x5d, 0xed, 0x5d, 0x01, 0x10, 0xd6, 0xd5, 0x32, + 0xfd, 0xc0, 0x10, 0xd4, 0xed, 0x10, 0xd6, 0x5d, 0xed, 0xd4, 0xed, 0x31, 0x30, 0x2b, 0x2b, 0x2b, + 0x25, 0x14, 0x0e, 0x02, 0x23, 0x22, 0x26, 0x27, 0x35, 0x23, 0x35, 0x33, 0x11, 0x36, 0x36, 0x33, + 0x32, 0x1e, 0x02, 0x15, 0x14, 0x06, 0x07, 0x16, 0x16, 0x25, 0x15, 0x33, 0x15, 0x23, 0x15, 0x16, + 0x16, 0x33, 0x32, 0x3e, 0x02, 0x35, 0x34, 0x26, 0x23, 0x27, 0x32, 0x36, 0x35, 0x34, 0x2e, 0x02, + 0x23, 0x22, 0x06, 0x07, 0x15, 0x01, 0xd5, 0x23, 0x3e, 0x52, 0x30, 0x26, 0x53, 0x29, 0x3e, 0x3e, + 0x21, 0x4f, 0x26, 0x41, 0x52, 0x2e, 0x11, 0x2b, 0x24, 0x3f, 0x2d, 0xfe, 0xf7, 0x42, 0x42, 0x0b, + 0x19, 0x0c, 0x12, 0x22, 0x1b, 0x11, 0x30, 0x29, 0x12, 0x26, 0x29, 0x0c, 0x13, 0x1a, 0x0e, 0x0b, + 0x18, 0x0a, 0xbb, 0x38, 0x4b, 0x2d, 0x13, 0x09, 0x09, 0x8d, 0x4f, 0x01, 0x7d, 0x06, 0x09, 0x1d, + 0x2f, 0x3a, 0x1d, 0x2c, 0x44, 0x14, 0x17, 0x4e, 0x29, 0x29, 0x4f, 0x30, 0x02, 0x02, 0x07, 0x13, + 0x23, 0x1b, 0x2d, 0x27, 0x66, 0x29, 0x24, 0x16, 0x1b, 0x0f, 0x05, 0x02, 0x02, 0x8e, 0x00, 0x00, + 0x00, 0x02, 0x00, 0x12, 0xff, 0xf3, 0x01, 0xe2, 0x02, 0x6b, 0x00, 0x18, 0x00, 0x21, 0x00, 0xa3, + 0xb9, 0x00, 0x16, 0xff, 0xc0, 0xb3, 0x0a, 0x00, 0x4d, 0x15, 0xb8, 0xff, 0xc0, 0xb4, 0x09, 0x0a, + 0x00, 0x4c, 0x14, 0xb8, 0xff, 0xc0, 0x40, 0x1e, 0x09, 0x0a, 0x00, 0x4c, 0x0a, 0x40, 0x0b, 0x00, + 0x4d, 0x09, 0x40, 0x0b, 0x00, 0x4d, 0x06, 0x40, 0x0b, 0x00, 0x4d, 0x05, 0x40, 0x0b, 0x00, 0x4d, + 0x04, 0x40, 0x0b, 0x00, 0x4d, 0x02, 0xb8, 0xff, 0xe0, 0x40, 0x3d, 0x09, 0x0a, 0x00, 0x4c, 0x1d, + 0x0d, 0x44, 0x00, 0x0f, 0x10, 0x0f, 0x02, 0x0f, 0x13, 0x20, 0x11, 0x01, 0x01, 0x11, 0x11, 0x11, + 0x02, 0x11, 0x23, 0x1e, 0x30, 0x0c, 0x01, 0x0c, 0x44, 0x0f, 0x0a, 0x1f, 0x0a, 0x02, 0x0a, 0x0f, + 0x06, 0x1f, 0x06, 0x02, 0x06, 0x08, 0x22, 0x10, 0x09, 0x0d, 0x72, 0x13, 0x06, 0x1d, 0x1d, 0x00, + 0x0e, 0x02, 0x0b, 0x02, 0x19, 0x4a, 0x00, 0x09, 0x00, 0x3f, 0xed, 0x3f, 0x3f, 0x12, 0x39, 0x2f, + 0x33, 0x33, 0xed, 0x32, 0x32, 0x01, 0x10, 0xd6, 0xc5, 0x5d, 0xd6, 0x5d, 0xed, 0x5d, 0x32, 0x10, + 0xd6, 0x71, 0x71, 0xc5, 0xd6, 0x5d, 0xed, 0x32, 0x31, 0x30, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, + 0x2b, 0x2b, 0x2b, 0x17, 0x22, 0x2e, 0x02, 0x35, 0x35, 0x23, 0x35, 0x33, 0x35, 0x33, 0x15, 0x33, + 0x35, 0x33, 0x15, 0x33, 0x15, 0x23, 0x15, 0x14, 0x0e, 0x02, 0x27, 0x32, 0x36, 0x35, 0x35, 0x23, + 0x15, 0x14, 0x16, 0xf6, 0x36, 0x47, 0x2a, 0x12, 0x2b, 0x2b, 0x7b, 0x81, 0x7b, 0x2e, 0x2e, 0x12, + 0x2c, 0x49, 0x35, 0x26, 0x1b, 0x81, 0x1a, 0x0d, 0x21, 0x3e, 0x58, 0x36, 0x44, 0x62, 0xe5, 0xe5, + 0xe5, 0xe5, 0x62, 0x44, 0x36, 0x58, 0x3e, 0x21, 0x6b, 0x3d, 0x4e, 0x3b, 0x3c, 0x4e, 0x3c, 0x00, + 0xff, 0xff, 0x00, 0x09, 0x00, 0x00, 0x01, 0xeb, 0x02, 0x6b, 0x02, 0x06, 0x03, 0x9b, 0x00, 0x00, + 0x00, 0x03, 0x00, 0x36, 0xff, 0xa6, 0x01, 0xee, 0x02, 0xb5, 0x00, 0x0f, 0x00, 0x13, 0x00, 0x17, + 0x00, 0x53, 0x40, 0x32, 0x0a, 0x0e, 0x19, 0x08, 0x07, 0x06, 0x09, 0x12, 0x0c, 0x11, 0x0d, 0x16, + 0x00, 0x01, 0x15, 0x03, 0x02, 0x0e, 0x18, 0x19, 0x17, 0x13, 0x44, 0x05, 0x18, 0x08, 0x07, 0x00, + 0x09, 0x40, 0x10, 0x01, 0x10, 0x48, 0x0c, 0x17, 0x17, 0x04, 0x13, 0x48, 0x05, 0x02, 0x0d, 0x14, + 0x48, 0x04, 0x08, 0x02, 0x01, 0xb6, 0x00, 0x3f, 0xc5, 0x3f, 0xed, 0x32, 0x3f, 0xed, 0x12, 0x39, + 0x2f, 0x33, 0xed, 0x5d, 0x32, 0x3f, 0xc5, 0x01, 0x10, 0xd6, 0xed, 0x32, 0x11, 0x12, 0x17, 0x39, + 0x10, 0xd6, 0xc6, 0x31, 0x30, 0x33, 0x07, 0x27, 0x37, 0x23, 0x11, 0x21, 0x37, 0x17, 0x03, 0x33, + 0x15, 0x23, 0x07, 0x33, 0x15, 0x01, 0x33, 0x37, 0x23, 0x11, 0x33, 0x37, 0x23, 0xef, 0x22, 0x4c, + 0x19, 0x64, 0x01, 0x4e, 0x1c, 0x4e, 0x6f, 0x31, 0x57, 0x42, 0xb5, 0xfe, 0xe5, 0x77, 0x35, 0xac, + 0x0f, 0x42, 0x51, 0x5a, 0x1b, 0x3f, 0x02, 0x6b, 0x4a, 0x1a, 0xfe, 0xdf, 0x66, 0xae, 0x66, 0x01, + 0x7a, 0x8b, 0xfe, 0x61, 0xae, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x16, 0xff, 0xb0, 0x01, 0xdb, + 0x02, 0x24, 0x00, 0x23, 0x00, 0x2d, 0x00, 0x32, 0x00, 0x37, 0x00, 0x75, 0x40, 0x4a, 0x2e, 0x53, + 0x18, 0x20, 0x10, 0x40, 0x10, 0x60, 0x10, 0x80, 0x10, 0x04, 0x10, 0x39, 0x12, 0x24, 0x1e, 0x37, + 0x1f, 0x36, 0x21, 0x20, 0x08, 0x38, 0x09, 0x0a, 0x31, 0x08, 0x32, 0x07, 0x11, 0x07, 0x39, 0x25, + 0x25, 0x38, 0x39, 0x33, 0x2d, 0x53, 0x00, 0x38, 0x36, 0x57, 0x21, 0x07, 0x1f, 0xb6, 0x37, 0x11, + 0x73, 0x24, 0x32, 0x32, 0x05, 0x18, 0x3f, 0x14, 0x01, 0x14, 0x57, 0x1b, 0x07, 0x0a, 0x0a, 0x08, + 0xac, 0x4f, 0x28, 0x01, 0x28, 0x57, 0x05, 0x0b, 0x00, 0x3f, 0xed, 0x5d, 0x3f, 0x3f, 0x3f, 0xed, + 0x5d, 0xc5, 0x12, 0x39, 0x2f, 0x33, 0xed, 0x32, 0x3f, 0x3f, 0xed, 0x01, 0x10, 0xd6, 0xfd, 0xc5, + 0x11, 0x12, 0x39, 0x2f, 0x12, 0x17, 0x39, 0x12, 0x17, 0x39, 0x10, 0xd6, 0x5d, 0xc6, 0xed, 0x31, + 0x30, 0x37, 0x34, 0x3e, 0x02, 0x33, 0x32, 0x17, 0x37, 0x17, 0x07, 0x16, 0x16, 0x15, 0x14, 0x06, + 0x07, 0x23, 0x07, 0x16, 0x33, 0x32, 0x36, 0x37, 0x17, 0x06, 0x06, 0x23, 0x22, 0x26, 0x27, 0x07, + 0x27, 0x37, 0x26, 0x26, 0x37, 0x37, 0x22, 0x26, 0x23, 0x22, 0x0e, 0x02, 0x07, 0x33, 0x26, 0x26, + 0x27, 0x07, 0x07, 0x16, 0x16, 0x17, 0x37, 0x16, 0x26, 0x3f, 0x50, 0x2a, 0x1c, 0x14, 0x16, 0x47, + 0x16, 0x36, 0x39, 0x02, 0x01, 0xc2, 0x1c, 0x16, 0x20, 0x25, 0x42, 0x17, 0x11, 0x15, 0x59, 0x33, + 0x15, 0x23, 0x11, 0x19, 0x44, 0x16, 0x3d, 0x3b, 0xcd, 0x20, 0x03, 0x06, 0x04, 0x17, 0x22, 0x17, + 0x0d, 0x03, 0xd0, 0x02, 0x0d, 0x0e, 0x18, 0x98, 0x02, 0x0c, 0x0d, 0x14, 0xe7, 0x3e, 0x5e, 0x3f, + 0x20, 0x03, 0x45, 0x16, 0x40, 0x1a, 0x6e, 0x55, 0x0b, 0x19, 0x0b, 0x56, 0x06, 0x0d, 0x0a, 0x6c, + 0x0b, 0x13, 0x04, 0x04, 0x4b, 0x17, 0x46, 0x1d, 0x74, 0x76, 0x62, 0x01, 0x11, 0x1c, 0x24, 0x12, + 0x14, 0x27, 0x10, 0x4b, 0x52, 0x12, 0x20, 0x0b, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x2a, + 0xff, 0xf3, 0x01, 0xe2, 0x02, 0x6b, 0x00, 0x1b, 0x00, 0x3a, 0x40, 0x1e, 0x15, 0x14, 0x18, 0x44, + 0x03, 0x1b, 0x01, 0x1d, 0x19, 0x0c, 0x1c, 0x00, 0x40, 0x17, 0x01, 0x17, 0x72, 0x03, 0x14, 0x14, + 0x09, 0x18, 0x48, 0x1a, 0x02, 0x0d, 0x10, 0x4a, 0x09, 0x09, 0x00, 0x3f, 0xfd, 0xc6, 0x3f, 0xed, + 0x12, 0x39, 0x2f, 0x33, 0xed, 0x5d, 0x32, 0x01, 0x10, 0xc6, 0xc6, 0x10, 0xd6, 0xde, 0xc0, 0xfd, + 0xd0, 0xc5, 0x31, 0x30, 0x01, 0x33, 0x15, 0x23, 0x15, 0x14, 0x0e, 0x02, 0x23, 0x22, 0x26, 0x27, + 0x37, 0x16, 0x16, 0x33, 0x32, 0x36, 0x35, 0x35, 0x23, 0x35, 0x33, 0x35, 0x23, 0x35, 0x21, 0x01, + 0x9a, 0x48, 0x48, 0x16, 0x31, 0x4e, 0x39, 0x39, 0x4d, 0x1c, 0x2f, 0x17, 0x35, 0x1d, 0x2a, 0x33, + 0x77, 0x77, 0xc4, 0x01, 0x3f, 0x01, 0x78, 0x62, 0x47, 0x2d, 0x50, 0x3c, 0x23, 0x20, 0x17, 0x62, + 0x10, 0x1e, 0x33, 0x45, 0x40, 0x62, 0x8d, 0x66, 0x00, 0x02, 0x00, 0x31, 0xff, 0x56, 0x01, 0xdf, + 0x02, 0xac, 0x00, 0x1b, 0x00, 0x27, 0x00, 0x77, 0x40, 0x10, 0x27, 0x40, 0x14, 0x00, 0x4d, 0x1d, + 0x40, 0x14, 0x00, 0x4d, 0x1c, 0x40, 0x14, 0x00, 0x4d, 0x20, 0xb8, 0xff, 0xc0, 0xb3, 0x14, 0x00, + 0x4d, 0x1f, 0xb8, 0xff, 0xc0, 0xb3, 0x14, 0x00, 0x4d, 0x1e, 0xb8, 0xff, 0xc0, 0xb3, 0x14, 0x00, + 0x4d, 0x1d, 0xb8, 0xff, 0xc0, 0x40, 0x24, 0x14, 0x00, 0x4d, 0x1c, 0x54, 0x22, 0x28, 0x10, 0x44, + 0x1b, 0x19, 0x18, 0x44, 0x14, 0x15, 0x11, 0x08, 0x28, 0x1f, 0x58, 0x25, 0x00, 0x1b, 0x11, 0x73, + 0x18, 0x12, 0x15, 0x48, 0x16, 0x0a, 0x09, 0x0c, 0x4a, 0x05, 0x92, 0x00, 0x3f, 0xfd, 0xc6, 0x3f, + 0xfd, 0xd6, 0x32, 0xed, 0x32, 0x3f, 0xed, 0x01, 0x10, 0xc6, 0xd6, 0xd0, 0xd5, 0xfd, 0xcd, 0xd0, + 0xed, 0x10, 0xd4, 0xed, 0x31, 0x30, 0x00, 0x2b, 0x2b, 0x2b, 0x2b, 0x01, 0x2b, 0x2b, 0x2b, 0x25, + 0x14, 0x0e, 0x02, 0x23, 0x22, 0x26, 0x27, 0x37, 0x16, 0x16, 0x33, 0x32, 0x36, 0x35, 0x35, 0x23, + 0x35, 0x33, 0x35, 0x23, 0x35, 0x21, 0x15, 0x33, 0x15, 0x23, 0x03, 0x14, 0x06, 0x23, 0x22, 0x26, + 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x01, 0x90, 0x1c, 0x31, 0x43, 0x27, 0x30, 0x52, 0x26, 0x26, + 0x19, 0x47, 0x1d, 0x1f, 0x22, 0xbe, 0xbe, 0xbe, 0x01, 0x39, 0x4f, 0x4f, 0x0f, 0x2e, 0x20, 0x20, + 0x2d, 0x2d, 0x20, 0x20, 0x2e, 0x1f, 0x39, 0x4d, 0x2f, 0x14, 0x18, 0x13, 0x68, 0x0e, 0x19, 0x25, + 0x32, 0xaf, 0x53, 0x55, 0x66, 0xbb, 0x53, 0x01, 0x95, 0x24, 0x2a, 0x2a, 0x24, 0x25, 0x2a, 0x2a, + 0x00, 0x02, 0x00, 0x1b, 0xff, 0x59, 0x02, 0x0a, 0x02, 0x79, 0x00, 0x1c, 0x00, 0x30, 0x00, 0x2a, + 0x40, 0x16, 0x27, 0x46, 0x06, 0x0e, 0x32, 0x1d, 0x46, 0x00, 0x31, 0x22, 0x4a, 0x1a, 0x09, 0x0e, + 0x0a, 0x4a, 0x11, 0x92, 0x2c, 0x4a, 0x03, 0x03, 0x00, 0x3f, 0xed, 0x3f, 0xed, 0xc5, 0x3f, 0xed, + 0x01, 0x10, 0xd6, 0xed, 0x10, 0xc4, 0xd6, 0xed, 0x31, 0x30, 0x13, 0x34, 0x36, 0x33, 0x32, 0x16, + 0x15, 0x11, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x17, 0x06, 0x06, 0x23, 0x22, 0x2e, 0x02, 0x35, + 0x35, 0x06, 0x06, 0x23, 0x22, 0x26, 0x37, 0x14, 0x1e, 0x02, 0x33, 0x32, 0x3e, 0x02, 0x35, 0x34, + 0x2e, 0x02, 0x23, 0x22, 0x0e, 0x02, 0x1b, 0x6c, 0x61, 0x64, 0x6a, 0x10, 0x11, 0x09, 0x12, 0x0b, + 0x0d, 0x13, 0x22, 0x0b, 0x29, 0x34, 0x1d, 0x0b, 0x14, 0x2e, 0x1a, 0x64, 0x6a, 0x7d, 0x06, 0x11, + 0x1f, 0x1a, 0x1a, 0x20, 0x11, 0x06, 0x06, 0x11, 0x20, 0x1a, 0x1a, 0x1f, 0x11, 0x06, 0x01, 0x36, + 0xa0, 0xa3, 0xa3, 0xa0, 0xfe, 0xda, 0x2d, 0x22, 0x02, 0x05, 0x64, 0x08, 0x03, 0x17, 0x2c, 0x3f, + 0x29, 0x0e, 0x11, 0x0e, 0xa3, 0xa0, 0x2d, 0x4f, 0x3a, 0x22, 0x22, 0x3b, 0x4e, 0x2d, 0x2d, 0x4f, + 0x3a, 0x22, 0x22, 0x3b, 0x4e, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1f, 0xff, 0x5b, 0x01, 0xfe, + 0x01, 0xe0, 0x00, 0x1f, 0x00, 0x2c, 0x00, 0x2a, 0x40, 0x16, 0x18, 0x27, 0x51, 0x08, 0x0f, 0x2e, + 0x20, 0x53, 0x00, 0x2d, 0x23, 0x57, 0x1b, 0x07, 0x0c, 0x4a, 0x14, 0x92, 0x2a, 0x57, 0x05, 0x0b, + 0x00, 0x3f, 0xed, 0x3f, 0xed, 0x3f, 0xed, 0x01, 0x10, 0xd6, 0xed, 0x10, 0xc6, 0xd6, 0xfd, 0xc0, + 0x31, 0x30, 0x37, 0x34, 0x3e, 0x02, 0x33, 0x32, 0x16, 0x17, 0x11, 0x14, 0x16, 0x33, 0x32, 0x37, + 0x17, 0x0e, 0x03, 0x23, 0x22, 0x26, 0x35, 0x35, 0x06, 0x06, 0x23, 0x22, 0x2e, 0x02, 0x37, 0x14, + 0x16, 0x33, 0x32, 0x36, 0x37, 0x11, 0x26, 0x26, 0x23, 0x22, 0x06, 0x1f, 0x1c, 0x37, 0x50, 0x34, + 0x2d, 0x62, 0x20, 0x0c, 0x14, 0x14, 0x12, 0x13, 0x0a, 0x18, 0x18, 0x14, 0x06, 0x3f, 0x42, 0x15, + 0x2f, 0x16, 0x2c, 0x41, 0x2d, 0x16, 0x7d, 0x26, 0x26, 0x13, 0x22, 0x0c, 0x08, 0x1c, 0x0e, 0x2d, + 0x2e, 0xeb, 0x36, 0x5b, 0x40, 0x24, 0x0e, 0x0b, 0xfe, 0x42, 0x1d, 0x23, 0x06, 0x67, 0x04, 0x05, + 0x03, 0x01, 0x45, 0x51, 0x1c, 0x0b, 0x0d, 0x23, 0x40, 0x5b, 0x34, 0x41, 0x47, 0x0a, 0x08, 0x01, + 0x02, 0x01, 0x03, 0x51, 0x00, 0x02, 0x00, 0x12, 0x00, 0x00, 0x01, 0xe0, 0x02, 0x72, 0x00, 0x1b, + 0x00, 0x25, 0x00, 0x4e, 0x40, 0x2e, 0x0d, 0x40, 0x0b, 0x00, 0x4d, 0x0f, 0x0c, 0x44, 0x0b, 0x1c, + 0x46, 0x03, 0x06, 0x60, 0x0b, 0x80, 0x0b, 0xa0, 0x0b, 0xb0, 0x0b, 0x04, 0x0b, 0x27, 0x22, 0x10, + 0x44, 0x16, 0x13, 0x14, 0x26, 0x11, 0x08, 0x13, 0x0f, 0x48, 0x16, 0x23, 0x23, 0x00, 0x0c, 0x08, + 0x1f, 0x4a, 0x00, 0x03, 0x00, 0x3f, 0xed, 0x3f, 0x12, 0x39, 0x2f, 0x33, 0xed, 0x32, 0x3f, 0x01, + 0x10, 0xd6, 0xdd, 0xc0, 0xfd, 0xc0, 0x10, 0xd6, 0x5d, 0x32, 0xd6, 0xed, 0x10, 0xed, 0x32, 0x31, + 0x30, 0x2b, 0x13, 0x32, 0x16, 0x15, 0x14, 0x06, 0x07, 0x1e, 0x03, 0x17, 0x23, 0x26, 0x26, 0x27, + 0x23, 0x15, 0x23, 0x35, 0x23, 0x35, 0x33, 0x11, 0x3e, 0x03, 0x17, 0x34, 0x26, 0x23, 0x22, 0x07, + 0x15, 0x33, 0x32, 0x36, 0xf2, 0x5d, 0x71, 0x2c, 0x33, 0x10, 0x23, 0x22, 0x1e, 0x0c, 0x81, 0x17, + 0x34, 0x23, 0x1c, 0x7b, 0x48, 0x48, 0x11, 0x29, 0x29, 0x27, 0x5f, 0x2d, 0x24, 0x0d, 0x10, 0x13, + 0x30, 0x2b, 0x02, 0x72, 0x63, 0x68, 0x36, 0x58, 0x17, 0x1a, 0x3f, 0x45, 0x45, 0x1f, 0x3c, 0x6f, + 0x39, 0xe4, 0xe4, 0x66, 0x01, 0x18, 0x04, 0x07, 0x03, 0x02, 0xca, 0x31, 0x2e, 0x03, 0xba, 0x31, + 0x00, 0x01, 0x00, 0x12, 0x00, 0x00, 0x01, 0xcb, 0x01, 0xdf, 0x00, 0x1b, 0x00, 0x35, 0x40, 0x1b, + 0x1b, 0x08, 0x0b, 0x0c, 0x51, 0x12, 0x0f, 0x10, 0x1c, 0x0f, 0x0b, 0x73, 0x12, 0x0a, 0x0a, 0x16, + 0x0d, 0x00, 0x2f, 0x05, 0x01, 0x05, 0x53, 0x16, 0x0b, 0x0d, 0x08, 0x00, 0x3f, 0x3f, 0xfd, 0x5d, + 0xc6, 0x11, 0x12, 0x39, 0x2f, 0x33, 0xed, 0x32, 0x01, 0x10, 0xd6, 0xd5, 0xc0, 0xfd, 0xc5, 0xd0, + 0xc5, 0x31, 0x30, 0x01, 0x2e, 0x03, 0x23, 0x22, 0x06, 0x07, 0x15, 0x33, 0x15, 0x23, 0x15, 0x23, + 0x35, 0x23, 0x35, 0x33, 0x35, 0x36, 0x36, 0x33, 0x32, 0x1e, 0x02, 0x17, 0x01, 0xb5, 0x0c, 0x20, + 0x23, 0x20, 0x0b, 0x1b, 0x39, 0x1d, 0xab, 0xab, 0x7b, 0x3d, 0x3d, 0x31, 0x71, 0x45, 0x0a, 0x27, + 0x2c, 0x2a, 0x0e, 0x01, 0x5b, 0x03, 0x05, 0x04, 0x02, 0x05, 0x08, 0x5c, 0x53, 0xad, 0xad, 0x53, + 0xb7, 0x12, 0x16, 0x01, 0x04, 0x06, 0x04, 0x00, 0x00, 0x02, 0x00, 0x09, 0x00, 0x00, 0x01, 0xeb, + 0x02, 0x6b, 0x00, 0x19, 0x00, 0x20, 0x00, 0xb2, 0xb9, 0x00, 0x1f, 0xff, 0xc0, 0x40, 0x1d, 0x0f, + 0x00, 0x4d, 0x1d, 0x20, 0x10, 0x00, 0x4d, 0x1c, 0x40, 0x0f, 0x00, 0x4d, 0x1c, 0x40, 0x0c, 0x00, + 0x4d, 0x1c, 0x20, 0x0b, 0x00, 0x4d, 0x14, 0x20, 0x0c, 0x00, 0x4d, 0x0f, 0xb8, 0xff, 0xe0, 0xb3, + 0x0c, 0x00, 0x4d, 0x0e, 0xb8, 0xff, 0xd0, 0xb3, 0x0c, 0x00, 0x4d, 0x08, 0xb8, 0xff, 0xe0, 0x40, + 0x3f, 0x0e, 0x00, 0x4d, 0x01, 0x20, 0x0d, 0x00, 0x4d, 0x15, 0x16, 0x22, 0x1e, 0x11, 0x09, 0x0c, + 0x04, 0x0a, 0x17, 0x00, 0x12, 0x1d, 0x04, 0x1a, 0x19, 0x0a, 0x19, 0x1a, 0x19, 0x1a, 0x0a, 0x03, + 0x21, 0x22, 0x0e, 0x0d, 0x21, 0x04, 0x44, 0x05, 0x21, 0x0c, 0x12, 0x12, 0x17, 0x09, 0x1d, 0x1d, + 0x00, 0x73, 0x03, 0x06, 0x1a, 0x17, 0x1a, 0x17, 0x1a, 0x04, 0x15, 0x02, 0x0e, 0x02, 0x04, 0x08, + 0x00, 0x3f, 0x3f, 0x3f, 0x12, 0x39, 0x39, 0x2f, 0x2f, 0x11, 0x39, 0x39, 0xed, 0x32, 0x11, 0x33, + 0x11, 0x33, 0x11, 0x33, 0x01, 0x10, 0xd6, 0xed, 0x10, 0xdc, 0xcd, 0x11, 0x12, 0x17, 0x39, 0x3d, + 0x2f, 0x18, 0x2f, 0x2f, 0x11, 0x12, 0x17, 0x39, 0x11, 0x17, 0x39, 0x10, 0xdc, 0xc5, 0x31, 0x30, + 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x01, 0x06, 0x06, 0x07, 0x15, 0x23, + 0x35, 0x26, 0x26, 0x27, 0x23, 0x35, 0x33, 0x27, 0x33, 0x16, 0x16, 0x17, 0x33, 0x36, 0x36, 0x37, + 0x33, 0x07, 0x33, 0x15, 0x07, 0x36, 0x36, 0x37, 0x23, 0x16, 0x16, 0x01, 0x95, 0x13, 0x2e, 0x1b, + 0x7c, 0x1a, 0x2d, 0x13, 0x5a, 0x35, 0x29, 0x85, 0x08, 0x10, 0x09, 0x84, 0x08, 0x11, 0x08, 0x7f, + 0x28, 0x34, 0xed, 0x08, 0x14, 0x08, 0x4c, 0x09, 0x14, 0x01, 0xa8, 0x2d, 0x61, 0x2e, 0xec, 0xeb, + 0x2e, 0x62, 0x2d, 0x58, 0x6b, 0x1a, 0x37, 0x1a, 0x1c, 0x38, 0x17, 0x6b, 0x58, 0x61, 0x10, 0x36, + 0x1b, 0x18, 0x35, 0x00, 0x00, 0x02, 0x00, 0x09, 0xff, 0x58, 0x01, 0xeb, 0x01, 0xd6, 0x00, 0x27, + 0x00, 0x2e, 0x00, 0x85, 0x40, 0x17, 0x2a, 0x40, 0x0b, 0x0c, 0x00, 0x4c, 0x27, 0x40, 0x0c, 0x00, + 0x4d, 0x27, 0x38, 0x0b, 0x00, 0x4d, 0x26, 0x20, 0x0b, 0x0c, 0x00, 0x4c, 0x21, 0xb8, 0xff, 0xc0, + 0xb4, 0x0b, 0x0c, 0x00, 0x4c, 0x20, 0xb8, 0xff, 0xc0, 0x40, 0x32, 0x0b, 0x0c, 0x00, 0x4c, 0x27, + 0x51, 0x00, 0x02, 0x30, 0x2c, 0x16, 0x19, 0x1c, 0x04, 0x2f, 0x01, 0x04, 0x07, 0x24, 0x2b, 0x05, + 0x30, 0x28, 0x28, 0x2f, 0x30, 0x20, 0x51, 0x1f, 0x1b, 0x0f, 0x2f, 0x2b, 0x2b, 0x19, 0x19, 0x04, + 0x7d, 0x1c, 0x01, 0x24, 0x27, 0x0a, 0x20, 0x0a, 0x10, 0x13, 0x4a, 0x0c, 0x0f, 0x00, 0x3f, 0xfd, + 0xc6, 0x3f, 0x3f, 0xd4, 0x32, 0x32, 0xed, 0x32, 0x2f, 0x32, 0x2f, 0x01, 0x10, 0xc6, 0xd6, 0xde, + 0xed, 0x11, 0x12, 0x39, 0x3d, 0x2f, 0x12, 0x17, 0x39, 0x12, 0x17, 0x39, 0x18, 0x10, 0xd6, 0xde, + 0xed, 0x31, 0x30, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x01, 0x07, 0x33, 0x15, 0x23, 0x06, 0x06, + 0x07, 0x0e, 0x03, 0x23, 0x22, 0x26, 0x27, 0x37, 0x16, 0x16, 0x33, 0x32, 0x36, 0x37, 0x26, 0x26, + 0x27, 0x23, 0x35, 0x33, 0x26, 0x26, 0x27, 0x33, 0x16, 0x16, 0x17, 0x33, 0x36, 0x36, 0x37, 0x03, + 0x36, 0x36, 0x37, 0x23, 0x16, 0x16, 0x01, 0xcf, 0x26, 0x42, 0x56, 0x14, 0x2f, 0x1a, 0x13, 0x25, + 0x2d, 0x37, 0x25, 0x1f, 0x33, 0x11, 0x17, 0x14, 0x1f, 0x12, 0x24, 0x2c, 0x0d, 0x18, 0x33, 0x17, + 0x62, 0x46, 0x0b, 0x15, 0x0a, 0x80, 0x08, 0x13, 0x0c, 0x69, 0x08, 0x0d, 0x08, 0x47, 0x06, 0x0e, + 0x05, 0x3f, 0x09, 0x14, 0x01, 0xd6, 0x92, 0x4e, 0x43, 0x87, 0x3b, 0x28, 0x3a, 0x25, 0x12, 0x0a, + 0x08, 0x67, 0x09, 0x07, 0x30, 0x21, 0x30, 0x74, 0x40, 0x4e, 0x23, 0x49, 0x26, 0x22, 0x4a, 0x26, + 0x24, 0x4a, 0x24, 0xfe, 0xbf, 0x16, 0x33, 0x18, 0x19, 0x33, 0x00, 0x00, 0x00, 0x01, 0x00, 0x1f, + 0xff, 0x5b, 0x01, 0xba, 0x01, 0xd6, 0x00, 0x25, 0x00, 0x40, 0x40, 0x21, 0x21, 0x53, 0x09, 0x13, + 0x27, 0x0e, 0x05, 0x00, 0x00, 0x27, 0x1b, 0x06, 0x26, 0x1c, 0x1f, 0x57, 0x16, 0x0e, 0x00, 0x25, + 0x25, 0x00, 0x0e, 0x03, 0x08, 0x16, 0x0f, 0x08, 0x0a, 0x06, 0x55, 0x07, 0x0a, 0x00, 0x3f, 0xed, + 0x3f, 0x3f, 0x12, 0x17, 0x39, 0x2f, 0x2f, 0x2f, 0x10, 0xfd, 0xc6, 0x01, 0x10, 0xc6, 0xc6, 0x12, + 0x39, 0x2f, 0x39, 0x39, 0x10, 0xd6, 0xc4, 0xed, 0x31, 0x30, 0x37, 0x3e, 0x03, 0x37, 0x23, 0x35, + 0x21, 0x15, 0x0e, 0x03, 0x07, 0x1e, 0x03, 0x15, 0x14, 0x06, 0x23, 0x22, 0x2e, 0x02, 0x27, 0x37, + 0x16, 0x16, 0x33, 0x32, 0x35, 0x34, 0x26, 0x23, 0x23, 0x92, 0x0f, 0x26, 0x27, 0x24, 0x0d, 0xe9, + 0x01, 0x7a, 0x0b, 0x22, 0x29, 0x2b, 0x13, 0x21, 0x3a, 0x2a, 0x19, 0x7e, 0x70, 0x15, 0x30, 0x2f, + 0x2a, 0x0f, 0x1e, 0x1d, 0x50, 0x23, 0x70, 0x43, 0x40, 0x28, 0xcd, 0x10, 0x2b, 0x2d, 0x2a, 0x11, + 0x66, 0x4b, 0x0f, 0x2b, 0x32, 0x35, 0x18, 0x08, 0x1d, 0x2d, 0x3c, 0x25, 0x63, 0x61, 0x06, 0x09, + 0x0d, 0x08, 0x61, 0x0d, 0x0f, 0x61, 0x35, 0x2f, 0x00, 0x01, 0x00, 0x69, 0x02, 0x0f, 0x01, 0x8b, + 0x02, 0xa3, 0x00, 0x13, 0x00, 0x1b, 0x40, 0x0b, 0x07, 0x06, 0x15, 0x0d, 0x0e, 0x14, 0x0d, 0x07, + 0x0a, 0x00, 0x98, 0x00, 0x3f, 0xd5, 0xce, 0xce, 0x01, 0x10, 0xd6, 0xc5, 0x10, 0xd6, 0xc5, 0x31, + 0x30, 0x13, 0x32, 0x1e, 0x02, 0x15, 0x15, 0x23, 0x26, 0x26, 0x23, 0x22, 0x06, 0x07, 0x23, 0x35, + 0x34, 0x3e, 0x02, 0xfa, 0x1f, 0x35, 0x27, 0x16, 0x5a, 0x03, 0x1e, 0x16, 0x16, 0x1e, 0x02, 0x5b, + 0x16, 0x27, 0x35, 0x02, 0xa3, 0x13, 0x25, 0x34, 0x21, 0x07, 0x26, 0x19, 0x19, 0x26, 0x07, 0x21, + 0x34, 0x25, 0x13, 0x00, 0x00, 0x02, 0x00, 0x4f, 0x01, 0xff, 0x01, 0xaa, 0x02, 0xb2, 0x00, 0x03, + 0x00, 0x07, 0x00, 0x1a, 0x40, 0x0b, 0x01, 0x03, 0x05, 0x07, 0x08, 0x06, 0x04, 0x9f, 0x02, 0x00, + 0x9f, 0x00, 0x3f, 0xc5, 0x3f, 0xc5, 0x01, 0x10, 0xd6, 0xd5, 0xd6, 0xc5, 0x31, 0x30, 0x01, 0x17, + 0x07, 0x27, 0x27, 0x17, 0x07, 0x27, 0x01, 0x3e, 0x6c, 0x36, 0x7a, 0x67, 0x6c, 0x36, 0x7a, 0x02, + 0xb2, 0x88, 0x2b, 0x70, 0x43, 0x88, 0x2b, 0x70, 0x00, 0x03, 0x00, 0xa1, 0x02, 0x07, 0x01, 0x56, + 0x03, 0x3e, 0x00, 0x03, 0x00, 0x17, 0x00, 0x23, 0x00, 0x2b, 0x40, 0x16, 0x04, 0x82, 0xcf, 0x18, + 0x01, 0x18, 0x1e, 0x82, 0x0e, 0x24, 0x00, 0x02, 0x24, 0x09, 0x81, 0x21, 0x1b, 0x81, 0x13, 0x01, + 0x03, 0x86, 0x00, 0x3f, 0xd5, 0xde, 0xfd, 0xd6, 0xed, 0x01, 0x10, 0xd6, 0xc5, 0x10, 0xd6, 0xfd, + 0xd6, 0x5d, 0xed, 0x31, 0x30, 0x01, 0x07, 0x27, 0x37, 0x17, 0x14, 0x0e, 0x02, 0x23, 0x22, 0x2e, + 0x02, 0x35, 0x34, 0x3e, 0x02, 0x33, 0x32, 0x1e, 0x02, 0x07, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, + 0x14, 0x16, 0x33, 0x32, 0x36, 0x01, 0x52, 0x98, 0x18, 0x91, 0x23, 0x0f, 0x1a, 0x20, 0x12, 0x12, + 0x20, 0x19, 0x0f, 0x0f, 0x19, 0x20, 0x12, 0x12, 0x20, 0x1a, 0x0f, 0x38, 0x15, 0x0e, 0x0d, 0x16, + 0x16, 0x0d, 0x0e, 0x15, 0x02, 0xfd, 0x39, 0x2f, 0x4b, 0xdf, 0x15, 0x21, 0x17, 0x0b, 0x0b, 0x17, + 0x21, 0x15, 0x15, 0x21, 0x17, 0x0b, 0x0b, 0x17, 0x21, 0x15, 0x12, 0x13, 0x13, 0x12, 0x12, 0x13, + 0x13, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x6d, 0x02, 0x0b, 0x01, 0x87, 0x02, 0xdc, 0x00, 0x0b, + 0x00, 0x17, 0x00, 0x1b, 0x00, 0x3e, 0x40, 0x25, 0x1a, 0xb0, 0x1b, 0x01, 0x6f, 0x1b, 0x01, 0x30, + 0x1b, 0x01, 0x1b, 0x1c, 0x0c, 0x4a, 0x12, 0x00, 0x4a, 0xcf, 0x06, 0xdf, 0x06, 0x02, 0x50, 0x06, + 0x01, 0x06, 0x1c, 0x19, 0x1a, 0x0f, 0x4a, 0x15, 0x8b, 0x03, 0x4a, 0x09, 0x8b, 0x00, 0x3f, 0xed, + 0x3f, 0xed, 0xde, 0xc5, 0x01, 0x10, 0xd6, 0x5d, 0x5d, 0xfd, 0xd6, 0xed, 0x10, 0xd4, 0x5d, 0x5d, + 0x5d, 0xcd, 0x31, 0x30, 0x13, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, + 0x17, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x25, 0x33, 0x15, 0x23, + 0xdf, 0x22, 0x17, 0x18, 0x21, 0x21, 0x18, 0x17, 0x22, 0xa8, 0x22, 0x17, 0x17, 0x22, 0x22, 0x17, + 0x17, 0x22, 0xfe, 0xfe, 0xe8, 0xe8, 0x02, 0x44, 0x1a, 0x1f, 0x1f, 0x1a, 0x1a, 0x1e, 0x1e, 0x1a, + 0x1a, 0x1f, 0x1f, 0x1a, 0x1a, 0x1e, 0x1e, 0x7e, 0x47, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x86, + 0x02, 0x0c, 0x01, 0x6e, 0x02, 0xdc, 0x00, 0x0b, 0x00, 0x0f, 0x00, 0x1b, 0x40, 0x0c, 0x00, 0x4a, + 0x06, 0x0e, 0x0c, 0x10, 0x0c, 0x0f, 0x03, 0x4a, 0x09, 0x8b, 0x00, 0x3f, 0xed, 0xde, 0xc5, 0x01, + 0x10, 0xd6, 0xcd, 0xd4, 0xed, 0x31, 0x30, 0x01, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, + 0x33, 0x32, 0x16, 0x27, 0x33, 0x15, 0x23, 0x01, 0x33, 0x22, 0x17, 0x17, 0x22, 0x22, 0x17, 0x17, + 0x22, 0xad, 0xe8, 0xe8, 0x02, 0x44, 0x1a, 0x1e, 0x1e, 0x1a, 0x1a, 0x1f, 0x1f, 0x7e, 0x47, 0x00, + 0x00, 0x03, 0x00, 0x4a, 0x02, 0x0f, 0x01, 0xa9, 0x03, 0x12, 0x00, 0x03, 0x00, 0x0f, 0x00, 0x1b, + 0x00, 0x2d, 0x40, 0x18, 0x04, 0x4a, 0xa0, 0x0a, 0x01, 0x0a, 0x1d, 0x01, 0x03, 0x16, 0x4a, 0x10, + 0x1c, 0x19, 0x4a, 0x13, 0x8b, 0x0d, 0x4a, 0x07, 0x8b, 0x02, 0x00, 0xb7, 0x00, 0x3f, 0xc5, 0x3f, + 0xed, 0x3f, 0xed, 0x01, 0x10, 0xd6, 0xed, 0xd4, 0xc5, 0x10, 0xd6, 0x5d, 0xed, 0x31, 0x30, 0x13, + 0x17, 0x07, 0x27, 0x17, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x27, + 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0xc5, 0x6b, 0x39, 0x78, 0xb8, + 0x22, 0x17, 0x18, 0x21, 0x21, 0x18, 0x17, 0x22, 0xed, 0x22, 0x17, 0x18, 0x21, 0x21, 0x18, 0x17, + 0x22, 0x03, 0x12, 0x98, 0x2a, 0x89, 0x92, 0x1a, 0x1e, 0x1e, 0x1a, 0x1a, 0x1e, 0x1e, 0x1a, 0x1a, + 0x1e, 0x1e, 0x1a, 0x1a, 0x1e, 0x1e, 0x00, 0x00, 0x00, 0x03, 0x00, 0x4a, 0x02, 0x0f, 0x01, 0xa9, + 0x03, 0x12, 0x00, 0x03, 0x00, 0x0f, 0x00, 0x1b, 0x00, 0x37, 0x40, 0x21, 0x10, 0x4a, 0xaf, 0x16, + 0xbf, 0x16, 0xff, 0x16, 0x03, 0x16, 0x04, 0x4a, 0x0a, 0x1c, 0x00, 0xb0, 0x02, 0xe0, 0x02, 0x02, + 0x02, 0x1c, 0x13, 0x4a, 0x19, 0x8b, 0x07, 0x4a, 0x0d, 0x8b, 0x01, 0x03, 0xb7, 0x00, 0x3f, 0xc5, + 0x3f, 0xed, 0x3f, 0xed, 0x01, 0x10, 0xd4, 0x5d, 0xc5, 0x10, 0xd6, 0xfd, 0xd6, 0x5d, 0xed, 0x31, + 0x30, 0x01, 0x07, 0x27, 0x37, 0x07, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, + 0x16, 0x17, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x01, 0x74, 0x78, + 0x38, 0x6a, 0x72, 0x21, 0x18, 0x18, 0x21, 0x21, 0x18, 0x18, 0x21, 0xed, 0x22, 0x17, 0x17, 0x22, + 0x22, 0x17, 0x17, 0x22, 0x02, 0xd9, 0x89, 0x2a, 0x98, 0xcb, 0x1a, 0x1e, 0x1e, 0x1a, 0x1a, 0x1e, + 0x1e, 0x1a, 0x1a, 0x1e, 0x1e, 0x1a, 0x1a, 0x1e, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x4a, + 0x02, 0x0f, 0x01, 0xa9, 0x03, 0x00, 0x00, 0x0b, 0x00, 0x17, 0x00, 0x1d, 0x00, 0x4a, 0xb9, 0x00, + 0x1a, 0xff, 0xc0, 0xb4, 0x0f, 0x00, 0x4d, 0x1c, 0x18, 0xb8, 0xff, 0xc0, 0x40, 0x22, 0x1e, 0x21, + 0x48, 0x18, 0x1e, 0x0c, 0x4a, 0xaf, 0x12, 0xbf, 0x12, 0xdf, 0x12, 0xff, 0x12, 0x04, 0x12, 0x00, + 0x4a, 0x06, 0x1e, 0x1b, 0x1a, 0x19, 0x1d, 0xb4, 0x0f, 0x4a, 0x15, 0x8b, 0x03, 0x4a, 0x09, 0x8b, + 0x00, 0x3f, 0xed, 0x3f, 0xed, 0x3f, 0xc5, 0xc5, 0xc5, 0x01, 0x10, 0xd6, 0xfd, 0xd6, 0x5d, 0xed, + 0x10, 0xd4, 0x2b, 0xc4, 0x31, 0x30, 0x00, 0x2b, 0x13, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, + 0x36, 0x33, 0x32, 0x16, 0x17, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, + 0x25, 0x37, 0x17, 0x37, 0x17, 0x07, 0xbc, 0x21, 0x18, 0x18, 0x21, 0x21, 0x18, 0x18, 0x21, 0xed, + 0x22, 0x17, 0x17, 0x22, 0x22, 0x17, 0x17, 0x22, 0xfe, 0xce, 0x2c, 0x55, 0x57, 0x2d, 0x84, 0x02, + 0x47, 0x1a, 0x1e, 0x1e, 0x1a, 0x1a, 0x1e, 0x1e, 0x1a, 0x1a, 0x1e, 0x1e, 0x1a, 0x1a, 0x1e, 0x1e, + 0x6b, 0x34, 0x41, 0x41, 0x34, 0x72, 0x00, 0x00, 0x00, 0x02, 0x00, 0x6f, 0x02, 0x0d, 0x01, 0x85, + 0x02, 0xdc, 0x00, 0x1b, 0x00, 0x1f, 0x00, 0x3e, 0xb9, 0x00, 0x15, 0xff, 0xc0, 0xb3, 0x0a, 0x00, + 0x4d, 0x15, 0xb8, 0xff, 0xe0, 0x40, 0x18, 0x09, 0x00, 0x4d, 0x1e, 0x1c, 0x20, 0x2f, 0x00, 0x3f, + 0x00, 0x02, 0x00, 0x0e, 0x20, 0x05, 0x18, 0x1b, 0x1f, 0x0d, 0x0a, 0x13, 0x1d, 0x1f, 0x98, 0x00, + 0x3f, 0xc5, 0xde, 0xdd, 0xce, 0x10, 0xde, 0xde, 0xc5, 0x01, 0x10, 0xde, 0xcd, 0x5d, 0x10, 0xde, + 0xcd, 0x31, 0x30, 0x00, 0x2b, 0x2b, 0x01, 0x0e, 0x03, 0x23, 0x22, 0x2e, 0x02, 0x23, 0x22, 0x06, + 0x07, 0x27, 0x3e, 0x03, 0x33, 0x32, 0x1e, 0x02, 0x33, 0x32, 0x36, 0x37, 0x27, 0x33, 0x15, 0x23, + 0x01, 0x85, 0x05, 0x10, 0x16, 0x1e, 0x12, 0x0d, 0x18, 0x17, 0x18, 0x0c, 0x10, 0x12, 0x08, 0x31, + 0x04, 0x10, 0x18, 0x1e, 0x12, 0x0d, 0x18, 0x16, 0x17, 0x0d, 0x10, 0x13, 0x08, 0xcf, 0xe8, 0xe8, + 0x02, 0x62, 0x0c, 0x1b, 0x17, 0x10, 0x08, 0x0a, 0x08, 0x13, 0x0e, 0x27, 0x0c, 0x1a, 0x14, 0x0d, + 0x08, 0x0b, 0x08, 0x13, 0x0e, 0x5b, 0x47, 0x00, 0x00, 0x01, 0x00, 0x8b, 0x02, 0xa5, 0x01, 0x69, + 0x03, 0x3d, 0x00, 0x03, 0x00, 0x10, 0xb5, 0x00, 0x02, 0x04, 0x01, 0x03, 0x86, 0x00, 0x3f, 0xcd, + 0x01, 0x10, 0xde, 0xcd, 0x31, 0x30, 0x01, 0x07, 0x27, 0x37, 0x01, 0x69, 0xc3, 0x1b, 0xbe, 0x02, + 0xe3, 0x3e, 0x3e, 0x5a, 0x00, 0x01, 0x00, 0x77, 0x02, 0xa5, 0x01, 0x7d, 0x03, 0x3d, 0x00, 0x05, + 0x00, 0x14, 0xb7, 0x00, 0x04, 0x06, 0x03, 0x01, 0x02, 0x05, 0x86, 0x00, 0x3f, 0xdd, 0xcd, 0xcd, + 0x01, 0x10, 0xd6, 0xc5, 0x31, 0x30, 0x01, 0x07, 0x27, 0x07, 0x27, 0x37, 0x01, 0x7d, 0x26, 0x5c, + 0x5e, 0x26, 0x84, 0x02, 0xde, 0x39, 0x36, 0x36, 0x39, 0x5f, 0x00, 0x00, 0x00, 0x01, 0x00, 0x77, + 0x02, 0xa5, 0x01, 0x7d, 0x03, 0x3d, 0x00, 0x05, 0x00, 0x16, 0x40, 0x09, 0x05, 0x01, 0x06, 0x04, + 0x86, 0x00, 0x03, 0x02, 0x86, 0x00, 0x3f, 0xdd, 0xc5, 0x3f, 0x01, 0x10, 0xd6, 0xc5, 0x31, 0x30, + 0x13, 0x27, 0x37, 0x17, 0x37, 0x17, 0xfb, 0x84, 0x26, 0x5e, 0x5c, 0x26, 0x02, 0xa5, 0x60, 0x38, + 0x36, 0x36, 0x38, 0x00, 0x00, 0x03, 0x00, 0x4d, 0x02, 0x84, 0x01, 0xa7, 0x03, 0x3e, 0x00, 0x0b, + 0x00, 0x17, 0x00, 0x1b, 0x00, 0x43, 0x40, 0x2a, 0x06, 0x4a, 0x4f, 0x00, 0x01, 0x00, 0x4f, 0x19, + 0x01, 0x19, 0x0f, 0x1b, 0x01, 0x1b, 0x12, 0x4a, 0x40, 0x0c, 0x01, 0x0c, 0x1c, 0x1a, 0x18, 0x86, + 0x15, 0x4a, 0xc0, 0x0f, 0xd0, 0x0f, 0x02, 0x0f, 0xb8, 0x09, 0x4a, 0xc0, 0x03, 0xd0, 0x03, 0x02, + 0x03, 0xb8, 0x00, 0x3f, 0x5d, 0xed, 0x3f, 0x5d, 0xed, 0x3f, 0xc5, 0x01, 0x10, 0xd6, 0x5d, 0xed, + 0xd4, 0x71, 0xc5, 0x5d, 0xd4, 0x5d, 0xed, 0x31, 0x30, 0x01, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, + 0x14, 0x06, 0x23, 0x22, 0x26, 0x27, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, + 0x26, 0x37, 0x17, 0x07, 0x27, 0x01, 0x35, 0x22, 0x17, 0x18, 0x21, 0x21, 0x18, 0x17, 0x22, 0xe8, + 0x22, 0x17, 0x17, 0x22, 0x22, 0x17, 0x17, 0x22, 0x93, 0x56, 0x2d, 0x5e, 0x02, 0xbc, 0x1a, 0x1e, + 0x1e, 0x1a, 0x1a, 0x1e, 0x1e, 0x1a, 0x1a, 0x1e, 0x1e, 0x1a, 0x1a, 0x1e, 0x1e, 0x9c, 0x50, 0x35, + 0x45, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x4d, 0x02, 0x84, 0x01, 0xa7, 0x03, 0x3e, 0x00, 0x0b, + 0x00, 0x17, 0x00, 0x1b, 0x00, 0x4b, 0x40, 0x32, 0x0c, 0x4a, 0x2f, 0x12, 0x01, 0x2f, 0x12, 0x3f, + 0x12, 0x4f, 0x12, 0xaf, 0x12, 0xbf, 0x12, 0x05, 0x12, 0x4f, 0x18, 0x01, 0x18, 0x1a, 0x00, 0x4a, + 0x40, 0x06, 0x01, 0x06, 0x1c, 0x19, 0x1b, 0x86, 0x0f, 0x4a, 0xc0, 0x15, 0xd0, 0x15, 0x02, 0x15, + 0xb8, 0x03, 0x4a, 0xc0, 0x09, 0xd0, 0x09, 0x02, 0x09, 0xb8, 0x00, 0x3f, 0x5d, 0xed, 0x3f, 0x5d, + 0xed, 0x3f, 0xc5, 0x01, 0x10, 0xd6, 0x5d, 0xed, 0xd4, 0xc5, 0x5d, 0xd4, 0x5d, 0x71, 0xed, 0x31, + 0x30, 0x13, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x17, 0x14, 0x06, + 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x27, 0x07, 0x27, 0x37, 0xbf, 0x22, 0x17, + 0x18, 0x21, 0x21, 0x18, 0x17, 0x22, 0xe8, 0x22, 0x17, 0x17, 0x22, 0x22, 0x17, 0x17, 0x22, 0x5f, + 0x5d, 0x2d, 0x55, 0x02, 0xbc, 0x1a, 0x1e, 0x1e, 0x1a, 0x1a, 0x1e, 0x1e, 0x1a, 0x1a, 0x1e, 0x1e, + 0x1a, 0x1a, 0x1e, 0x1e, 0x28, 0x45, 0x35, 0x50, 0x00, 0x03, 0x00, 0x4d, 0x02, 0x84, 0x01, 0xa7, + 0x03, 0x3e, 0x00, 0x0b, 0x00, 0x17, 0x00, 0x1d, 0x00, 0x6a, 0x40, 0x4a, 0x12, 0x4a, 0xdf, 0x0c, + 0x01, 0xa0, 0x0c, 0x01, 0x4f, 0x0c, 0x5f, 0x0c, 0x7f, 0x0c, 0x03, 0x0c, 0x1f, 0x4f, 0x1c, 0x5f, + 0x1c, 0x02, 0x1c, 0x18, 0x1e, 0x00, 0x4a, 0x00, 0x06, 0x10, 0x06, 0x02, 0x40, 0x06, 0x50, 0x06, + 0x60, 0x06, 0xb0, 0x06, 0xc0, 0x06, 0x05, 0x06, 0x1e, 0x1b, 0x86, 0x8f, 0x1d, 0x9f, 0x1d, 0x02, + 0x1d, 0x1a, 0x19, 0x86, 0x0f, 0x4a, 0xc0, 0x15, 0xd0, 0x15, 0x02, 0x15, 0xb8, 0x03, 0x4a, 0xc0, + 0x09, 0xd0, 0x09, 0x02, 0x09, 0xb8, 0x00, 0x3f, 0x5d, 0xed, 0x3f, 0x5d, 0xed, 0x3f, 0xdd, 0xc5, + 0x5d, 0x3f, 0x01, 0x10, 0xd6, 0x5d, 0x71, 0xed, 0x10, 0xd4, 0xc5, 0x5d, 0x10, 0xd6, 0x5d, 0x5d, + 0x5d, 0xed, 0x31, 0x30, 0x13, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, + 0x17, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x25, 0x37, 0x17, 0x37, + 0x17, 0x07, 0xbf, 0x22, 0x17, 0x18, 0x21, 0x21, 0x18, 0x17, 0x22, 0xe8, 0x22, 0x17, 0x17, 0x22, + 0x22, 0x17, 0x17, 0x22, 0xfe, 0xfd, 0x25, 0x31, 0x2f, 0x27, 0x56, 0x02, 0xbc, 0x1a, 0x1e, 0x1e, + 0x1a, 0x1a, 0x1e, 0x1e, 0x1a, 0x1a, 0x1e, 0x1e, 0x1a, 0x1a, 0x1e, 0x1e, 0x3a, 0x2e, 0x23, 0x23, + 0x2e, 0x4e, 0x00, 0x00, 0xff, 0xff, 0x00, 0x3f, 0x00, 0x00, 0x01, 0xcc, 0x03, 0x3e, 0x02, 0x26, + 0x00, 0x28, 0x00, 0x00, 0x01, 0x07, 0x00, 0x43, 0x00, 0x00, 0x00, 0x8b, 0x00, 0x10, 0x40, 0x0b, + 0x01, 0x00, 0x0f, 0x0d, 0x00, 0x0a, 0x50, 0x01, 0x01, 0x0e, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x3f, 0x00, 0x00, 0x01, 0xcc, 0x03, 0x2c, 0x02, 0x26, 0x00, 0x28, 0x00, 0x00, + 0x01, 0x07, 0x00, 0x83, 0x00, 0x00, 0x00, 0x8b, 0x00, 0x1a, 0xb1, 0x02, 0x01, 0xb8, 0xff, 0xf6, + 0x40, 0x0d, 0x0e, 0x20, 0x00, 0x0a, 0x50, 0x02, 0x01, 0x18, 0x4f, 0x01, 0x01, 0x0c, 0x4f, 0x2b, + 0x2b, 0x2b, 0x34, 0x34, 0x00, 0x01, 0x00, 0x12, 0xff, 0xfa, 0x01, 0xe7, 0x02, 0x6b, 0x00, 0x23, + 0x00, 0x5a, 0x40, 0x39, 0x19, 0x40, 0x09, 0x00, 0x4d, 0x18, 0x40, 0x09, 0x00, 0x4d, 0x17, 0x40, + 0x09, 0x00, 0x4d, 0x30, 0x0a, 0x01, 0x0f, 0x0a, 0x01, 0x0a, 0x46, 0x18, 0x0f, 0x11, 0x01, 0x11, + 0x1e, 0x01, 0x20, 0x03, 0x01, 0x03, 0x44, 0x21, 0x22, 0x24, 0x20, 0x08, 0x05, 0x4a, 0x1b, 0x1b, + 0x00, 0x15, 0x4a, 0x0f, 0x09, 0x21, 0x4f, 0x02, 0x01, 0x02, 0x48, 0x00, 0x02, 0x00, 0x3f, 0xfd, + 0x5d, 0xc0, 0x3f, 0xed, 0x12, 0x39, 0x2f, 0xed, 0x3f, 0x01, 0x10, 0xd6, 0xd5, 0xfd, 0x5d, 0xc6, + 0xd0, 0xc6, 0x5d, 0xd6, 0xed, 0x5d, 0x5d, 0x31, 0x30, 0x2b, 0x2b, 0x2b, 0x01, 0x15, 0x23, 0x15, + 0x36, 0x33, 0x32, 0x1e, 0x02, 0x15, 0x14, 0x0e, 0x02, 0x23, 0x22, 0x27, 0x37, 0x16, 0x32, 0x33, + 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x11, 0x23, 0x11, 0x23, 0x35, 0x01, 0x87, + 0xaa, 0x1f, 0x1f, 0x2d, 0x4b, 0x36, 0x1e, 0x12, 0x27, 0x40, 0x2d, 0x17, 0x1b, 0x05, 0x07, 0x09, + 0x08, 0x23, 0x25, 0x39, 0x2e, 0x0b, 0x18, 0x0d, 0x7b, 0x50, 0x02, 0x6b, 0x66, 0x85, 0x06, 0x19, + 0x31, 0x49, 0x30, 0x2f, 0x4a, 0x34, 0x1c, 0x03, 0x64, 0x01, 0x26, 0x2f, 0x38, 0x2b, 0x04, 0x02, + 0xfe, 0xee, 0x02, 0x05, 0x66, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x24, 0x00, 0x00, 0x01, 0xe4, + 0x03, 0x3e, 0x02, 0x26, 0x02, 0xc6, 0x00, 0x00, 0x01, 0x07, 0x00, 0x8f, 0x00, 0x3a, 0x00, 0x8b, + 0x00, 0x10, 0x40, 0x0b, 0x01, 0x3b, 0x0c, 0x0a, 0x08, 0x02, 0x50, 0x01, 0x01, 0x0b, 0x4f, 0x2b, + 0x2b, 0x34, 0x00, 0x00, 0x00, 0x01, 0x00, 0x1b, 0xff, 0xf3, 0x01, 0xd5, 0x02, 0x79, 0x00, 0x22, + 0x00, 0x33, 0x40, 0x1a, 0x0d, 0x20, 0x24, 0x17, 0x16, 0x46, 0x19, 0x46, 0x03, 0x23, 0x18, 0x57, + 0x17, 0x17, 0x08, 0x00, 0x0e, 0x11, 0x4a, 0x08, 0x03, 0x1f, 0x1c, 0x4a, 0x00, 0x09, 0x00, 0x3f, + 0xfd, 0xc6, 0x3f, 0xfd, 0xc6, 0x11, 0x12, 0x39, 0x2f, 0xed, 0x01, 0x10, 0xde, 0xed, 0xfd, 0xc5, + 0x10, 0xd6, 0xc6, 0x31, 0x30, 0x05, 0x22, 0x26, 0x35, 0x34, 0x3e, 0x02, 0x33, 0x32, 0x1e, 0x02, + 0x17, 0x07, 0x26, 0x26, 0x23, 0x22, 0x0e, 0x02, 0x07, 0x33, 0x15, 0x23, 0x16, 0x16, 0x33, 0x32, + 0x36, 0x37, 0x17, 0x06, 0x06, 0x01, 0x28, 0x83, 0x8a, 0x2a, 0x4b, 0x67, 0x3d, 0x21, 0x35, 0x28, + 0x1b, 0x07, 0x20, 0x17, 0x41, 0x2a, 0x19, 0x32, 0x2a, 0x1f, 0x06, 0xcc, 0xcd, 0x08, 0x4d, 0x48, + 0x30, 0x3f, 0x13, 0x1f, 0x1a, 0x59, 0x0d, 0xa8, 0x9b, 0x4d, 0x78, 0x53, 0x2b, 0x0b, 0x0e, 0x10, + 0x04, 0x62, 0x0f, 0x15, 0x10, 0x24, 0x3c, 0x2c, 0x6f, 0x50, 0x55, 0x16, 0x0b, 0x61, 0x10, 0x1b, + 0xff, 0xff, 0x00, 0x28, 0xff, 0xf3, 0x01, 0xcc, 0x02, 0x79, 0x02, 0x06, 0x00, 0x36, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x36, 0x00, 0x00, 0x01, 0xbf, 0x02, 0x6b, 0x02, 0x06, 0x00, 0x2c, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x36, 0x00, 0x00, 0x01, 0xbf, 0x03, 0x2c, 0x02, 0x26, 0x00, 0x2c, 0x00, 0x00, + 0x01, 0x07, 0x00, 0x83, 0x00, 0x00, 0x00, 0x8b, 0x00, 0x17, 0x40, 0x10, 0x02, 0x01, 0x01, 0x0e, + 0x20, 0x00, 0x06, 0x50, 0x02, 0x05, 0x18, 0x4f, 0x01, 0x05, 0x0c, 0x4f, 0x2b, 0x2b, 0x2b, 0x34, + 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x2a, 0xff, 0xf3, 0x01, 0xb6, 0x02, 0x6b, 0x02, 0x06, + 0x00, 0x2d, 0x00, 0x00, 0x00, 0x02, 0x00, 0x04, 0xff, 0xf5, 0x01, 0xe0, 0x02, 0x6b, 0x00, 0x1f, + 0x00, 0x2b, 0x00, 0x52, 0x40, 0x33, 0x40, 0x28, 0x50, 0x28, 0x02, 0x28, 0x84, 0xc0, 0x00, 0x01, + 0x00, 0x2d, 0x20, 0x09, 0x85, 0x2f, 0x1b, 0x3f, 0x1b, 0x02, 0x1b, 0x40, 0x0f, 0x13, 0x48, 0x1b, + 0x6f, 0x0a, 0x01, 0x0a, 0x85, 0x1a, 0x11, 0x2c, 0x1d, 0x7d, 0x2b, 0x2b, 0x05, 0x09, 0x73, 0x1b, + 0x02, 0x1a, 0x02, 0x10, 0x09, 0x23, 0x7d, 0x05, 0x09, 0x00, 0x3f, 0xed, 0x3f, 0x3f, 0x3f, 0xed, + 0x12, 0x39, 0x2f, 0xed, 0x01, 0x10, 0xd6, 0xd6, 0xed, 0x5d, 0xd5, 0x2b, 0x71, 0xfd, 0xc5, 0x10, + 0xd6, 0x5d, 0xed, 0x5d, 0x31, 0x30, 0x25, 0x14, 0x0e, 0x02, 0x23, 0x22, 0x26, 0x27, 0x11, 0x23, + 0x15, 0x14, 0x0e, 0x02, 0x07, 0x27, 0x36, 0x36, 0x37, 0x3e, 0x03, 0x35, 0x35, 0x33, 0x15, 0x33, + 0x32, 0x16, 0x27, 0x15, 0x16, 0x33, 0x32, 0x3e, 0x02, 0x35, 0x34, 0x26, 0x23, 0x01, 0xe0, 0x1b, + 0x2d, 0x3c, 0x21, 0x18, 0x2b, 0x22, 0x33, 0x09, 0x1e, 0x3a, 0x30, 0x0e, 0x1b, 0x15, 0x07, 0x05, + 0x06, 0x04, 0x01, 0xe3, 0x13, 0x4e, 0x51, 0xb2, 0x09, 0x09, 0x15, 0x18, 0x0d, 0x04, 0x22, 0x23, + 0xc2, 0x39, 0x4d, 0x2f, 0x13, 0x05, 0x0a, 0x02, 0x0e, 0xac, 0x65, 0x84, 0x53, 0x2d, 0x0d, 0x5d, + 0x09, 0x1b, 0x1b, 0x15, 0x3b, 0x54, 0x72, 0x4d, 0x77, 0xdc, 0x61, 0x11, 0xf2, 0x03, 0x17, 0x23, + 0x2a, 0x14, 0x43, 0x3a, 0x00, 0x02, 0x00, 0x2e, 0xff, 0xfa, 0x01, 0xe0, 0x02, 0x6b, 0x00, 0x16, + 0x00, 0x22, 0x00, 0x69, 0xb9, 0x00, 0x1f, 0xff, 0xc0, 0x40, 0x26, 0x0b, 0x0e, 0x48, 0x1f, 0x84, + 0x80, 0x00, 0xa0, 0x00, 0x02, 0x00, 0x24, 0x17, 0x6f, 0x13, 0x7f, 0x13, 0x8f, 0x13, 0x03, 0x13, + 0x8f, 0x09, 0xa0, 0x10, 0xb0, 0x10, 0x02, 0x10, 0x0a, 0x0e, 0x40, 0x0d, 0x11, 0x48, 0x0e, 0x8f, + 0x0d, 0xb8, 0xff, 0xc0, 0x40, 0x17, 0x0b, 0x13, 0x48, 0x0d, 0x23, 0x14, 0x7d, 0x22, 0x22, 0x05, + 0x12, 0x02, 0x09, 0x7d, 0x0f, 0x0e, 0x02, 0x0b, 0x08, 0x1a, 0x7d, 0x05, 0x09, 0x00, 0x3f, 0xed, + 0x3f, 0x3f, 0xd5, 0xed, 0x3f, 0x12, 0x39, 0x2f, 0xed, 0x01, 0x10, 0xd6, 0x2b, 0xfd, 0x2b, 0x32, + 0xd6, 0x5d, 0x32, 0xfd, 0x5d, 0xc0, 0x10, 0xd6, 0x5d, 0xed, 0x2b, 0x31, 0x30, 0x25, 0x14, 0x0e, + 0x02, 0x23, 0x22, 0x26, 0x27, 0x11, 0x23, 0x11, 0x23, 0x11, 0x33, 0x15, 0x33, 0x35, 0x33, 0x15, + 0x33, 0x32, 0x16, 0x27, 0x15, 0x16, 0x33, 0x32, 0x3e, 0x02, 0x35, 0x34, 0x26, 0x23, 0x01, 0xe0, + 0x1b, 0x2d, 0x3c, 0x21, 0x18, 0x2b, 0x22, 0x51, 0x57, 0x57, 0x51, 0x58, 0x13, 0x4e, 0x51, 0xb2, + 0x09, 0x09, 0x15, 0x18, 0x0d, 0x04, 0x22, 0x23, 0xc2, 0x39, 0x4d, 0x2f, 0x13, 0x05, 0x0a, 0x01, + 0x27, 0xfe, 0xd0, 0x02, 0x6b, 0xe7, 0xe7, 0xdc, 0x61, 0x11, 0xf2, 0x03, 0x17, 0x23, 0x2a, 0x14, + 0x43, 0x3a, 0x00, 0x00, 0x00, 0x01, 0x00, 0x12, 0x00, 0x00, 0x01, 0xc7, 0x02, 0x6b, 0x00, 0x19, + 0x00, 0x3a, 0x40, 0x20, 0x00, 0x44, 0x2f, 0x17, 0x3f, 0x17, 0x02, 0x17, 0x1b, 0x0d, 0x06, 0x0e, + 0x44, 0x09, 0x0a, 0x1a, 0x03, 0x57, 0x12, 0x12, 0x0c, 0x19, 0x08, 0x09, 0x0e, 0x48, 0x0c, 0x02, + 0x0b, 0x02, 0x08, 0x08, 0x00, 0x3f, 0x3f, 0x3f, 0xfd, 0xc0, 0x3f, 0x12, 0x39, 0x2f, 0xed, 0x01, + 0x10, 0xd6, 0xd5, 0xfd, 0x32, 0xc5, 0x10, 0xd6, 0x5d, 0xed, 0x31, 0x30, 0x25, 0x34, 0x26, 0x23, + 0x22, 0x06, 0x07, 0x11, 0x23, 0x11, 0x23, 0x35, 0x21, 0x15, 0x23, 0x15, 0x36, 0x36, 0x33, 0x32, + 0x1e, 0x02, 0x15, 0x15, 0x23, 0x01, 0x4c, 0x1d, 0x20, 0x09, 0x1c, 0x0d, 0x7b, 0x50, 0x01, 0x75, + 0xaa, 0x12, 0x23, 0x0f, 0x25, 0x3d, 0x2c, 0x18, 0x7b, 0xad, 0x3d, 0x2e, 0x04, 0x04, 0xfe, 0xf0, + 0x02, 0x05, 0x66, 0x66, 0x86, 0x04, 0x03, 0x0f, 0x2d, 0x53, 0x43, 0xb4, 0xff, 0xff, 0x00, 0x2d, + 0x00, 0x00, 0x01, 0xe9, 0x03, 0x3e, 0x02, 0x26, 0x00, 0x2e, 0x00, 0x00, 0x01, 0x07, 0x00, 0x8f, + 0x00, 0x00, 0x00, 0x8b, 0x00, 0x13, 0xb9, 0x00, 0x01, 0xff, 0xfb, 0x40, 0x09, 0x1d, 0x1b, 0x07, + 0x1a, 0x50, 0x01, 0x08, 0x1c, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x2e, + 0x00, 0x00, 0x01, 0xc6, 0x03, 0x3e, 0x02, 0x26, 0x02, 0xcb, 0x00, 0x00, 0x01, 0x07, 0x00, 0x43, + 0x00, 0x00, 0x00, 0x8b, 0x00, 0x10, 0x40, 0x0b, 0x01, 0x0b, 0x13, 0x11, 0x00, 0x09, 0x50, 0x01, + 0x01, 0x12, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0x00, 0xff, 0xff, 0x00, 0x05, 0xff, 0xf3, 0x01, 0xee, + 0x03, 0x39, 0x02, 0x26, 0x02, 0xd6, 0x00, 0x00, 0x01, 0x07, 0x03, 0x90, 0x00, 0x00, 0x00, 0x8b, + 0x00, 0x10, 0x40, 0x0b, 0x01, 0x01, 0x26, 0x2e, 0x17, 0x00, 0x50, 0x01, 0x00, 0x21, 0x4f, 0x2b, + 0x2b, 0x34, 0x00, 0x00, 0x00, 0x01, 0x00, 0x2d, 0xff, 0x5b, 0x01, 0xc7, 0x02, 0x6b, 0x00, 0x0b, + 0x00, 0x3e, 0x40, 0x26, 0x09, 0x44, 0x00, 0x0a, 0x10, 0x0a, 0x02, 0x0a, 0x0d, 0x06, 0x44, 0x20, + 0x05, 0x30, 0x05, 0x50, 0x05, 0x03, 0x05, 0x0c, 0x00, 0xa9, 0x50, 0x02, 0x01, 0x02, 0x0c, 0x09, + 0x02, 0x06, 0x02, 0x08, 0x48, 0x00, 0x03, 0x08, 0x01, 0x92, 0x00, 0x3f, 0x3f, 0x33, 0xed, 0x3f, + 0x3f, 0x01, 0x10, 0xd6, 0x5d, 0xed, 0x10, 0xd6, 0x5d, 0xed, 0x10, 0xd6, 0x5d, 0xed, 0x31, 0x30, + 0x21, 0x15, 0x23, 0x35, 0x23, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x01, 0x32, 0x72, 0x93, + 0x7b, 0xa4, 0x7b, 0xa5, 0xa5, 0x02, 0x6b, 0xfd, 0xfb, 0x02, 0x05, 0xfd, 0x95, 0x00, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x09, 0x00, 0x00, 0x01, 0xeb, 0x02, 0x6b, 0x02, 0x06, 0x00, 0x24, 0x00, 0x00, + 0x00, 0x02, 0x00, 0x36, 0xff, 0xf8, 0x01, 0xd5, 0x02, 0x6b, 0x00, 0x10, 0x00, 0x1b, 0x00, 0x44, + 0xb3, 0x14, 0x46, 0x10, 0x07, 0xb8, 0xff, 0xc0, 0x40, 0x09, 0x09, 0x0f, 0x48, 0x07, 0x1d, 0x01, + 0x18, 0x44, 0x0d, 0xb8, 0xff, 0xc0, 0x40, 0x15, 0x0a, 0x0e, 0x48, 0x0d, 0x1c, 0x02, 0x4a, 0x17, + 0x17, 0x0a, 0x4f, 0x00, 0x01, 0x00, 0x48, 0x0e, 0x02, 0x11, 0x4a, 0x0a, 0x09, 0x00, 0x3f, 0xed, + 0x3f, 0xed, 0x5d, 0x12, 0x39, 0x2f, 0xed, 0x01, 0x10, 0xd6, 0x2b, 0xfd, 0xc0, 0x10, 0xd6, 0x2b, + 0xc4, 0xed, 0x31, 0x30, 0x13, 0x15, 0x33, 0x32, 0x1e, 0x02, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, + 0x27, 0x11, 0x21, 0x15, 0x03, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x23, 0x15, 0x16, 0x16, 0xb1, + 0x2e, 0x38, 0x5b, 0x40, 0x23, 0x7d, 0x76, 0x23, 0x5c, 0x2d, 0x01, 0x5f, 0xac, 0x36, 0x3d, 0x40, + 0x41, 0x2a, 0x08, 0x22, 0x02, 0x05, 0x76, 0x15, 0x30, 0x4d, 0x38, 0x67, 0x66, 0x08, 0x0a, 0x02, + 0x61, 0x66, 0xfe, 0x5e, 0x2e, 0x33, 0x36, 0x2a, 0xbd, 0x01, 0x03, 0x00, 0xff, 0xff, 0x00, 0x36, + 0xff, 0xf8, 0x01, 0xd5, 0x02, 0x72, 0x02, 0x06, 0x00, 0x25, 0x00, 0x00, 0x00, 0x01, 0x00, 0x24, + 0x00, 0x00, 0x01, 0xe4, 0x02, 0x6b, 0x00, 0x09, 0x00, 0x35, 0x40, 0x0e, 0x03, 0x04, 0x06, 0x05, + 0x44, 0x00, 0xb0, 0x09, 0xc0, 0x09, 0xd0, 0x09, 0x03, 0x09, 0xb8, 0xff, 0xc0, 0x40, 0x0e, 0x0e, + 0x12, 0x48, 0x09, 0x0a, 0x00, 0x05, 0x48, 0x07, 0x08, 0x04, 0x48, 0x02, 0x02, 0x00, 0x3f, 0xed, + 0x3f, 0xed, 0x32, 0x01, 0x10, 0xd6, 0x2b, 0x5d, 0xd5, 0xfd, 0xc5, 0xd0, 0xc5, 0x31, 0x30, 0x37, + 0x11, 0x21, 0x15, 0x23, 0x11, 0x33, 0x15, 0x21, 0x35, 0x7d, 0x01, 0x67, 0xec, 0x86, 0xfe, 0xa6, + 0x66, 0x02, 0x05, 0x66, 0xfe, 0x61, 0x66, 0x66, 0x00, 0x02, 0x00, 0x0f, 0xff, 0x5b, 0x01, 0xe2, + 0x02, 0x6b, 0x00, 0x10, 0x00, 0x1a, 0x00, 0x9f, 0xb9, 0x00, 0x17, 0xff, 0xc0, 0x40, 0x09, 0x0e, + 0x00, 0x4d, 0x15, 0x20, 0x0d, 0x00, 0x4d, 0x09, 0xb8, 0xff, 0xc0, 0xb3, 0x0d, 0x00, 0x4d, 0x08, + 0xb8, 0xff, 0xc0, 0x40, 0x20, 0x0d, 0x00, 0x4d, 0x07, 0x40, 0x0e, 0x00, 0x4d, 0x06, 0x40, 0x0e, + 0x00, 0x4d, 0x05, 0x40, 0x0e, 0x00, 0x4d, 0x04, 0x40, 0x0e, 0x00, 0x4d, 0x40, 0x1a, 0x01, 0x1a, + 0x44, 0x50, 0x08, 0x01, 0x08, 0xb8, 0xff, 0xc0, 0x40, 0x35, 0x09, 0x0c, 0x48, 0x08, 0x0a, 0x20, + 0x0d, 0x30, 0x0d, 0x40, 0x0d, 0x03, 0x0d, 0xa9, 0x1c, 0x11, 0xa9, 0x4f, 0x07, 0x01, 0x07, 0x00, + 0x18, 0xa9, 0x01, 0x00, 0x2f, 0x0e, 0x3f, 0x0e, 0x4f, 0x0e, 0x03, 0x0e, 0xa9, 0x1b, 0x0f, 0x92, + 0x18, 0x01, 0x48, 0x0e, 0x08, 0x09, 0x48, 0x0d, 0x08, 0x0c, 0x92, 0x1a, 0x48, 0x08, 0x02, 0x00, + 0x3f, 0xed, 0x3f, 0x3f, 0xed, 0x3f, 0xed, 0x32, 0x3f, 0x01, 0x10, 0xec, 0x5d, 0xd6, 0xd5, 0xed, + 0x10, 0xd6, 0x5d, 0xed, 0x10, 0xec, 0x5d, 0xd6, 0xd6, 0x2b, 0x5d, 0xed, 0x5d, 0x31, 0x30, 0x2b, + 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x37, 0x33, 0x3e, 0x03, 0x35, 0x35, 0x21, 0x11, 0x33, + 0x11, 0x23, 0x35, 0x23, 0x15, 0x23, 0x13, 0x14, 0x0e, 0x04, 0x07, 0x33, 0x11, 0x0f, 0x24, 0x1a, + 0x1d, 0x0d, 0x02, 0x01, 0x46, 0x23, 0x72, 0xef, 0x72, 0xda, 0x03, 0x06, 0x09, 0x10, 0x15, 0x0e, + 0x9f, 0x66, 0x2d, 0x75, 0x7d, 0x7a, 0x30, 0x3c, 0xfd, 0xfb, 0xfe, 0xf5, 0xa5, 0xa5, 0x02, 0xaa, + 0x14, 0x3f, 0x4c, 0x54, 0x4f, 0x45, 0x18, 0x01, 0x9f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x3f, + 0x00, 0x00, 0x01, 0xcc, 0x02, 0x6b, 0x02, 0x06, 0x00, 0x28, 0x00, 0x00, 0x00, 0x01, 0x00, 0x09, + 0x00, 0x00, 0x01, 0xeb, 0x02, 0x6b, 0x00, 0x2d, 0x00, 0x64, 0x40, 0x3a, 0x1d, 0x1c, 0x08, 0x07, + 0x85, 0x06, 0x11, 0x17, 0x0d, 0x0e, 0x04, 0x16, 0x24, 0x00, 0x2a, 0x1e, 0x1f, 0x05, 0x06, 0x06, + 0x2d, 0x25, 0x2e, 0x16, 0x06, 0x25, 0x25, 0x06, 0x16, 0x03, 0x2f, 0x2e, 0x24, 0x08, 0x05, 0x08, + 0x11, 0x2a, 0x1c, 0x1f, 0x1f, 0x1c, 0x2a, 0x11, 0x08, 0x05, 0x06, 0x07, 0x1d, 0x08, 0x17, 0x08, + 0x0d, 0x02, 0x07, 0x02, 0x00, 0x02, 0x00, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x12, 0x17, 0x39, 0x2f, + 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x3f, 0x01, 0x11, 0x12, 0x17, 0x39, 0x2f, 0x2f, 0x2f, 0x11, 0x12, + 0x39, 0x11, 0x17, 0x39, 0x12, 0x17, 0x39, 0x10, 0xed, 0x32, 0x32, 0x32, 0x31, 0x30, 0x13, 0x1e, + 0x03, 0x17, 0x35, 0x33, 0x15, 0x3e, 0x03, 0x37, 0x33, 0x06, 0x06, 0x07, 0x1e, 0x03, 0x17, 0x23, + 0x2e, 0x03, 0x27, 0x11, 0x23, 0x11, 0x0e, 0x03, 0x07, 0x23, 0x3e, 0x03, 0x37, 0x26, 0x26, 0x27, + 0x70, 0x0a, 0x14, 0x17, 0x18, 0x0d, 0x60, 0x0d, 0x18, 0x17, 0x15, 0x09, 0x67, 0x19, 0x3e, 0x2d, + 0x15, 0x29, 0x23, 0x1b, 0x08, 0x67, 0x06, 0x14, 0x19, 0x1b, 0x0c, 0x60, 0x0d, 0x1b, 0x18, 0x14, + 0x06, 0x67, 0x08, 0x1b, 0x23, 0x29, 0x15, 0x2a, 0x41, 0x19, 0x02, 0x6b, 0x26, 0x41, 0x3b, 0x39, + 0x1e, 0xf9, 0xfa, 0x1d, 0x39, 0x3c, 0x42, 0x26, 0x47, 0x8e, 0x4f, 0x1d, 0x4a, 0x55, 0x5d, 0x2e, + 0x2a, 0x53, 0x4e, 0x44, 0x1b, 0xfe, 0xd6, 0x01, 0x2a, 0x1b, 0x44, 0x4e, 0x53, 0x2a, 0x2e, 0x5d, + 0x55, 0x4a, 0x1d, 0x51, 0x8e, 0x45, 0x00, 0x00, 0x00, 0x01, 0x00, 0x17, 0xff, 0xf3, 0x01, 0xdf, + 0x02, 0x79, 0x00, 0x32, 0x00, 0xa3, 0xb9, 0x00, 0x32, 0xff, 0xc0, 0xb3, 0x0a, 0x00, 0x4d, 0x00, + 0xb8, 0xff, 0xc0, 0xb3, 0x0a, 0x00, 0x4d, 0x25, 0xb8, 0xff, 0xc0, 0xb3, 0x0d, 0x00, 0x4d, 0x24, + 0xb8, 0xff, 0xc0, 0x40, 0x2f, 0x0d, 0x00, 0x4d, 0x17, 0x20, 0x0e, 0x00, 0x4d, 0x0c, 0x40, 0x0c, + 0x0d, 0x00, 0x4c, 0x0b, 0x20, 0x0d, 0x00, 0x4d, 0x0b, 0x40, 0x0c, 0x00, 0x4d, 0x0a, 0x20, 0x0d, + 0x0f, 0x00, 0x4c, 0x32, 0x2e, 0x46, 0x1b, 0x04, 0x46, 0x15, 0x00, 0x1b, 0x20, 0x1b, 0x40, 0x1b, + 0x60, 0x1b, 0x04, 0x1b, 0xb8, 0xff, 0xc0, 0x40, 0x23, 0x11, 0x15, 0x48, 0x1b, 0x34, 0x0d, 0x23, + 0x33, 0x24, 0x3f, 0x29, 0x01, 0x29, 0x4a, 0x20, 0x01, 0x48, 0x40, 0x31, 0x01, 0x31, 0x18, 0x18, + 0x31, 0x10, 0x20, 0x09, 0x0c, 0x30, 0x07, 0x01, 0x07, 0x4a, 0x10, 0x03, 0x00, 0x3f, 0xfd, 0x5d, + 0xc6, 0x3f, 0x12, 0x39, 0x39, 0x3d, 0x2f, 0x18, 0x2f, 0x5d, 0xed, 0x10, 0xfd, 0x5d, 0xc6, 0x01, + 0x10, 0xd6, 0xc6, 0x10, 0xd6, 0x2b, 0x5d, 0xd4, 0xed, 0x10, 0xfd, 0xc6, 0x31, 0x30, 0x00, 0x2b, + 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x01, 0x2b, 0x2b, 0x13, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, + 0x23, 0x22, 0x0e, 0x02, 0x07, 0x27, 0x36, 0x36, 0x33, 0x32, 0x1e, 0x02, 0x15, 0x14, 0x06, 0x07, + 0x16, 0x16, 0x15, 0x14, 0x0e, 0x02, 0x23, 0x22, 0x26, 0x27, 0x37, 0x1e, 0x03, 0x33, 0x32, 0x3e, + 0x02, 0x35, 0x34, 0x26, 0x23, 0x23, 0x80, 0x4f, 0x3c, 0x3c, 0x32, 0x33, 0x13, 0x27, 0x24, 0x20, + 0x0b, 0x2c, 0x27, 0x64, 0x33, 0x39, 0x52, 0x35, 0x19, 0x2c, 0x27, 0x33, 0x3b, 0x16, 0x3a, 0x63, + 0x4d, 0x30, 0x6b, 0x2d, 0x29, 0x0c, 0x22, 0x29, 0x2f, 0x1a, 0x26, 0x32, 0x1e, 0x0c, 0x39, 0x47, + 0x62, 0x01, 0x73, 0x2b, 0x26, 0x26, 0x23, 0x08, 0x0c, 0x0f, 0x07, 0x63, 0x18, 0x1b, 0x1d, 0x30, + 0x3d, 0x1f, 0x2a, 0x49, 0x13, 0x11, 0x54, 0x34, 0x22, 0x44, 0x36, 0x22, 0x19, 0x17, 0x63, 0x05, + 0x0e, 0x0c, 0x09, 0x0f, 0x18, 0x20, 0x11, 0x2a, 0x2e, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x2e, + 0x00, 0x00, 0x01, 0xc6, 0x02, 0x6b, 0x00, 0x0f, 0x00, 0x3c, 0x40, 0x11, 0x0e, 0x20, 0x0d, 0x00, + 0x4d, 0x0c, 0x44, 0x00, 0x0a, 0x10, 0x0a, 0x02, 0x0a, 0x11, 0x03, 0x44, 0x01, 0xb8, 0xff, 0xc0, + 0x40, 0x10, 0x0b, 0x0e, 0x48, 0x01, 0x10, 0x0c, 0x03, 0x08, 0x0f, 0x08, 0x0b, 0x08, 0x08, 0x02, + 0x02, 0x02, 0x00, 0x3f, 0x3f, 0x3f, 0x3f, 0x12, 0x39, 0x39, 0x01, 0x10, 0xd6, 0x2b, 0xed, 0x10, + 0xd6, 0x5d, 0xed, 0x31, 0x30, 0x2b, 0x33, 0x11, 0x33, 0x11, 0x3e, 0x03, 0x37, 0x33, 0x11, 0x23, + 0x11, 0x06, 0x06, 0x07, 0x2e, 0x6f, 0x10, 0x2d, 0x35, 0x38, 0x1c, 0x63, 0x6f, 0x39, 0x61, 0x2c, + 0x02, 0x6b, 0xfe, 0x83, 0x23, 0x5f, 0x68, 0x67, 0x2c, 0xfd, 0x95, 0x01, 0x9b, 0x67, 0xc8, 0x6c, + 0xff, 0xff, 0x00, 0x2e, 0x00, 0x00, 0x01, 0xc6, 0x03, 0x38, 0x02, 0x26, 0x02, 0xcb, 0x00, 0x00, + 0x01, 0x07, 0x03, 0x90, 0x00, 0x00, 0x00, 0x8a, 0x00, 0x10, 0x40, 0x0b, 0x01, 0x00, 0x15, 0x1d, + 0x00, 0x09, 0x50, 0x01, 0x01, 0x10, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0x00, 0xff, 0xff, 0x00, 0x2d, + 0x00, 0x00, 0x01, 0xe9, 0x02, 0x6b, 0x02, 0x06, 0x00, 0x2e, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, + 0xff, 0xf3, 0x01, 0xd0, 0x02, 0x6b, 0x00, 0x14, 0x00, 0x29, 0x40, 0x16, 0x09, 0x44, 0x0c, 0x30, + 0x0d, 0x01, 0x0d, 0x44, 0x08, 0x00, 0x15, 0x00, 0x14, 0x09, 0x0b, 0x08, 0x09, 0x02, 0x0d, 0x48, + 0x08, 0x02, 0x00, 0x3f, 0xed, 0x3f, 0x3f, 0x3f, 0xc5, 0x01, 0x10, 0xd6, 0xd6, 0xfd, 0x5d, 0xd6, + 0xed, 0x31, 0x30, 0x37, 0x3e, 0x03, 0x37, 0x36, 0x36, 0x35, 0x21, 0x11, 0x23, 0x11, 0x23, 0x0e, + 0x05, 0x07, 0x08, 0x1a, 0x23, 0x16, 0x0f, 0x06, 0x10, 0x0a, 0x01, 0x46, 0x7b, 0x5a, 0x02, 0x06, + 0x0f, 0x1c, 0x31, 0x4a, 0x36, 0x5d, 0x09, 0x19, 0x21, 0x29, 0x19, 0x42, 0xc7, 0x80, 0xfd, 0x95, + 0x02, 0x05, 0x3a, 0x7a, 0x72, 0x67, 0x4f, 0x32, 0x04, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x17, + 0x00, 0x00, 0x01, 0xdd, 0x02, 0x6b, 0x02, 0x06, 0x00, 0x30, 0x00, 0x00, 0xff, 0xff, 0x00, 0x2d, + 0x00, 0x00, 0x01, 0xc7, 0x02, 0x6b, 0x02, 0x06, 0x00, 0x2b, 0x00, 0x00, 0xff, 0xff, 0x00, 0x1b, + 0xff, 0xf3, 0x01, 0xd9, 0x02, 0x79, 0x02, 0x06, 0x00, 0x32, 0x00, 0x00, 0x00, 0x01, 0x00, 0x2d, + 0x00, 0x00, 0x01, 0xc7, 0x02, 0x6b, 0x00, 0x07, 0x00, 0x34, 0x40, 0x10, 0x01, 0x44, 0x20, 0x02, + 0x30, 0x02, 0x02, 0x02, 0x05, 0x44, 0x70, 0x06, 0xd0, 0x06, 0x02, 0x06, 0xb8, 0xff, 0xc0, 0x40, + 0x0d, 0x0b, 0x0e, 0x48, 0x06, 0x08, 0x04, 0x48, 0x07, 0x02, 0x06, 0x08, 0x02, 0x08, 0x00, 0x3f, + 0x3f, 0x3f, 0xed, 0x01, 0x10, 0xd6, 0x2b, 0x5d, 0xfd, 0xd6, 0x5d, 0xed, 0x31, 0x30, 0x01, 0x11, + 0x23, 0x11, 0x23, 0x11, 0x23, 0x11, 0x01, 0xc7, 0x7b, 0xa4, 0x7b, 0x02, 0x6b, 0xfd, 0x95, 0x02, + 0x05, 0xfd, 0xfb, 0x02, 0x6b, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x36, 0x00, 0x00, 0x01, 0xd8, + 0x02, 0x72, 0x02, 0x06, 0x00, 0x33, 0x00, 0x00, 0xff, 0xff, 0x00, 0x1b, 0xff, 0xf3, 0x01, 0xd5, + 0x02, 0x79, 0x02, 0x06, 0x00, 0x26, 0x00, 0x00, 0xff, 0xff, 0x00, 0x19, 0x00, 0x00, 0x01, 0xdb, + 0x02, 0x6b, 0x02, 0x06, 0x00, 0x37, 0x00, 0x00, 0x00, 0x01, 0x00, 0x05, 0xff, 0xf3, 0x01, 0xee, + 0x02, 0x6b, 0x00, 0x20, 0x00, 0x45, 0x40, 0x27, 0x19, 0x40, 0x12, 0x00, 0x4d, 0x18, 0x40, 0x12, + 0x00, 0x4d, 0x14, 0x21, 0x05, 0x22, 0x1b, 0x1b, 0x21, 0x22, 0x20, 0x00, 0x22, 0x40, 0x22, 0x60, + 0x22, 0x02, 0x18, 0x17, 0x0d, 0x21, 0x18, 0x02, 0x0e, 0x11, 0x48, 0x0a, 0x09, 0x00, 0x02, 0x00, + 0x3f, 0x3f, 0xfd, 0xc6, 0x3f, 0x01, 0x10, 0xd6, 0xd6, 0xc5, 0x5d, 0x10, 0xd6, 0xc5, 0x11, 0x12, + 0x39, 0x3d, 0x2f, 0x12, 0x39, 0x12, 0x39, 0x31, 0x30, 0x2b, 0x2b, 0x01, 0x0e, 0x03, 0x07, 0x0e, + 0x03, 0x23, 0x22, 0x26, 0x27, 0x37, 0x16, 0x16, 0x33, 0x32, 0x36, 0x37, 0x26, 0x26, 0x27, 0x33, + 0x16, 0x16, 0x17, 0x3e, 0x03, 0x37, 0x01, 0xee, 0x18, 0x27, 0x23, 0x21, 0x13, 0x17, 0x2d, 0x31, + 0x38, 0x21, 0x1e, 0x35, 0x1d, 0x19, 0x16, 0x24, 0x10, 0x20, 0x2c, 0x15, 0x46, 0x70, 0x23, 0x88, + 0x1d, 0x3d, 0x26, 0x0e, 0x1a, 0x15, 0x10, 0x06, 0x02, 0x6b, 0x4b, 0x75, 0x64, 0x5a, 0x2f, 0x3b, + 0x4e, 0x2e, 0x14, 0x0c, 0x0b, 0x68, 0x08, 0x08, 0x2c, 0x38, 0x75, 0xdb, 0x55, 0x46, 0x8a, 0x4e, + 0x2c, 0x54, 0x4a, 0x3e, 0x16, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x19, 0x00, 0x00, 0x01, 0xda, + 0x02, 0x93, 0x00, 0x0d, 0x00, 0x14, 0x00, 0x1b, 0x00, 0x7f, 0x40, 0x0b, 0x1a, 0x20, 0x16, 0x00, + 0x4d, 0x1a, 0x20, 0x14, 0x00, 0x4d, 0x17, 0xb8, 0xff, 0xe0, 0xb3, 0x11, 0x00, 0x4d, 0x13, 0xb8, + 0xff, 0xe0, 0xb3, 0x16, 0x00, 0x4d, 0x13, 0xb8, 0xff, 0xe0, 0x40, 0x39, 0x14, 0x00, 0x4d, 0x10, + 0x20, 0x11, 0x00, 0x4d, 0x15, 0x84, 0x40, 0x07, 0x50, 0x07, 0x80, 0x07, 0x90, 0x07, 0x04, 0x07, + 0x1d, 0x18, 0x05, 0x09, 0x52, 0x11, 0x02, 0x40, 0x0c, 0x50, 0x0c, 0x90, 0x0c, 0x03, 0x0c, 0x1c, + 0x0e, 0x84, 0xaf, 0x00, 0x01, 0x00, 0x1c, 0x11, 0x19, 0x73, 0x0c, 0x09, 0x0a, 0x08, 0x12, 0x18, + 0x73, 0x02, 0x05, 0x03, 0x93, 0x00, 0x3f, 0xd5, 0x32, 0xed, 0x32, 0x3f, 0xd5, 0x32, 0xed, 0x32, + 0x01, 0x10, 0xd6, 0x5d, 0xed, 0x10, 0xd6, 0x5d, 0x32, 0x32, 0xed, 0x32, 0x32, 0x10, 0xd6, 0x5d, + 0xed, 0x31, 0x30, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x13, 0x34, 0x37, 0x35, 0x33, 0x15, 0x16, + 0x15, 0x14, 0x07, 0x15, 0x23, 0x35, 0x26, 0x37, 0x14, 0x16, 0x17, 0x11, 0x06, 0x06, 0x17, 0x34, + 0x26, 0x27, 0x11, 0x36, 0x36, 0x19, 0xb1, 0x60, 0xb0, 0xb0, 0x60, 0xb1, 0x62, 0x21, 0x2e, 0x2d, + 0x22, 0xfd, 0x21, 0x2d, 0x2c, 0x22, 0x01, 0x4c, 0xeb, 0x1b, 0x41, 0x41, 0x1d, 0xe9, 0xeb, 0x1a, + 0x47, 0x46, 0x1b, 0xea, 0x40, 0x5d, 0x10, 0x01, 0x5b, 0x11, 0x5c, 0x3d, 0x40, 0x5a, 0x10, 0xfe, + 0xa6, 0x11, 0x5e, 0x00, 0xff, 0xff, 0x00, 0x0b, 0x00, 0x00, 0x01, 0xe9, 0x02, 0x6b, 0x02, 0x06, + 0x00, 0x3b, 0x00, 0x00, 0x00, 0x01, 0x00, 0x2d, 0xff, 0x5b, 0x01, 0xd9, 0x02, 0x6b, 0x00, 0x0b, + 0x00, 0x5f, 0x40, 0x29, 0x02, 0x40, 0x0d, 0x0e, 0x00, 0x4c, 0x02, 0x38, 0x0c, 0x00, 0x4d, 0x02, + 0x40, 0x0b, 0x00, 0x4d, 0x01, 0x40, 0x09, 0x0e, 0x00, 0x4c, 0x01, 0x00, 0x44, 0x20, 0x09, 0x30, + 0x09, 0x40, 0x09, 0x03, 0x09, 0x07, 0x44, 0x90, 0x06, 0xc0, 0x06, 0x02, 0x06, 0xb8, 0xff, 0xc0, + 0x40, 0x16, 0x0b, 0x10, 0x48, 0x06, 0x6f, 0x04, 0x9f, 0x04, 0x02, 0x04, 0x0c, 0x0a, 0x02, 0x07, + 0x02, 0x00, 0x09, 0x48, 0x04, 0x08, 0x02, 0x92, 0x00, 0x3f, 0x3f, 0xed, 0x32, 0x3f, 0x3f, 0x01, + 0x10, 0xc4, 0x5d, 0xd6, 0x2b, 0x5d, 0xfd, 0xd6, 0x5d, 0xfd, 0xc5, 0x31, 0x30, 0x2b, 0x2b, 0x2b, + 0x2b, 0x25, 0x33, 0x11, 0x23, 0x35, 0x21, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x01, 0xb6, 0x23, + 0x72, 0xfe, 0xc6, 0x7b, 0x92, 0x7c, 0x66, 0xfe, 0xf5, 0xa5, 0x02, 0x6b, 0xfd, 0xfb, 0x02, 0x05, + 0x00, 0x01, 0x00, 0x2d, 0x00, 0x00, 0x01, 0xc7, 0x02, 0x6b, 0x00, 0x17, 0x00, 0x46, 0x40, 0x16, + 0x0d, 0xbf, 0x0a, 0x01, 0x0a, 0x44, 0x10, 0x08, 0x20, 0x08, 0x30, 0x08, 0x03, 0x08, 0x00, 0x44, + 0x70, 0x15, 0xd0, 0x15, 0x02, 0x15, 0xb8, 0xff, 0xc0, 0x40, 0x13, 0x0b, 0x0e, 0x48, 0x15, 0x18, + 0x17, 0x02, 0x05, 0x4a, 0x40, 0x10, 0x01, 0x10, 0x10, 0x09, 0x0c, 0x08, 0x09, 0x02, 0x00, 0x3f, + 0x3f, 0x12, 0x39, 0x2f, 0x5d, 0xed, 0x3f, 0x01, 0x10, 0xd6, 0x2b, 0x5d, 0xfd, 0xd6, 0x5d, 0xed, + 0x5d, 0x33, 0x31, 0x30, 0x13, 0x14, 0x1e, 0x02, 0x33, 0x32, 0x36, 0x37, 0x11, 0x33, 0x11, 0x23, + 0x35, 0x06, 0x06, 0x23, 0x22, 0x2e, 0x02, 0x35, 0x35, 0x33, 0xa8, 0x0b, 0x18, 0x24, 0x18, 0x0d, + 0x27, 0x11, 0x7b, 0x7b, 0x17, 0x2c, 0x14, 0x2c, 0x49, 0x35, 0x1e, 0x7b, 0x01, 0xb5, 0x26, 0x30, + 0x1d, 0x0b, 0x03, 0x04, 0x01, 0x2d, 0xfd, 0x95, 0xcf, 0x03, 0x04, 0x14, 0x34, 0x59, 0x45, 0xbd, + 0x00, 0x01, 0x00, 0x17, 0x00, 0x00, 0x01, 0xdd, 0x02, 0x6b, 0x00, 0x0b, 0x00, 0x39, 0x40, 0x21, + 0x6f, 0x0b, 0x01, 0x0b, 0x0a, 0x10, 0x07, 0x01, 0x4f, 0x07, 0x5f, 0x07, 0x02, 0x07, 0x06, 0x6f, + 0x03, 0x01, 0x03, 0x02, 0x0c, 0x0a, 0x02, 0x03, 0x02, 0x08, 0x06, 0x05, 0x48, 0x01, 0x08, 0x00, + 0x08, 0x00, 0x3f, 0x3f, 0xfd, 0xc5, 0x33, 0x3f, 0x3f, 0x01, 0x10, 0xd6, 0xd5, 0x5d, 0xd6, 0xd5, + 0x5d, 0x71, 0xd6, 0xc5, 0x5d, 0x31, 0x30, 0x21, 0x21, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, + 0x33, 0x11, 0x33, 0x01, 0xdd, 0xfe, 0x3a, 0x61, 0x52, 0x60, 0x52, 0x61, 0x02, 0x6b, 0xfd, 0xfb, + 0x01, 0x1a, 0xfe, 0xe6, 0x02, 0x05, 0x00, 0x00, 0x00, 0x01, 0x00, 0x17, 0xff, 0x5b, 0x01, 0xeb, + 0x02, 0x6b, 0x00, 0x0f, 0x00, 0x59, 0x40, 0x3a, 0x2f, 0x00, 0x3f, 0x00, 0x4f, 0x00, 0x03, 0x00, + 0x0f, 0x03, 0x0c, 0x9f, 0x0b, 0xaf, 0x0b, 0x02, 0x10, 0x0b, 0x01, 0xcf, 0x0b, 0x01, 0x70, 0x0b, + 0x01, 0x0b, 0x09, 0x6f, 0x06, 0x01, 0x06, 0x10, 0x05, 0x20, 0x05, 0x30, 0x05, 0x03, 0xd0, 0x05, + 0xe0, 0x05, 0x02, 0x05, 0x10, 0x0d, 0x02, 0x06, 0x02, 0x0f, 0x0a, 0x08, 0x0b, 0x48, 0x03, 0x08, + 0x02, 0x92, 0x00, 0x3f, 0x3f, 0xfd, 0x32, 0xc5, 0x33, 0x3f, 0x3f, 0x01, 0x10, 0xd6, 0x5d, 0x71, + 0xd5, 0x5d, 0xd6, 0xd5, 0x5d, 0x5d, 0x71, 0x71, 0xd6, 0xd5, 0xd5, 0xc5, 0x5d, 0x31, 0x30, 0x25, + 0x11, 0x23, 0x35, 0x21, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x01, + 0xeb, 0x60, 0xfe, 0x8c, 0x61, 0x47, 0x61, 0x47, 0x60, 0x66, 0xfe, 0xf5, 0xa5, 0x02, 0x6b, 0xfd, + 0xfb, 0x01, 0x1a, 0xfe, 0xe6, 0x02, 0x05, 0xfd, 0xfb, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x12, + 0xff, 0xf8, 0x01, 0xd4, 0x02, 0x6b, 0x00, 0x12, 0x00, 0x1d, 0x00, 0x37, 0x40, 0x1f, 0x1a, 0x46, + 0x40, 0x09, 0x60, 0x09, 0x02, 0x09, 0x1f, 0x13, 0x03, 0x44, 0x9f, 0x12, 0x01, 0x12, 0x00, 0x1e, + 0x04, 0x4a, 0x1d, 0x1d, 0x01, 0x17, 0x4a, 0x0e, 0x09, 0x00, 0x48, 0x01, 0x02, 0x00, 0x3f, 0xed, + 0x3f, 0xed, 0x12, 0x39, 0x2f, 0xed, 0x01, 0x10, 0xd6, 0xd5, 0x5d, 0xed, 0x32, 0x10, 0xd6, 0x5d, + 0xed, 0x31, 0x30, 0x13, 0x35, 0x33, 0x15, 0x33, 0x32, 0x1e, 0x02, 0x15, 0x14, 0x0e, 0x02, 0x23, + 0x22, 0x26, 0x27, 0x11, 0x17, 0x15, 0x16, 0x32, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x12, + 0xcb, 0x1d, 0x31, 0x50, 0x39, 0x20, 0x22, 0x3b, 0x50, 0x2e, 0x22, 0x4f, 0x26, 0x7b, 0x07, 0x0e, + 0x06, 0x2b, 0x32, 0x33, 0x30, 0x02, 0x05, 0x66, 0xd6, 0x17, 0x31, 0x4c, 0x36, 0x36, 0x50, 0x34, + 0x19, 0x08, 0x0b, 0x01, 0xfa, 0xd6, 0xc7, 0x01, 0x2e, 0x36, 0x37, 0x2d, 0x00, 0x03, 0x00, 0x22, + 0xff, 0xf8, 0x01, 0xcf, 0x02, 0x6b, 0x00, 0x0e, 0x00, 0x19, 0x00, 0x1d, 0x00, 0x6a, 0xb9, 0x00, + 0x16, 0xff, 0xc0, 0x40, 0x2c, 0x0b, 0x0e, 0x48, 0x16, 0x84, 0x00, 0x2f, 0x1b, 0x3f, 0x1b, 0x02, + 0x1b, 0x52, 0x1a, 0x40, 0x09, 0x10, 0x48, 0x1a, 0x1f, 0x0f, 0x40, 0x0a, 0x50, 0x0a, 0xd0, 0x0a, + 0x03, 0x31, 0x0a, 0x01, 0x20, 0x0a, 0x01, 0x0a, 0x52, 0xc0, 0x09, 0xd0, 0x09, 0xf0, 0x09, 0x03, + 0x09, 0xb8, 0xff, 0xc0, 0x40, 0x14, 0x0f, 0x12, 0x48, 0x09, 0x1e, 0x1c, 0x02, 0x1b, 0x08, 0x0c, + 0x4a, 0x19, 0x19, 0x05, 0x0a, 0x02, 0x13, 0x4a, 0x05, 0x09, 0x00, 0x3f, 0xed, 0x3f, 0x12, 0x39, + 0x2f, 0xed, 0x3f, 0x3f, 0x01, 0x10, 0xd6, 0x2b, 0x5d, 0xed, 0x5d, 0x5d, 0x5d, 0x32, 0x10, 0xde, + 0x2b, 0xfd, 0x5d, 0xde, 0xed, 0x2b, 0x31, 0x30, 0x25, 0x14, 0x0e, 0x02, 0x23, 0x22, 0x26, 0x27, + 0x11, 0x33, 0x15, 0x33, 0x32, 0x16, 0x27, 0x15, 0x16, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, + 0x23, 0x01, 0x23, 0x11, 0x33, 0x01, 0x4c, 0x1b, 0x2f, 0x40, 0x24, 0x1d, 0x3d, 0x22, 0x60, 0x0d, + 0x61, 0x5c, 0xca, 0x07, 0x13, 0x06, 0x26, 0x22, 0x2d, 0x2d, 0x01, 0x3f, 0x60, 0x60, 0xcb, 0x3c, + 0x50, 0x32, 0x15, 0x07, 0x0a, 0x02, 0x62, 0xce, 0x66, 0x01, 0xd8, 0x01, 0x01, 0x3b, 0x32, 0x3b, + 0x32, 0xfe, 0xc8, 0x02, 0x6b, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x36, 0xff, 0xf8, 0x01, 0xd5, + 0x02, 0x6b, 0x00, 0x0b, 0x00, 0x18, 0x00, 0x3f, 0xb2, 0x15, 0x46, 0x00, 0xb8, 0xff, 0xc0, 0x40, + 0x21, 0x09, 0x0f, 0x48, 0x00, 0x1a, 0x0c, 0x09, 0x44, 0x10, 0x07, 0x20, 0x07, 0x30, 0x07, 0x50, + 0x07, 0x04, 0x07, 0x19, 0x4f, 0x18, 0x01, 0x18, 0x4a, 0x0a, 0x0a, 0x03, 0x08, 0x02, 0x10, 0x4a, + 0x03, 0x09, 0x00, 0x3f, 0xed, 0x3f, 0x12, 0x39, 0x2f, 0xed, 0x5d, 0x01, 0x10, 0xd6, 0x5d, 0xed, + 0x32, 0x10, 0xd6, 0x2b, 0xed, 0x31, 0x30, 0x25, 0x14, 0x06, 0x23, 0x22, 0x26, 0x27, 0x11, 0x33, + 0x15, 0x33, 0x32, 0x05, 0x15, 0x16, 0x32, 0x33, 0x32, 0x3e, 0x02, 0x35, 0x34, 0x26, 0x23, 0x01, + 0xd5, 0x85, 0x74, 0x25, 0x54, 0x2d, 0x7b, 0x31, 0xf3, 0xfe, 0xdc, 0x08, 0x1a, 0x0f, 0x18, 0x2a, + 0x1f, 0x13, 0x49, 0x38, 0xcb, 0x69, 0x6a, 0x08, 0x0b, 0x02, 0x60, 0xd6, 0x66, 0xc7, 0x01, 0x0a, + 0x17, 0x24, 0x1b, 0x39, 0x2f, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x2a, 0xff, 0xf3, 0x01, 0xe4, + 0x02, 0x79, 0x00, 0x24, 0x00, 0x39, 0x40, 0x1e, 0x0c, 0x0a, 0x0d, 0x46, 0x00, 0x20, 0x20, 0x20, + 0x02, 0x20, 0x26, 0x16, 0x03, 0x25, 0x15, 0x12, 0x4a, 0x1b, 0x0c, 0x0b, 0x0c, 0x0b, 0x00, 0x1b, + 0x03, 0x04, 0x07, 0x4a, 0x00, 0x09, 0x00, 0x3f, 0xfd, 0xc6, 0x3f, 0x12, 0x39, 0x39, 0x2f, 0x2f, + 0x10, 0xfd, 0xc6, 0x01, 0x10, 0xd6, 0xc6, 0x10, 0xd6, 0x5d, 0xfd, 0x32, 0xc5, 0x31, 0x30, 0x17, + 0x22, 0x26, 0x27, 0x37, 0x16, 0x16, 0x33, 0x32, 0x36, 0x37, 0x23, 0x35, 0x33, 0x2e, 0x03, 0x23, + 0x22, 0x06, 0x07, 0x27, 0x3e, 0x03, 0x33, 0x32, 0x1e, 0x02, 0x15, 0x14, 0x0e, 0x02, 0xd1, 0x3a, + 0x53, 0x1a, 0x1f, 0x12, 0x40, 0x30, 0x47, 0x4e, 0x08, 0xce, 0xcd, 0x06, 0x1d, 0x28, 0x2f, 0x19, + 0x2a, 0x41, 0x17, 0x20, 0x07, 0x1c, 0x2a, 0x37, 0x20, 0x3d, 0x63, 0x47, 0x27, 0x25, 0x47, 0x66, + 0x0d, 0x1b, 0x10, 0x61, 0x0b, 0x16, 0x5c, 0x49, 0x6f, 0x30, 0x3c, 0x23, 0x0d, 0x15, 0x0f, 0x62, + 0x04, 0x10, 0x0e, 0x0b, 0x29, 0x51, 0x79, 0x50, 0x4a, 0x77, 0x54, 0x2e, 0x00, 0x02, 0x00, 0x1e, + 0xff, 0xf3, 0x01, 0xdb, 0x02, 0x79, 0x00, 0x1a, 0x00, 0x2e, 0x00, 0x65, 0xb7, 0xc0, 0x00, 0xd0, + 0x00, 0xf0, 0x00, 0x03, 0x00, 0xb8, 0xff, 0xc0, 0x40, 0x0e, 0x0b, 0x0e, 0x48, 0x00, 0x52, 0x25, + 0xc0, 0x1b, 0xd0, 0x1b, 0xf0, 0x1b, 0x03, 0x1b, 0xb8, 0xff, 0xc0, 0x40, 0x10, 0x0b, 0x0e, 0x48, + 0x1b, 0x52, 0x0a, 0x11, 0x0b, 0x20, 0x10, 0x30, 0x10, 0x02, 0x10, 0x52, 0x0e, 0xb8, 0xff, 0xc0, + 0x40, 0x14, 0x11, 0x1a, 0x48, 0x0e, 0x2f, 0x2a, 0x4a, 0x16, 0x03, 0x0b, 0x48, 0x10, 0x0f, 0x02, + 0x0c, 0x08, 0x20, 0x4a, 0x05, 0x09, 0x00, 0x3f, 0xed, 0x3f, 0x3f, 0xd5, 0xed, 0x3f, 0xed, 0x01, + 0x10, 0xd6, 0x2b, 0xfd, 0x5d, 0x32, 0xd6, 0x32, 0xfd, 0x2b, 0x5d, 0xd6, 0xed, 0x2b, 0x5d, 0x31, + 0x30, 0x01, 0x14, 0x0e, 0x02, 0x23, 0x22, 0x2e, 0x02, 0x27, 0x23, 0x11, 0x23, 0x11, 0x33, 0x15, + 0x33, 0x3e, 0x03, 0x33, 0x32, 0x1e, 0x02, 0x07, 0x14, 0x1e, 0x02, 0x33, 0x32, 0x3e, 0x02, 0x35, + 0x34, 0x2e, 0x02, 0x23, 0x22, 0x0e, 0x02, 0x01, 0xdb, 0x10, 0x23, 0x36, 0x26, 0x23, 0x34, 0x23, + 0x13, 0x02, 0x3e, 0x61, 0x61, 0x3f, 0x03, 0x14, 0x24, 0x32, 0x21, 0x25, 0x36, 0x23, 0x11, 0xbb, + 0x02, 0x09, 0x11, 0x10, 0x10, 0x12, 0x09, 0x02, 0x02, 0x09, 0x12, 0x10, 0x10, 0x12, 0x08, 0x02, + 0x01, 0x36, 0x60, 0x7d, 0x49, 0x1d, 0x19, 0x41, 0x6e, 0x54, 0xfe, 0xf1, 0x02, 0x6b, 0xf6, 0x4c, + 0x65, 0x3b, 0x18, 0x1d, 0x49, 0x7d, 0x60, 0x3e, 0x55, 0x34, 0x16, 0x17, 0x34, 0x54, 0x3e, 0x3f, + 0x54, 0x34, 0x16, 0x16, 0x34, 0x55, 0x00, 0x00, 0x00, 0x02, 0x00, 0x14, 0x00, 0x00, 0x01, 0xc7, + 0x02, 0x72, 0x00, 0x19, 0x00, 0x24, 0x00, 0x3a, 0x40, 0x20, 0x1e, 0x08, 0x44, 0x00, 0x06, 0x10, + 0x06, 0x02, 0x06, 0x26, 0x1a, 0x46, 0x15, 0x09, 0x0c, 0x44, 0x12, 0x0d, 0x25, 0x0c, 0x08, 0x08, + 0x48, 0x1e, 0x1e, 0x00, 0x07, 0x08, 0x22, 0x4a, 0x00, 0x03, 0x00, 0x3f, 0xed, 0x3f, 0x12, 0x39, + 0x2f, 0xed, 0x3f, 0x01, 0x10, 0xd6, 0x32, 0xed, 0x32, 0xd6, 0xed, 0x10, 0xd6, 0x5d, 0xfd, 0xc0, + 0x31, 0x30, 0x01, 0x32, 0x1e, 0x02, 0x17, 0x11, 0x23, 0x35, 0x23, 0x06, 0x06, 0x07, 0x23, 0x3e, + 0x03, 0x37, 0x26, 0x26, 0x35, 0x34, 0x3e, 0x02, 0x07, 0x14, 0x16, 0x33, 0x33, 0x35, 0x26, 0x26, + 0x23, 0x22, 0x06, 0x01, 0x27, 0x0f, 0x28, 0x2c, 0x2b, 0x12, 0x7b, 0x40, 0x23, 0x3d, 0x17, 0x81, + 0x0c, 0x21, 0x24, 0x25, 0x11, 0x33, 0x2b, 0x21, 0x3e, 0x56, 0x38, 0x38, 0x3f, 0x1b, 0x0a, 0x14, + 0x07, 0x31, 0x3c, 0x02, 0x72, 0x02, 0x03, 0x07, 0x04, 0xfd, 0x9e, 0xe4, 0x39, 0x6f, 0x3c, 0x1f, + 0x45, 0x45, 0x3f, 0x1a, 0x17, 0x58, 0x36, 0x34, 0x4d, 0x32, 0x18, 0xca, 0x2d, 0x31, 0xba, 0x02, + 0x01, 0x2e, 0x00, 0x00, 0xff, 0xff, 0x00, 0x2c, 0xff, 0xf5, 0x01, 0xb9, 0x01, 0xe2, 0x02, 0x06, + 0x00, 0x44, 0x00, 0x00, 0x00, 0x02, 0x00, 0x28, 0xff, 0xf3, 0x01, 0xcd, 0x02, 0xb5, 0x00, 0x1c, + 0x00, 0x2e, 0x00, 0x60, 0xb9, 0x00, 0x18, 0xff, 0xe0, 0x40, 0x1a, 0x0d, 0x00, 0x4d, 0x04, 0x20, + 0x12, 0x00, 0x4d, 0x04, 0x20, 0x0e, 0x00, 0x4d, 0x03, 0x20, 0x0e, 0x00, 0x4d, 0x05, 0x20, 0x18, + 0x00, 0x4d, 0x2a, 0x53, 0x0c, 0xb8, 0xff, 0xc0, 0x40, 0x1f, 0x09, 0x0c, 0x48, 0x0c, 0x00, 0x00, + 0x01, 0x00, 0x30, 0x20, 0x53, 0x14, 0x2f, 0x00, 0x1c, 0x9f, 0x25, 0x57, 0x11, 0x07, 0x2d, 0x57, + 0x30, 0x07, 0x50, 0x07, 0x70, 0x07, 0x03, 0x07, 0x0a, 0x00, 0x3f, 0x5d, 0xed, 0x3f, 0xed, 0x3f, + 0xc5, 0x01, 0x10, 0xd6, 0xed, 0x10, 0xc6, 0x5d, 0xd6, 0x2b, 0xed, 0x31, 0x30, 0x00, 0x2b, 0x01, + 0x2b, 0x2b, 0x2b, 0x2b, 0x01, 0x0e, 0x03, 0x07, 0x36, 0x33, 0x32, 0x1e, 0x02, 0x15, 0x14, 0x0e, + 0x02, 0x23, 0x22, 0x26, 0x35, 0x34, 0x3e, 0x02, 0x37, 0x36, 0x36, 0x37, 0x01, 0x06, 0x06, 0x15, + 0x14, 0x1e, 0x02, 0x33, 0x32, 0x3e, 0x02, 0x35, 0x34, 0x26, 0x23, 0x22, 0x01, 0xc6, 0x2c, 0x5b, + 0x4e, 0x37, 0x07, 0x33, 0x32, 0x26, 0x42, 0x31, 0x1c, 0x21, 0x37, 0x4b, 0x2a, 0x74, 0x64, 0x24, + 0x46, 0x6a, 0x45, 0x1e, 0x39, 0x1f, 0xfe, 0xfa, 0x02, 0x01, 0x06, 0x12, 0x21, 0x1a, 0x11, 0x1a, + 0x12, 0x09, 0x25, 0x27, 0x22, 0x02, 0x47, 0x09, 0x08, 0x19, 0x39, 0x3a, 0x1c, 0x1d, 0x39, 0x55, + 0x38, 0x3c, 0x5a, 0x3c, 0x1e, 0x96, 0x94, 0x61, 0x86, 0x5a, 0x34, 0x0f, 0x06, 0x07, 0x07, 0xfe, + 0x89, 0x0b, 0x1f, 0x12, 0x1a, 0x39, 0x2f, 0x1e, 0x15, 0x22, 0x2d, 0x17, 0x35, 0x45, 0x00, 0x00, + 0x00, 0x03, 0x00, 0x44, 0xff, 0xf7, 0x01, 0xce, 0x01, 0xe0, 0x00, 0x09, 0x00, 0x14, 0x00, 0x2f, + 0x00, 0x8f, 0x40, 0x15, 0x0d, 0x40, 0x0e, 0x00, 0x4d, 0x0d, 0x40, 0x0b, 0x00, 0x4d, 0x06, 0x40, + 0x0e, 0x00, 0x4d, 0x06, 0x40, 0x0b, 0x00, 0x4d, 0x2a, 0xb8, 0xff, 0xe0, 0xb3, 0x0f, 0x00, 0x4d, + 0x2a, 0xb8, 0xff, 0xc0, 0xb3, 0x0e, 0x00, 0x4d, 0x29, 0xb8, 0xff, 0xc0, 0x40, 0x0f, 0x0e, 0x0f, + 0x00, 0x4c, 0x10, 0x40, 0x0d, 0x00, 0x4d, 0x0d, 0x53, 0x25, 0x06, 0x53, 0x2d, 0xb8, 0xff, 0xc0, + 0x40, 0x28, 0x09, 0x0c, 0x48, 0x2d, 0x31, 0x14, 0x09, 0x51, 0x00, 0x1a, 0x10, 0x1a, 0x30, 0x1a, + 0x03, 0x1a, 0x30, 0x70, 0x08, 0x80, 0x08, 0x02, 0x08, 0x73, 0x0a, 0x28, 0x0a, 0x28, 0x15, 0x10, + 0x55, 0x20, 0x0b, 0x3f, 0x03, 0x01, 0x03, 0x55, 0x15, 0x07, 0x00, 0x3f, 0xed, 0x5d, 0x3f, 0xed, + 0x12, 0x39, 0x39, 0x3d, 0x2f, 0x18, 0x2f, 0xed, 0x5d, 0x01, 0x10, 0xd6, 0x5d, 0xfd, 0xc0, 0x10, + 0xd6, 0x2b, 0xed, 0xd4, 0xed, 0x31, 0x30, 0x00, 0x2b, 0x2b, 0x2b, 0x2b, 0x01, 0x2b, 0x2b, 0x2b, + 0x2b, 0x37, 0x16, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x23, 0x23, 0x37, 0x32, 0x36, 0x35, 0x34, + 0x26, 0x23, 0x22, 0x06, 0x07, 0x15, 0x13, 0x22, 0x2e, 0x02, 0x27, 0x11, 0x3e, 0x03, 0x33, 0x32, + 0x1e, 0x02, 0x15, 0x14, 0x06, 0x07, 0x1e, 0x03, 0x07, 0x06, 0x06, 0xbf, 0x0a, 0x2c, 0x0f, 0x26, + 0x2a, 0x4b, 0x4a, 0x48, 0x1a, 0x21, 0x26, 0x1f, 0x0b, 0x29, 0x0a, 0x3a, 0x17, 0x32, 0x31, 0x2b, + 0x10, 0x10, 0x2b, 0x31, 0x32, 0x17, 0x33, 0x4a, 0x2f, 0x16, 0x20, 0x17, 0x0c, 0x1b, 0x15, 0x0e, + 0x01, 0x02, 0x68, 0x60, 0x02, 0x01, 0x17, 0x1e, 0x35, 0x54, 0x14, 0x1c, 0x1b, 0x15, 0x03, 0x02, + 0x5b, 0xfe, 0xdc, 0x04, 0x06, 0x08, 0x04, 0x01, 0xc2, 0x03, 0x07, 0x04, 0x03, 0x15, 0x23, 0x2f, + 0x1b, 0x23, 0x30, 0x0c, 0x06, 0x13, 0x1c, 0x26, 0x19, 0x41, 0x53, 0x00, 0x00, 0x01, 0x00, 0x59, + 0x00, 0x00, 0x01, 0xbf, 0x01, 0xd6, 0x00, 0x05, 0x00, 0x28, 0x40, 0x18, 0x20, 0x00, 0x01, 0x00, + 0x01, 0x51, 0x00, 0x03, 0x10, 0x03, 0x30, 0x03, 0x03, 0x03, 0x06, 0x30, 0x01, 0x01, 0x01, 0x55, + 0x04, 0x0a, 0x03, 0x06, 0x00, 0x3f, 0x3f, 0xed, 0x5d, 0x01, 0x10, 0xd6, 0x5d, 0xfd, 0xc5, 0x5d, + 0x31, 0x30, 0x01, 0x23, 0x11, 0x23, 0x11, 0x21, 0x01, 0xbf, 0xea, 0x7c, 0x01, 0x66, 0x01, 0x70, + 0xfe, 0x90, 0x01, 0xd6, 0x00, 0x02, 0x00, 0x18, 0xff, 0x7a, 0x01, 0xd9, 0x01, 0xd6, 0x00, 0x0f, + 0x00, 0x17, 0x00, 0x5d, 0xb9, 0x00, 0x14, 0xff, 0xc0, 0x40, 0x09, 0x0e, 0x00, 0x4d, 0x0c, 0x0a, + 0x19, 0x16, 0x51, 0x08, 0xb8, 0xff, 0xc0, 0x40, 0x29, 0x09, 0x0e, 0x48, 0x08, 0x09, 0x19, 0x2f, + 0x15, 0x3f, 0x15, 0x02, 0x15, 0x01, 0x0d, 0x2f, 0x06, 0x3f, 0x06, 0x4f, 0x06, 0x03, 0x06, 0x00, + 0x18, 0x01, 0x15, 0x55, 0x0e, 0x0d, 0x06, 0x0b, 0x08, 0x55, 0x0c, 0x06, 0x07, 0x0a, 0x10, 0x55, + 0x06, 0x0a, 0x00, 0x3f, 0xed, 0x3f, 0x3f, 0xed, 0xc5, 0x3f, 0xc5, 0xed, 0x32, 0x01, 0x10, 0xd6, + 0xc6, 0x5d, 0xc5, 0xd5, 0xc5, 0x5d, 0x10, 0xd6, 0xd5, 0x2b, 0xed, 0x10, 0xd6, 0xc5, 0x31, 0x30, + 0x2b, 0x37, 0x33, 0x3e, 0x03, 0x35, 0x21, 0x11, 0x33, 0x15, 0x23, 0x35, 0x23, 0x15, 0x23, 0x13, + 0x0e, 0x03, 0x07, 0x33, 0x11, 0x18, 0x25, 0x16, 0x1d, 0x0f, 0x06, 0x01, 0x31, 0x23, 0x72, 0xdd, + 0x72, 0xd2, 0x03, 0x08, 0x0e, 0x15, 0x0f, 0x8d, 0x66, 0x24, 0x5c, 0x62, 0x63, 0x2b, 0xfe, 0x90, + 0xec, 0x86, 0x86, 0x01, 0xf6, 0x1f, 0x45, 0x46, 0x43, 0x1d, 0x01, 0x0a, 0xff, 0xff, 0x00, 0x1f, + 0xff, 0xf5, 0x01, 0xd1, 0x01, 0xe2, 0x02, 0x06, 0x00, 0x48, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0e, + 0x00, 0x00, 0x01, 0xe6, 0x01, 0xd6, 0x00, 0x2b, 0x00, 0x73, 0x40, 0x41, 0x12, 0x40, 0x00, 0x50, + 0x00, 0x80, 0x00, 0x90, 0x00, 0x04, 0x00, 0x52, 0x29, 0x15, 0x29, 0x18, 0x24, 0x19, 0x03, 0x23, + 0x1e, 0x0e, 0x05, 0x0f, 0x03, 0x0b, 0x06, 0x23, 0x29, 0x06, 0x1e, 0x0b, 0x06, 0x0b, 0x29, 0x1e, + 0x23, 0x05, 0x2c, 0x2d, 0x12, 0x15, 0x14, 0x1e, 0x00, 0x29, 0x0b, 0x2b, 0x1e, 0x0b, 0x1e, 0x0b, + 0x14, 0x2b, 0x0a, 0x24, 0x0a, 0x18, 0x06, 0x14, 0x06, 0x0f, 0x06, 0x05, 0x0a, 0x00, 0x3f, 0x3f, + 0x3f, 0x3f, 0x3f, 0x3f, 0x12, 0x39, 0x39, 0x3d, 0x2f, 0x2f, 0x11, 0x12, 0x39, 0x39, 0x11, 0x12, + 0x39, 0x39, 0x01, 0x11, 0x12, 0x17, 0x39, 0x2f, 0x2f, 0x18, 0x2f, 0x2f, 0x2f, 0x11, 0x12, 0x17, + 0x39, 0x11, 0x12, 0x17, 0x39, 0x11, 0x33, 0x10, 0xed, 0x5d, 0x32, 0x31, 0x30, 0x01, 0x3e, 0x03, + 0x37, 0x33, 0x0e, 0x03, 0x07, 0x16, 0x16, 0x17, 0x23, 0x26, 0x26, 0x27, 0x15, 0x23, 0x35, 0x06, + 0x06, 0x07, 0x23, 0x3e, 0x03, 0x37, 0x2e, 0x03, 0x27, 0x33, 0x1e, 0x03, 0x17, 0x35, 0x33, 0x01, + 0x2b, 0x09, 0x17, 0x17, 0x15, 0x08, 0x67, 0x0c, 0x1a, 0x1d, 0x21, 0x13, 0x23, 0x3c, 0x16, 0x67, + 0x07, 0x2a, 0x21, 0x60, 0x22, 0x28, 0x08, 0x67, 0x0a, 0x19, 0x1e, 0x22, 0x11, 0x14, 0x22, 0x1d, + 0x19, 0x0c, 0x67, 0x08, 0x15, 0x18, 0x17, 0x0a, 0x60, 0x01, 0x11, 0x14, 0x32, 0x34, 0x34, 0x17, + 0x1c, 0x33, 0x35, 0x37, 0x1f, 0x35, 0x86, 0x41, 0x20, 0x6f, 0x4e, 0xdd, 0xe0, 0x4d, 0x6e, 0x25, + 0x1f, 0x43, 0x42, 0x3d, 0x1a, 0x21, 0x37, 0x34, 0x33, 0x1c, 0x17, 0x34, 0x34, 0x31, 0x14, 0xc4, + 0x00, 0x01, 0x00, 0x33, 0xff, 0xf3, 0x01, 0xb3, 0x01, 0xe0, 0x00, 0x30, 0x00, 0x51, 0x40, 0x2f, + 0x28, 0x53, 0x08, 0x1d, 0x53, 0x0e, 0x32, 0x24, 0x00, 0x10, 0x16, 0x01, 0x16, 0x31, 0x17, 0x40, + 0x1a, 0x01, 0x1a, 0x57, 0x13, 0x3f, 0x25, 0x4f, 0x25, 0x7f, 0x25, 0x8f, 0x25, 0x04, 0x25, 0x73, + 0x22, 0x0b, 0x0b, 0x22, 0x03, 0x13, 0x07, 0x30, 0x4f, 0x2d, 0x01, 0x2d, 0x57, 0x03, 0x0b, 0x00, + 0x3f, 0xfd, 0x5d, 0xc6, 0x3f, 0x12, 0x39, 0x39, 0x3d, 0x2f, 0x18, 0x2f, 0xed, 0x5d, 0x10, 0xfd, + 0x5d, 0xc6, 0x01, 0x10, 0xd6, 0x5d, 0xd6, 0xc4, 0x10, 0xd6, 0xed, 0xd4, 0xed, 0x31, 0x30, 0x13, + 0x36, 0x36, 0x33, 0x32, 0x1e, 0x02, 0x15, 0x14, 0x06, 0x07, 0x16, 0x16, 0x15, 0x14, 0x0e, 0x02, + 0x23, 0x22, 0x26, 0x27, 0x37, 0x16, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x2e, 0x02, 0x23, 0x23, + 0x35, 0x33, 0x32, 0x36, 0x35, 0x34, 0x2e, 0x02, 0x23, 0x22, 0x06, 0x07, 0x40, 0x22, 0x4e, 0x33, + 0x27, 0x46, 0x35, 0x20, 0x22, 0x1d, 0x27, 0x26, 0x21, 0x37, 0x4a, 0x29, 0x32, 0x5f, 0x24, 0x17, + 0x14, 0x53, 0x35, 0x2c, 0x2d, 0x0e, 0x17, 0x1d, 0x0f, 0x6a, 0x6a, 0x26, 0x1d, 0x07, 0x12, 0x1e, + 0x16, 0x2a, 0x4b, 0x17, 0x01, 0xc7, 0x0b, 0x0e, 0x0d, 0x1f, 0x34, 0x26, 0x23, 0x30, 0x11, 0x11, + 0x37, 0x2b, 0x28, 0x37, 0x22, 0x0f, 0x12, 0x0f, 0x65, 0x07, 0x13, 0x19, 0x15, 0x0f, 0x13, 0x0b, + 0x04, 0x5d, 0x1b, 0x11, 0x08, 0x11, 0x0d, 0x08, 0x0e, 0x06, 0x00, 0x00, 0x00, 0x01, 0x00, 0x3f, + 0x00, 0x00, 0x01, 0xb6, 0x01, 0xd6, 0x00, 0x0f, 0x00, 0x3c, 0x40, 0x10, 0x0a, 0x07, 0x52, 0x06, + 0x03, 0x20, 0x0f, 0x30, 0x0f, 0x02, 0x0f, 0x52, 0x70, 0x00, 0x01, 0x00, 0xb8, 0xff, 0xc0, 0x40, + 0x10, 0x09, 0x0e, 0x48, 0x00, 0x10, 0x0a, 0x03, 0x01, 0x0f, 0x06, 0x08, 0x06, 0x07, 0x0a, 0x01, + 0x0a, 0x00, 0x3f, 0x3f, 0x3f, 0x3f, 0x12, 0x39, 0x39, 0x01, 0x10, 0xd6, 0x2b, 0x5d, 0xfd, 0x5d, + 0xd5, 0xd5, 0xed, 0xc5, 0x31, 0x30, 0x33, 0x11, 0x33, 0x11, 0x36, 0x36, 0x37, 0x33, 0x11, 0x23, + 0x11, 0x0e, 0x03, 0x07, 0x3f, 0x6e, 0x20, 0x4e, 0x38, 0x63, 0x6f, 0x17, 0x29, 0x27, 0x29, 0x16, + 0x01, 0xd6, 0xfe, 0xf5, 0x40, 0x81, 0x4a, 0xfe, 0x2a, 0x01, 0x20, 0x23, 0x42, 0x44, 0x4b, 0x2c, + 0xff, 0xff, 0x00, 0x3f, 0x00, 0x00, 0x01, 0xb6, 0x02, 0xae, 0x02, 0x26, 0x02, 0xeb, 0x00, 0x00, + 0x01, 0x06, 0x03, 0x90, 0x00, 0x00, 0x00, 0x10, 0x40, 0x0b, 0x01, 0x00, 0x15, 0x1d, 0x00, 0x07, + 0x50, 0x01, 0x01, 0x10, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0x01, 0x00, 0x3f, 0x00, 0x00, 0x01, 0xe8, + 0x01, 0xd6, 0x00, 0x18, 0x00, 0x5a, 0x40, 0x0d, 0x03, 0x51, 0x04, 0x0f, 0x51, 0x80, 0x0e, 0xa0, + 0x0e, 0xb0, 0x0e, 0x03, 0x0e, 0xb8, 0xff, 0xc0, 0x40, 0x0e, 0x0a, 0x0f, 0x48, 0x0e, 0x1a, 0x09, + 0x52, 0x00, 0x30, 0x14, 0x01, 0x14, 0x51, 0x16, 0xb8, 0xff, 0xc0, 0x40, 0x14, 0x09, 0x0f, 0x48, + 0x16, 0x19, 0x17, 0x0a, 0x16, 0x06, 0x00, 0x03, 0x14, 0x0f, 0x09, 0x09, 0x03, 0x0f, 0x06, 0x03, + 0x0a, 0x00, 0x3f, 0x3f, 0x12, 0x39, 0x3d, 0x2f, 0x12, 0x39, 0x12, 0x39, 0x18, 0x3f, 0x3f, 0x01, + 0x10, 0xd6, 0x2b, 0xfd, 0x5d, 0xd0, 0xed, 0x10, 0xd6, 0x2b, 0x5d, 0xed, 0xd6, 0xed, 0x31, 0x30, + 0x13, 0x36, 0x36, 0x37, 0x33, 0x0e, 0x03, 0x07, 0x1e, 0x03, 0x17, 0x23, 0x2e, 0x03, 0x27, 0x15, + 0x23, 0x11, 0x33, 0xbb, 0x23, 0x49, 0x19, 0x95, 0x12, 0x2c, 0x2f, 0x2f, 0x14, 0x19, 0x39, 0x36, + 0x2d, 0x0e, 0x8e, 0x0c, 0x26, 0x2c, 0x2e, 0x13, 0x7c, 0x7c, 0x01, 0x21, 0x2a, 0x62, 0x29, 0x17, + 0x38, 0x3a, 0x36, 0x16, 0x18, 0x41, 0x46, 0x46, 0x1c, 0x19, 0x3f, 0x3d, 0x37, 0x12, 0xde, 0x01, + 0xd6, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x11, 0xff, 0xf8, 0x01, 0xb6, 0x01, 0xd6, 0x00, 0x15, + 0x00, 0x21, 0x40, 0x11, 0x20, 0x13, 0x01, 0x13, 0x51, 0x15, 0x00, 0x53, 0x10, 0x08, 0x16, 0x14, + 0x06, 0x12, 0x0a, 0x07, 0x07, 0x00, 0x3f, 0x3f, 0x3f, 0x01, 0x10, 0xd6, 0xd6, 0xfd, 0xd6, 0xed, + 0x5d, 0x31, 0x30, 0x13, 0x0e, 0x05, 0x07, 0x27, 0x36, 0x36, 0x37, 0x3e, 0x03, 0x35, 0x35, 0x21, + 0x11, 0x23, 0x11, 0xf0, 0x02, 0x05, 0x0d, 0x1a, 0x2d, 0x43, 0x30, 0x11, 0x23, 0x22, 0x0b, 0x0c, + 0x0d, 0x07, 0x01, 0x01, 0x34, 0x7b, 0x01, 0x70, 0x2b, 0x57, 0x52, 0x48, 0x37, 0x22, 0x03, 0x66, + 0x08, 0x22, 0x15, 0x18, 0x3f, 0x46, 0x47, 0x1f, 0x36, 0xfe, 0x2a, 0x01, 0x70, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x18, 0x00, 0x00, 0x01, 0xde, 0x01, 0xd6, 0x00, 0x1c, 0x00, 0x87, 0xb9, 0x00, + 0x0d, 0xff, 0xf8, 0xb4, 0x0e, 0x0f, 0x00, 0x4c, 0x04, 0xb8, 0xff, 0xc0, 0x40, 0x45, 0x0b, 0x00, + 0x4d, 0x13, 0x40, 0x0b, 0x00, 0x4d, 0x0a, 0x0b, 0x20, 0x10, 0xc0, 0x10, 0xd0, 0x10, 0x03, 0x10, + 0x1e, 0x15, 0x1d, 0x14, 0x16, 0x13, 0x05, 0x12, 0x11, 0x1e, 0x20, 0x16, 0x30, 0x16, 0x02, 0x3f, + 0x11, 0x01, 0x16, 0x11, 0x05, 0x11, 0x05, 0x16, 0x03, 0x1d, 0x1e, 0x00, 0x1c, 0x17, 0x1d, 0x16, + 0x06, 0x12, 0x15, 0x05, 0x13, 0x14, 0x14, 0x13, 0x05, 0x15, 0x12, 0x05, 0x0a, 0x11, 0x06, 0x0a, + 0x0a, 0x00, 0x0a, 0x00, 0x3f, 0x3f, 0x3f, 0x12, 0x17, 0x39, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x3f, + 0x01, 0x10, 0xd6, 0xd5, 0xc5, 0x11, 0x12, 0x17, 0x39, 0x3d, 0x2f, 0x18, 0x2f, 0x2f, 0x5d, 0x5d, + 0x11, 0x12, 0x39, 0x11, 0x39, 0x12, 0x39, 0x11, 0x39, 0x10, 0xd6, 0x5d, 0xd5, 0xc5, 0x31, 0x30, + 0x00, 0x2b, 0x01, 0x2b, 0x2b, 0x13, 0x1e, 0x03, 0x17, 0x3e, 0x03, 0x37, 0x33, 0x1e, 0x03, 0x17, + 0x23, 0x13, 0x07, 0x23, 0x27, 0x13, 0x23, 0x3e, 0x03, 0x37, 0xa2, 0x07, 0x15, 0x18, 0x19, 0x0b, + 0x0b, 0x19, 0x18, 0x15, 0x08, 0x66, 0x07, 0x0d, 0x09, 0x06, 0x02, 0x71, 0x06, 0x4b, 0x5a, 0x4a, + 0x05, 0x71, 0x03, 0x07, 0x08, 0x0b, 0x07, 0x01, 0xd6, 0x15, 0x3c, 0x45, 0x48, 0x22, 0x21, 0x48, + 0x45, 0x3d, 0x15, 0x3e, 0x75, 0x73, 0x73, 0x3d, 0x01, 0x4c, 0xeb, 0xeb, 0xfe, 0xb4, 0x3a, 0x7c, + 0x7b, 0x74, 0x31, 0x00, 0x00, 0x01, 0x00, 0x3b, 0x00, 0x00, 0x01, 0xb8, 0x01, 0xd6, 0x00, 0x0b, + 0x00, 0x39, 0x40, 0x0e, 0x09, 0x00, 0x51, 0x0f, 0x02, 0x01, 0x9f, 0x02, 0x01, 0x02, 0x08, 0x03, + 0x51, 0x05, 0xb8, 0xff, 0xc0, 0x40, 0x10, 0x0b, 0x0e, 0x48, 0x05, 0x0c, 0x02, 0x55, 0x09, 0x0a, + 0x0a, 0x06, 0x0a, 0x04, 0x06, 0x01, 0x06, 0x00, 0x3f, 0x3f, 0x3f, 0x3f, 0xd5, 0xed, 0x01, 0x10, + 0xd6, 0x2b, 0xfd, 0x32, 0xd6, 0x5d, 0x71, 0xed, 0x33, 0x31, 0x30, 0x21, 0x23, 0x35, 0x23, 0x15, + 0x23, 0x11, 0x33, 0x15, 0x33, 0x35, 0x33, 0x01, 0xb8, 0x7b, 0x87, 0x7b, 0x7b, 0x87, 0x7b, 0xba, + 0xba, 0x01, 0xd6, 0xb6, 0xb6, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x1d, 0xff, 0xf3, 0x01, 0xd8, + 0x01, 0xe2, 0x02, 0x06, 0x00, 0x52, 0x00, 0x00, 0x00, 0x01, 0x00, 0x3f, 0x00, 0x00, 0x01, 0xb6, + 0x01, 0xd6, 0x00, 0x07, 0x00, 0x42, 0x40, 0x17, 0xbf, 0x01, 0x01, 0x01, 0x51, 0xb0, 0x02, 0x01, + 0x9f, 0x02, 0xaf, 0x02, 0x02, 0x30, 0x02, 0x01, 0x02, 0xbf, 0x05, 0x01, 0x05, 0x51, 0x06, 0xb8, + 0xff, 0xc0, 0x40, 0x10, 0x09, 0x0e, 0x48, 0x06, 0x08, 0x06, 0x06, 0x01, 0x06, 0x30, 0x03, 0x01, + 0x03, 0x55, 0x00, 0x0a, 0x00, 0x3f, 0xed, 0x5d, 0x3f, 0x3f, 0x01, 0x10, 0xd6, 0x2b, 0xfd, 0x5d, + 0xd6, 0x5d, 0x5d, 0x5d, 0xed, 0x5d, 0x31, 0x30, 0x01, 0x11, 0x23, 0x11, 0x23, 0x11, 0x23, 0x11, + 0x01, 0xb6, 0x7c, 0x80, 0x7b, 0x01, 0xd6, 0xfe, 0x2a, 0x01, 0x70, 0xfe, 0x90, 0x01, 0xd6, 0x00, + 0xff, 0xff, 0x00, 0x3f, 0xff, 0x5b, 0x01, 0xd5, 0x01, 0xe0, 0x02, 0x06, 0x00, 0x53, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x2c, 0xff, 0xf5, 0x01, 0xd2, 0x01, 0xe2, 0x02, 0x06, 0x00, 0x46, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x26, 0x00, 0x00, 0x01, 0xcf, 0x01, 0xd6, 0x00, 0x07, 0x00, 0x2b, 0x40, 0x19, + 0x00, 0x20, 0x01, 0x01, 0x01, 0x51, 0x04, 0x40, 0x05, 0x50, 0x05, 0x80, 0x05, 0x03, 0x05, 0x08, + 0x04, 0x01, 0x55, 0x07, 0x0a, 0x06, 0x0a, 0x03, 0x06, 0x00, 0x3f, 0x3f, 0x3f, 0xfd, 0xc0, 0x01, + 0x10, 0xd6, 0x5d, 0xd5, 0xfd, 0x5d, 0xc5, 0x31, 0x30, 0x01, 0x23, 0x11, 0x23, 0x11, 0x23, 0x35, + 0x21, 0x01, 0xcf, 0x97, 0x7c, 0x96, 0x01, 0xa9, 0x01, 0x70, 0xfe, 0x90, 0x01, 0x70, 0x66, 0x00, + 0xff, 0xff, 0x00, 0x14, 0xff, 0x58, 0x01, 0xd8, 0x01, 0xd6, 0x02, 0x06, 0x00, 0x5c, 0x00, 0x00, + 0x00, 0x03, 0x00, 0x18, 0xff, 0x5b, 0x01, 0xdb, 0x02, 0xb5, 0x00, 0x06, 0x00, 0x0d, 0x00, 0x27, + 0x00, 0x74, 0x40, 0x2f, 0x27, 0x1d, 0x0d, 0x20, 0x22, 0x30, 0x22, 0x40, 0x22, 0xc0, 0x22, 0xd0, + 0x22, 0x05, 0x22, 0x52, 0xa0, 0x0a, 0x01, 0x0a, 0x3f, 0x0d, 0x4f, 0x0d, 0x02, 0x0d, 0x85, 0x1a, + 0x10, 0xa0, 0x00, 0x01, 0x00, 0x20, 0x03, 0x30, 0x03, 0x40, 0x03, 0xc0, 0x03, 0xd0, 0x03, 0x05, + 0x03, 0x52, 0x15, 0xb8, 0xff, 0xc0, 0x40, 0x1c, 0x15, 0x18, 0x48, 0xaf, 0x15, 0x01, 0x15, 0x28, + 0x07, 0x49, 0x27, 0x06, 0x1c, 0x0d, 0x49, 0x1d, 0x0a, 0x1b, 0x00, 0x49, 0x1a, 0x0a, 0x06, 0x49, + 0x10, 0x06, 0x0f, 0x0e, 0x00, 0x3f, 0x3f, 0xed, 0x3f, 0xed, 0xc5, 0x3f, 0xed, 0xc5, 0x3f, 0xed, + 0x01, 0x10, 0xd6, 0x5d, 0x2b, 0xfd, 0x5d, 0xd6, 0x5d, 0xc0, 0xc0, 0xfd, 0x5d, 0xd6, 0x5d, 0xed, + 0x5d, 0x10, 0xd0, 0xc0, 0x31, 0x30, 0x13, 0x06, 0x06, 0x15, 0x14, 0x16, 0x17, 0x33, 0x36, 0x36, + 0x35, 0x34, 0x26, 0x27, 0x11, 0x23, 0x35, 0x2e, 0x03, 0x35, 0x34, 0x3e, 0x02, 0x37, 0x35, 0x37, + 0x15, 0x1e, 0x03, 0x15, 0x14, 0x0e, 0x02, 0x07, 0xc9, 0x2a, 0x25, 0x24, 0x2b, 0x60, 0x24, 0x2c, + 0x2c, 0x24, 0x60, 0x2f, 0x43, 0x2b, 0x14, 0x13, 0x2a, 0x43, 0x31, 0x60, 0x26, 0x41, 0x30, 0x1b, + 0x1a, 0x30, 0x41, 0x27, 0x01, 0x78, 0x05, 0x4f, 0x3d, 0x3d, 0x4c, 0x06, 0x01, 0x4a, 0x45, 0x46, + 0x48, 0x02, 0xfd, 0xe3, 0xa3, 0x04, 0x27, 0x3d, 0x53, 0x30, 0x2d, 0x4e, 0x3e, 0x28, 0x07, 0xcf, + 0x15, 0xe4, 0x05, 0x1f, 0x39, 0x54, 0x38, 0x39, 0x54, 0x39, 0x20, 0x04, 0xff, 0xff, 0x00, 0x14, + 0x00, 0x00, 0x01, 0xe1, 0x01, 0xd6, 0x02, 0x06, 0x00, 0x5b, 0x00, 0x00, 0x00, 0x01, 0x00, 0x3f, + 0xff, 0x7a, 0x01, 0xc7, 0x01, 0xd6, 0x00, 0x0b, 0x00, 0x35, 0x40, 0x20, 0x01, 0x00, 0x51, 0x04, + 0x09, 0x08, 0x51, 0x20, 0x05, 0x30, 0x05, 0x50, 0x05, 0x60, 0x05, 0x70, 0x05, 0x05, 0x05, 0x0c, + 0x0a, 0x0a, 0x06, 0x0a, 0x00, 0x09, 0x55, 0x05, 0x06, 0x03, 0x04, 0x06, 0x00, 0x3f, 0xc5, 0x3f, + 0xfd, 0xc0, 0x3f, 0x3f, 0x01, 0x10, 0xd6, 0x5d, 0xfd, 0xd6, 0xcd, 0xfd, 0xcd, 0x31, 0x30, 0x25, + 0x33, 0x15, 0x23, 0x35, 0x21, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x01, 0xa4, 0x23, 0x72, 0xfe, + 0xea, 0x7b, 0x6e, 0x7c, 0x66, 0xec, 0x86, 0x01, 0xd6, 0xfe, 0x90, 0x01, 0x70, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x2b, 0x00, 0x00, 0x01, 0xb6, 0x01, 0xd6, 0x00, 0x16, 0x00, 0x2c, 0x40, 0x17, + 0x0e, 0x0a, 0x51, 0x0b, 0x18, 0x01, 0x53, 0x30, 0x15, 0x01, 0x15, 0x17, 0x16, 0x0a, 0x06, 0x57, + 0x10, 0x10, 0x0a, 0x0d, 0x06, 0x0a, 0x0a, 0x00, 0x3f, 0x3f, 0x12, 0x39, 0x2f, 0xed, 0x3f, 0x01, + 0x10, 0xd6, 0x5d, 0xed, 0x10, 0xd6, 0xfd, 0xc0, 0x31, 0x30, 0x13, 0x15, 0x14, 0x1e, 0x02, 0x33, + 0x32, 0x36, 0x37, 0x35, 0x33, 0x11, 0x23, 0x35, 0x06, 0x23, 0x22, 0x2e, 0x02, 0x35, 0x35, 0xa6, + 0x10, 0x1b, 0x21, 0x11, 0x10, 0x1c, 0x0b, 0x7c, 0x7c, 0x2a, 0x27, 0x27, 0x45, 0x34, 0x1e, 0x01, + 0xd6, 0x95, 0x13, 0x18, 0x0e, 0x05, 0x02, 0x02, 0xcf, 0xfe, 0x2a, 0x9a, 0x06, 0x0f, 0x27, 0x41, + 0x32, 0x99, 0x00, 0x00, 0x00, 0x01, 0x00, 0x20, 0x00, 0x00, 0x01, 0xd4, 0x01, 0xd6, 0x00, 0x0b, + 0x00, 0x53, 0x40, 0x1a, 0x5f, 0x00, 0x6f, 0x00, 0x02, 0x00, 0x09, 0x70, 0x08, 0x01, 0x2f, 0x08, + 0x3f, 0x08, 0x4f, 0x08, 0x03, 0x08, 0x05, 0x5f, 0x04, 0x6f, 0x04, 0x02, 0x04, 0x01, 0xb8, 0xff, + 0xc0, 0x40, 0x1a, 0x1a, 0x00, 0x4d, 0x70, 0x01, 0x80, 0x01, 0x90, 0x01, 0xc0, 0x01, 0x04, 0x01, + 0x0c, 0x0a, 0x0a, 0x03, 0x0a, 0x01, 0x06, 0x07, 0x05, 0x09, 0x55, 0x00, 0x06, 0x00, 0x3f, 0xfd, + 0xd0, 0xc5, 0x3f, 0x3f, 0x3f, 0x01, 0x10, 0xd6, 0x5d, 0x2b, 0xd5, 0x5d, 0xd6, 0xd5, 0x5d, 0x5d, + 0xd6, 0xc5, 0x5d, 0x31, 0x30, 0x21, 0x21, 0x11, 0x33, 0x11, 0x33, 0x35, 0x33, 0x15, 0x33, 0x11, + 0x33, 0x01, 0xd4, 0xfe, 0x4c, 0x61, 0x49, 0x60, 0x49, 0x61, 0x01, 0xd6, 0xfe, 0x90, 0xff, 0xff, + 0x01, 0x70, 0x00, 0x00, 0x00, 0x01, 0x00, 0x20, 0xff, 0x7a, 0x01, 0xe2, 0x01, 0xd6, 0x00, 0x0f, + 0x00, 0x7f, 0xb5, 0x0d, 0x40, 0x0e, 0x00, 0x4d, 0x0c, 0xb8, 0xff, 0xc0, 0xb4, 0x0b, 0x0d, 0x00, + 0x4c, 0x0b, 0xb8, 0xff, 0xc0, 0x40, 0x49, 0x0b, 0x0d, 0x00, 0x4c, 0x0d, 0x2f, 0x0c, 0x3f, 0x0c, + 0x4f, 0x0c, 0x6f, 0x0c, 0x04, 0x0c, 0x5f, 0x00, 0x01, 0x00, 0x09, 0x10, 0x07, 0x01, 0xef, 0x07, + 0xff, 0x07, 0x02, 0x70, 0x07, 0x80, 0x07, 0x90, 0x07, 0x03, 0x5f, 0x07, 0x01, 0x07, 0x06, 0x6f, + 0x03, 0x01, 0x03, 0x10, 0x02, 0x20, 0x02, 0x30, 0x02, 0x03, 0x70, 0x02, 0x80, 0x02, 0x90, 0x02, + 0x03, 0x02, 0x10, 0x07, 0x0a, 0x0a, 0x03, 0x0a, 0x05, 0x08, 0x55, 0x0f, 0x0c, 0x55, 0x00, 0x06, + 0x00, 0x3f, 0xed, 0xc5, 0xfd, 0xc0, 0x3f, 0x3f, 0xc6, 0x01, 0x10, 0xd6, 0x5d, 0x71, 0xd5, 0x5d, + 0xd6, 0xd5, 0x5d, 0x5d, 0x5d, 0x71, 0xd6, 0xc5, 0x5d, 0xd5, 0x5d, 0xc5, 0x31, 0x30, 0x2b, 0x2b, + 0x2b, 0x21, 0x21, 0x11, 0x33, 0x11, 0x33, 0x35, 0x33, 0x15, 0x33, 0x11, 0x33, 0x11, 0x33, 0x15, + 0x23, 0x01, 0x82, 0xfe, 0x9e, 0x61, 0x3e, 0x61, 0x3e, 0x61, 0x23, 0x60, 0x01, 0xd6, 0xfe, 0x90, + 0xff, 0xff, 0x01, 0x70, 0xfe, 0x90, 0xec, 0x00, 0x00, 0x02, 0x00, 0x12, 0xff, 0xf6, 0x01, 0xd4, + 0x01, 0xd6, 0x00, 0x0c, 0x00, 0x20, 0x00, 0x4b, 0x40, 0x31, 0x00, 0x40, 0x0b, 0x00, 0x4d, 0x00, + 0x53, 0x00, 0x14, 0x20, 0x14, 0x40, 0x14, 0x60, 0x14, 0x80, 0x14, 0x05, 0x14, 0x22, 0x06, 0x0d, + 0x51, 0x1d, 0x1e, 0x21, 0x03, 0x57, 0x0f, 0x0f, 0x19, 0x4f, 0x1e, 0x5f, 0x1e, 0x6f, 0x1e, 0x03, + 0x1e, 0x55, 0x1f, 0x0a, 0x40, 0x0a, 0x01, 0x0a, 0x57, 0x19, 0x07, 0x00, 0x3f, 0xed, 0x5d, 0x3f, + 0xed, 0x5d, 0x12, 0x39, 0x2f, 0xed, 0x01, 0x10, 0xd6, 0xd5, 0xfd, 0xc0, 0x10, 0xd6, 0x5d, 0xed, + 0x31, 0x30, 0x2b, 0x25, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x15, 0x16, 0x16, 0x33, 0x32, 0x36, + 0x27, 0x36, 0x33, 0x32, 0x1e, 0x02, 0x15, 0x14, 0x0e, 0x02, 0x23, 0x22, 0x26, 0x27, 0x11, 0x23, + 0x35, 0x33, 0x01, 0x59, 0x2b, 0x24, 0x0c, 0x17, 0x0a, 0x0c, 0x1a, 0x0c, 0x1d, 0x2d, 0x7c, 0x28, + 0x21, 0x25, 0x40, 0x2e, 0x1b, 0x1f, 0x34, 0x48, 0x28, 0x37, 0x56, 0x22, 0x50, 0xcb, 0x98, 0x21, + 0x18, 0x03, 0x02, 0x6c, 0x02, 0x02, 0x18, 0xbb, 0x08, 0x13, 0x29, 0x3d, 0x2a, 0x2f, 0x3d, 0x24, + 0x0e, 0x0f, 0x08, 0x01, 0x63, 0x66, 0x00, 0x00, 0x00, 0x03, 0x00, 0x22, 0xff, 0xf6, 0x01, 0xcf, + 0x01, 0xd6, 0x00, 0x12, 0x00, 0x16, 0x00, 0x23, 0x00, 0x5d, 0x40, 0x0a, 0x20, 0x17, 0x30, 0x17, + 0x40, 0x17, 0x03, 0x17, 0x79, 0x08, 0xb8, 0xff, 0xc0, 0x40, 0x14, 0x09, 0x0c, 0x48, 0x08, 0x60, + 0x16, 0x70, 0x16, 0x02, 0x16, 0xa4, 0x40, 0x15, 0x01, 0x15, 0x25, 0x00, 0x1e, 0xa4, 0x10, 0xb8, + 0xff, 0xc0, 0x40, 0x17, 0x0f, 0x12, 0x48, 0x10, 0x24, 0x16, 0x06, 0x13, 0x0a, 0x40, 0x03, 0x01, + 0x03, 0x57, 0x1a, 0x1a, 0x0d, 0x12, 0x0a, 0x21, 0x57, 0x0d, 0x07, 0x00, 0x3f, 0xed, 0x3f, 0x12, + 0x39, 0x2f, 0xed, 0x5d, 0x3f, 0x3f, 0x01, 0x10, 0xd6, 0x2b, 0xfd, 0xc0, 0x10, 0xd6, 0x5d, 0xfd, + 0x5d, 0xd6, 0x2b, 0xed, 0x5d, 0x31, 0x30, 0x13, 0x36, 0x36, 0x33, 0x32, 0x1e, 0x02, 0x15, 0x14, + 0x0e, 0x02, 0x23, 0x22, 0x26, 0x27, 0x11, 0x3b, 0x02, 0x11, 0x23, 0x27, 0x34, 0x26, 0x23, 0x22, + 0x06, 0x07, 0x15, 0x16, 0x16, 0x33, 0x32, 0x36, 0x82, 0x14, 0x1e, 0x10, 0x19, 0x2f, 0x25, 0x16, + 0x1b, 0x2d, 0x3b, 0x1f, 0x24, 0x3e, 0x21, 0x60, 0xed, 0x60, 0x60, 0x8a, 0x1b, 0x20, 0x0b, 0x12, + 0x0b, 0x0c, 0x11, 0x0b, 0x21, 0x1a, 0x01, 0x2f, 0x04, 0x04, 0x13, 0x27, 0x3e, 0x2b, 0x30, 0x3d, + 0x24, 0x0d, 0x0b, 0x08, 0x01, 0xcd, 0xfe, 0x2a, 0x98, 0x1f, 0x23, 0x03, 0x02, 0x7e, 0x02, 0x02, + 0x22, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x36, 0xff, 0xf6, 0x01, 0xd5, 0x01, 0xd6, 0x00, 0x10, + 0x00, 0x21, 0x00, 0x3f, 0xb2, 0x03, 0x53, 0x19, 0xb8, 0xff, 0xc0, 0x40, 0x0c, 0x09, 0x0f, 0x48, + 0x19, 0x23, 0x11, 0x0b, 0x51, 0x70, 0x1f, 0x01, 0x1f, 0xb8, 0xff, 0xc0, 0x40, 0x10, 0x0a, 0x0e, + 0x48, 0x1f, 0x22, 0x14, 0x57, 0x08, 0x08, 0x1c, 0x21, 0x0a, 0x00, 0x57, 0x1c, 0x07, 0x00, 0x3f, + 0xed, 0x3f, 0x12, 0x39, 0x2f, 0xed, 0x01, 0x10, 0xd6, 0x2b, 0x5d, 0xfd, 0xc0, 0x10, 0xd6, 0x2b, + 0xed, 0x31, 0x30, 0x25, 0x32, 0x36, 0x35, 0x34, 0x2e, 0x02, 0x23, 0x22, 0x06, 0x07, 0x15, 0x1e, + 0x03, 0x27, 0x36, 0x36, 0x33, 0x32, 0x1e, 0x02, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x27, 0x11, + 0x33, 0x01, 0x09, 0x26, 0x2b, 0x11, 0x1d, 0x24, 0x12, 0x14, 0x25, 0x0c, 0x05, 0x15, 0x1a, 0x1a, + 0x4e, 0x16, 0x2f, 0x17, 0x27, 0x48, 0x38, 0x21, 0x6c, 0x5a, 0x3c, 0x6a, 0x33, 0x7b, 0x5c, 0x1d, + 0x1f, 0x12, 0x16, 0x0d, 0x05, 0x04, 0x02, 0x6c, 0x01, 0x01, 0x01, 0x01, 0xd3, 0x04, 0x05, 0x11, + 0x26, 0x3f, 0x2e, 0x53, 0x4b, 0x0c, 0x0c, 0x01, 0xc8, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x18, + 0xff, 0xf5, 0x01, 0xcb, 0x01, 0xe2, 0x00, 0x22, 0x00, 0x4a, 0x40, 0x2d, 0x11, 0x14, 0x53, 0x00, + 0x00, 0x20, 0x00, 0xb0, 0x00, 0x03, 0x00, 0x24, 0x13, 0x1b, 0x08, 0x23, 0x1a, 0x30, 0x17, 0x01, + 0x17, 0x57, 0x1e, 0x40, 0x13, 0x50, 0x13, 0x60, 0x13, 0x03, 0x13, 0x55, 0x12, 0x12, 0x05, 0x1e, + 0x0b, 0x09, 0x40, 0x0c, 0x01, 0x0c, 0x57, 0x05, 0x07, 0x00, 0x3f, 0xfd, 0x5d, 0xc6, 0x3f, 0x12, + 0x39, 0x2f, 0xed, 0x5d, 0x10, 0xfd, 0x5d, 0xc6, 0x01, 0x10, 0xd6, 0xd6, 0xc4, 0x10, 0xd6, 0x5d, + 0xfd, 0xc5, 0x31, 0x30, 0x25, 0x14, 0x0e, 0x02, 0x23, 0x22, 0x26, 0x27, 0x37, 0x16, 0x16, 0x33, + 0x32, 0x3e, 0x02, 0x37, 0x23, 0x35, 0x33, 0x26, 0x26, 0x23, 0x22, 0x06, 0x07, 0x27, 0x36, 0x36, + 0x33, 0x32, 0x1e, 0x02, 0x01, 0xcb, 0x26, 0x43, 0x5e, 0x38, 0x30, 0x54, 0x30, 0x19, 0x1d, 0x42, + 0x23, 0x19, 0x32, 0x2b, 0x1e, 0x06, 0xc3, 0xc2, 0x0e, 0x52, 0x33, 0x25, 0x36, 0x1f, 0x1a, 0x2c, + 0x52, 0x26, 0x39, 0x5f, 0x44, 0x26, 0xee, 0x3c, 0x5d, 0x3f, 0x21, 0x0d, 0x11, 0x65, 0x09, 0x0f, + 0x0a, 0x17, 0x23, 0x1a, 0x5d, 0x32, 0x2a, 0x09, 0x0b, 0x64, 0x0e, 0x0d, 0x21, 0x3f, 0x5b, 0x00, + 0x00, 0x02, 0x00, 0x17, 0xff, 0xf5, 0x01, 0xe2, 0x01, 0xe2, 0x00, 0x16, 0x00, 0x2a, 0x00, 0x6d, + 0x40, 0x1a, 0x24, 0x0b, 0x01, 0x3b, 0x1c, 0x4b, 0x1c, 0xcb, 0x1c, 0xdb, 0x1c, 0x04, 0x2f, 0x1c, + 0x01, 0x02, 0x1c, 0x52, 0x40, 0x0b, 0x60, 0x0b, 0x80, 0x0b, 0x03, 0x0b, 0xb8, 0xff, 0xc0, 0x40, + 0x0b, 0x13, 0x16, 0x48, 0x0b, 0x2c, 0xc0, 0x26, 0xd0, 0x26, 0x02, 0x26, 0xb8, 0xff, 0xc0, 0x40, + 0x1d, 0x0b, 0x0f, 0x48, 0x26, 0x52, 0x03, 0x13, 0x02, 0x14, 0x52, 0xd0, 0x16, 0x01, 0x16, 0x2b, + 0x15, 0x06, 0x17, 0x57, 0x10, 0x07, 0x21, 0x57, 0x06, 0x0b, 0x14, 0x02, 0x01, 0x0a, 0x00, 0x3f, + 0xd5, 0xc5, 0x3f, 0xed, 0x3f, 0xed, 0x3f, 0x01, 0x10, 0xd6, 0x5d, 0xfd, 0xc0, 0xd6, 0xd0, 0xed, + 0x2b, 0x5d, 0x10, 0xd6, 0x2b, 0x5d, 0xed, 0x5f, 0x5d, 0x5d, 0x31, 0x30, 0x5d, 0x13, 0x33, 0x15, + 0x33, 0x36, 0x36, 0x33, 0x32, 0x1e, 0x02, 0x15, 0x14, 0x0e, 0x02, 0x23, 0x22, 0x26, 0x27, 0x23, + 0x15, 0x23, 0x25, 0x32, 0x3e, 0x02, 0x35, 0x34, 0x2e, 0x02, 0x23, 0x22, 0x0e, 0x02, 0x15, 0x14, + 0x1e, 0x02, 0x17, 0x61, 0x3b, 0x07, 0x46, 0x4b, 0x2a, 0x3a, 0x23, 0x10, 0x10, 0x25, 0x3a, 0x2a, + 0x4a, 0x45, 0x07, 0x3b, 0x61, 0x01, 0x33, 0x0b, 0x14, 0x0f, 0x08, 0x08, 0x0f, 0x14, 0x0b, 0x0b, + 0x14, 0x0f, 0x08, 0x08, 0x0f, 0x14, 0x01, 0xd6, 0xb5, 0x5b, 0x66, 0x22, 0x3f, 0x5b, 0x3a, 0x38, + 0x5b, 0x40, 0x24, 0x6c, 0x5b, 0xbc, 0x5b, 0x0b, 0x20, 0x39, 0x2d, 0x2d, 0x39, 0x1f, 0x0b, 0x0b, + 0x20, 0x38, 0x2d, 0x2e, 0x39, 0x1f, 0x0b, 0x00, 0x00, 0x02, 0x00, 0x14, 0x00, 0x00, 0x01, 0xc7, + 0x01, 0xe0, 0x00, 0x15, 0x00, 0x22, 0x00, 0x40, 0x40, 0x24, 0x22, 0x15, 0x51, 0x00, 0x13, 0x01, + 0x13, 0x24, 0x1c, 0x53, 0x68, 0x0a, 0x01, 0x0a, 0x00, 0x03, 0x51, 0x07, 0x6f, 0x04, 0x01, 0x04, + 0x23, 0x15, 0x55, 0x22, 0x22, 0x0d, 0x14, 0x06, 0x19, 0x57, 0x0d, 0x0b, 0x03, 0x06, 0x00, 0x3f, + 0x3f, 0xed, 0x3f, 0x12, 0x39, 0x2f, 0xed, 0x01, 0x10, 0xd6, 0x5d, 0x32, 0xed, 0x32, 0xd6, 0x5d, + 0xed, 0x10, 0xd6, 0x5d, 0xfd, 0xc0, 0x31, 0x30, 0x37, 0x06, 0x06, 0x07, 0x23, 0x36, 0x36, 0x37, + 0x26, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x1e, 0x02, 0x17, 0x11, 0x23, 0x35, 0x35, 0x26, 0x26, + 0x23, 0x22, 0x06, 0x15, 0x14, 0x1e, 0x02, 0x33, 0x33, 0xf1, 0x1c, 0x2e, 0x14, 0x7f, 0x1a, 0x39, + 0x19, 0x2c, 0x21, 0x6d, 0x68, 0x18, 0x34, 0x33, 0x2f, 0x11, 0x7b, 0x0a, 0x28, 0x0e, 0x36, 0x28, + 0x10, 0x19, 0x20, 0x10, 0x45, 0xa7, 0x2a, 0x50, 0x2d, 0x3a, 0x66, 0x23, 0x16, 0x3b, 0x29, 0x4e, + 0x55, 0x04, 0x07, 0x09, 0x04, 0xfe, 0x38, 0xa7, 0xcf, 0x01, 0x03, 0x21, 0x1a, 0x11, 0x16, 0x0e, + 0x06, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x1f, 0xff, 0xf5, 0x01, 0xd1, 0x02, 0xb3, 0x02, 0x26, + 0x00, 0x48, 0x00, 0x00, 0x01, 0x06, 0x00, 0x43, 0xef, 0x00, 0x00, 0x13, 0xb9, 0x00, 0x02, 0xff, + 0xfd, 0x40, 0x09, 0x29, 0x27, 0x00, 0x07, 0x50, 0x02, 0x04, 0x28, 0x4f, 0x2b, 0x2b, 0x34, 0x00, + 0xff, 0xff, 0x00, 0x1f, 0xff, 0xf5, 0x01, 0xd1, 0x02, 0xa1, 0x02, 0x26, 0x00, 0x48, 0x00, 0x00, + 0x01, 0x06, 0x00, 0x83, 0x00, 0x00, 0x00, 0x17, 0x40, 0x10, 0x03, 0x02, 0x03, 0x28, 0x3a, 0x00, + 0x07, 0x50, 0x03, 0x04, 0x32, 0x4f, 0x02, 0x04, 0x26, 0x4f, 0x2b, 0x2b, 0x2b, 0x34, 0x34, 0x00, + 0x00, 0x01, 0x00, 0x19, 0xff, 0x5b, 0x01, 0xb9, 0x02, 0xb6, 0x00, 0x29, 0x00, 0x69, 0x40, 0x43, + 0x1b, 0x40, 0x0d, 0x0f, 0x00, 0x4c, 0x22, 0x51, 0x13, 0x40, 0x0a, 0x00, 0x4d, 0xa0, 0x13, 0x01, + 0x0f, 0x13, 0x01, 0x13, 0x40, 0x0b, 0x0e, 0x48, 0x13, 0x2b, 0x09, 0x07, 0x07, 0x0b, 0x28, 0x51, + 0x1a, 0x40, 0x0d, 0x00, 0x4d, 0x0f, 0x1a, 0x5f, 0x1a, 0x02, 0x1a, 0x04, 0x00, 0x02, 0x2a, 0x29, + 0x06, 0x1e, 0x57, 0x1a, 0x17, 0x0e, 0x25, 0x57, 0x0e, 0x0b, 0x01, 0x0a, 0x73, 0x06, 0x08, 0x04, + 0x05, 0x03, 0x04, 0x00, 0x3f, 0xc6, 0x3f, 0xc6, 0xfd, 0xc0, 0x3f, 0xed, 0x3f, 0xc5, 0xed, 0x3f, + 0x01, 0x10, 0xd6, 0xde, 0x32, 0xc6, 0x5d, 0x2b, 0xfd, 0xc0, 0x33, 0x2f, 0xc5, 0x10, 0xd6, 0x2b, + 0x5d, 0x5d, 0x2b, 0xed, 0x31, 0x30, 0x2b, 0x33, 0x11, 0x23, 0x35, 0x33, 0x35, 0x37, 0x15, 0x33, + 0x15, 0x23, 0x15, 0x36, 0x36, 0x33, 0x32, 0x1e, 0x02, 0x15, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, + 0x27, 0x37, 0x16, 0x16, 0x33, 0x32, 0x36, 0x35, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x11, + 0x50, 0x37, 0x37, 0x7c, 0x7f, 0x7f, 0x0e, 0x26, 0x0f, 0x31, 0x41, 0x27, 0x11, 0x5a, 0x56, 0x0c, + 0x31, 0x16, 0x12, 0x0e, 0x16, 0x11, 0x25, 0x1c, 0x1a, 0x23, 0x0e, 0x1f, 0x08, 0x02, 0x14, 0x53, + 0x3a, 0x15, 0x4f, 0x53, 0x42, 0x05, 0x09, 0x1f, 0x39, 0x4f, 0x30, 0xf8, 0x5d, 0x59, 0x04, 0x08, + 0x67, 0x04, 0x04, 0x2b, 0x24, 0xe4, 0x42, 0x3a, 0x08, 0x03, 0xfe, 0x96, 0xff, 0xff, 0x00, 0x59, + 0x00, 0x00, 0x01, 0xbf, 0x02, 0xb3, 0x02, 0x26, 0x02, 0xe6, 0x00, 0x00, 0x01, 0x06, 0x00, 0x8f, + 0x1d, 0x00, 0x00, 0x10, 0x40, 0x0b, 0x01, 0x16, 0x08, 0x06, 0x03, 0x00, 0x50, 0x01, 0x04, 0x07, + 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0x01, 0x00, 0x27, 0xff, 0xf5, 0x01, 0xd7, 0x01, 0xe2, 0x00, 0x20, + 0x00, 0x50, 0x40, 0x31, 0x08, 0x00, 0x19, 0x20, 0x19, 0x60, 0x19, 0x03, 0x19, 0x22, 0x40, 0x22, + 0x01, 0x12, 0x40, 0x10, 0x01, 0x10, 0x0f, 0x53, 0x00, 0x21, 0x18, 0x40, 0x15, 0x01, 0x15, 0x57, + 0x1c, 0x5f, 0x11, 0x6f, 0x11, 0x02, 0x11, 0x55, 0x10, 0x10, 0x05, 0x1c, 0x07, 0x09, 0x4f, 0x0c, + 0x01, 0x0c, 0x57, 0x05, 0x0b, 0x00, 0x3f, 0xfd, 0x5d, 0xc6, 0x3f, 0x12, 0x39, 0x2f, 0xed, 0x5d, + 0x10, 0xfd, 0x5d, 0xc6, 0x01, 0x10, 0xd6, 0xfd, 0xc5, 0x5d, 0xc5, 0x5d, 0x10, 0xd6, 0x5d, 0xc6, + 0x31, 0x30, 0x37, 0x34, 0x3e, 0x02, 0x33, 0x32, 0x16, 0x17, 0x07, 0x26, 0x26, 0x23, 0x22, 0x06, + 0x07, 0x33, 0x15, 0x23, 0x16, 0x16, 0x33, 0x32, 0x36, 0x37, 0x17, 0x06, 0x06, 0x23, 0x22, 0x2e, + 0x02, 0x27, 0x20, 0x44, 0x68, 0x47, 0x2b, 0x46, 0x24, 0x1b, 0x14, 0x33, 0x28, 0x48, 0x4c, 0x0b, + 0xc3, 0xc4, 0x0b, 0x51, 0x49, 0x1f, 0x44, 0x1a, 0x10, 0x1a, 0x4d, 0x33, 0x4a, 0x69, 0x43, 0x20, + 0xeb, 0x33, 0x5a, 0x43, 0x27, 0x0c, 0x0e, 0x63, 0x07, 0x0b, 0x32, 0x2a, 0x5d, 0x2d, 0x31, 0x09, + 0x08, 0x65, 0x0a, 0x0d, 0x26, 0x42, 0x5a, 0x00, 0xff, 0xff, 0x00, 0x36, 0xff, 0xf5, 0x01, 0xba, + 0x01, 0xe2, 0x02, 0x06, 0x00, 0x56, 0x00, 0x00, 0xff, 0xff, 0x00, 0x24, 0xff, 0xf5, 0x01, 0xd3, + 0x02, 0xac, 0x02, 0x06, 0x00, 0x4c, 0x00, 0x00, 0xff, 0xff, 0x00, 0x24, 0xff, 0xf5, 0x01, 0xd3, + 0x02, 0xa1, 0x02, 0x26, 0x01, 0x0c, 0x00, 0x00, 0x01, 0x06, 0x00, 0x83, 0xef, 0x00, 0x00, 0x1a, + 0xb1, 0x02, 0x01, 0xb8, 0xff, 0xef, 0x40, 0x0d, 0x16, 0x28, 0x0a, 0x00, 0x50, 0x02, 0x0b, 0x20, + 0x4f, 0x01, 0x0b, 0x14, 0x4f, 0x2b, 0x2b, 0x2b, 0x34, 0x34, 0x00, 0x00, 0xff, 0xff, 0x00, 0x31, + 0xff, 0x56, 0x01, 0x90, 0x02, 0xac, 0x02, 0x06, 0x00, 0x4d, 0x00, 0x00, 0x00, 0x02, 0x00, 0x04, + 0xff, 0xf5, 0x01, 0xe1, 0x01, 0xd6, 0x00, 0x1e, 0x00, 0x2b, 0x00, 0x50, 0x40, 0x31, 0x29, 0x40, + 0x10, 0x12, 0x00, 0x4c, 0x5f, 0x06, 0x01, 0x06, 0x84, 0x1f, 0x7f, 0x25, 0x8f, 0x25, 0x02, 0x25, + 0x00, 0x8f, 0x10, 0x0f, 0x01, 0x0f, 0x8f, 0x10, 0x01, 0x10, 0x8f, 0x1d, 0x17, 0x2c, 0x03, 0x7d, + 0x22, 0x22, 0x0b, 0x0f, 0x55, 0x1e, 0x0a, 0x17, 0x57, 0x16, 0x07, 0x29, 0x7d, 0x0b, 0x07, 0x00, + 0x3f, 0xed, 0x3f, 0xed, 0x3f, 0xed, 0x12, 0x39, 0x2f, 0xed, 0x01, 0x10, 0xd6, 0xd6, 0xfd, 0x5d, + 0xd6, 0x5d, 0xfd, 0xd0, 0x5d, 0xd6, 0xed, 0x5d, 0x31, 0x30, 0x00, 0x2b, 0x01, 0x36, 0x36, 0x33, + 0x32, 0x16, 0x15, 0x14, 0x0e, 0x02, 0x23, 0x22, 0x26, 0x27, 0x11, 0x23, 0x15, 0x14, 0x0e, 0x02, + 0x07, 0x27, 0x3e, 0x03, 0x35, 0x35, 0x33, 0x13, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x15, 0x16, + 0x16, 0x33, 0x32, 0x36, 0x01, 0x2e, 0x0e, 0x1b, 0x0c, 0x3f, 0x3f, 0x19, 0x2a, 0x38, 0x1f, 0x1c, + 0x3a, 0x1b, 0x33, 0x01, 0x18, 0x3c, 0x3c, 0x0e, 0x19, 0x1d, 0x0e, 0x03, 0xe3, 0x51, 0x1a, 0x1b, + 0x07, 0x0d, 0x08, 0x08, 0x0d, 0x06, 0x1d, 0x19, 0x01, 0x26, 0x03, 0x04, 0x54, 0x49, 0x2c, 0x3b, + 0x24, 0x10, 0x0b, 0x09, 0x01, 0x79, 0x18, 0x4f, 0x84, 0x62, 0x3a, 0x05, 0x61, 0x06, 0x19, 0x2d, + 0x43, 0x2f, 0xc1, 0xfe, 0xbd, 0x23, 0x27, 0x02, 0x03, 0x8e, 0x02, 0x01, 0x26, 0x00, 0x00, 0x00, + 0x00, 0x02, 0x00, 0x2e, 0xff, 0xf5, 0x01, 0xe1, 0x01, 0xd6, 0x00, 0x18, 0x00, 0x25, 0x00, 0x71, + 0x40, 0x33, 0x4f, 0x06, 0x5f, 0x06, 0x02, 0x06, 0x84, 0x19, 0x00, 0x2f, 0x1f, 0x3f, 0x1f, 0x4f, + 0x1f, 0x03, 0x6f, 0x1f, 0x7f, 0x1f, 0x8f, 0x1f, 0x03, 0x1f, 0x8f, 0x16, 0xa0, 0x0f, 0xb0, 0x0f, + 0xc0, 0x0f, 0x03, 0x0f, 0x10, 0x2f, 0x15, 0x3f, 0x15, 0x4f, 0x15, 0x03, 0x8f, 0x15, 0x01, 0x15, + 0x8f, 0x20, 0x13, 0x01, 0x13, 0xb8, 0xff, 0xc0, 0x40, 0x16, 0x0b, 0x10, 0x48, 0x13, 0x26, 0x03, + 0x7d, 0x1c, 0x1c, 0x0b, 0x18, 0x0a, 0x10, 0x15, 0x14, 0x0a, 0x11, 0x06, 0x23, 0x7d, 0x0b, 0x07, + 0x00, 0x3f, 0xed, 0x3f, 0x3f, 0xd5, 0xc5, 0x3f, 0x12, 0x39, 0x2f, 0xed, 0x01, 0x10, 0xd6, 0x2b, + 0x71, 0xfd, 0x5d, 0x71, 0xd0, 0xd6, 0x5d, 0xc0, 0xfd, 0x5d, 0x71, 0xc0, 0xd6, 0xed, 0x5d, 0x31, + 0x30, 0x01, 0x36, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x0e, 0x02, 0x23, 0x22, 0x26, 0x27, 0x35, + 0x23, 0x15, 0x23, 0x11, 0x33, 0x15, 0x33, 0x35, 0x33, 0x13, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, + 0x15, 0x16, 0x16, 0x33, 0x32, 0x36, 0x01, 0x2e, 0x0e, 0x1b, 0x0c, 0x3f, 0x3f, 0x19, 0x2a, 0x38, + 0x1f, 0x1c, 0x3a, 0x1b, 0x51, 0x57, 0x57, 0x51, 0x58, 0x51, 0x1a, 0x1b, 0x07, 0x0d, 0x08, 0x08, + 0x0d, 0x06, 0x1d, 0x19, 0x01, 0x26, 0x03, 0x04, 0x54, 0x49, 0x2c, 0x3b, 0x24, 0x10, 0x0b, 0x09, + 0xbf, 0xc8, 0x01, 0xd6, 0xba, 0xba, 0xfe, 0xbd, 0x23, 0x27, 0x02, 0x03, 0x8e, 0x02, 0x01, 0x26, + 0xff, 0xff, 0x00, 0x19, 0x00, 0x00, 0x01, 0xb9, 0x02, 0xb6, 0x02, 0x06, 0x01, 0x02, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x3f, 0x00, 0x00, 0x01, 0xe8, 0x02, 0xb3, 0x02, 0x26, 0x02, 0xed, 0x00, 0x00, + 0x01, 0x06, 0x00, 0x8f, 0x0b, 0x00, 0x00, 0x13, 0xb9, 0x00, 0x01, 0xff, 0xfd, 0x40, 0x09, 0x1b, + 0x19, 0x16, 0x0e, 0x50, 0x01, 0x03, 0x1a, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0xff, 0xff, 0x00, 0x3f, + 0x00, 0x00, 0x01, 0xb6, 0x02, 0xb3, 0x02, 0x26, 0x02, 0xeb, 0x00, 0x00, 0x01, 0x06, 0x00, 0x43, + 0xef, 0x00, 0x00, 0x13, 0xb9, 0x00, 0x01, 0xff, 0xfa, 0x40, 0x09, 0x13, 0x11, 0x00, 0x07, 0x50, + 0x01, 0x01, 0x12, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0xff, 0xff, 0x00, 0x14, 0xff, 0x58, 0x01, 0xd8, + 0x02, 0xae, 0x02, 0x26, 0x00, 0x5c, 0x00, 0x00, 0x01, 0x06, 0x03, 0x90, 0x00, 0x00, 0x00, 0x10, + 0x40, 0x0b, 0x01, 0x04, 0x28, 0x30, 0x0d, 0x00, 0x50, 0x01, 0x00, 0x23, 0x4f, 0x2b, 0x2b, 0x34, + 0x00, 0x01, 0x00, 0x3f, 0xff, 0x7a, 0x01, 0xb6, 0x01, 0xd6, 0x00, 0x0b, 0x00, 0x48, 0x40, 0x1a, + 0x0a, 0x51, 0x30, 0x09, 0xb0, 0x09, 0xc0, 0x09, 0x03, 0x1f, 0x09, 0x01, 0x09, 0x06, 0x51, 0x05, + 0x4f, 0x00, 0x01, 0x00, 0x1f, 0x03, 0x01, 0x03, 0x51, 0x05, 0xb8, 0xff, 0xc0, 0x40, 0x10, 0x0a, + 0x0e, 0x48, 0x05, 0x0c, 0x09, 0x0a, 0x06, 0x0a, 0x08, 0x55, 0x01, 0x03, 0x06, 0x00, 0x06, 0x00, + 0x3f, 0x3f, 0xc5, 0xed, 0x3f, 0x3f, 0x01, 0x10, 0xd6, 0x2b, 0xfd, 0x5d, 0xc5, 0x5d, 0x10, 0xfd, + 0xd6, 0x5d, 0x5d, 0xed, 0x31, 0x30, 0x21, 0x15, 0x23, 0x35, 0x23, 0x11, 0x33, 0x11, 0x33, 0x11, + 0x33, 0x11, 0x01, 0x32, 0x72, 0x81, 0x7b, 0x80, 0x7c, 0x86, 0x86, 0x01, 0xd6, 0xfe, 0x90, 0x01, + 0x70, 0xfe, 0x2a, 0x00, 0x00, 0x02, 0x00, 0x1f, 0xff, 0xf3, 0x01, 0xd7, 0x02, 0xb4, 0x00, 0x2c, + 0x00, 0x3c, 0x00, 0x40, 0x40, 0x26, 0x2d, 0x46, 0x13, 0x20, 0x23, 0x40, 0x23, 0x60, 0x23, 0x70, + 0x23, 0x04, 0x23, 0x3e, 0x1b, 0x46, 0x05, 0x08, 0x37, 0x46, 0x70, 0x00, 0x01, 0x00, 0x3d, 0x32, + 0x57, 0x20, 0x20, 0x0d, 0x3a, 0x4a, 0x28, 0x07, 0x16, 0x57, 0x0d, 0x10, 0x00, 0x3f, 0xed, 0x3f, + 0xed, 0x12, 0x39, 0x2f, 0xed, 0x01, 0x10, 0xd6, 0x5d, 0xed, 0xd4, 0xc5, 0xed, 0x10, 0xd6, 0x5d, + 0xc4, 0xed, 0x31, 0x30, 0x37, 0x34, 0x3e, 0x02, 0x37, 0x26, 0x26, 0x35, 0x34, 0x3e, 0x02, 0x33, + 0x32, 0x32, 0x36, 0x36, 0x37, 0x17, 0x06, 0x06, 0x23, 0x22, 0x0e, 0x02, 0x15, 0x14, 0x1e, 0x02, + 0x17, 0x16, 0x16, 0x15, 0x14, 0x0e, 0x02, 0x23, 0x22, 0x2e, 0x02, 0x25, 0x34, 0x2e, 0x02, 0x27, + 0x0e, 0x03, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x1f, 0x0b, 0x1e, 0x35, 0x2b, 0x1d, 0x24, 0x14, + 0x29, 0x3f, 0x2c, 0x1a, 0x28, 0x24, 0x21, 0x13, 0x0b, 0x23, 0x52, 0x26, 0x09, 0x13, 0x11, 0x0a, + 0x0b, 0x1b, 0x2d, 0x21, 0x3b, 0x46, 0x1f, 0x39, 0x51, 0x31, 0x32, 0x51, 0x3b, 0x20, 0x01, 0x3a, + 0x11, 0x1b, 0x24, 0x13, 0x1c, 0x23, 0x13, 0x07, 0x35, 0x2a, 0x2a, 0x33, 0xda, 0x16, 0x38, 0x3a, + 0x37, 0x15, 0x17, 0x39, 0x29, 0x1d, 0x33, 0x25, 0x15, 0x01, 0x01, 0x01, 0x5b, 0x02, 0x02, 0x02, + 0x08, 0x10, 0x0d, 0x0c, 0x17, 0x1b, 0x22, 0x16, 0x27, 0x67, 0x48, 0x37, 0x59, 0x3e, 0x21, 0x1f, + 0x3b, 0x56, 0x41, 0x1a, 0x2a, 0x23, 0x1e, 0x0e, 0x0d, 0x24, 0x28, 0x28, 0x12, 0x44, 0x43, 0x42, + 0x00, 0x02, 0x00, 0x12, 0xff, 0xf8, 0x01, 0xd5, 0x02, 0x93, 0x00, 0x13, 0x00, 0x20, 0x00, 0x51, + 0x40, 0x31, 0x8f, 0x00, 0x9f, 0x00, 0xbf, 0x00, 0x03, 0x00, 0x53, 0x30, 0x1d, 0x40, 0x1d, 0x02, + 0x1d, 0x14, 0x0f, 0x0d, 0x10, 0x51, 0x0a, 0x07, 0x08, 0x21, 0x40, 0x12, 0x01, 0x12, 0x57, 0x20, + 0x20, 0x0c, 0x03, 0x07, 0x10, 0x40, 0x0d, 0x10, 0x48, 0x10, 0x55, 0x0a, 0x0d, 0x0c, 0x93, 0x18, + 0x57, 0x03, 0x07, 0x00, 0x3f, 0xed, 0x3f, 0xd5, 0xc0, 0xfd, 0x2b, 0xc0, 0x11, 0x12, 0x39, 0x2f, + 0xed, 0x5d, 0x01, 0x10, 0xd6, 0xd5, 0xc0, 0xfd, 0xc0, 0xc5, 0xd0, 0xd6, 0x5d, 0xed, 0x5d, 0x31, + 0x30, 0x25, 0x14, 0x06, 0x23, 0x22, 0x26, 0x27, 0x11, 0x23, 0x35, 0x33, 0x35, 0x33, 0x15, 0x33, + 0x15, 0x23, 0x15, 0x33, 0x32, 0x05, 0x15, 0x16, 0x32, 0x33, 0x32, 0x3e, 0x02, 0x35, 0x34, 0x26, + 0x23, 0x01, 0xd5, 0x77, 0x69, 0x23, 0x51, 0x2c, 0x43, 0x43, 0x7b, 0x9c, 0x9c, 0x2b, 0xda, 0xfe, + 0xfb, 0x08, 0x16, 0x0d, 0x13, 0x21, 0x19, 0x0e, 0x3b, 0x2d, 0xcb, 0x69, 0x6a, 0x08, 0x0b, 0x01, + 0xe9, 0x66, 0x39, 0x39, 0x66, 0x5f, 0x66, 0xc7, 0x01, 0x0a, 0x17, 0x24, 0x1b, 0x39, 0x2f, 0x00, + 0x00, 0x02, 0x00, 0x12, 0xff, 0xf6, 0x01, 0xd5, 0x02, 0xb6, 0x00, 0x18, 0x00, 0x29, 0x00, 0x50, + 0x40, 0x19, 0x8f, 0x11, 0x9f, 0x11, 0x02, 0x11, 0x53, 0x20, 0x1c, 0x30, 0x1c, 0x40, 0x1c, 0x03, + 0x1c, 0x24, 0x07, 0x05, 0x08, 0x51, 0x02, 0x18, 0x00, 0x2a, 0x0c, 0xb8, 0xff, 0xc0, 0x40, 0x15, + 0x0d, 0x00, 0x4d, 0x20, 0x0c, 0x01, 0x0c, 0x57, 0x21, 0x21, 0x04, 0x19, 0x57, 0x14, 0x07, 0x06, + 0x0a, 0x04, 0x10, 0x01, 0x0a, 0x00, 0x3f, 0x3f, 0x3f, 0x3f, 0xed, 0x12, 0x39, 0x2f, 0xed, 0x5d, + 0x2b, 0x01, 0x10, 0xd6, 0xd5, 0xc0, 0xfd, 0xc0, 0xc5, 0xd0, 0xd6, 0x5d, 0xed, 0x5d, 0x31, 0x30, + 0x13, 0x35, 0x33, 0x35, 0x37, 0x15, 0x33, 0x15, 0x23, 0x15, 0x36, 0x36, 0x33, 0x32, 0x1e, 0x02, + 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x27, 0x11, 0x13, 0x32, 0x36, 0x35, 0x34, 0x2e, 0x02, 0x23, + 0x22, 0x06, 0x07, 0x15, 0x1e, 0x03, 0x12, 0x43, 0x7b, 0x95, 0x95, 0x14, 0x28, 0x14, 0x24, 0x41, + 0x32, 0x1e, 0x61, 0x52, 0x39, 0x63, 0x31, 0xc8, 0x1c, 0x21, 0x0e, 0x17, 0x1c, 0x0f, 0x11, 0x1f, + 0x0a, 0x05, 0x13, 0x16, 0x16, 0x01, 0x7a, 0x5c, 0xcb, 0x15, 0xe0, 0x5c, 0x4b, 0x04, 0x05, 0x11, + 0x26, 0x3f, 0x2e, 0x53, 0x4b, 0x0c, 0x0c, 0x01, 0x6c, 0xfe, 0xe2, 0x1d, 0x1f, 0x12, 0x16, 0x0d, + 0x05, 0x04, 0x02, 0x6c, 0x01, 0x01, 0x01, 0x01, 0x00, 0x03, 0x00, 0x1b, 0xff, 0xf3, 0x01, 0xd9, + 0x02, 0x79, 0x00, 0x0b, 0x00, 0x1f, 0x00, 0x34, 0x00, 0x62, 0xb9, 0x00, 0x19, 0xff, 0xc0, 0xb4, + 0x16, 0x17, 0x00, 0x4c, 0x19, 0xb8, 0xff, 0xc0, 0x40, 0x34, 0x0e, 0x0f, 0x00, 0x4c, 0x25, 0x1b, + 0x46, 0x40, 0x06, 0x60, 0x06, 0x80, 0x06, 0x03, 0x06, 0x36, 0x30, 0x11, 0x46, 0xa0, 0x00, 0x01, + 0x00, 0x35, 0xa0, 0x19, 0xb0, 0x19, 0x02, 0xa0, 0x28, 0xb0, 0x28, 0x02, 0x14, 0x19, 0x2d, 0x28, + 0x28, 0x2d, 0x19, 0x14, 0x04, 0x03, 0x20, 0x4a, 0x09, 0x07, 0x0c, 0x4a, 0x03, 0x03, 0x00, 0x3f, + 0xed, 0x3f, 0xed, 0x12, 0x17, 0x39, 0x2f, 0x2f, 0x2f, 0x2f, 0x5d, 0x5d, 0x01, 0x10, 0xd6, 0x5d, + 0xfd, 0xc0, 0x10, 0xd6, 0x5d, 0xfd, 0xc5, 0x31, 0x30, 0x00, 0x2b, 0x2b, 0x13, 0x34, 0x36, 0x33, + 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x13, 0x22, 0x0e, 0x02, 0x07, 0x36, 0x36, 0x33, + 0x32, 0x1e, 0x02, 0x33, 0x32, 0x37, 0x2e, 0x03, 0x03, 0x32, 0x3e, 0x02, 0x37, 0x06, 0x06, 0x23, + 0x22, 0x2e, 0x02, 0x23, 0x22, 0x06, 0x07, 0x1e, 0x03, 0x1b, 0x76, 0x69, 0x6d, 0x72, 0x74, 0x6a, + 0x6d, 0x73, 0xdf, 0x1c, 0x24, 0x16, 0x0a, 0x01, 0x0e, 0x1c, 0x0e, 0x12, 0x1c, 0x19, 0x18, 0x0e, + 0x0f, 0x0e, 0x01, 0x09, 0x16, 0x25, 0x1c, 0x1a, 0x23, 0x16, 0x0b, 0x02, 0x0a, 0x13, 0x09, 0x12, + 0x1c, 0x19, 0x18, 0x0e, 0x0b, 0x15, 0x0e, 0x01, 0x0b, 0x17, 0x23, 0x01, 0x36, 0xa0, 0xa3, 0xa3, + 0xa0, 0xa0, 0xa3, 0xa3, 0x01, 0x78, 0x1b, 0x2e, 0x3f, 0x25, 0x0e, 0x0b, 0x0d, 0x0f, 0x0d, 0x0a, + 0x26, 0x42, 0x30, 0x1b, 0xfe, 0x50, 0x17, 0x29, 0x38, 0x21, 0x07, 0x05, 0x0d, 0x0f, 0x0d, 0x0a, + 0x0c, 0x23, 0x3b, 0x2a, 0x18, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x1d, 0xff, 0xf3, 0x01, 0xd8, + 0x01, 0xe2, 0x00, 0x13, 0x00, 0x23, 0x00, 0x34, 0x00, 0x49, 0xb9, 0x00, 0x1f, 0xff, 0xc0, 0x40, + 0x28, 0x13, 0x00, 0x4d, 0x1c, 0x27, 0x53, 0x20, 0x00, 0x40, 0x00, 0x60, 0x00, 0x80, 0x00, 0x04, + 0x00, 0x36, 0x16, 0x2d, 0x53, 0x0a, 0x35, 0x30, 0x24, 0x14, 0x1f, 0x1f, 0x14, 0x24, 0x30, 0x04, + 0x05, 0x2a, 0x57, 0x0f, 0x0b, 0x19, 0x57, 0x05, 0x07, 0x00, 0x3f, 0xed, 0x3f, 0xed, 0x12, 0x17, + 0x39, 0x2f, 0x2f, 0x2f, 0x2f, 0x01, 0x10, 0xd6, 0xfd, 0xc5, 0x10, 0xd6, 0x5d, 0xfd, 0xc5, 0x31, + 0x30, 0x00, 0x2b, 0x25, 0x14, 0x0e, 0x02, 0x23, 0x22, 0x2e, 0x02, 0x35, 0x34, 0x3e, 0x02, 0x33, + 0x32, 0x1e, 0x02, 0x05, 0x22, 0x07, 0x16, 0x16, 0x33, 0x32, 0x36, 0x37, 0x06, 0x06, 0x23, 0x22, + 0x2e, 0x02, 0x37, 0x32, 0x36, 0x37, 0x26, 0x26, 0x23, 0x22, 0x06, 0x07, 0x36, 0x36, 0x33, 0x32, + 0x1e, 0x02, 0x01, 0xd8, 0x20, 0x3a, 0x51, 0x32, 0x32, 0x51, 0x3b, 0x20, 0x21, 0x3b, 0x52, 0x30, + 0x31, 0x51, 0x3b, 0x20, 0xfe, 0xe0, 0x10, 0x0e, 0x03, 0x2e, 0x2e, 0x28, 0x2f, 0x07, 0x0e, 0x1a, + 0x08, 0x0f, 0x1f, 0x1c, 0x1a, 0x74, 0x08, 0x11, 0x09, 0x05, 0x2d, 0x2c, 0x26, 0x30, 0x08, 0x0b, + 0x17, 0x09, 0x0f, 0x1e, 0x1d, 0x1a, 0xec, 0x38, 0x5b, 0x42, 0x24, 0x24, 0x42, 0x5b, 0x38, 0x37, + 0x5b, 0x41, 0x23, 0x23, 0x41, 0x5b, 0x46, 0x08, 0x36, 0x41, 0x36, 0x2e, 0x07, 0x06, 0x0c, 0x0f, + 0x0d, 0x22, 0x04, 0x05, 0x33, 0x3c, 0x32, 0x2b, 0x06, 0x06, 0x0c, 0x0f, 0x0c, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x03, 0x00, 0x00, 0x02, 0x0c, 0x02, 0x74, 0x00, 0x23, 0x00, 0x48, 0x40, 0x27, + 0x04, 0x20, 0x0c, 0x00, 0x4d, 0x11, 0x40, 0x0c, 0x00, 0x4d, 0x11, 0x06, 0x16, 0x00, 0x05, 0x0c, + 0x06, 0x05, 0x05, 0x06, 0x0c, 0x03, 0x0b, 0x1c, 0x25, 0x0b, 0x24, 0x1d, 0x1f, 0x4a, 0x19, 0x03, + 0x11, 0x11, 0x05, 0x0c, 0x02, 0x05, 0x08, 0x00, 0x3f, 0x3f, 0x12, 0x39, 0x2f, 0x3f, 0xfd, 0xc6, + 0x01, 0x10, 0xc6, 0x10, 0xc6, 0x11, 0x17, 0x39, 0x2f, 0x2f, 0x2f, 0x11, 0x39, 0x39, 0x12, 0x39, + 0x31, 0x30, 0x00, 0x2b, 0x01, 0x2b, 0x01, 0x0e, 0x03, 0x07, 0x23, 0x2e, 0x03, 0x27, 0x33, 0x1e, + 0x03, 0x17, 0x3e, 0x03, 0x37, 0x36, 0x36, 0x33, 0x32, 0x16, 0x17, 0x07, 0x26, 0x23, 0x22, 0x0e, + 0x02, 0x01, 0x8b, 0x0b, 0x13, 0x18, 0x20, 0x18, 0x7f, 0x16, 0x30, 0x2b, 0x22, 0x08, 0x82, 0x05, + 0x14, 0x18, 0x1b, 0x0e, 0x0c, 0x14, 0x12, 0x0f, 0x08, 0x10, 0x3c, 0x30, 0x18, 0x2d, 0x23, 0x35, + 0x11, 0x0e, 0x0b, 0x0d, 0x0a, 0x07, 0x01, 0xb1, 0x33, 0x55, 0x5e, 0x76, 0x55, 0x45, 0xae, 0xad, + 0x9a, 0x31, 0x30, 0x7f, 0x87, 0x83, 0x34, 0x37, 0x5e, 0x54, 0x50, 0x2b, 0x52, 0x40, 0x11, 0x1f, + 0x47, 0x11, 0x11, 0x1b, 0x21, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0e, 0x00, 0x00, 0x02, 0x00, + 0x01, 0xe2, 0x00, 0x20, 0x00, 0x35, 0x40, 0x1b, 0x02, 0x20, 0x0a, 0x00, 0x4d, 0x08, 0x07, 0x0d, + 0x04, 0x12, 0x00, 0x03, 0x04, 0x03, 0x04, 0x03, 0x07, 0x1a, 0x22, 0x07, 0x21, 0x17, 0x0b, 0x07, + 0x0a, 0x04, 0x06, 0x00, 0x3f, 0x3f, 0x3f, 0x01, 0x10, 0xc6, 0x10, 0xc6, 0x11, 0x39, 0x39, 0x2f, + 0x2f, 0x11, 0x39, 0x39, 0x12, 0x39, 0x11, 0x39, 0x31, 0x30, 0x2b, 0x01, 0x06, 0x06, 0x07, 0x23, + 0x26, 0x26, 0x27, 0x33, 0x1e, 0x03, 0x17, 0x3e, 0x03, 0x37, 0x3e, 0x03, 0x33, 0x32, 0x16, 0x17, + 0x07, 0x26, 0x26, 0x23, 0x22, 0x06, 0x01, 0x93, 0x22, 0x41, 0x1d, 0x68, 0x27, 0x51, 0x25, 0x81, + 0x07, 0x14, 0x16, 0x17, 0x0a, 0x0a, 0x10, 0x0e, 0x0e, 0x09, 0x07, 0x14, 0x20, 0x2d, 0x21, 0x14, + 0x2b, 0x18, 0x17, 0x0d, 0x12, 0x08, 0x10, 0x17, 0x01, 0x53, 0x5f, 0xb2, 0x42, 0x59, 0xef, 0x8e, + 0x26, 0x56, 0x57, 0x52, 0x22, 0x22, 0x35, 0x32, 0x33, 0x20, 0x1a, 0x2c, 0x1f, 0x12, 0x07, 0x0b, + 0x61, 0x06, 0x03, 0x10, 0x00, 0x02, 0x00, 0x2e, 0xff, 0x57, 0x01, 0xec, 0x03, 0x39, 0x00, 0x18, + 0x00, 0x2a, 0x00, 0x66, 0xb9, 0x00, 0x09, 0xff, 0xc0, 0x40, 0x3b, 0x0a, 0x00, 0x4d, 0x15, 0xb3, + 0x0a, 0x0b, 0x2c, 0x00, 0x09, 0x01, 0x08, 0x09, 0x08, 0x09, 0x2b, 0x0f, 0x2c, 0x26, 0x1e, 0x18, + 0x2f, 0x02, 0x3f, 0x02, 0x4f, 0x02, 0x03, 0x02, 0xb3, 0x20, 0x01, 0x30, 0x01, 0x50, 0x01, 0x03, + 0x01, 0x2b, 0x25, 0x86, 0x0f, 0x19, 0x01, 0x19, 0x22, 0x1f, 0x86, 0x18, 0x08, 0x14, 0x08, 0x10, + 0x0f, 0x92, 0x08, 0x02, 0x02, 0x02, 0x00, 0x3f, 0x3f, 0x3f, 0xcd, 0x3f, 0x3f, 0x3f, 0xde, 0xc5, + 0x5d, 0x3f, 0x01, 0x10, 0xd6, 0x5d, 0xed, 0x5d, 0x32, 0xd6, 0xc4, 0x10, 0xc4, 0x12, 0x39, 0x39, + 0x2f, 0x2f, 0x5d, 0x10, 0xd6, 0xdd, 0xed, 0x31, 0x30, 0x2b, 0x33, 0x11, 0x33, 0x11, 0x3e, 0x03, + 0x37, 0x33, 0x11, 0x33, 0x15, 0x14, 0x06, 0x07, 0x27, 0x36, 0x36, 0x37, 0x23, 0x11, 0x06, 0x06, + 0x07, 0x13, 0x22, 0x2e, 0x02, 0x27, 0x37, 0x16, 0x16, 0x33, 0x32, 0x36, 0x37, 0x17, 0x0e, 0x03, + 0x2e, 0x6f, 0x10, 0x2e, 0x36, 0x39, 0x1c, 0x62, 0x24, 0x3b, 0x3c, 0x49, 0x18, 0x24, 0x0b, 0x19, + 0x39, 0x64, 0x2c, 0x6a, 0x1c, 0x36, 0x2a, 0x1c, 0x03, 0x5c, 0x07, 0x21, 0x17, 0x17, 0x21, 0x07, + 0x5b, 0x03, 0x1b, 0x2a, 0x36, 0x02, 0x6b, 0xfe, 0x83, 0x23, 0x5f, 0x68, 0x67, 0x2c, 0xfe, 0x0b, + 0x09, 0x47, 0x92, 0x3d, 0x2f, 0x20, 0x3d, 0x1d, 0x01, 0x9b, 0x67, 0xc8, 0x6c, 0x02, 0xa1, 0x11, + 0x21, 0x30, 0x1e, 0x18, 0x22, 0x1c, 0x1a, 0x23, 0x18, 0x1e, 0x2f, 0x21, 0x11, 0x00, 0x00, 0x00, + 0x00, 0x02, 0x00, 0x3f, 0xff, 0x6c, 0x01, 0xda, 0x02, 0xae, 0x00, 0x17, 0x00, 0x29, 0x00, 0x69, + 0xb2, 0x12, 0x44, 0x08, 0xb8, 0xff, 0xc0, 0x40, 0x1a, 0x09, 0x0d, 0x48, 0x08, 0x09, 0x2b, 0x06, + 0x10, 0x10, 0x2a, 0x0d, 0x2b, 0x25, 0x24, 0x1e, 0x1d, 0x2a, 0x17, 0x02, 0x44, 0xc0, 0x01, 0xd0, + 0x01, 0x02, 0x01, 0xb8, 0xff, 0xc0, 0x40, 0x19, 0x09, 0x0e, 0x48, 0x01, 0x2a, 0x24, 0xa0, 0x18, + 0x21, 0x1e, 0xa0, 0x03, 0x12, 0x07, 0x17, 0x06, 0x0d, 0x0c, 0x09, 0x11, 0x06, 0x07, 0x0a, 0x01, + 0x0a, 0x00, 0x3f, 0x3f, 0x3f, 0xc5, 0xd4, 0xc5, 0x3f, 0x12, 0x39, 0x39, 0x3f, 0xde, 0xc5, 0x3f, + 0x01, 0x10, 0xd6, 0x2b, 0x5d, 0xed, 0x32, 0x10, 0xd4, 0xd5, 0xd6, 0xc5, 0x10, 0xc4, 0x12, 0x39, + 0x2f, 0x39, 0x10, 0xd6, 0xd5, 0x2b, 0xed, 0x31, 0x30, 0x33, 0x11, 0x33, 0x11, 0x36, 0x36, 0x37, + 0x33, 0x11, 0x33, 0x14, 0x06, 0x07, 0x27, 0x36, 0x36, 0x37, 0x23, 0x11, 0x0e, 0x03, 0x07, 0x13, + 0x22, 0x2e, 0x02, 0x27, 0x37, 0x16, 0x16, 0x33, 0x32, 0x36, 0x37, 0x17, 0x0e, 0x03, 0x3f, 0x6e, + 0x20, 0x4e, 0x38, 0x63, 0x24, 0x3c, 0x33, 0x4a, 0x12, 0x22, 0x0b, 0x19, 0x17, 0x29, 0x27, 0x29, + 0x16, 0x59, 0x1c, 0x36, 0x2a, 0x1c, 0x02, 0x5c, 0x06, 0x22, 0x16, 0x17, 0x22, 0x06, 0x5c, 0x03, + 0x1c, 0x2a, 0x36, 0x01, 0xd6, 0xfe, 0xf5, 0x40, 0x81, 0x4a, 0xfe, 0x97, 0x4c, 0x88, 0x2d, 0x2e, + 0x16, 0x37, 0x19, 0x01, 0x20, 0x23, 0x42, 0x44, 0x4b, 0x2c, 0x02, 0x16, 0x11, 0x21, 0x30, 0x1e, + 0x18, 0x23, 0x1c, 0x1b, 0x23, 0x18, 0x1e, 0x30, 0x20, 0x11, 0x00, 0x00, 0x00, 0x02, 0x00, 0x12, + 0xff, 0xf8, 0x01, 0xd5, 0x02, 0x6b, 0x00, 0x14, 0x00, 0x23, 0x00, 0x61, 0x40, 0x20, 0x1e, 0x51, + 0x20, 0x00, 0x01, 0x00, 0x00, 0x40, 0x00, 0x60, 0x00, 0x03, 0x00, 0x25, 0x15, 0x0f, 0x0d, 0x10, + 0x53, 0x0a, 0x0f, 0x07, 0x01, 0x07, 0x08, 0x24, 0x4f, 0x23, 0x01, 0x23, 0x4a, 0x12, 0xb8, 0xff, + 0xc0, 0x40, 0x19, 0x09, 0x0c, 0x48, 0x12, 0x12, 0x0c, 0x03, 0x07, 0x4f, 0x10, 0x5f, 0x10, 0x6f, + 0x10, 0x03, 0x10, 0x72, 0x0a, 0x0d, 0x0c, 0x02, 0x19, 0x4a, 0x03, 0x09, 0x00, 0x3f, 0xed, 0x3f, + 0xd5, 0xc0, 0xfd, 0x5d, 0xc0, 0x11, 0x12, 0x39, 0x2f, 0x2b, 0xed, 0x5d, 0x01, 0x10, 0xd6, 0xd5, + 0x5d, 0x32, 0xfd, 0x32, 0xc5, 0x33, 0x10, 0xd6, 0x5d, 0x71, 0xed, 0x31, 0x30, 0x25, 0x14, 0x06, + 0x23, 0x22, 0x26, 0x27, 0x11, 0x23, 0x35, 0x33, 0x35, 0x33, 0x15, 0x33, 0x15, 0x23, 0x15, 0x33, + 0x32, 0x16, 0x05, 0x15, 0x16, 0x32, 0x33, 0x32, 0x3e, 0x02, 0x35, 0x34, 0x2e, 0x02, 0x23, 0x01, + 0xd5, 0x85, 0x74, 0x25, 0x42, 0x2e, 0x35, 0x35, 0x7c, 0x47, 0x47, 0x1f, 0x79, 0x7a, 0xfe, 0xee, + 0x08, 0x08, 0x0f, 0x18, 0x2a, 0x1f, 0x13, 0x14, 0x22, 0x2f, 0x1c, 0xc6, 0x68, 0x66, 0x08, 0x0b, + 0x01, 0xc4, 0x62, 0x3a, 0x3a, 0x62, 0x43, 0x61, 0x05, 0xbe, 0x01, 0x08, 0x15, 0x24, 0x1b, 0x1c, + 0x27, 0x16, 0x0a, 0x00, 0x00, 0x02, 0x00, 0x12, 0xff, 0xf6, 0x01, 0xd5, 0x01, 0xe8, 0x00, 0x18, + 0x00, 0x27, 0x00, 0x76, 0x40, 0x3c, 0x1c, 0x51, 0x00, 0x0b, 0x40, 0x0b, 0x60, 0x0b, 0x03, 0x0b, + 0x29, 0x24, 0x18, 0x01, 0x02, 0x51, 0x15, 0x0f, 0x12, 0x1f, 0x12, 0x2f, 0x12, 0x03, 0x0f, 0x12, + 0x01, 0x12, 0x13, 0x28, 0x02, 0x12, 0x40, 0x12, 0x00, 0x4d, 0x6f, 0x12, 0x7f, 0x12, 0x02, 0xaf, + 0x12, 0xbf, 0x12, 0x02, 0x12, 0x18, 0x15, 0x17, 0x4f, 0x21, 0x5f, 0x21, 0x6f, 0x21, 0x03, 0x21, + 0x4a, 0x06, 0xb8, 0xff, 0xc0, 0x40, 0x0f, 0x0c, 0x0f, 0x48, 0x06, 0x06, 0x0e, 0x17, 0x0b, 0x40, + 0x19, 0x01, 0x19, 0x4a, 0x0e, 0x07, 0x00, 0x3f, 0xed, 0x5d, 0x3f, 0x12, 0x39, 0x2f, 0x2b, 0xed, + 0x5d, 0x10, 0xd5, 0x32, 0xc5, 0x5d, 0x71, 0x2b, 0x32, 0x01, 0x10, 0xd6, 0xd5, 0x5d, 0x71, 0xc0, + 0xfd, 0xc5, 0xc0, 0xc0, 0x10, 0xd6, 0x5d, 0xed, 0x31, 0x30, 0x01, 0x15, 0x23, 0x15, 0x36, 0x36, + 0x33, 0x32, 0x1e, 0x02, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x27, 0x11, 0x23, 0x35, 0x33, 0x35, + 0x33, 0x15, 0x13, 0x32, 0x36, 0x35, 0x34, 0x2e, 0x02, 0x23, 0x22, 0x06, 0x07, 0x15, 0x16, 0x16, + 0x01, 0x4e, 0x8b, 0x14, 0x2b, 0x16, 0x25, 0x44, 0x35, 0x1f, 0x65, 0x57, 0x3a, 0x65, 0x33, 0x35, + 0x35, 0x7c, 0x51, 0x21, 0x25, 0x10, 0x19, 0x20, 0x10, 0x12, 0x21, 0x0b, 0x0a, 0x34, 0x01, 0xb3, + 0x53, 0x31, 0x04, 0x05, 0x11, 0x26, 0x3f, 0x2e, 0x53, 0x4b, 0x0c, 0x0c, 0x01, 0x52, 0x53, 0x35, + 0x35, 0xfe, 0xa9, 0x1d, 0x1f, 0x12, 0x16, 0x0d, 0x05, 0x04, 0x02, 0x6c, 0x02, 0x02, 0x00, 0x00, + 0x00, 0x02, 0x00, 0x36, 0x00, 0x00, 0x01, 0xd8, 0x02, 0x72, 0x00, 0x14, 0x00, 0x24, 0x00, 0x5b, + 0x40, 0x37, 0x07, 0x06, 0x08, 0x20, 0x09, 0x1f, 0x1d, 0x1e, 0x08, 0x25, 0x26, 0x22, 0x46, 0x00, + 0x03, 0x60, 0x03, 0x80, 0x03, 0x03, 0x03, 0x26, 0x0d, 0x20, 0x19, 0x30, 0x19, 0x02, 0x19, 0x44, + 0x10, 0x25, 0x1a, 0x4a, 0x1f, 0x1e, 0x00, 0x0c, 0x08, 0x07, 0x0e, 0x0c, 0x07, 0x0c, 0x07, 0x00, + 0x0e, 0x08, 0x4f, 0x15, 0x01, 0x15, 0x4a, 0x00, 0x03, 0x00, 0x3f, 0xed, 0x5d, 0x3f, 0x12, 0x39, + 0x39, 0x2f, 0x2f, 0x11, 0x12, 0x39, 0x11, 0x12, 0x39, 0x39, 0xed, 0x01, 0x10, 0xd6, 0xfd, 0x5d, + 0xc0, 0x10, 0xd6, 0x5d, 0xed, 0x11, 0x12, 0x17, 0x39, 0x31, 0x30, 0x13, 0x32, 0x16, 0x15, 0x14, + 0x06, 0x07, 0x17, 0x07, 0x27, 0x06, 0x06, 0x23, 0x23, 0x15, 0x23, 0x11, 0x3e, 0x03, 0x17, 0x22, + 0x06, 0x07, 0x15, 0x33, 0x32, 0x36, 0x33, 0x27, 0x37, 0x17, 0x36, 0x35, 0x34, 0x26, 0xe0, 0x76, + 0x82, 0x23, 0x20, 0x39, 0x53, 0x3c, 0x16, 0x31, 0x1b, 0x2c, 0x7b, 0x12, 0x2d, 0x2e, 0x2c, 0x1f, + 0x0b, 0x27, 0x0b, 0x32, 0x09, 0x13, 0x08, 0x27, 0x52, 0x23, 0x09, 0x3f, 0x02, 0x72, 0x61, 0x6e, + 0x38, 0x50, 0x1a, 0x5f, 0x2e, 0x67, 0x05, 0x05, 0xd1, 0x02, 0x63, 0x04, 0x06, 0x03, 0x02, 0x6b, + 0x01, 0x02, 0xcc, 0x01, 0x43, 0x2f, 0x3c, 0x15, 0x22, 0x37, 0x2a, 0x00, 0x00, 0x02, 0x00, 0x3f, + 0xff, 0x5b, 0x01, 0xd5, 0x01, 0xe0, 0x00, 0x13, 0x00, 0x22, 0x00, 0x4d, 0x40, 0x2d, 0x14, 0x53, + 0x40, 0x0e, 0x60, 0x0e, 0x02, 0x0e, 0x24, 0x1f, 0x1e, 0x23, 0x12, 0x11, 0x13, 0x21, 0x00, 0x05, + 0x24, 0x20, 0x20, 0x23, 0x24, 0x05, 0x1a, 0x51, 0x08, 0x23, 0x13, 0x12, 0x11, 0x1f, 0x20, 0x05, + 0x06, 0x17, 0x57, 0x0b, 0x0b, 0x06, 0x0e, 0x1e, 0x57, 0x02, 0x07, 0x00, 0x3f, 0xed, 0x3f, 0x3f, + 0xed, 0x12, 0x17, 0x39, 0x01, 0x10, 0xd6, 0xfd, 0xc0, 0x11, 0x12, 0x39, 0x2f, 0x12, 0x17, 0x39, + 0x12, 0x39, 0x39, 0x10, 0xd6, 0x5d, 0xed, 0x31, 0x30, 0x05, 0x06, 0x23, 0x22, 0x26, 0x27, 0x15, + 0x23, 0x11, 0x36, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x07, 0x17, 0x07, 0x03, 0x34, 0x26, + 0x23, 0x22, 0x06, 0x07, 0x11, 0x16, 0x16, 0x33, 0x27, 0x37, 0x17, 0x36, 0x01, 0x39, 0x0e, 0x10, + 0x17, 0x30, 0x1a, 0x7b, 0x22, 0x63, 0x30, 0x6d, 0x74, 0x23, 0x23, 0x33, 0x53, 0x13, 0x36, 0x33, + 0x0e, 0x20, 0x0b, 0x0b, 0x27, 0x13, 0x2a, 0x52, 0x28, 0x0d, 0x06, 0x03, 0x09, 0x0c, 0xb1, 0x02, + 0x6c, 0x0b, 0x0e, 0x84, 0x71, 0x43, 0x67, 0x20, 0x57, 0x2d, 0x01, 0x4a, 0x3f, 0x51, 0x03, 0x01, + 0xfe, 0xfb, 0x08, 0x0b, 0x4a, 0x2f, 0x46, 0x1e, 0x00, 0x01, 0x00, 0x24, 0x00, 0x00, 0x01, 0xdb, + 0x02, 0xe1, 0x00, 0x0b, 0x00, 0x30, 0xb7, 0x05, 0x02, 0x06, 0x08, 0x07, 0x44, 0x00, 0x0b, 0xb8, + 0xff, 0xc0, 0x40, 0x0f, 0x0e, 0x12, 0x48, 0x0b, 0x0c, 0x07, 0x00, 0x48, 0x0a, 0x08, 0x06, 0x48, + 0x03, 0x01, 0x02, 0x00, 0x3f, 0xc6, 0xed, 0x3f, 0xed, 0x32, 0x01, 0x10, 0xd6, 0x2b, 0xd5, 0xfd, + 0xc5, 0xd0, 0xd5, 0xc5, 0x31, 0x30, 0x37, 0x11, 0x33, 0x35, 0x33, 0x15, 0x23, 0x11, 0x33, 0x15, + 0x21, 0x35, 0x7d, 0xec, 0x72, 0xe3, 0x86, 0xfe, 0xa6, 0x66, 0x02, 0x05, 0x76, 0xdc, 0xfe, 0x61, + 0x66, 0x66, 0x00, 0x00, 0x00, 0x01, 0x00, 0x59, 0x00, 0x00, 0x01, 0xbf, 0x02, 0x44, 0x00, 0x07, + 0x00, 0x31, 0x40, 0x1f, 0x07, 0x40, 0x05, 0x50, 0x05, 0x02, 0x05, 0xaf, 0x01, 0xbf, 0x01, 0x02, + 0x01, 0x51, 0xa0, 0x03, 0xb0, 0x03, 0xd0, 0x03, 0x03, 0x03, 0x08, 0x06, 0xb1, 0x01, 0x55, 0x04, + 0x0a, 0x02, 0x06, 0x00, 0x3f, 0x3f, 0xed, 0x3f, 0x01, 0x10, 0xd6, 0x5d, 0xfd, 0x5d, 0xd5, 0x5d, + 0xc5, 0x31, 0x30, 0x01, 0x23, 0x11, 0x23, 0x11, 0x33, 0x35, 0x33, 0x01, 0xbf, 0xea, 0x7c, 0xf3, + 0x73, 0x01, 0x70, 0xfe, 0x90, 0x01, 0xd6, 0x6e, 0x00, 0x01, 0x00, 0x24, 0x00, 0x00, 0x01, 0xe4, + 0x02, 0x6b, 0x00, 0x11, 0x00, 0x42, 0x40, 0x22, 0x07, 0x05, 0x03, 0x0d, 0x0c, 0x0c, 0x0e, 0x0b, + 0x08, 0x09, 0x51, 0x01, 0x00, 0x04, 0x03, 0x11, 0x12, 0x0d, 0x40, 0x00, 0x01, 0x00, 0x48, 0x10, + 0x08, 0x01, 0x0c, 0x48, 0x04, 0x09, 0x08, 0x48, 0x05, 0x02, 0x00, 0x3f, 0xfd, 0xd6, 0x32, 0xed, + 0x32, 0x3f, 0xed, 0x5d, 0x32, 0x01, 0x10, 0xc6, 0xd6, 0xd5, 0x32, 0x32, 0xfd, 0x32, 0xc5, 0x32, + 0x33, 0x11, 0x33, 0x10, 0xd6, 0xc5, 0x31, 0x30, 0x37, 0x35, 0x23, 0x35, 0x33, 0x11, 0x21, 0x15, + 0x23, 0x15, 0x33, 0x15, 0x23, 0x15, 0x33, 0x15, 0x21, 0x35, 0x7d, 0x59, 0x59, 0x01, 0x67, 0xec, + 0x86, 0x86, 0x86, 0xfe, 0xa6, 0x66, 0xa0, 0x62, 0x01, 0x03, 0x66, 0x9d, 0x62, 0xa0, 0x66, 0x66, + 0x00, 0x01, 0x00, 0x12, 0x00, 0x00, 0x01, 0xbf, 0x01, 0xd6, 0x00, 0x0d, 0x00, 0x2f, 0x40, 0x18, + 0x00, 0x01, 0x05, 0x03, 0x02, 0x51, 0x08, 0x0b, 0x0a, 0x0e, 0x08, 0x05, 0x73, 0x0b, 0x4f, 0x02, + 0x01, 0x02, 0x00, 0x48, 0x0d, 0x0a, 0x06, 0x08, 0x00, 0x3f, 0x3f, 0xfd, 0xd6, 0x5d, 0x32, 0xed, + 0x32, 0x01, 0x10, 0xd6, 0xd5, 0x32, 0xfd, 0xc5, 0x33, 0xd0, 0xc5, 0x31, 0x30, 0x01, 0x23, 0x15, + 0x33, 0x15, 0x23, 0x15, 0x23, 0x35, 0x23, 0x35, 0x33, 0x35, 0x21, 0x01, 0xbf, 0xea, 0x74, 0x74, + 0x7c, 0x47, 0x47, 0x01, 0x66, 0x01, 0x70, 0x7a, 0x53, 0xa3, 0xa3, 0x53, 0xe0, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x2d, 0xff, 0x59, 0x01, 0xde, 0x02, 0x6b, 0x00, 0x22, 0x00, 0x4c, 0x40, 0x2f, + 0x19, 0x53, 0x02, 0x00, 0x0c, 0x80, 0x0c, 0x90, 0x0c, 0xa0, 0x0c, 0x04, 0x0c, 0x24, 0x05, 0x21, + 0x51, 0x00, 0x4f, 0x12, 0x01, 0x12, 0x23, 0x40, 0x07, 0x01, 0x07, 0x57, 0x1e, 0x1e, 0x01, 0x22, + 0x08, 0x13, 0x40, 0x16, 0x50, 0x16, 0x02, 0x16, 0x55, 0x0f, 0x92, 0x04, 0x48, 0x01, 0x02, 0x00, + 0x3f, 0xed, 0x3f, 0xfd, 0x5d, 0xc6, 0x3f, 0x12, 0x39, 0x2f, 0xed, 0x5d, 0x01, 0x10, 0xc6, 0x5d, + 0xd6, 0xed, 0x32, 0x10, 0xd6, 0x5d, 0xc4, 0xed, 0x31, 0x30, 0x33, 0x11, 0x21, 0x15, 0x21, 0x15, + 0x36, 0x33, 0x32, 0x1e, 0x02, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x27, 0x37, 0x16, 0x32, 0x33, + 0x32, 0x36, 0x35, 0x34, 0x2e, 0x02, 0x23, 0x22, 0x06, 0x07, 0x11, 0x2d, 0x01, 0x81, 0xfe, 0xfa, + 0x22, 0x22, 0x36, 0x5a, 0x3f, 0x23, 0x7d, 0x81, 0x0e, 0x1e, 0x10, 0x05, 0x0b, 0x13, 0x0a, 0x4d, + 0x4d, 0x14, 0x24, 0x35, 0x21, 0x0d, 0x1a, 0x0e, 0x02, 0x6b, 0x66, 0x7f, 0x06, 0x20, 0x44, 0x6a, + 0x49, 0x87, 0x95, 0x02, 0x02, 0x65, 0x01, 0x4f, 0x61, 0x34, 0x46, 0x2a, 0x11, 0x03, 0x02, 0xfe, + 0xdf, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x3f, 0xff, 0x5a, 0x01, 0xd3, 0x01, 0xd6, 0x00, 0x22, + 0x00, 0x48, 0x40, 0x2c, 0x20, 0x18, 0x30, 0x18, 0xe0, 0x18, 0x03, 0x18, 0x57, 0x09, 0x24, 0x22, + 0x01, 0x1e, 0x51, 0x20, 0x0f, 0x11, 0x01, 0x11, 0x40, 0x0c, 0x0f, 0x48, 0x11, 0x23, 0x1b, 0x57, + 0x04, 0x04, 0x1f, 0x4f, 0x01, 0x01, 0x01, 0x48, 0x21, 0x0a, 0x1f, 0x06, 0x15, 0x57, 0x0e, 0x0e, + 0x00, 0x3f, 0xed, 0x3f, 0x3f, 0xed, 0x5d, 0x12, 0x39, 0x2f, 0xed, 0x01, 0x10, 0xc6, 0x2b, 0x5d, + 0xd6, 0xfd, 0xd0, 0xc5, 0x10, 0xd6, 0xed, 0x5d, 0x31, 0x30, 0x01, 0x23, 0x15, 0x36, 0x33, 0x32, + 0x1e, 0x02, 0x15, 0x14, 0x0e, 0x02, 0x23, 0x22, 0x26, 0x27, 0x37, 0x16, 0x16, 0x33, 0x32, 0x36, + 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x15, 0x23, 0x11, 0x21, 0x01, 0x98, 0xde, 0x25, 0x24, + 0x31, 0x4d, 0x36, 0x1c, 0x17, 0x32, 0x4f, 0x37, 0x0c, 0x1e, 0x0e, 0x08, 0x08, 0x1a, 0x08, 0x35, + 0x2e, 0x36, 0x3d, 0x09, 0x22, 0x09, 0x7b, 0x01, 0x59, 0x01, 0x70, 0x57, 0x06, 0x20, 0x3c, 0x53, + 0x33, 0x33, 0x53, 0x3c, 0x21, 0x01, 0x02, 0x61, 0x01, 0x01, 0x45, 0x38, 0x42, 0x40, 0x03, 0x02, + 0xb6, 0x01, 0xd6, 0x00, 0x00, 0x01, 0x00, 0x09, 0xff, 0x5a, 0x01, 0xeb, 0x02, 0x6b, 0x00, 0x2f, + 0x00, 0x72, 0x40, 0x40, 0x18, 0xa4, 0x16, 0x31, 0x14, 0x15, 0x31, 0x2c, 0x00, 0x21, 0x05, 0x06, + 0x19, 0x11, 0x08, 0x1e, 0x04, 0x07, 0x0d, 0x26, 0x00, 0x06, 0x07, 0x0d, 0x0d, 0x07, 0x06, 0x00, + 0x26, 0x05, 0x2f, 0x0e, 0x31, 0x2f, 0x27, 0x30, 0x26, 0x08, 0x20, 0x08, 0x05, 0x08, 0x2c, 0x11, + 0x21, 0x1e, 0x1e, 0x21, 0x11, 0x2c, 0x08, 0x05, 0x06, 0x0d, 0x1f, 0x08, 0x17, 0x0e, 0x0d, 0x02, + 0x06, 0x02, 0x00, 0x02, 0x00, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x12, 0x17, 0x39, 0x2f, 0x2f, 0x2f, + 0x2f, 0x2f, 0x2f, 0x3f, 0x3f, 0x01, 0x10, 0xc6, 0xc6, 0x10, 0xc6, 0x11, 0x17, 0x39, 0x2f, 0x2f, + 0x2f, 0x2f, 0x2f, 0x11, 0x12, 0x17, 0x39, 0x11, 0x39, 0x39, 0x12, 0x39, 0x10, 0xd6, 0xc5, 0x10, + 0xd6, 0xed, 0x31, 0x30, 0x13, 0x1e, 0x03, 0x17, 0x35, 0x33, 0x15, 0x3e, 0x03, 0x37, 0x33, 0x06, + 0x06, 0x07, 0x16, 0x16, 0x17, 0x33, 0x11, 0x23, 0x35, 0x23, 0x2e, 0x03, 0x27, 0x11, 0x23, 0x11, + 0x0e, 0x03, 0x07, 0x23, 0x3e, 0x03, 0x37, 0x26, 0x26, 0x27, 0x70, 0x0a, 0x14, 0x17, 0x18, 0x0d, + 0x60, 0x0d, 0x18, 0x17, 0x15, 0x09, 0x67, 0x19, 0x3e, 0x2d, 0x1f, 0x38, 0x14, 0x19, 0x57, 0x10, + 0x06, 0x14, 0x19, 0x1b, 0x0c, 0x60, 0x0d, 0x1b, 0x18, 0x14, 0x06, 0x67, 0x08, 0x1b, 0x23, 0x29, + 0x15, 0x2a, 0x41, 0x19, 0x02, 0x6b, 0x26, 0x41, 0x3b, 0x39, 0x1e, 0xf9, 0xfa, 0x1d, 0x39, 0x3c, + 0x42, 0x26, 0x47, 0x8e, 0x4f, 0x2a, 0x75, 0x42, 0xfe, 0xf4, 0xa6, 0x2a, 0x53, 0x4e, 0x44, 0x1b, + 0xfe, 0xd6, 0x01, 0x2a, 0x1b, 0x44, 0x4e, 0x53, 0x2a, 0x2e, 0x5d, 0x55, 0x4a, 0x1d, 0x51, 0x8e, + 0x45, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0e, 0xff, 0x7a, 0x01, 0xeb, 0x01, 0xd6, 0x00, 0x2b, + 0x00, 0x66, 0x40, 0x3b, 0x10, 0x06, 0x0d, 0x2d, 0x1e, 0x1a, 0x17, 0x09, 0x11, 0x15, 0x05, 0x23, + 0x24, 0x1a, 0x17, 0x2a, 0x16, 0x14, 0x2b, 0x15, 0x05, 0x05, 0x15, 0x2b, 0x14, 0x16, 0x2a, 0x17, + 0x1a, 0x24, 0x23, 0x0a, 0x2d, 0x1b, 0x2c, 0x14, 0x17, 0x1e, 0x09, 0x00, 0x29, 0x06, 0x15, 0x2b, + 0x0a, 0x23, 0x0a, 0x1a, 0x06, 0x15, 0x06, 0x0c, 0x48, 0x11, 0x06, 0x0e, 0x88, 0x06, 0x0a, 0x00, + 0x3f, 0x3f, 0x3f, 0xed, 0x3f, 0x3f, 0x3f, 0x3f, 0x12, 0x17, 0x39, 0x01, 0x10, 0xc6, 0x12, 0x17, + 0x39, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x11, 0x12, 0x39, 0x39, 0x11, + 0x12, 0x39, 0x10, 0xd6, 0xc6, 0xc5, 0x31, 0x30, 0x01, 0x3e, 0x03, 0x37, 0x33, 0x06, 0x06, 0x07, + 0x16, 0x16, 0x17, 0x33, 0x15, 0x23, 0x35, 0x23, 0x26, 0x26, 0x27, 0x15, 0x23, 0x35, 0x06, 0x06, + 0x07, 0x23, 0x36, 0x36, 0x37, 0x2e, 0x03, 0x27, 0x33, 0x1e, 0x03, 0x17, 0x35, 0x33, 0x01, 0x2b, + 0x09, 0x17, 0x17, 0x15, 0x08, 0x67, 0x19, 0x38, 0x26, 0x1a, 0x22, 0x11, 0x2f, 0x57, 0x17, 0x07, + 0x2a, 0x21, 0x60, 0x22, 0x28, 0x08, 0x67, 0x14, 0x39, 0x27, 0x15, 0x22, 0x1c, 0x19, 0x0c, 0x67, + 0x08, 0x15, 0x18, 0x17, 0x0a, 0x60, 0x01, 0x11, 0x14, 0x32, 0x34, 0x34, 0x17, 0x38, 0x66, 0x3c, + 0x23, 0x4c, 0x27, 0xec, 0x86, 0x20, 0x6f, 0x4e, 0xdd, 0xe0, 0x4d, 0x6e, 0x25, 0x3e, 0x81, 0x3c, + 0x21, 0x38, 0x33, 0x33, 0x1c, 0x17, 0x34, 0x34, 0x31, 0x14, 0xc4, 0x00, 0x00, 0x01, 0x00, 0x17, + 0xff, 0x56, 0x01, 0xdf, 0x02, 0x79, 0x00, 0x48, 0x00, 0x8d, 0x40, 0x5b, 0x34, 0x40, 0x0f, 0x00, + 0x4d, 0x34, 0x40, 0x0c, 0x00, 0x4d, 0x33, 0x20, 0x0f, 0x00, 0x4d, 0x33, 0x40, 0x0e, 0x00, 0x4d, + 0x33, 0x40, 0x0c, 0x00, 0x4d, 0x32, 0x20, 0x0d, 0x00, 0x4d, 0x40, 0x2c, 0x63, 0xaf, 0x3d, 0x01, + 0x3d, 0x43, 0x27, 0x23, 0x63, 0x60, 0x43, 0x80, 0x43, 0xa0, 0x43, 0x03, 0x43, 0x4a, 0x35, 0x18, + 0x49, 0x03, 0x10, 0x0a, 0x49, 0x34, 0x20, 0x2f, 0x30, 0x2f, 0x02, 0x2f, 0x67, 0x38, 0x40, 0x28, + 0x01, 0x28, 0x65, 0x27, 0x40, 0x40, 0x27, 0x15, 0x38, 0x05, 0x19, 0x2f, 0x1e, 0x3f, 0x1e, 0x02, + 0x1e, 0x67, 0x15, 0x0d, 0x0e, 0x08, 0x92, 0x00, 0x3f, 0xc5, 0x3f, 0xfd, 0x5d, 0xc6, 0x3f, 0x12, + 0x39, 0x39, 0x3d, 0x2f, 0x18, 0x2f, 0xed, 0x5d, 0x10, 0xfd, 0x5d, 0xc6, 0x01, 0x10, 0xd6, 0xdc, + 0xc5, 0x10, 0xd6, 0xc6, 0x10, 0xd6, 0x5d, 0xfd, 0xc6, 0x10, 0xd4, 0x5d, 0xed, 0xc5, 0x31, 0x30, + 0x00, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x05, 0x16, 0x16, 0x15, 0x14, 0x0e, 0x02, 0x23, 0x22, + 0x27, 0x37, 0x16, 0x16, 0x33, 0x32, 0x35, 0x34, 0x27, 0x27, 0x36, 0x37, 0x26, 0x26, 0x27, 0x37, + 0x1e, 0x03, 0x33, 0x32, 0x3e, 0x02, 0x35, 0x34, 0x26, 0x23, 0x23, 0x35, 0x33, 0x32, 0x36, 0x35, + 0x34, 0x26, 0x23, 0x22, 0x0e, 0x02, 0x07, 0x27, 0x36, 0x36, 0x33, 0x32, 0x1e, 0x02, 0x15, 0x14, + 0x06, 0x07, 0x16, 0x16, 0x15, 0x14, 0x0e, 0x02, 0x07, 0x01, 0x1a, 0x21, 0x1a, 0x15, 0x21, 0x2c, + 0x16, 0x2d, 0x23, 0x0d, 0x06, 0x22, 0x10, 0x29, 0x24, 0x14, 0x05, 0x06, 0x2d, 0x60, 0x2a, 0x29, + 0x0c, 0x22, 0x29, 0x2f, 0x1a, 0x26, 0x32, 0x1e, 0x0c, 0x39, 0x47, 0x62, 0x4f, 0x3c, 0x3c, 0x32, + 0x33, 0x13, 0x27, 0x24, 0x20, 0x0b, 0x2c, 0x27, 0x64, 0x33, 0x39, 0x52, 0x35, 0x19, 0x2c, 0x27, + 0x33, 0x3b, 0x12, 0x2b, 0x4a, 0x38, 0x18, 0x0a, 0x27, 0x12, 0x17, 0x1e, 0x12, 0x08, 0x0b, 0x3f, + 0x02, 0x07, 0x19, 0x13, 0x0c, 0x06, 0x10, 0x0e, 0x02, 0x19, 0x15, 0x63, 0x05, 0x0e, 0x0c, 0x09, + 0x0f, 0x18, 0x20, 0x11, 0x2a, 0x2e, 0x65, 0x2b, 0x26, 0x26, 0x23, 0x08, 0x0c, 0x0f, 0x07, 0x63, + 0x18, 0x1b, 0x1d, 0x30, 0x3d, 0x1f, 0x2a, 0x49, 0x13, 0x11, 0x54, 0x34, 0x1e, 0x3d, 0x33, 0x26, + 0x07, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x33, 0xff, 0x56, 0x01, 0xb3, 0x01, 0xe0, 0x00, 0x46, + 0x00, 0x61, 0x40, 0x37, 0x2a, 0x51, 0x3b, 0x3e, 0x1f, 0x51, 0x41, 0x48, 0x0a, 0x10, 0x03, 0x48, + 0x33, 0x26, 0x0f, 0x18, 0x01, 0x18, 0x47, 0x46, 0x07, 0x32, 0x4f, 0x2f, 0x01, 0x2f, 0x4a, 0x36, + 0x24, 0xa5, 0x27, 0x3e, 0x27, 0x3e, 0x15, 0x36, 0x07, 0xa0, 0x19, 0x01, 0x19, 0x40, 0x1c, 0x50, + 0x1c, 0x60, 0x1c, 0x03, 0x1c, 0x4a, 0x15, 0x07, 0x0e, 0x08, 0x92, 0x00, 0x3f, 0xc5, 0x3f, 0xfd, + 0x5d, 0xc6, 0x5d, 0x3f, 0x12, 0x39, 0x39, 0x3d, 0x2f, 0x18, 0x2f, 0xed, 0x10, 0xfd, 0x5d, 0xc6, + 0x3f, 0x01, 0x10, 0xd6, 0x5d, 0xc4, 0xc6, 0x10, 0xd6, 0xd5, 0xcc, 0x10, 0xd6, 0xed, 0xc5, 0xd4, + 0xed, 0x31, 0x30, 0x05, 0x16, 0x16, 0x15, 0x14, 0x0e, 0x02, 0x23, 0x22, 0x27, 0x37, 0x16, 0x16, + 0x33, 0x32, 0x35, 0x34, 0x27, 0x27, 0x36, 0x37, 0x26, 0x26, 0x27, 0x37, 0x16, 0x16, 0x33, 0x32, + 0x36, 0x35, 0x34, 0x2e, 0x02, 0x23, 0x23, 0x35, 0x33, 0x32, 0x36, 0x35, 0x34, 0x2e, 0x02, 0x23, + 0x22, 0x06, 0x07, 0x27, 0x36, 0x36, 0x33, 0x32, 0x1e, 0x02, 0x15, 0x14, 0x06, 0x07, 0x16, 0x16, + 0x15, 0x14, 0x0e, 0x02, 0x07, 0x01, 0x10, 0x21, 0x1a, 0x15, 0x21, 0x2c, 0x16, 0x2d, 0x23, 0x0d, + 0x06, 0x22, 0x10, 0x29, 0x24, 0x14, 0x05, 0x07, 0x29, 0x4b, 0x1e, 0x17, 0x14, 0x53, 0x35, 0x2c, + 0x2d, 0x0e, 0x17, 0x1d, 0x0f, 0x6a, 0x6a, 0x26, 0x1d, 0x07, 0x12, 0x1e, 0x16, 0x2a, 0x4b, 0x17, + 0x18, 0x22, 0x4e, 0x33, 0x27, 0x46, 0x35, 0x20, 0x22, 0x1d, 0x27, 0x26, 0x18, 0x2a, 0x39, 0x21, + 0x18, 0x0a, 0x27, 0x12, 0x17, 0x1e, 0x12, 0x08, 0x0b, 0x3f, 0x02, 0x07, 0x19, 0x13, 0x0c, 0x06, + 0x11, 0x0e, 0x03, 0x10, 0x0d, 0x65, 0x07, 0x13, 0x19, 0x15, 0x0f, 0x13, 0x0b, 0x04, 0x5d, 0x1b, + 0x11, 0x08, 0x11, 0x0d, 0x08, 0x0e, 0x06, 0x66, 0x0b, 0x0e, 0x0d, 0x1f, 0x34, 0x26, 0x23, 0x30, + 0x11, 0x11, 0x37, 0x2b, 0x22, 0x32, 0x22, 0x13, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x2d, + 0xff, 0x5b, 0x01, 0xd9, 0x02, 0x6b, 0x00, 0x1c, 0x00, 0x46, 0x40, 0x27, 0x00, 0x1c, 0xb3, 0x19, + 0x1e, 0x0f, 0x10, 0x0f, 0x10, 0x1d, 0x1e, 0x00, 0x1e, 0x10, 0x1e, 0x02, 0x15, 0x0a, 0x05, 0x51, + 0x07, 0x1d, 0x1b, 0x0e, 0x0f, 0x04, 0x05, 0x15, 0x0a, 0x03, 0x06, 0x09, 0x04, 0x06, 0x08, 0x19, + 0x65, 0x00, 0x08, 0x00, 0x3f, 0xed, 0x3f, 0x3f, 0x12, 0x17, 0x39, 0x3f, 0x3f, 0x01, 0x10, 0xd6, + 0xfd, 0xd0, 0xc5, 0x5d, 0x11, 0x12, 0x39, 0x39, 0x2f, 0x2f, 0x10, 0xd6, 0xfd, 0xc5, 0x31, 0x30, + 0x21, 0x2e, 0x03, 0x27, 0x11, 0x23, 0x11, 0x33, 0x11, 0x3e, 0x03, 0x37, 0x33, 0x0e, 0x03, 0x07, + 0x16, 0x16, 0x17, 0x33, 0x11, 0x23, 0x35, 0x01, 0x4c, 0x0a, 0x25, 0x2d, 0x31, 0x17, 0x7b, 0x7b, + 0x14, 0x2a, 0x27, 0x20, 0x0a, 0x8b, 0x0e, 0x24, 0x2d, 0x35, 0x1e, 0x2d, 0x4f, 0x22, 0x2b, 0x72, + 0x23, 0x51, 0x4d, 0x43, 0x17, 0xfe, 0xe5, 0x02, 0x6b, 0xfe, 0xff, 0x1c, 0x44, 0x44, 0x42, 0x1b, + 0x1b, 0x44, 0x4b, 0x4e, 0x25, 0x2b, 0x7b, 0x42, 0xfe, 0xf5, 0xa5, 0x00, 0x00, 0x01, 0x00, 0x3f, + 0xff, 0x7a, 0x01, 0xc7, 0x01, 0xd6, 0x00, 0x1a, 0x00, 0x4f, 0x40, 0x2e, 0x0d, 0x40, 0x0b, 0x0c, + 0x00, 0x4c, 0x0c, 0x20, 0x0b, 0x00, 0x4d, 0x00, 0x1a, 0xb3, 0x17, 0x1c, 0x0d, 0x16, 0x1c, 0x13, + 0x13, 0x1b, 0x0e, 0x1c, 0x05, 0x09, 0x44, 0x08, 0x1b, 0x18, 0x88, 0x0a, 0x13, 0x05, 0x03, 0x06, + 0x0d, 0x0a, 0x08, 0x0a, 0x06, 0x06, 0x17, 0x79, 0x00, 0x06, 0x00, 0x3f, 0xed, 0x3f, 0x3f, 0x3f, + 0x12, 0x17, 0x39, 0x3f, 0x01, 0x10, 0xd6, 0xfd, 0xc0, 0x10, 0xc6, 0x12, 0x39, 0x2f, 0x12, 0x39, + 0x39, 0x10, 0xd6, 0xfd, 0xc5, 0x31, 0x30, 0x2b, 0x2b, 0x21, 0x2e, 0x03, 0x27, 0x15, 0x23, 0x11, + 0x33, 0x15, 0x36, 0x36, 0x37, 0x33, 0x0e, 0x03, 0x07, 0x16, 0x16, 0x17, 0x33, 0x15, 0x23, 0x35, + 0x01, 0x3f, 0x0a, 0x20, 0x25, 0x25, 0x10, 0x7c, 0x7c, 0x1c, 0x3b, 0x14, 0x94, 0x12, 0x2a, 0x2c, + 0x2c, 0x15, 0x1f, 0x42, 0x1d, 0x38, 0x72, 0x19, 0x3f, 0x3d, 0x37, 0x12, 0xde, 0x01, 0xd6, 0xba, + 0x2a, 0x66, 0x2a, 0x17, 0x36, 0x38, 0x34, 0x16, 0x1e, 0x56, 0x2d, 0xec, 0x86, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x1c, 0x00, 0x00, 0x01, 0xf0, 0x02, 0x6b, 0x00, 0x20, 0x00, 0x96, 0x40, 0x0d, + 0x10, 0x40, 0x0c, 0x0d, 0x00, 0x4c, 0x0f, 0x40, 0x0c, 0x0d, 0x00, 0x4c, 0x0e, 0xb8, 0xff, 0xc0, + 0xb4, 0x09, 0x0b, 0x00, 0x4c, 0x0d, 0xb8, 0xff, 0xc0, 0xb4, 0x09, 0x0b, 0x00, 0x4c, 0x0a, 0xb8, + 0xff, 0xc0, 0xb4, 0x09, 0x0b, 0x00, 0x4c, 0x09, 0xb8, 0xff, 0xc0, 0x40, 0x40, 0x09, 0x0b, 0x00, + 0x4c, 0x08, 0x40, 0x0c, 0x00, 0x4d, 0x07, 0x40, 0x0c, 0x00, 0x4d, 0x20, 0x16, 0x00, 0x15, 0x1b, + 0x05, 0x21, 0x22, 0x05, 0x3f, 0x12, 0x4f, 0x12, 0x02, 0x12, 0x0f, 0x0f, 0x09, 0x4f, 0x08, 0x01, + 0x08, 0x0f, 0x0e, 0x1f, 0x0e, 0x2f, 0x0e, 0x03, 0x0e, 0xb3, 0x0c, 0x21, 0x12, 0x1b, 0x05, 0x03, + 0x00, 0x15, 0x04, 0x07, 0x08, 0x0f, 0x10, 0x0d, 0x04, 0x0a, 0x08, 0x00, 0x08, 0x00, 0x3f, 0x3f, + 0x3f, 0xd6, 0xd5, 0xd5, 0xc5, 0x3f, 0x12, 0x17, 0x39, 0x01, 0x10, 0xd6, 0xfd, 0x5d, 0xc5, 0x5d, + 0x33, 0x33, 0x2f, 0xc5, 0x5d, 0x32, 0x11, 0x12, 0x17, 0x39, 0x31, 0x30, 0x2b, 0x2b, 0x2b, 0x2b, + 0x2b, 0x2b, 0x2b, 0x2b, 0x21, 0x2e, 0x03, 0x27, 0x15, 0x23, 0x35, 0x23, 0x11, 0x23, 0x11, 0x33, + 0x15, 0x33, 0x35, 0x33, 0x15, 0x36, 0x36, 0x37, 0x33, 0x0e, 0x03, 0x07, 0x1e, 0x03, 0x17, 0x01, + 0x74, 0x0e, 0x1c, 0x1e, 0x21, 0x14, 0x44, 0x25, 0x72, 0x72, 0x25, 0x44, 0x1d, 0x3d, 0x13, 0x7d, + 0x08, 0x1b, 0x25, 0x30, 0x1c, 0x18, 0x28, 0x27, 0x27, 0x15, 0x30, 0x46, 0x3e, 0x3a, 0x24, 0x84, + 0x88, 0xfe, 0xea, 0x02, 0x6b, 0xfa, 0x89, 0x8a, 0x36, 0x83, 0x42, 0x1b, 0x47, 0x4f, 0x52, 0x27, + 0x21, 0x42, 0x4d, 0x5a, 0x37, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x1c, 0x00, 0x00, 0x01, 0xe7, + 0x01, 0xd6, 0x00, 0x1e, 0x00, 0x90, 0xb9, 0x00, 0x1b, 0xff, 0xc0, 0xb4, 0x0b, 0x0f, 0x00, 0x4c, + 0x1a, 0xb8, 0xff, 0xc0, 0xb4, 0x0b, 0x0f, 0x00, 0x4c, 0x17, 0xb8, 0xff, 0xc0, 0xb4, 0x0b, 0x0f, + 0x00, 0x4c, 0x16, 0xb8, 0xff, 0xc0, 0xb4, 0x0b, 0x0f, 0x00, 0x4c, 0x13, 0xb8, 0xff, 0xc0, 0x40, + 0x34, 0x09, 0x00, 0x4d, 0x09, 0x1f, 0x05, 0x0e, 0x0f, 0x06, 0x60, 0x06, 0x01, 0x05, 0x0f, 0x06, + 0x06, 0x0f, 0x05, 0x03, 0x1f, 0x20, 0x1e, 0x82, 0x1c, 0x1b, 0x13, 0x82, 0x15, 0x16, 0x1b, 0x51, + 0x19, 0x1f, 0x13, 0x15, 0x1c, 0x1e, 0x1a, 0x0a, 0x17, 0x06, 0x00, 0x05, 0x12, 0x0f, 0x09, 0x09, + 0x05, 0x0f, 0x06, 0x05, 0x0a, 0x00, 0x3f, 0x3f, 0x12, 0x39, 0x3d, 0x2f, 0x12, 0x39, 0x12, 0x39, + 0x18, 0x3f, 0x3f, 0xd6, 0xd5, 0xd5, 0xc5, 0x01, 0x10, 0xd6, 0xfd, 0xd0, 0xd6, 0xed, 0x10, 0xd6, + 0xed, 0x11, 0x12, 0x17, 0x39, 0x2f, 0x2f, 0x2f, 0x5d, 0x11, 0x12, 0x39, 0x11, 0x12, 0x39, 0x31, + 0x30, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x13, 0x3e, 0x03, 0x37, 0x33, 0x06, 0x06, 0x07, 0x1e, 0x03, + 0x17, 0x23, 0x26, 0x26, 0x27, 0x15, 0x23, 0x35, 0x23, 0x15, 0x23, 0x11, 0x33, 0x15, 0x33, 0x35, + 0x33, 0xfb, 0x0d, 0x20, 0x1d, 0x18, 0x07, 0x83, 0x1a, 0x4f, 0x2a, 0x19, 0x2b, 0x25, 0x1e, 0x0c, + 0x7c, 0x0e, 0x3c, 0x26, 0x45, 0x1f, 0x7b, 0x7b, 0x1f, 0x45, 0x01, 0x1f, 0x13, 0x2f, 0x30, 0x30, + 0x15, 0x33, 0x70, 0x2c, 0x18, 0x40, 0x47, 0x48, 0x20, 0x3c, 0x74, 0x2d, 0x75, 0x76, 0xde, 0x01, + 0xd6, 0xba, 0x6c, 0x00, 0x00, 0x01, 0x00, 0x1b, 0x00, 0x00, 0x01, 0xee, 0x02, 0x93, 0x00, 0x22, + 0x00, 0x58, 0xb9, 0x00, 0x06, 0xff, 0xc0, 0xb3, 0x0b, 0x00, 0x4d, 0x05, 0xb8, 0xff, 0xc0, 0x40, + 0x2a, 0x0b, 0x00, 0x4d, 0x0c, 0x17, 0x0b, 0x11, 0x04, 0x23, 0x24, 0x20, 0x1c, 0x01, 0x1c, 0x04, + 0x20, 0x02, 0x01, 0x02, 0x05, 0x51, 0x22, 0x1f, 0x20, 0x23, 0x1d, 0x08, 0x1c, 0x11, 0x06, 0x03, + 0x0b, 0x17, 0x08, 0x0b, 0x02, 0x1f, 0x05, 0x22, 0x02, 0x01, 0x98, 0x00, 0x3f, 0xd5, 0xc0, 0xd5, + 0xc0, 0x3f, 0x3f, 0x12, 0x17, 0x39, 0x3f, 0x01, 0x10, 0xd6, 0xd5, 0xc0, 0xfd, 0xc0, 0x5d, 0xc5, + 0xc0, 0x5d, 0x11, 0x12, 0x17, 0x39, 0x31, 0x30, 0x2b, 0x2b, 0x13, 0x33, 0x15, 0x33, 0x15, 0x23, + 0x15, 0x3e, 0x03, 0x37, 0x33, 0x0e, 0x03, 0x07, 0x1e, 0x03, 0x17, 0x23, 0x2e, 0x03, 0x27, 0x11, + 0x23, 0x11, 0x23, 0x35, 0x33, 0x55, 0x7b, 0x32, 0x32, 0x18, 0x27, 0x22, 0x1e, 0x0f, 0x88, 0x0e, + 0x26, 0x2f, 0x35, 0x1c, 0x1a, 0x39, 0x34, 0x2a, 0x0b, 0x87, 0x09, 0x1e, 0x28, 0x2f, 0x19, 0x7b, + 0x3a, 0x3a, 0x02, 0x93, 0x47, 0x56, 0x8c, 0x22, 0x39, 0x3b, 0x41, 0x2a, 0x23, 0x4a, 0x4b, 0x49, + 0x22, 0x1e, 0x4e, 0x57, 0x5b, 0x2a, 0x23, 0x4b, 0x4a, 0x45, 0x1e, 0xfe, 0xe5, 0x01, 0xf6, 0x56, + 0x00, 0x01, 0x00, 0x12, 0x00, 0x00, 0x01, 0xe7, 0x01, 0xfe, 0x00, 0x22, 0x00, 0x57, 0x40, 0x35, + 0x22, 0x20, 0x0a, 0x0b, 0x00, 0x4c, 0xa0, 0x0a, 0xb0, 0x0a, 0x02, 0x0a, 0x00, 0x14, 0x01, 0x14, + 0x24, 0x1a, 0x04, 0x00, 0x02, 0x20, 0x02, 0x30, 0x02, 0x03, 0x02, 0x00, 0x03, 0x51, 0x20, 0x1d, + 0x1e, 0x23, 0x02, 0x1e, 0x81, 0x1f, 0x0a, 0x1a, 0x0f, 0x04, 0x03, 0x09, 0x1b, 0x06, 0x15, 0x06, + 0x09, 0x0a, 0x21, 0x00, 0x0a, 0x00, 0x3f, 0xc5, 0x3f, 0x3f, 0x3f, 0x12, 0x17, 0x39, 0x3f, 0xed, + 0x32, 0x01, 0x10, 0xd6, 0xd5, 0x32, 0xfd, 0x32, 0xcd, 0x5d, 0x33, 0x33, 0x10, 0xd6, 0x5d, 0xc6, + 0x5d, 0x31, 0x30, 0x00, 0x2b, 0x13, 0x33, 0x15, 0x23, 0x15, 0x3e, 0x03, 0x37, 0x33, 0x0e, 0x03, + 0x07, 0x1e, 0x03, 0x17, 0x23, 0x2e, 0x03, 0x27, 0x15, 0x23, 0x11, 0x23, 0x35, 0x33, 0x35, 0x33, + 0xbb, 0x43, 0x43, 0x16, 0x2b, 0x25, 0x1f, 0x0a, 0x94, 0x0e, 0x2c, 0x33, 0x38, 0x1a, 0x19, 0x3b, + 0x39, 0x2f, 0x0c, 0x8d, 0x0c, 0x27, 0x2c, 0x2d, 0x13, 0x7c, 0x2d, 0x2d, 0x7c, 0x01, 0xd6, 0x41, + 0x79, 0x15, 0x31, 0x32, 0x30, 0x12, 0x17, 0x36, 0x37, 0x35, 0x16, 0x18, 0x42, 0x48, 0x47, 0x1e, + 0x19, 0x3f, 0x3d, 0x37, 0x12, 0xde, 0x01, 0x95, 0x41, 0x28, 0x00, 0x00, 0x00, 0x01, 0x00, 0x12, + 0x00, 0x00, 0x01, 0xe9, 0x02, 0x6b, 0x00, 0x18, 0x00, 0x3d, 0x40, 0x22, 0x07, 0x10, 0x06, 0x0a, + 0x04, 0x0f, 0x0f, 0x19, 0x1a, 0x15, 0x02, 0x44, 0x18, 0x50, 0x17, 0x01, 0x17, 0x00, 0x19, 0x15, + 0x0a, 0x03, 0x03, 0x06, 0x16, 0x08, 0x10, 0x08, 0x06, 0x02, 0x18, 0x48, 0x01, 0x02, 0x00, 0x3f, + 0xed, 0x3f, 0x3f, 0x3f, 0x12, 0x17, 0x39, 0x01, 0x10, 0xc6, 0xd6, 0x5d, 0x32, 0xed, 0x32, 0x11, + 0x12, 0x39, 0x2f, 0x17, 0x39, 0x31, 0x30, 0x13, 0x35, 0x33, 0x11, 0x36, 0x36, 0x37, 0x33, 0x06, + 0x06, 0x07, 0x1e, 0x03, 0x17, 0x23, 0x2e, 0x03, 0x27, 0x11, 0x23, 0x11, 0x12, 0xd4, 0x23, 0x38, + 0x11, 0x8b, 0x16, 0x43, 0x40, 0x19, 0x32, 0x2c, 0x23, 0x0b, 0x8b, 0x08, 0x1b, 0x21, 0x24, 0x10, + 0x7b, 0x02, 0x05, 0x66, 0xfe, 0xff, 0x40, 0x85, 0x3c, 0x39, 0x8d, 0x59, 0x1e, 0x50, 0x58, 0x5c, + 0x2a, 0x23, 0x51, 0x4d, 0x43, 0x17, 0xfe, 0xe5, 0x02, 0x05, 0x00, 0x00, 0x00, 0x01, 0x00, 0x12, + 0x00, 0x00, 0x01, 0xe7, 0x01, 0xd6, 0x00, 0x1c, 0x00, 0x40, 0x40, 0x23, 0x11, 0x05, 0x0b, 0x03, + 0x1d, 0x10, 0x1e, 0x60, 0x06, 0x01, 0x06, 0x06, 0x1d, 0x1e, 0x16, 0x1c, 0x51, 0x19, 0x1b, 0x1d, + 0x16, 0x0b, 0x00, 0x03, 0x17, 0x19, 0x48, 0x1c, 0x0a, 0x17, 0x06, 0x11, 0x06, 0x05, 0x0a, 0x00, + 0x3f, 0x3f, 0x3f, 0x3f, 0xed, 0x12, 0x17, 0x39, 0x01, 0x10, 0xd6, 0xdd, 0xed, 0x32, 0x11, 0x12, + 0x39, 0x2f, 0x5d, 0x12, 0x39, 0x12, 0x17, 0x39, 0x31, 0x30, 0x13, 0x3e, 0x03, 0x37, 0x33, 0x0e, + 0x03, 0x07, 0x1e, 0x03, 0x17, 0x23, 0x2e, 0x03, 0x27, 0x15, 0x23, 0x11, 0x23, 0x35, 0x33, 0xda, + 0x0e, 0x1e, 0x1c, 0x18, 0x07, 0x94, 0x0d, 0x26, 0x2b, 0x2e, 0x14, 0x17, 0x34, 0x30, 0x29, 0x0e, + 0x8d, 0x0a, 0x1f, 0x23, 0x25, 0x0f, 0x7b, 0x4d, 0xc8, 0x01, 0x1c, 0x15, 0x32, 0x33, 0x2f, 0x11, + 0x17, 0x36, 0x38, 0x34, 0x16, 0x14, 0x41, 0x4b, 0x4b, 0x1c, 0x19, 0x3f, 0x3d, 0x37, 0x12, 0xde, + 0x01, 0x70, 0x66, 0x00, 0x00, 0x01, 0x00, 0x2d, 0xff, 0x5b, 0x01, 0xd9, 0x02, 0x6b, 0x00, 0x0f, + 0x00, 0x4a, 0x40, 0x17, 0x0f, 0x0d, 0x1f, 0x0d, 0x02, 0x0d, 0x51, 0x0f, 0x01, 0x0b, 0x51, 0x20, + 0x08, 0x30, 0x08, 0x40, 0x08, 0x03, 0x08, 0x02, 0x07, 0x51, 0x05, 0xb8, 0xff, 0xc0, 0x40, 0x14, + 0x0b, 0x0e, 0x48, 0x05, 0x10, 0x0e, 0x0e, 0x0a, 0x02, 0x02, 0x55, 0x07, 0x06, 0x02, 0x03, 0x08, + 0x0b, 0x55, 0x00, 0x08, 0x00, 0x3f, 0xed, 0x3f, 0x3f, 0xd5, 0xed, 0x3f, 0x3f, 0x01, 0x10, 0xd6, + 0x2b, 0xfd, 0x32, 0xd6, 0x5d, 0xed, 0xd0, 0xd5, 0xed, 0x5d, 0x31, 0x30, 0x21, 0x11, 0x23, 0x11, + 0x23, 0x11, 0x33, 0x15, 0x33, 0x35, 0x33, 0x11, 0x33, 0x11, 0x23, 0x35, 0x01, 0x3a, 0x92, 0x7b, + 0x7b, 0x92, 0x7c, 0x23, 0x72, 0x01, 0x11, 0xfe, 0xef, 0x02, 0x6b, 0xf4, 0xf4, 0xfd, 0xfb, 0xfe, + 0xf5, 0xa5, 0x00, 0x00, 0x00, 0x01, 0x00, 0x3b, 0xff, 0x7a, 0x01, 0xd3, 0x01, 0xd6, 0x00, 0x0f, + 0x00, 0x6a, 0xb9, 0x00, 0x0d, 0xff, 0xc0, 0xb3, 0x0b, 0x00, 0x4d, 0x0c, 0xb8, 0xff, 0xc0, 0xb3, + 0x0b, 0x00, 0x4d, 0x0b, 0xb8, 0xff, 0xc0, 0xb3, 0x0b, 0x00, 0x4d, 0x0a, 0xb8, 0xff, 0xc0, 0x40, + 0x2c, 0x0b, 0x00, 0x4d, 0x01, 0x09, 0x51, 0x0a, 0x20, 0x0f, 0x01, 0x0f, 0x0c, 0x11, 0x02, 0x07, + 0x51, 0x10, 0x05, 0x20, 0x05, 0x30, 0x05, 0x70, 0x05, 0x04, 0x05, 0x10, 0x0d, 0x0f, 0x06, 0x01, + 0x55, 0x08, 0x0b, 0x08, 0x0b, 0x09, 0x0a, 0x06, 0x0a, 0x03, 0x06, 0x00, 0x06, 0x00, 0x3f, 0x3f, + 0x3f, 0x3f, 0x39, 0x39, 0x2f, 0x2f, 0xed, 0x3f, 0xc5, 0x01, 0x10, 0xd6, 0x5d, 0xed, 0x32, 0x10, + 0xd6, 0xc5, 0x5d, 0xde, 0xed, 0x32, 0x31, 0x30, 0x2b, 0x2b, 0x2b, 0x2b, 0x21, 0x35, 0x23, 0x15, + 0x23, 0x11, 0x33, 0x15, 0x33, 0x35, 0x33, 0x11, 0x33, 0x15, 0x23, 0x35, 0x01, 0x34, 0x7e, 0x7b, + 0x7b, 0x7e, 0x7b, 0x24, 0x72, 0xba, 0xba, 0x01, 0xd6, 0xb6, 0xb6, 0xfe, 0x90, 0xec, 0x86, 0x00, + 0x00, 0x01, 0x00, 0x2d, 0x00, 0x00, 0x01, 0xe2, 0x02, 0x6b, 0x00, 0x0d, 0x00, 0x8a, 0xb6, 0x20, + 0x01, 0x01, 0x20, 0x00, 0x01, 0x0c, 0xb8, 0xff, 0xc0, 0xb3, 0x0d, 0x00, 0x4d, 0x0b, 0xb8, 0xff, + 0xc0, 0xb3, 0x0d, 0x00, 0x4d, 0x06, 0xb8, 0xff, 0xc0, 0xb3, 0x0d, 0x00, 0x4d, 0x05, 0xb8, 0xff, + 0xc0, 0x40, 0x20, 0x0d, 0x00, 0x4d, 0x0d, 0x05, 0x20, 0x0c, 0x30, 0x0c, 0x02, 0x0c, 0x44, 0x20, + 0x02, 0x01, 0x02, 0x01, 0x0f, 0x06, 0x2f, 0x0a, 0x3f, 0x0a, 0x02, 0x0a, 0x44, 0xc0, 0x09, 0xd0, + 0x09, 0x02, 0x09, 0xb8, 0xff, 0xc0, 0x40, 0x18, 0x0b, 0x0e, 0x48, 0x09, 0x0e, 0x0d, 0x02, 0x0a, + 0x02, 0x07, 0x08, 0x0c, 0x0b, 0x48, 0x05, 0x02, 0x05, 0x02, 0x05, 0x04, 0x03, 0x08, 0x00, 0x02, + 0x00, 0x3f, 0x3f, 0x2f, 0x39, 0x39, 0x2f, 0x2f, 0x10, 0xed, 0x32, 0x3f, 0x3f, 0x3f, 0x01, 0x10, + 0xd6, 0x2b, 0x5d, 0xed, 0x71, 0x32, 0x10, 0xd6, 0xdd, 0x71, 0xed, 0x71, 0x32, 0x32, 0x31, 0x30, + 0x00, 0x2b, 0x2b, 0x2b, 0x2b, 0x01, 0x71, 0x71, 0x01, 0x15, 0x23, 0x11, 0x23, 0x11, 0x23, 0x11, + 0x23, 0x11, 0x33, 0x15, 0x33, 0x35, 0x01, 0xe2, 0x59, 0x7b, 0x66, 0x7b, 0x7b, 0x66, 0x02, 0x6b, + 0x66, 0xfd, 0xfb, 0x01, 0x11, 0xfe, 0xef, 0x02, 0x6b, 0xf4, 0xf4, 0x00, 0x00, 0x01, 0x00, 0x3b, + 0x00, 0x00, 0x01, 0xe2, 0x01, 0xd6, 0x00, 0x0d, 0x00, 0x4e, 0x40, 0x16, 0x3f, 0x0b, 0x01, 0x00, + 0x01, 0x51, 0x04, 0x0b, 0x05, 0x0a, 0x51, 0x40, 0x08, 0x50, 0x08, 0x02, 0xa0, 0x08, 0xb0, 0x08, + 0x02, 0x08, 0xb8, 0xff, 0xc0, 0x40, 0x15, 0x0b, 0x0e, 0x48, 0x08, 0x0e, 0x0b, 0x55, 0x04, 0x01, + 0x04, 0x01, 0x04, 0x03, 0x0c, 0x0a, 0x09, 0x0a, 0x06, 0x06, 0x03, 0x06, 0x00, 0x3f, 0x3f, 0x3f, + 0x3f, 0x12, 0x39, 0x39, 0x2f, 0x2f, 0x10, 0xed, 0x01, 0x10, 0xd6, 0x2b, 0x5d, 0x71, 0xfd, 0x32, + 0xd6, 0x32, 0xfd, 0xc5, 0x31, 0x30, 0x00, 0x5d, 0x01, 0x23, 0x11, 0x23, 0x35, 0x23, 0x15, 0x23, + 0x11, 0x33, 0x15, 0x33, 0x35, 0x33, 0x01, 0xe2, 0x4d, 0x7c, 0x63, 0x7b, 0x7b, 0x63, 0xc9, 0x01, + 0x70, 0xfe, 0x90, 0xba, 0xba, 0x01, 0xd6, 0xb6, 0xb6, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x24, + 0xff, 0x5b, 0x01, 0xde, 0x02, 0x6b, 0x00, 0x26, 0x00, 0x5c, 0x40, 0x3b, 0x50, 0x18, 0x01, 0x18, + 0x84, 0x5f, 0x07, 0x7f, 0x07, 0x8f, 0x07, 0x9f, 0x07, 0x04, 0x07, 0x40, 0x09, 0x0c, 0x48, 0x07, + 0x28, 0x1f, 0x01, 0x40, 0x0b, 0x0f, 0x48, 0x01, 0x85, 0x22, 0x23, 0x85, 0x50, 0x26, 0x60, 0x26, + 0x70, 0x26, 0x03, 0x26, 0x0f, 0x27, 0x24, 0x08, 0x01, 0xa5, 0x1f, 0x22, 0x1f, 0x22, 0x1f, 0x00, + 0x21, 0x08, 0x13, 0xa5, 0x0c, 0x0f, 0x00, 0x00, 0x2f, 0x3f, 0xed, 0x3f, 0x12, 0x39, 0x39, 0x2f, + 0x2f, 0x10, 0xed, 0x3f, 0x01, 0x10, 0xc6, 0xd6, 0x5d, 0xfd, 0xde, 0xed, 0x2b, 0x32, 0x10, 0xde, + 0x2b, 0x5d, 0xed, 0x5d, 0x31, 0x30, 0x01, 0x15, 0x36, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x0e, + 0x02, 0x23, 0x22, 0x26, 0x27, 0x37, 0x16, 0x32, 0x33, 0x32, 0x3e, 0x02, 0x35, 0x34, 0x2e, 0x02, + 0x23, 0x22, 0x07, 0x11, 0x23, 0x11, 0x23, 0x11, 0x23, 0x11, 0x01, 0x27, 0x08, 0x0d, 0x08, 0x4a, + 0x50, 0x11, 0x27, 0x3e, 0x2e, 0x08, 0x11, 0x09, 0x05, 0x07, 0x09, 0x08, 0x11, 0x1b, 0x12, 0x0a, + 0x0a, 0x13, 0x1a, 0x10, 0x07, 0x08, 0x61, 0x42, 0x60, 0x02, 0x6b, 0xe2, 0x01, 0x02, 0x85, 0x92, + 0x41, 0x68, 0x49, 0x28, 0x01, 0x01, 0x5c, 0x01, 0x12, 0x2b, 0x47, 0x35, 0x3a, 0x4a, 0x2a, 0x10, + 0x02, 0xfe, 0xd3, 0x02, 0x0e, 0xfd, 0xf2, 0x02, 0x6b, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x24, + 0xff, 0x5b, 0x01, 0xde, 0x01, 0xd6, 0x00, 0x26, 0x00, 0x5b, 0x40, 0x1e, 0x50, 0x18, 0x01, 0x18, + 0x84, 0x0f, 0x07, 0x1f, 0x07, 0x3f, 0x07, 0x5f, 0x07, 0x7f, 0x07, 0x05, 0x07, 0x28, 0x1f, 0x01, + 0x40, 0x0c, 0x0f, 0x48, 0x01, 0x85, 0x22, 0x23, 0x85, 0x26, 0xb8, 0xff, 0xc0, 0x40, 0x18, 0x0e, + 0x12, 0x48, 0x26, 0x0f, 0x27, 0x24, 0x06, 0x21, 0x06, 0x01, 0xa5, 0x1f, 0x22, 0x1f, 0x22, 0x1f, + 0x00, 0x10, 0xa5, 0x0f, 0x0f, 0x00, 0x0a, 0x00, 0x3f, 0x3f, 0xed, 0x12, 0x39, 0x39, 0x2f, 0x2f, + 0x10, 0xed, 0x3f, 0x3f, 0x01, 0x10, 0xc6, 0xd6, 0x2b, 0xfd, 0xde, 0xed, 0x2b, 0x32, 0x10, 0xde, + 0x5d, 0xed, 0x5d, 0x31, 0x30, 0x01, 0x15, 0x36, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x0e, 0x02, + 0x23, 0x22, 0x26, 0x27, 0x37, 0x16, 0x32, 0x33, 0x32, 0x3e, 0x02, 0x35, 0x34, 0x2e, 0x02, 0x23, + 0x22, 0x07, 0x15, 0x23, 0x11, 0x23, 0x11, 0x23, 0x11, 0x01, 0x27, 0x08, 0x0d, 0x08, 0x4a, 0x50, + 0x11, 0x27, 0x3e, 0x2e, 0x08, 0x11, 0x09, 0x05, 0x07, 0x09, 0x08, 0x11, 0x1b, 0x12, 0x0a, 0x0a, + 0x13, 0x1a, 0x10, 0x07, 0x08, 0x61, 0x42, 0x60, 0x01, 0xd6, 0xb4, 0x01, 0x02, 0x6c, 0x77, 0x35, + 0x55, 0x3c, 0x21, 0x01, 0x01, 0x5c, 0x01, 0x0d, 0x1f, 0x34, 0x26, 0x2a, 0x36, 0x1f, 0x0b, 0x02, + 0xc6, 0x01, 0x79, 0xfe, 0x87, 0x01, 0xd6, 0x00, 0x00, 0x02, 0x00, 0x12, 0xff, 0x5c, 0x01, 0xea, + 0x02, 0x79, 0x00, 0x32, 0x00, 0x44, 0x00, 0x9b, 0xb9, 0x00, 0x30, 0xff, 0xc0, 0xb3, 0x0d, 0x00, + 0x4d, 0x08, 0xb8, 0xff, 0xe0, 0x40, 0x5b, 0x0d, 0x00, 0x4d, 0x2f, 0x40, 0x0d, 0x00, 0x4d, 0x2e, + 0x40, 0x0d, 0x00, 0x4d, 0x2d, 0x40, 0x0d, 0x00, 0x4d, 0x2c, 0x40, 0x0d, 0x00, 0x4d, 0x2b, 0x40, + 0x0d, 0x00, 0x4d, 0x2b, 0x5f, 0x2a, 0x01, 0x2a, 0x46, 0x14, 0x17, 0x46, 0x05, 0x84, 0x33, 0x33, + 0x20, 0x30, 0x3b, 0x40, 0x3b, 0x50, 0x3b, 0x03, 0x3b, 0x84, 0x0f, 0x0f, 0x1f, 0x0f, 0x02, 0x0f, + 0x40, 0x0c, 0x10, 0x48, 0x0f, 0x46, 0x00, 0x63, 0x20, 0x1b, 0x45, 0x14, 0x36, 0x2b, 0x0a, 0x40, + 0x03, 0x36, 0x36, 0x03, 0x40, 0x0a, 0x2b, 0x05, 0x1b, 0x2e, 0x4a, 0x25, 0x03, 0x17, 0x4a, 0x18, + 0x1b, 0x09, 0x00, 0x3f, 0xdd, 0xed, 0x3f, 0xed, 0x12, 0x17, 0x39, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, + 0x11, 0x39, 0x01, 0x10, 0xc6, 0xd6, 0xed, 0x10, 0xde, 0x2b, 0x5d, 0xed, 0x5d, 0x12, 0x39, 0x2f, + 0xed, 0x10, 0xd6, 0xce, 0x10, 0xd4, 0x5d, 0xcd, 0x31, 0x30, 0x00, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, + 0x01, 0x2b, 0x2b, 0x13, 0x14, 0x16, 0x17, 0x26, 0x35, 0x34, 0x3e, 0x02, 0x33, 0x32, 0x1e, 0x02, + 0x15, 0x14, 0x0e, 0x02, 0x07, 0x16, 0x16, 0x17, 0x07, 0x26, 0x26, 0x27, 0x2e, 0x03, 0x35, 0x34, + 0x3e, 0x02, 0x33, 0x32, 0x1e, 0x02, 0x17, 0x07, 0x26, 0x26, 0x23, 0x22, 0x0e, 0x02, 0x17, 0x14, + 0x16, 0x17, 0x3e, 0x03, 0x35, 0x34, 0x2e, 0x02, 0x23, 0x22, 0x0e, 0x02, 0x86, 0x1b, 0x22, 0x0a, + 0x12, 0x27, 0x3c, 0x2a, 0x26, 0x37, 0x24, 0x11, 0x13, 0x27, 0x3c, 0x29, 0x12, 0x39, 0x29, 0x10, + 0x43, 0x66, 0x20, 0x34, 0x4f, 0x36, 0x1b, 0x20, 0x43, 0x65, 0x45, 0x1a, 0x27, 0x1f, 0x1d, 0x11, + 0x1f, 0x21, 0x2d, 0x17, 0x2e, 0x3f, 0x26, 0x10, 0x9e, 0x03, 0x05, 0x16, 0x20, 0x14, 0x09, 0x04, + 0x09, 0x11, 0x0c, 0x0f, 0x13, 0x0b, 0x04, 0x01, 0x36, 0x4b, 0x69, 0x1a, 0x31, 0x36, 0x30, 0x57, + 0x41, 0x27, 0x20, 0x35, 0x45, 0x26, 0x29, 0x4e, 0x43, 0x33, 0x0d, 0x1d, 0x23, 0x03, 0x65, 0x02, + 0x58, 0x43, 0x04, 0x35, 0x54, 0x6e, 0x3e, 0x42, 0x77, 0x59, 0x35, 0x04, 0x07, 0x0a, 0x07, 0x64, + 0x0e, 0x07, 0x23, 0x3b, 0x4e, 0xa0, 0x1c, 0x34, 0x17, 0x08, 0x21, 0x2a, 0x30, 0x18, 0x14, 0x25, + 0x1c, 0x10, 0x18, 0x2a, 0x38, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x11, 0xff, 0x7c, 0x01, 0xea, + 0x01, 0xe2, 0x00, 0x2f, 0x00, 0x3c, 0x00, 0x8b, 0xb9, 0x00, 0x14, 0xff, 0xc0, 0xb3, 0x0d, 0x00, + 0x4d, 0x12, 0xb8, 0xff, 0xc0, 0x40, 0x4f, 0x0d, 0x00, 0x4d, 0x14, 0x40, 0x0f, 0x00, 0x4d, 0x13, + 0x40, 0x0f, 0x00, 0x4d, 0x12, 0x40, 0x0f, 0x00, 0x4d, 0x11, 0x40, 0x0f, 0x00, 0x4d, 0x03, 0x2c, + 0x2f, 0x3e, 0x1d, 0x84, 0x30, 0x30, 0x08, 0x40, 0x38, 0x50, 0x38, 0x02, 0x38, 0x84, 0x27, 0x11, + 0x10, 0x3e, 0x19, 0x63, 0x08, 0x3d, 0x2c, 0x07, 0x3a, 0x4a, 0x22, 0x1b, 0x33, 0x33, 0x1b, 0x22, + 0x03, 0x03, 0x11, 0x40, 0x0e, 0x00, 0x4d, 0x11, 0x14, 0x40, 0x0e, 0x00, 0x4d, 0x14, 0x4a, 0x0d, + 0x0b, 0x2f, 0x4a, 0x00, 0x03, 0x07, 0x00, 0x3f, 0xdd, 0xed, 0x3f, 0xed, 0x2b, 0x32, 0x2b, 0x12, + 0x17, 0x39, 0x2f, 0x2f, 0x2f, 0xed, 0x3f, 0x01, 0x10, 0xde, 0xed, 0x10, 0xc4, 0x32, 0xd6, 0xed, + 0x5d, 0x12, 0x39, 0x2f, 0xed, 0x10, 0xd6, 0xde, 0xc5, 0x31, 0x30, 0x00, 0x2b, 0x2b, 0x2b, 0x2b, + 0x01, 0x2b, 0x2b, 0x05, 0x26, 0x26, 0x27, 0x2e, 0x03, 0x35, 0x34, 0x3e, 0x02, 0x33, 0x32, 0x16, + 0x17, 0x07, 0x26, 0x26, 0x23, 0x22, 0x0e, 0x02, 0x15, 0x14, 0x17, 0x26, 0x35, 0x34, 0x3e, 0x02, + 0x33, 0x32, 0x1e, 0x02, 0x15, 0x14, 0x0e, 0x02, 0x07, 0x16, 0x16, 0x17, 0x27, 0x14, 0x16, 0x17, + 0x3e, 0x03, 0x35, 0x34, 0x23, 0x22, 0x06, 0x01, 0xcd, 0x50, 0x7b, 0x23, 0x33, 0x4e, 0x33, 0x1a, + 0x1e, 0x3d, 0x5b, 0x3c, 0x23, 0x3c, 0x1d, 0x1b, 0x17, 0x25, 0x1a, 0x27, 0x35, 0x1f, 0x0d, 0x36, + 0x03, 0x1d, 0x30, 0x3c, 0x1f, 0x1a, 0x32, 0x26, 0x17, 0x10, 0x21, 0x31, 0x21, 0x16, 0x3b, 0x26, + 0xba, 0x04, 0x04, 0x18, 0x20, 0x13, 0x08, 0x2a, 0x15, 0x1c, 0x84, 0x08, 0x40, 0x38, 0x07, 0x2b, + 0x40, 0x52, 0x2f, 0x2e, 0x58, 0x44, 0x29, 0x05, 0x0b, 0x65, 0x07, 0x03, 0x18, 0x28, 0x32, 0x1b, + 0x66, 0x23, 0x15, 0x14, 0x2f, 0x44, 0x2d, 0x16, 0x10, 0x22, 0x33, 0x24, 0x1b, 0x37, 0x30, 0x26, + 0x0b, 0x0d, 0x11, 0x05, 0xa7, 0x11, 0x1c, 0x0d, 0x04, 0x13, 0x1b, 0x1e, 0x0f, 0x30, 0x28, 0x00, + 0xff, 0xff, 0x00, 0x1b, 0xff, 0x56, 0x01, 0xd5, 0x02, 0x79, 0x02, 0x06, 0x00, 0xa2, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x2c, 0xff, 0x56, 0x01, 0xd2, 0x01, 0xe2, 0x02, 0x06, 0x00, 0xc2, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x19, 0xff, 0x5b, 0x01, 0xdb, 0x02, 0x6b, 0x00, 0x0b, 0x00, 0x31, 0x40, 0x1a, + 0x00, 0x02, 0x02, 0x04, 0x03, 0x44, 0xb0, 0x07, 0x01, 0x07, 0x09, 0xd0, 0x0b, 0x01, 0x0b, 0x0c, + 0x02, 0x09, 0x55, 0x0b, 0x02, 0x06, 0x04, 0x55, 0x07, 0x08, 0x00, 0x3f, 0xed, 0xc5, 0x3f, 0xfd, + 0xc0, 0x01, 0x10, 0xd6, 0x5d, 0xdd, 0xcd, 0x5d, 0xfd, 0xcd, 0x33, 0x10, 0xcd, 0x31, 0x30, 0x01, + 0x15, 0x23, 0x11, 0x33, 0x11, 0x23, 0x35, 0x23, 0x11, 0x23, 0x35, 0x01, 0xdb, 0xa3, 0x44, 0x73, + 0x4d, 0xa3, 0x02, 0x6b, 0x66, 0xfe, 0x61, 0xfe, 0xf5, 0xa5, 0x02, 0x05, 0x66, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x26, 0xff, 0x7a, 0x01, 0xcf, 0x01, 0xd6, 0x00, 0x0b, 0x00, 0x2d, 0x40, 0x16, + 0x04, 0x03, 0x02, 0x0b, 0x01, 0x01, 0x02, 0x44, 0x06, 0x08, 0x0a, 0x0c, 0x01, 0x08, 0x48, 0x0a, + 0x0a, 0x07, 0x06, 0x05, 0x06, 0x06, 0x00, 0x3f, 0xc5, 0x3f, 0x3f, 0xed, 0x32, 0x01, 0x10, 0xd6, + 0xdd, 0xcd, 0xed, 0x32, 0x10, 0xcd, 0x10, 0xcd, 0x32, 0x31, 0x30, 0x01, 0x23, 0x11, 0x33, 0x15, + 0x23, 0x35, 0x23, 0x11, 0x23, 0x35, 0x21, 0x01, 0xcf, 0x97, 0x58, 0x72, 0x62, 0x96, 0x01, 0xa9, + 0x01, 0x70, 0xfe, 0xf6, 0xec, 0x86, 0x01, 0x70, 0x66, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x0d, + 0x00, 0x00, 0x01, 0xe8, 0x02, 0x6b, 0x02, 0x06, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0e, + 0xff, 0x5b, 0x01, 0xe6, 0x01, 0xd6, 0x00, 0x14, 0x00, 0x3a, 0x40, 0x1d, 0x03, 0x04, 0x51, 0x06, + 0x09, 0x0a, 0x15, 0x14, 0x00, 0x16, 0x05, 0x05, 0x15, 0x16, 0x0f, 0x06, 0x03, 0x03, 0x06, 0x0f, + 0x03, 0x04, 0x14, 0x0a, 0x0a, 0x0a, 0x05, 0x12, 0x04, 0x00, 0x2f, 0x3f, 0x3f, 0x3f, 0x12, 0x17, + 0x39, 0x2f, 0x2f, 0x2f, 0x01, 0x11, 0x12, 0x39, 0x2f, 0x12, 0x39, 0x39, 0x12, 0x39, 0x39, 0x33, + 0xed, 0x32, 0x31, 0x30, 0x01, 0x06, 0x06, 0x07, 0x15, 0x23, 0x35, 0x26, 0x26, 0x27, 0x33, 0x1e, + 0x03, 0x17, 0x3e, 0x03, 0x37, 0x01, 0xe6, 0x26, 0x5e, 0x2f, 0x7b, 0x2e, 0x57, 0x25, 0x81, 0x09, + 0x1a, 0x1c, 0x1d, 0x0c, 0x0c, 0x1f, 0x20, 0x1d, 0x0a, 0x01, 0xd6, 0x81, 0xe3, 0x5e, 0xb9, 0xbb, + 0x5e, 0xe4, 0x7e, 0x27, 0x59, 0x57, 0x50, 0x20, 0x20, 0x50, 0x57, 0x58, 0x28, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x0d, 0x00, 0x00, 0x01, 0xe8, 0x02, 0x6b, 0x00, 0x1a, 0x00, 0x8b, 0xb9, 0x00, + 0x14, 0xff, 0xe0, 0xb3, 0x0e, 0x00, 0x4d, 0x13, 0xb8, 0xff, 0xc0, 0xb3, 0x18, 0x00, 0x4d, 0x13, + 0xb8, 0xff, 0xe0, 0xb3, 0x17, 0x00, 0x4d, 0x12, 0xb8, 0xff, 0xc0, 0xb3, 0x18, 0x00, 0x4d, 0x0b, + 0xb8, 0xff, 0xe0, 0x40, 0x3a, 0x0f, 0x00, 0x4d, 0x05, 0x44, 0x06, 0x1c, 0x14, 0x11, 0xaf, 0x0f, + 0xbf, 0x0f, 0x02, 0x12, 0x11, 0x0f, 0x0c, 0x00, 0x0c, 0x0f, 0x00, 0x11, 0x12, 0x05, 0x1b, 0x1c, + 0x18, 0x44, 0x17, 0x1b, 0x18, 0x02, 0x00, 0x5f, 0x11, 0x6f, 0x11, 0x02, 0x5f, 0x0e, 0x6f, 0x0e, + 0x02, 0x14, 0x0b, 0x11, 0x0e, 0x0e, 0x11, 0x0b, 0x14, 0x04, 0x05, 0x0f, 0x08, 0x05, 0x02, 0x00, + 0x3f, 0x3f, 0x12, 0x17, 0x39, 0x2f, 0x2f, 0x2f, 0x2f, 0x5d, 0x5d, 0x39, 0x3f, 0x01, 0x10, 0xd6, + 0xed, 0x11, 0x12, 0x17, 0x39, 0x3d, 0x2f, 0x18, 0x2f, 0x2f, 0x2f, 0x2f, 0x5d, 0x12, 0x39, 0x10, + 0xd6, 0xed, 0x31, 0x30, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x13, 0x3e, 0x03, 0x37, 0x33, 0x0e, 0x03, + 0x07, 0x33, 0x15, 0x23, 0x15, 0x23, 0x35, 0x23, 0x35, 0x33, 0x26, 0x26, 0x27, 0x33, 0x16, 0x16, + 0xfe, 0x0b, 0x1d, 0x1d, 0x1b, 0x0b, 0x7f, 0x12, 0x25, 0x29, 0x2e, 0x1b, 0x78, 0x7e, 0x7c, 0x7c, + 0x75, 0x34, 0x50, 0x25, 0x84, 0x17, 0x38, 0x01, 0x50, 0x17, 0x46, 0x4e, 0x50, 0x20, 0x32, 0x5d, + 0x5b, 0x5b, 0x2f, 0x52, 0xa5, 0xa5, 0x52, 0x5e, 0xb4, 0x62, 0x48, 0x95, 0x00, 0x01, 0x00, 0x0e, + 0xff, 0x5b, 0x01, 0xe6, 0x01, 0xd6, 0x00, 0x1a, 0x00, 0x75, 0x40, 0x17, 0x0c, 0x40, 0x0b, 0x00, + 0x4d, 0x05, 0x40, 0x1f, 0x20, 0x00, 0x4c, 0x05, 0x40, 0x1d, 0x00, 0x4d, 0x04, 0x40, 0x1e, 0x20, + 0x00, 0x4c, 0x03, 0xb8, 0xff, 0xc0, 0x40, 0x2e, 0x0b, 0x0c, 0x00, 0x4c, 0x0c, 0x0b, 0x09, 0x03, + 0x06, 0x04, 0x0b, 0x09, 0x06, 0x04, 0x15, 0x04, 0x06, 0x15, 0x09, 0x0b, 0x05, 0x1b, 0x1c, 0x1a, + 0x44, 0x00, 0x1c, 0x10, 0x44, 0x0f, 0x1b, 0x15, 0x1c, 0x1a, 0x0a, 0x10, 0x0a, 0x09, 0x06, 0x07, + 0x12, 0x0c, 0x03, 0x7d, 0x06, 0x06, 0x00, 0x3f, 0xfd, 0xc0, 0x3f, 0x3f, 0x3f, 0x3f, 0x12, 0x39, + 0x01, 0x10, 0xd6, 0xed, 0x10, 0xd6, 0xed, 0x11, 0x12, 0x17, 0x39, 0x3d, 0x2f, 0x18, 0x2f, 0x2f, + 0x2f, 0x2f, 0x11, 0x12, 0x39, 0x11, 0x12, 0x39, 0x31, 0x30, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x01, + 0x06, 0x06, 0x07, 0x33, 0x15, 0x23, 0x15, 0x23, 0x35, 0x23, 0x35, 0x33, 0x26, 0x26, 0x27, 0x33, + 0x1e, 0x03, 0x17, 0x3e, 0x03, 0x37, 0x01, 0xe6, 0x20, 0x4d, 0x27, 0x4d, 0x6c, 0x7b, 0x6f, 0x52, + 0x26, 0x48, 0x1f, 0x81, 0x09, 0x1a, 0x1c, 0x1d, 0x0c, 0x0c, 0x1f, 0x20, 0x1d, 0x0a, 0x01, 0xd6, + 0x6c, 0xc3, 0x55, 0x52, 0xa5, 0xa5, 0x52, 0x56, 0xc4, 0x6a, 0x27, 0x59, 0x57, 0x50, 0x20, 0x20, + 0x50, 0x57, 0x58, 0x28, 0x00, 0x01, 0x00, 0x0b, 0xff, 0x5b, 0x01, 0xd9, 0x02, 0x6b, 0x00, 0x19, + 0x00, 0x4b, 0x40, 0x29, 0x0c, 0x0e, 0x06, 0x07, 0x04, 0x1a, 0x0f, 0x00, 0x10, 0x12, 0x03, 0x03, + 0x16, 0x0f, 0x03, 0x0f, 0x03, 0x1a, 0x18, 0xb3, 0x11, 0x16, 0x1b, 0x0d, 0x1a, 0x18, 0x12, 0x10, + 0x02, 0x03, 0x0c, 0x12, 0x0f, 0x04, 0x06, 0x0d, 0x02, 0x06, 0x08, 0x00, 0x08, 0x00, 0x3f, 0x3f, + 0x3f, 0x12, 0x17, 0x39, 0x3f, 0x3f, 0x01, 0x10, 0xc6, 0x10, 0xd6, 0xc6, 0xed, 0x12, 0x39, 0x39, + 0x3d, 0x2f, 0x2f, 0x11, 0x12, 0x17, 0x39, 0x11, 0x12, 0x17, 0x39, 0x31, 0x30, 0x21, 0x26, 0x26, + 0x27, 0x06, 0x06, 0x07, 0x23, 0x3e, 0x03, 0x37, 0x03, 0x33, 0x17, 0x37, 0x33, 0x03, 0x16, 0x16, + 0x17, 0x33, 0x11, 0x23, 0x35, 0x01, 0x52, 0x12, 0x35, 0x1d, 0x1a, 0x31, 0x13, 0x85, 0x0a, 0x24, + 0x2b, 0x30, 0x16, 0x95, 0x85, 0x54, 0x64, 0x7b, 0x99, 0x22, 0x3e, 0x19, 0x2c, 0x72, 0x33, 0x7c, + 0x3e, 0x3b, 0x7f, 0x33, 0x1b, 0x4c, 0x58, 0x5d, 0x2b, 0x01, 0x24, 0xc6, 0xc6, 0xfe, 0xdf, 0x38, + 0x77, 0x35, 0xfe, 0xf5, 0xa5, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x14, 0xff, 0x7a, 0x01, 0xc9, + 0x01, 0xd6, 0x00, 0x19, 0x00, 0x4f, 0x40, 0x2a, 0x10, 0x0d, 0x0f, 0x07, 0x03, 0x08, 0x01, 0x11, + 0x13, 0x03, 0x04, 0x17, 0x08, 0x04, 0x08, 0x04, 0x1a, 0x19, 0x12, 0x17, 0x1b, 0x0e, 0x1a, 0x11, + 0x0a, 0x04, 0x0d, 0x13, 0x10, 0x04, 0x07, 0x0e, 0x0a, 0x07, 0x06, 0x01, 0x06, 0x18, 0x17, 0x55, + 0x00, 0x06, 0x00, 0x3f, 0xed, 0xc5, 0x3f, 0x3f, 0x3f, 0x12, 0x17, 0x39, 0x3f, 0x01, 0x10, 0xc6, + 0x10, 0xd6, 0xc6, 0xc5, 0x12, 0x39, 0x39, 0x3d, 0x2f, 0x18, 0x2f, 0x11, 0x12, 0x17, 0x39, 0x11, + 0x17, 0x39, 0x32, 0x31, 0x30, 0x21, 0x23, 0x26, 0x26, 0x27, 0x06, 0x06, 0x07, 0x23, 0x3e, 0x03, + 0x37, 0x27, 0x33, 0x17, 0x37, 0x33, 0x07, 0x16, 0x16, 0x17, 0x33, 0x15, 0x23, 0x01, 0x67, 0x18, + 0x1a, 0x33, 0x17, 0x1a, 0x2a, 0x16, 0x7d, 0x0d, 0x24, 0x28, 0x2b, 0x14, 0x97, 0x81, 0x5a, 0x5c, + 0x7d, 0x93, 0x19, 0x32, 0x16, 0x30, 0x60, 0x33, 0x50, 0x20, 0x28, 0x4b, 0x30, 0x1c, 0x3d, 0x3f, + 0x3e, 0x1c, 0xe4, 0x93, 0x93, 0xe2, 0x20, 0x4a, 0x24, 0xec, 0x00, 0x00, 0x00, 0x01, 0x00, 0x11, + 0xff, 0x5e, 0x01, 0xe4, 0x02, 0x72, 0x00, 0x0f, 0x00, 0x48, 0x40, 0x0b, 0x0b, 0x44, 0x08, 0x0f, + 0x04, 0x01, 0x04, 0x44, 0x07, 0x11, 0x00, 0xb8, 0xff, 0xc0, 0x40, 0x1d, 0x0a, 0x0e, 0x48, 0x00, + 0x03, 0x44, 0x20, 0x0c, 0x30, 0x0c, 0x02, 0x0c, 0x0f, 0x10, 0x07, 0x48, 0x03, 0x48, 0x0c, 0x08, + 0x0a, 0x12, 0x05, 0x02, 0x0d, 0x02, 0x72, 0x00, 0x02, 0x00, 0x3f, 0xed, 0x32, 0x3f, 0x3f, 0x3f, + 0xed, 0xed, 0x01, 0x10, 0xc6, 0xd6, 0x5d, 0xfd, 0xc4, 0x2b, 0x10, 0xdc, 0xed, 0x5d, 0xdd, 0xed, + 0x31, 0x30, 0x01, 0x15, 0x23, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x23, 0x35, 0x21, 0x11, + 0x23, 0x35, 0x01, 0x18, 0x45, 0x72, 0x7c, 0x23, 0x7b, 0xfe, 0xee, 0x46, 0x02, 0x72, 0x6e, 0xfe, + 0x73, 0x01, 0xfb, 0xfe, 0x05, 0xfe, 0xe7, 0xa2, 0x02, 0x04, 0x6e, 0x00, 0x00, 0x01, 0x00, 0x12, + 0xff, 0x7a, 0x01, 0xd9, 0x01, 0xd6, 0x00, 0x0f, 0x00, 0x48, 0x40, 0x2e, 0x0c, 0x40, 0x0b, 0x0e, + 0x00, 0x4c, 0x0b, 0x40, 0x0b, 0x0e, 0x00, 0x4c, 0x0d, 0x79, 0x0b, 0x09, 0x79, 0x08, 0xcf, 0x04, + 0x01, 0x04, 0x05, 0x79, 0xaf, 0x00, 0xbf, 0x00, 0xcf, 0x00, 0x03, 0x00, 0x01, 0x10, 0x0f, 0x07, + 0x0a, 0x07, 0x72, 0x0c, 0x0e, 0x07, 0x09, 0x0a, 0x03, 0x0a, 0x00, 0x3f, 0x3f, 0x3f, 0xc5, 0xed, + 0x32, 0x3f, 0x01, 0x10, 0xd6, 0xd5, 0x5d, 0xfd, 0xd5, 0x5d, 0xd6, 0xfd, 0xd6, 0xed, 0x31, 0x30, + 0x2b, 0x2b, 0x13, 0x23, 0x35, 0x33, 0x15, 0x23, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x15, 0x23, + 0x35, 0x21, 0x59, 0x47, 0xf8, 0x47, 0x89, 0x6a, 0x23, 0x69, 0xfe, 0xe9, 0x01, 0x79, 0x5d, 0x5d, + 0xfe, 0xed, 0x01, 0x70, 0xfe, 0x90, 0xec, 0x86, 0x00, 0x01, 0x00, 0x2d, 0xff, 0x5b, 0x01, 0xd9, + 0x02, 0x6b, 0x00, 0x1a, 0x00, 0x46, 0xb3, 0x02, 0x15, 0x51, 0x16, 0xb8, 0xff, 0xc0, 0x40, 0x0b, + 0x09, 0x0e, 0x48, 0x16, 0x00, 0xb3, 0x18, 0x1c, 0x0c, 0x51, 0x0b, 0xb8, 0xff, 0xc0, 0x40, 0x14, + 0x0b, 0x0e, 0x48, 0x0b, 0x1b, 0x1a, 0x12, 0x12, 0x53, 0x05, 0x05, 0x01, 0x16, 0x02, 0x0c, 0x02, + 0x18, 0x72, 0x01, 0x08, 0x00, 0x3f, 0xed, 0x3f, 0x3f, 0x12, 0x39, 0x2f, 0xed, 0x3f, 0x01, 0x10, + 0xd6, 0x2b, 0xed, 0x10, 0xd6, 0xed, 0xd6, 0x2b, 0xed, 0x32, 0x31, 0x30, 0x21, 0x23, 0x35, 0x06, + 0x06, 0x23, 0x22, 0x2e, 0x02, 0x35, 0x35, 0x33, 0x15, 0x14, 0x1e, 0x02, 0x33, 0x32, 0x37, 0x11, + 0x33, 0x11, 0x33, 0x11, 0x23, 0x01, 0x67, 0x2d, 0x17, 0x21, 0x14, 0x2c, 0x47, 0x33, 0x1b, 0x7b, + 0x09, 0x15, 0x21, 0x18, 0x1c, 0x1f, 0x7c, 0x23, 0x72, 0xcf, 0x03, 0x04, 0x14, 0x34, 0x59, 0x45, + 0xbd, 0xb6, 0x26, 0x30, 0x1d, 0x0b, 0x07, 0x01, 0x2d, 0xfd, 0xfb, 0xfe, 0xf5, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x2b, 0xff, 0x7a, 0x01, 0xc7, 0x01, 0xd6, 0x00, 0x1d, 0x00, 0x72, 0x40, 0x0a, + 0x1c, 0x40, 0x0c, 0x0e, 0x00, 0x4c, 0x2f, 0x1c, 0x01, 0x1b, 0xb8, 0xff, 0xd0, 0x40, 0x3f, 0x0f, + 0x00, 0x4d, 0x1b, 0x18, 0x0e, 0x00, 0x4d, 0x1b, 0x10, 0x0d, 0x00, 0x4d, 0x1b, 0x40, 0x0c, 0x00, + 0x4d, 0x2f, 0x1b, 0x01, 0x02, 0x17, 0x51, 0x00, 0x19, 0x10, 0x19, 0x02, 0x19, 0x5f, 0x1d, 0x01, + 0x1d, 0xb3, 0x1b, 0x1f, 0x0f, 0x51, 0x30, 0x0c, 0x01, 0x0c, 0x1e, 0x20, 0x12, 0x01, 0x12, 0x53, + 0x07, 0x07, 0x01, 0x18, 0x06, 0x0e, 0x06, 0x01, 0x0a, 0x1c, 0x1b, 0x72, 0x00, 0x0a, 0x00, 0x3f, + 0xed, 0xc5, 0x3f, 0x3f, 0x3f, 0x12, 0x39, 0x2f, 0xed, 0x5d, 0x01, 0x10, 0xd6, 0x5d, 0xed, 0x10, + 0xd6, 0xed, 0x5d, 0xd6, 0x5d, 0xed, 0x32, 0x31, 0x30, 0x5d, 0x2b, 0x2b, 0x2b, 0x2b, 0x5d, 0x2b, + 0x21, 0x23, 0x35, 0x0e, 0x03, 0x23, 0x22, 0x2e, 0x02, 0x35, 0x35, 0x33, 0x15, 0x14, 0x16, 0x33, + 0x32, 0x3e, 0x02, 0x37, 0x35, 0x33, 0x11, 0x33, 0x15, 0x23, 0x01, 0x55, 0x2d, 0x07, 0x15, 0x16, + 0x12, 0x04, 0x2a, 0x44, 0x2e, 0x19, 0x7b, 0x2a, 0x1f, 0x03, 0x0f, 0x11, 0x11, 0x05, 0x7c, 0x23, + 0x72, 0x9a, 0x01, 0x02, 0x02, 0x01, 0x11, 0x27, 0x41, 0x30, 0x99, 0x98, 0x22, 0x1d, 0x01, 0x01, + 0x02, 0x01, 0xd2, 0xfe, 0x90, 0xec, 0x00, 0x00, 0x00, 0x01, 0x00, 0x1b, 0x00, 0x00, 0x01, 0xc7, + 0x02, 0x6b, 0x00, 0x1b, 0x00, 0x47, 0x40, 0x29, 0x18, 0x15, 0x44, 0x0f, 0x14, 0x01, 0x14, 0x1b, + 0x0f, 0x82, 0x02, 0x0e, 0x20, 0x0a, 0x30, 0x0a, 0x02, 0x0a, 0x44, 0xa0, 0x07, 0xb0, 0x07, 0x02, + 0x07, 0x1c, 0x0f, 0x0d, 0x10, 0x4a, 0x02, 0x00, 0x1b, 0x1b, 0x14, 0x17, 0x08, 0x14, 0x04, 0x08, + 0x04, 0x00, 0x3f, 0x3f, 0x3f, 0x12, 0x39, 0x2f, 0xc5, 0xc0, 0xfd, 0xd5, 0xc5, 0x01, 0x10, 0xd6, + 0x5d, 0xfd, 0x5d, 0xd6, 0xc0, 0xfd, 0xc0, 0xd6, 0x5d, 0xed, 0xc0, 0x31, 0x30, 0x25, 0x23, 0x35, + 0x2e, 0x03, 0x35, 0x35, 0x33, 0x15, 0x14, 0x16, 0x17, 0x35, 0x33, 0x15, 0x36, 0x36, 0x37, 0x11, + 0x33, 0x11, 0x23, 0x35, 0x06, 0x06, 0x07, 0x01, 0x18, 0x44, 0x29, 0x44, 0x31, 0x1b, 0x7b, 0x1e, + 0x20, 0x44, 0x0d, 0x1b, 0x0c, 0x7b, 0x7b, 0x0e, 0x19, 0x0d, 0x60, 0x69, 0x02, 0x19, 0x35, 0x56, + 0x3f, 0xbd, 0xba, 0x3a, 0x37, 0x08, 0x6e, 0x72, 0x01, 0x03, 0x02, 0x01, 0x31, 0xfd, 0x95, 0xcf, + 0x02, 0x02, 0x02, 0x00, 0x00, 0x01, 0x00, 0x2d, 0x00, 0x00, 0x01, 0xc9, 0x01, 0xd6, 0x00, 0x18, + 0x00, 0x6f, 0x40, 0x2a, 0x15, 0x40, 0x12, 0x01, 0x12, 0x51, 0x0f, 0x11, 0x1f, 0x11, 0x02, 0x11, + 0x18, 0x0f, 0x0c, 0x01, 0xaf, 0x0c, 0xbf, 0x0c, 0xef, 0x0c, 0xff, 0x0c, 0x04, 0x0c, 0x82, 0x02, + 0x0f, 0x0b, 0x1f, 0x0b, 0x02, 0x0b, 0x20, 0x08, 0x30, 0x08, 0x02, 0x08, 0x51, 0x06, 0xb8, 0xff, + 0xc0, 0x40, 0x1b, 0x0b, 0x10, 0x48, 0x06, 0x19, 0x0a, 0x0d, 0x57, 0x02, 0x18, 0x4f, 0x0c, 0x01, + 0x0c, 0x18, 0x00, 0x00, 0x18, 0x0c, 0x03, 0x11, 0x14, 0x06, 0x11, 0x0a, 0x07, 0x0a, 0x00, 0x3f, + 0x3f, 0x3f, 0x12, 0x17, 0x39, 0x2f, 0x2f, 0x2f, 0x5d, 0x10, 0xc5, 0xfd, 0xc5, 0x01, 0x10, 0xd6, + 0x2b, 0xfd, 0x5d, 0xd6, 0x5d, 0xc0, 0xfd, 0x5d, 0x71, 0xc0, 0xd6, 0x5d, 0xed, 0x5d, 0xc0, 0x31, + 0x30, 0x25, 0x23, 0x35, 0x26, 0x26, 0x35, 0x35, 0x33, 0x15, 0x14, 0x17, 0x35, 0x33, 0x15, 0x32, + 0x36, 0x37, 0x35, 0x33, 0x11, 0x23, 0x35, 0x06, 0x06, 0x23, 0x01, 0x1d, 0x45, 0x53, 0x58, 0x7b, + 0x30, 0x45, 0x0a, 0x1f, 0x07, 0x7c, 0x7c, 0x07, 0x21, 0x08, 0x4a, 0x4b, 0x04, 0x4a, 0x5a, 0x99, + 0x98, 0x2f, 0x0c, 0x4b, 0x4e, 0x02, 0x02, 0xd2, 0xfe, 0x2a, 0x9a, 0x01, 0x02, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x36, 0x00, 0x00, 0x01, 0xd0, 0x02, 0x6b, 0x00, 0x17, 0x00, 0x3c, 0x40, 0x11, + 0x00, 0x44, 0x00, 0x15, 0x20, 0x15, 0x30, 0x15, 0x40, 0x15, 0x04, 0x15, 0x19, 0x08, 0x0d, 0x44, + 0x0b, 0xb8, 0xff, 0xc0, 0x40, 0x10, 0x0b, 0x0e, 0x48, 0x0b, 0x18, 0x05, 0x4a, 0x10, 0x10, 0x0b, + 0x17, 0x08, 0x0b, 0x02, 0x09, 0x08, 0x00, 0x3f, 0x3f, 0x3f, 0x12, 0x39, 0x2f, 0xed, 0x01, 0x10, + 0xd6, 0x2b, 0xfd, 0xc0, 0x10, 0xd6, 0x5d, 0xed, 0x31, 0x30, 0x25, 0x34, 0x2e, 0x02, 0x23, 0x22, + 0x06, 0x07, 0x11, 0x23, 0x11, 0x33, 0x15, 0x36, 0x36, 0x33, 0x32, 0x1e, 0x02, 0x15, 0x15, 0x23, + 0x01, 0x55, 0x0b, 0x18, 0x24, 0x18, 0x0d, 0x27, 0x11, 0x7b, 0x7b, 0x17, 0x2c, 0x14, 0x2c, 0x49, + 0x35, 0x1e, 0x7b, 0xb6, 0x25, 0x31, 0x1d, 0x0b, 0x04, 0x03, 0xfe, 0xd3, 0x02, 0x6b, 0xcf, 0x03, + 0x04, 0x15, 0x34, 0x59, 0x44, 0xbd, 0x00, 0x00, 0xff, 0xff, 0x00, 0x3f, 0x00, 0x00, 0x01, 0xb9, + 0x02, 0xb6, 0x02, 0x06, 0x00, 0x4b, 0x00, 0x00, 0x00, 0x02, 0x00, 0x09, 0xff, 0xf3, 0x01, 0xe4, + 0x02, 0x79, 0x00, 0x28, 0x00, 0x2f, 0x00, 0x7c, 0xb9, 0x00, 0x2e, 0xff, 0xa0, 0x40, 0x28, 0x0b, + 0x0c, 0x00, 0x4c, 0x2a, 0x40, 0x0e, 0x00, 0x4d, 0x2a, 0x60, 0x0b, 0x0c, 0x00, 0x4c, 0x2f, 0x40, + 0x0b, 0x0c, 0x00, 0x4c, 0x29, 0x40, 0x0b, 0x0c, 0x00, 0x4c, 0x29, 0x52, 0x28, 0x07, 0x31, 0xc0, + 0x1a, 0xd0, 0x1a, 0xe0, 0x1a, 0x03, 0x1a, 0xb8, 0xff, 0xc0, 0x40, 0x23, 0x0b, 0x10, 0x48, 0x1a, + 0x52, 0x14, 0x30, 0x2f, 0x00, 0x52, 0x1d, 0x11, 0x30, 0x40, 0x2f, 0x01, 0x2f, 0x48, 0x00, 0x00, + 0x0c, 0x4f, 0x2c, 0x01, 0x2c, 0x4a, 0x20, 0x03, 0x17, 0x0b, 0x06, 0x03, 0x4a, 0x0c, 0x09, 0x00, + 0x3f, 0xfd, 0xc6, 0x3f, 0x3f, 0xed, 0x5d, 0x12, 0x39, 0x2f, 0xed, 0x5d, 0x01, 0x10, 0xd6, 0xc5, + 0xfd, 0xc5, 0x10, 0xd6, 0xed, 0x2b, 0x5d, 0x10, 0xd6, 0xd6, 0xed, 0x31, 0x30, 0x00, 0x2b, 0x2b, + 0x01, 0x2b, 0x2b, 0x2b, 0x13, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x17, 0x0e, 0x03, 0x23, 0x22, + 0x2e, 0x02, 0x27, 0x26, 0x26, 0x35, 0x34, 0x36, 0x37, 0x17, 0x06, 0x15, 0x14, 0x16, 0x17, 0x36, + 0x36, 0x33, 0x32, 0x1e, 0x02, 0x15, 0x14, 0x06, 0x07, 0x27, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, + 0xfd, 0x33, 0x3f, 0x1c, 0x30, 0x0b, 0x1e, 0x06, 0x1b, 0x22, 0x29, 0x15, 0x34, 0x4c, 0x33, 0x1b, + 0x02, 0x48, 0x42, 0x04, 0x05, 0x54, 0x07, 0x18, 0x1e, 0x0a, 0x55, 0x49, 0x33, 0x41, 0x25, 0x0d, + 0x02, 0x01, 0x64, 0x24, 0x1c, 0x20, 0x1d, 0x01, 0x13, 0x64, 0x5a, 0x15, 0x0b, 0x56, 0x06, 0x10, + 0x0d, 0x09, 0x2d, 0x4f, 0x6c, 0x3f, 0x0a, 0x51, 0x37, 0x0f, 0x1f, 0x0e, 0x0c, 0x12, 0x16, 0x17, + 0x27, 0x02, 0x7d, 0x88, 0x36, 0x53, 0x65, 0x2e, 0x14, 0x26, 0x10, 0x60, 0x58, 0x4c, 0x5a, 0x4a, + 0x00, 0x02, 0x00, 0x09, 0xff, 0xf5, 0x01, 0xd1, 0x01, 0xe2, 0x00, 0x25, 0x00, 0x2c, 0x00, 0x80, + 0x40, 0x37, 0x29, 0x08, 0x0c, 0x00, 0x4d, 0x27, 0x40, 0x0c, 0x00, 0x4d, 0x11, 0x30, 0x0b, 0x00, + 0x4d, 0x2b, 0x26, 0x4b, 0x26, 0xcb, 0x26, 0xdb, 0x26, 0x04, 0x26, 0x53, 0xbb, 0x23, 0x01, 0x23, + 0x5b, 0x19, 0x01, 0x04, 0x19, 0x24, 0x19, 0x44, 0x19, 0x03, 0x19, 0x2e, 0x2c, 0x1a, 0x53, 0x10, + 0x03, 0x04, 0x0d, 0x14, 0x0d, 0x24, 0x0d, 0x03, 0x0d, 0xb8, 0xff, 0xc0, 0x40, 0x1d, 0x0f, 0x13, + 0x48, 0x0d, 0x84, 0x06, 0x2d, 0x2c, 0x73, 0x1a, 0x1a, 0x00, 0x4d, 0x29, 0x01, 0x02, 0x29, 0x57, + 0x0f, 0x09, 0x01, 0x09, 0x13, 0x0b, 0x22, 0x1f, 0x57, 0x00, 0x07, 0x00, 0x3f, 0xfd, 0xc6, 0x3f, + 0xc4, 0x5d, 0xed, 0x5f, 0x5d, 0x12, 0x39, 0x2f, 0xed, 0x01, 0x10, 0xd6, 0xed, 0x2b, 0x71, 0xd5, + 0xc5, 0xfd, 0xc0, 0x10, 0xd6, 0x5d, 0x5d, 0xc6, 0x5d, 0xed, 0x5d, 0x31, 0x30, 0x2b, 0x2b, 0x2b, + 0x05, 0x22, 0x26, 0x27, 0x26, 0x26, 0x35, 0x34, 0x36, 0x37, 0x17, 0x06, 0x06, 0x15, 0x14, 0x16, + 0x17, 0x36, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x07, 0x23, 0x14, 0x1e, 0x02, 0x33, 0x32, + 0x36, 0x37, 0x17, 0x06, 0x06, 0x03, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x01, 0x51, 0x5c, 0x66, + 0x06, 0x49, 0x37, 0x03, 0x05, 0x5c, 0x03, 0x02, 0x0f, 0x16, 0x0f, 0x58, 0x38, 0x51, 0x54, 0x01, + 0x01, 0xdc, 0x11, 0x1b, 0x23, 0x13, 0x17, 0x2b, 0x0e, 0x11, 0x16, 0x31, 0x07, 0x22, 0x18, 0x17, + 0x24, 0x0b, 0x6c, 0x6b, 0x0e, 0x49, 0x3f, 0x0b, 0x1b, 0x0f, 0x0e, 0x0b, 0x16, 0x09, 0x12, 0x1f, + 0x06, 0x5c, 0x5e, 0x7b, 0x76, 0x0c, 0x18, 0x0a, 0x1e, 0x29, 0x19, 0x0b, 0x0f, 0x08, 0x60, 0x0b, + 0x0f, 0x01, 0x23, 0x33, 0x35, 0x38, 0x30, 0x00, 0x00, 0x02, 0x00, 0x09, 0xff, 0x7f, 0x01, 0xe4, + 0x02, 0x79, 0x00, 0x2b, 0x00, 0x32, 0x00, 0x69, 0x40, 0x41, 0x1a, 0x40, 0x09, 0x00, 0x4d, 0x2c, + 0x40, 0x0b, 0x00, 0x4d, 0x3f, 0x2c, 0x4f, 0x2c, 0x5f, 0x2c, 0x03, 0x2c, 0x53, 0x28, 0x07, 0x34, + 0x00, 0x20, 0x32, 0x30, 0x32, 0x02, 0x32, 0x53, 0x14, 0x20, 0x1d, 0x17, 0x33, 0x0d, 0x52, 0x0f, + 0x33, 0x20, 0x32, 0x55, 0x14, 0x00, 0x00, 0x0f, 0x20, 0x2f, 0x30, 0x2f, 0x02, 0x2f, 0x57, 0x23, + 0x03, 0x1a, 0x0b, 0x0e, 0x0f, 0x08, 0x06, 0x03, 0x57, 0x0c, 0x09, 0x00, 0x3f, 0xfd, 0xc6, 0x3f, + 0xc5, 0x3f, 0x3f, 0xed, 0x5d, 0x12, 0x39, 0x2f, 0xc5, 0xfd, 0xc5, 0x01, 0x10, 0xd6, 0xed, 0x10, + 0xd6, 0xd5, 0xde, 0xc5, 0xfd, 0x5d, 0xc5, 0x10, 0xd6, 0xd6, 0xed, 0x5d, 0x2b, 0x31, 0x30, 0x00, + 0x2b, 0x13, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x17, 0x0e, 0x03, 0x07, 0x15, 0x23, 0x35, 0x2e, + 0x03, 0x27, 0x26, 0x26, 0x35, 0x34, 0x36, 0x37, 0x17, 0x06, 0x15, 0x14, 0x16, 0x17, 0x36, 0x36, + 0x33, 0x32, 0x1e, 0x02, 0x15, 0x14, 0x06, 0x07, 0x27, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0xfd, + 0x33, 0x3f, 0x1c, 0x30, 0x0b, 0x1e, 0x05, 0x15, 0x1b, 0x21, 0x12, 0x60, 0x22, 0x32, 0x21, 0x12, + 0x02, 0x48, 0x42, 0x04, 0x05, 0x54, 0x07, 0x18, 0x1e, 0x0a, 0x55, 0x49, 0x33, 0x41, 0x25, 0x0d, + 0x02, 0x01, 0x64, 0x24, 0x1c, 0x20, 0x1d, 0x01, 0x13, 0x64, 0x5a, 0x15, 0x0b, 0x56, 0x05, 0x0d, + 0x0c, 0x0a, 0x03, 0x75, 0x81, 0x0d, 0x35, 0x4a, 0x5b, 0x33, 0x0a, 0x51, 0x37, 0x0f, 0x1f, 0x0e, + 0x0c, 0x12, 0x16, 0x17, 0x27, 0x02, 0x7d, 0x88, 0x36, 0x53, 0x65, 0x2e, 0x14, 0x26, 0x10, 0x60, + 0x58, 0x4c, 0x5a, 0x4a, 0x00, 0x02, 0x00, 0x09, 0xff, 0x7f, 0x01, 0xd1, 0x01, 0xe2, 0x00, 0x28, + 0x00, 0x2f, 0x00, 0x72, 0x40, 0x49, 0x2f, 0x29, 0x3f, 0x29, 0x02, 0x29, 0x53, 0x5f, 0x19, 0x6f, + 0x19, 0x7f, 0x19, 0x03, 0x00, 0x19, 0x01, 0x19, 0x23, 0x40, 0x09, 0x10, 0x48, 0x23, 0x31, 0x1a, + 0x53, 0x03, 0x2f, 0x53, 0x00, 0x10, 0x01, 0x10, 0x0d, 0x06, 0x30, 0x27, 0x52, 0x00, 0x30, 0x22, + 0x1f, 0x57, 0x26, 0x40, 0x2f, 0x01, 0x2f, 0x55, 0x1a, 0x1a, 0x13, 0x26, 0x07, 0x4f, 0x2c, 0x5f, + 0x2c, 0x6f, 0x2c, 0x03, 0x2c, 0x57, 0x0f, 0x09, 0x01, 0x09, 0x13, 0x0b, 0x28, 0x00, 0x06, 0x00, + 0x3f, 0xc5, 0x3f, 0xc4, 0x5d, 0xed, 0x5d, 0x3f, 0x12, 0x39, 0x2f, 0xed, 0x5d, 0x10, 0xfd, 0xc6, + 0x01, 0x10, 0xd6, 0xed, 0x10, 0xd6, 0xd5, 0xde, 0x5d, 0xed, 0xd5, 0xed, 0x10, 0xc6, 0x2b, 0xd6, + 0x5d, 0x5d, 0xed, 0x5d, 0x31, 0x30, 0x05, 0x26, 0x26, 0x27, 0x26, 0x26, 0x35, 0x34, 0x36, 0x37, + 0x17, 0x06, 0x06, 0x15, 0x14, 0x16, 0x17, 0x36, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x07, + 0x23, 0x14, 0x1e, 0x02, 0x33, 0x32, 0x36, 0x37, 0x17, 0x06, 0x06, 0x07, 0x15, 0x23, 0x13, 0x34, + 0x26, 0x23, 0x22, 0x06, 0x15, 0x01, 0x0a, 0x3b, 0x41, 0x05, 0x49, 0x37, 0x03, 0x05, 0x5c, 0x03, + 0x02, 0x0f, 0x16, 0x0f, 0x58, 0x38, 0x51, 0x54, 0x01, 0x01, 0xdc, 0x11, 0x1b, 0x23, 0x13, 0x17, + 0x2b, 0x0e, 0x11, 0x11, 0x25, 0x15, 0x61, 0x5e, 0x22, 0x18, 0x17, 0x24, 0x01, 0x12, 0x66, 0x55, + 0x0e, 0x49, 0x3f, 0x0b, 0x1b, 0x0f, 0x0e, 0x0b, 0x16, 0x09, 0x12, 0x1f, 0x06, 0x5c, 0x5e, 0x7b, + 0x76, 0x0c, 0x1b, 0x07, 0x1e, 0x29, 0x19, 0x0b, 0x0f, 0x08, 0x60, 0x08, 0x0d, 0x03, 0x78, 0x01, + 0x99, 0x33, 0x35, 0x38, 0x30, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x36, 0x00, 0x00, 0x01, 0xbf, + 0x02, 0x6b, 0x02, 0x06, 0x00, 0x2c, 0x00, 0x00, 0xff, 0xff, 0x00, 0x09, 0x00, 0x00, 0x01, 0xeb, + 0x03, 0x39, 0x02, 0x26, 0x02, 0xc9, 0x00, 0x00, 0x01, 0x07, 0x03, 0x90, 0x00, 0x00, 0x00, 0x8b, + 0x00, 0x10, 0x40, 0x0b, 0x01, 0x00, 0x33, 0x3b, 0x25, 0x0e, 0x50, 0x01, 0x00, 0x2e, 0x4f, 0x2b, + 0x2b, 0x34, 0x00, 0x00, 0xff, 0xff, 0x00, 0x0e, 0x00, 0x00, 0x01, 0xe6, 0x02, 0xae, 0x02, 0x26, + 0x02, 0xe9, 0x00, 0x00, 0x01, 0x06, 0x03, 0x90, 0x00, 0x00, 0x00, 0x10, 0x40, 0x0b, 0x01, 0x00, + 0x31, 0x39, 0x23, 0x06, 0x50, 0x01, 0x05, 0x2c, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0x01, 0x00, 0x2d, + 0xff, 0x59, 0x01, 0xef, 0x02, 0x6b, 0x00, 0x25, 0x00, 0x54, 0x40, 0x30, 0x21, 0x46, 0x14, 0x27, + 0x11, 0x0b, 0x0c, 0x0c, 0x26, 0x27, 0x03, 0x08, 0x44, 0x06, 0x4f, 0x1a, 0x01, 0x1a, 0x26, 0x1b, + 0x40, 0x1e, 0x50, 0x1e, 0x60, 0x1e, 0x03, 0x1e, 0x4a, 0x17, 0x0e, 0x0b, 0x02, 0x11, 0x4a, 0x00, + 0x08, 0x00, 0x03, 0x03, 0x00, 0x08, 0x03, 0x04, 0x07, 0x02, 0x04, 0x08, 0x00, 0x3f, 0x3f, 0x12, + 0x17, 0x39, 0x2f, 0x2f, 0x2f, 0x10, 0xed, 0x3f, 0x3f, 0xfd, 0x5d, 0xc6, 0x01, 0x10, 0xc6, 0x5d, + 0xd6, 0xfd, 0xc0, 0x11, 0x12, 0x39, 0x2f, 0x39, 0x39, 0x10, 0xd6, 0xed, 0x31, 0x30, 0x13, 0x22, + 0x06, 0x07, 0x15, 0x23, 0x11, 0x33, 0x15, 0x36, 0x36, 0x37, 0x33, 0x0e, 0x03, 0x07, 0x16, 0x16, + 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x27, 0x37, 0x16, 0x32, 0x33, 0x32, 0x36, 0x35, 0x34, 0x2e, + 0x02, 0xdd, 0x0d, 0x1a, 0x0e, 0x7b, 0x7b, 0x32, 0x62, 0x27, 0x8c, 0x0e, 0x2d, 0x39, 0x41, 0x22, + 0x5b, 0x6b, 0x72, 0x76, 0x0d, 0x1c, 0x0e, 0x05, 0x09, 0x11, 0x08, 0x42, 0x43, 0x14, 0x24, 0x35, + 0x01, 0x02, 0x02, 0x02, 0xfe, 0x02, 0x6b, 0xee, 0x3a, 0x7b, 0x39, 0x15, 0x3c, 0x46, 0x4b, 0x24, + 0x0b, 0x7c, 0x7b, 0x7f, 0x8b, 0x02, 0x02, 0x65, 0x01, 0x47, 0x57, 0x2f, 0x3f, 0x25, 0x10, 0x00, + 0x00, 0x01, 0x00, 0x3f, 0xff, 0x59, 0x01, 0xde, 0x01, 0xd6, 0x00, 0x25, 0x00, 0x55, 0x40, 0x33, + 0x19, 0x53, 0x00, 0x0c, 0x60, 0x0c, 0x02, 0x0c, 0x27, 0x09, 0x03, 0x04, 0x04, 0x26, 0x27, 0x21, + 0x00, 0x51, 0x00, 0x24, 0x01, 0x24, 0x00, 0x12, 0x01, 0x12, 0x26, 0x25, 0x0a, 0x09, 0x57, 0x00, + 0x55, 0x1e, 0x1e, 0x03, 0x22, 0x06, 0x40, 0x16, 0x50, 0x16, 0x60, 0x16, 0x03, 0x16, 0x57, 0x0f, + 0x0e, 0x03, 0x0a, 0x00, 0x3f, 0x3f, 0xed, 0x5d, 0x3f, 0x12, 0x39, 0x2f, 0xed, 0xed, 0x3f, 0x01, + 0x10, 0xc6, 0x5d, 0xd6, 0x5d, 0xfd, 0xc0, 0x11, 0x12, 0x39, 0x2f, 0x39, 0x39, 0x10, 0xd6, 0x5d, + 0xed, 0x31, 0x30, 0x13, 0x36, 0x36, 0x37, 0x33, 0x0e, 0x03, 0x07, 0x16, 0x16, 0x15, 0x14, 0x06, + 0x23, 0x22, 0x26, 0x27, 0x37, 0x16, 0x32, 0x33, 0x32, 0x36, 0x35, 0x34, 0x2e, 0x02, 0x23, 0x22, + 0x06, 0x07, 0x15, 0x23, 0x11, 0x33, 0xbb, 0x26, 0x4e, 0x1b, 0x94, 0x10, 0x2a, 0x30, 0x32, 0x18, + 0x51, 0x5a, 0x6b, 0x6f, 0x0c, 0x19, 0x0e, 0x04, 0x08, 0x10, 0x08, 0x3b, 0x3c, 0x14, 0x25, 0x34, + 0x21, 0x07, 0x0c, 0x07, 0x7c, 0x7c, 0x01, 0x2e, 0x27, 0x5b, 0x26, 0x14, 0x2e, 0x30, 0x2f, 0x15, + 0x0b, 0x6c, 0x67, 0x6f, 0x7a, 0x02, 0x02, 0x65, 0x01, 0x38, 0x45, 0x25, 0x32, 0x1e, 0x0c, 0x01, + 0x01, 0xbd, 0x01, 0xcf, 0x00, 0x01, 0x00, 0x08, 0xff, 0x57, 0x01, 0xd9, 0x02, 0x6b, 0x00, 0x1d, + 0x00, 0x4b, 0x40, 0x2e, 0x30, 0x16, 0x01, 0x13, 0x14, 0x14, 0x0b, 0x20, 0x0a, 0x30, 0x0a, 0x02, + 0x0a, 0x44, 0x30, 0x15, 0x01, 0x15, 0x20, 0x16, 0x40, 0x16, 0x50, 0x16, 0x03, 0x16, 0x44, 0x08, + 0x00, 0x10, 0x1e, 0x00, 0x4a, 0x1d, 0x09, 0x0a, 0x14, 0x08, 0x0f, 0x92, 0x15, 0x48, 0x09, 0x02, + 0x08, 0x02, 0x00, 0x3f, 0x3f, 0xed, 0x3f, 0x3f, 0xc5, 0x3f, 0xed, 0x01, 0x10, 0xcc, 0xd6, 0xd6, + 0xfd, 0x5d, 0xde, 0x5d, 0xfd, 0x5d, 0xcd, 0x33, 0x2f, 0xcd, 0x5d, 0x31, 0x30, 0x37, 0x3e, 0x03, + 0x37, 0x36, 0x36, 0x35, 0x21, 0x11, 0x33, 0x15, 0x14, 0x06, 0x07, 0x27, 0x36, 0x36, 0x37, 0x23, + 0x11, 0x23, 0x0e, 0x05, 0x07, 0x08, 0x1a, 0x24, 0x18, 0x10, 0x06, 0x11, 0x0e, 0x01, 0x23, 0x23, + 0x3a, 0x3c, 0x4a, 0x18, 0x24, 0x0b, 0x26, 0x36, 0x02, 0x07, 0x11, 0x1e, 0x34, 0x4b, 0x36, 0x5d, + 0x09, 0x19, 0x21, 0x29, 0x19, 0x42, 0xc7, 0x80, 0xfe, 0x0b, 0x09, 0x47, 0x92, 0x3d, 0x2f, 0x20, + 0x3d, 0x1d, 0x02, 0x05, 0x3a, 0x7a, 0x72, 0x67, 0x4f, 0x32, 0x04, 0x00, 0x00, 0x01, 0x00, 0x11, + 0xff, 0x6c, 0x01, 0xdc, 0x01, 0xd6, 0x00, 0x1d, 0x00, 0x42, 0x40, 0x27, 0x1b, 0x20, 0x1c, 0x30, + 0x1c, 0x02, 0x1c, 0x1c, 0x14, 0x13, 0x51, 0x1d, 0x20, 0x00, 0x30, 0x00, 0x50, 0x00, 0x03, 0x00, + 0x52, 0x11, 0x08, 0x18, 0x1e, 0x1c, 0x06, 0x17, 0x13, 0x1b, 0x06, 0x00, 0x55, 0x11, 0x0a, 0x08, + 0x57, 0x07, 0x07, 0x00, 0x3f, 0xed, 0x3f, 0xed, 0x3f, 0xc5, 0xc5, 0x3f, 0x01, 0x10, 0xc6, 0xd6, + 0xd6, 0xfd, 0x5d, 0xde, 0xfd, 0xcd, 0x33, 0x2f, 0x5d, 0xcd, 0x31, 0x30, 0x13, 0x0e, 0x05, 0x07, + 0x27, 0x36, 0x36, 0x37, 0x3e, 0x03, 0x35, 0x35, 0x21, 0x11, 0x33, 0x16, 0x06, 0x07, 0x27, 0x36, + 0x36, 0x37, 0x23, 0x11, 0xf0, 0x02, 0x05, 0x0d, 0x1a, 0x2d, 0x43, 0x30, 0x11, 0x23, 0x22, 0x0b, + 0x0c, 0x0d, 0x07, 0x01, 0x01, 0x34, 0x24, 0x02, 0x3e, 0x33, 0x4a, 0x12, 0x22, 0x0b, 0x25, 0x01, + 0x70, 0x2b, 0x57, 0x52, 0x48, 0x37, 0x22, 0x03, 0x66, 0x08, 0x22, 0x15, 0x18, 0x3f, 0x46, 0x47, + 0x1f, 0x36, 0xfe, 0x97, 0x4b, 0x89, 0x2d, 0x2e, 0x16, 0x37, 0x19, 0x01, 0x70, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x2d, 0xff, 0x5b, 0x01, 0xc7, 0x02, 0x6b, 0x00, 0x17, 0x00, 0x52, 0x40, 0x16, + 0x0f, 0x30, 0x00, 0x01, 0x00, 0x44, 0x0f, 0x16, 0xbf, 0x16, 0x02, 0x16, 0x10, 0x20, 0x15, 0x01, + 0x15, 0x44, 0x70, 0x13, 0x01, 0x13, 0xb8, 0xff, 0xc0, 0x40, 0x19, 0x0b, 0x0e, 0x48, 0x13, 0x07, + 0x18, 0x17, 0x02, 0x15, 0x48, 0x40, 0x10, 0x01, 0x10, 0x10, 0x11, 0x14, 0x02, 0x11, 0x08, 0x08, + 0x0b, 0x4a, 0x04, 0x92, 0x00, 0x3f, 0xfd, 0xc6, 0x3f, 0x3f, 0x12, 0x39, 0x2f, 0x5d, 0xed, 0x3f, + 0x01, 0x10, 0xc6, 0xd6, 0x2b, 0x5d, 0xfd, 0x5d, 0xd0, 0xd5, 0x5d, 0xed, 0x5d, 0x33, 0x31, 0x30, + 0x01, 0x11, 0x14, 0x06, 0x23, 0x22, 0x26, 0x27, 0x37, 0x16, 0x16, 0x33, 0x32, 0x36, 0x35, 0x11, + 0x23, 0x11, 0x23, 0x11, 0x33, 0x15, 0x33, 0x35, 0x01, 0xc7, 0x5a, 0x55, 0x0d, 0x31, 0x16, 0x12, + 0x0e, 0x16, 0x11, 0x23, 0x1e, 0xa4, 0x7b, 0x7b, 0xa4, 0x02, 0x6b, 0xfd, 0xa6, 0x5d, 0x59, 0x04, + 0x08, 0x67, 0x04, 0x04, 0x27, 0x20, 0x01, 0x04, 0xfe, 0xef, 0x02, 0x6b, 0xf4, 0xf4, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x3b, 0xff, 0x5b, 0x01, 0xb8, 0x01, 0xd6, 0x00, 0x17, 0x00, 0x4c, 0x40, 0x0e, + 0x20, 0x17, 0x01, 0x17, 0x51, 0x0e, 0x30, 0x15, 0x01, 0x15, 0x0f, 0x14, 0x51, 0x11, 0xb8, 0xff, + 0xc0, 0x40, 0x1c, 0x0a, 0x0f, 0x48, 0x11, 0x4f, 0x06, 0x01, 0x10, 0x06, 0x01, 0x06, 0x18, 0x16, + 0x0a, 0x14, 0x55, 0x0f, 0x0f, 0x10, 0x13, 0x0a, 0x10, 0x06, 0x07, 0x0a, 0x57, 0x03, 0x0e, 0x00, + 0x3f, 0xfd, 0xc6, 0x3f, 0x3f, 0x12, 0x39, 0x2f, 0xed, 0x3f, 0x01, 0x10, 0xc6, 0x5d, 0x5d, 0xd6, + 0x2b, 0xfd, 0xc0, 0xd6, 0x5d, 0xc0, 0xed, 0x5d, 0x31, 0x30, 0x25, 0x14, 0x06, 0x23, 0x22, 0x26, + 0x27, 0x37, 0x16, 0x16, 0x33, 0x32, 0x36, 0x35, 0x35, 0x23, 0x15, 0x23, 0x11, 0x33, 0x15, 0x33, + 0x35, 0x33, 0x01, 0xb8, 0x5a, 0x56, 0x0c, 0x31, 0x16, 0x12, 0x0e, 0x16, 0x11, 0x23, 0x1e, 0x87, + 0x7b, 0x7b, 0x87, 0x7b, 0x11, 0x5d, 0x59, 0x04, 0x08, 0x67, 0x04, 0x04, 0x27, 0x20, 0xad, 0xba, + 0x01, 0xd6, 0xb6, 0xb6, 0x00, 0x01, 0x00, 0x2d, 0xff, 0x57, 0x01, 0xd9, 0x02, 0x6b, 0x00, 0x14, + 0x00, 0x68, 0x40, 0x29, 0x14, 0x40, 0x0b, 0x0c, 0x00, 0x4c, 0x13, 0x40, 0x0b, 0x0c, 0x00, 0x4c, + 0x0c, 0x40, 0x0b, 0x0c, 0x00, 0x4c, 0x0b, 0x40, 0x0b, 0x0c, 0x00, 0x4c, 0x0a, 0x0b, 0x0b, 0x13, + 0x02, 0x01, 0x44, 0x20, 0x13, 0x30, 0x13, 0x02, 0x13, 0x0d, 0x12, 0x44, 0x10, 0xb8, 0xff, 0xc0, + 0x40, 0x18, 0x0b, 0x0e, 0x48, 0x10, 0x07, 0x15, 0x14, 0x02, 0x11, 0x02, 0x13, 0x48, 0x40, 0x0d, + 0x01, 0x0d, 0x0e, 0x08, 0x02, 0x0b, 0x08, 0x07, 0x06, 0x92, 0x00, 0x3f, 0xc5, 0x3f, 0xc5, 0x3f, + 0xdd, 0x5d, 0xed, 0x3f, 0x3f, 0x01, 0x10, 0xc6, 0xd6, 0x2b, 0xfd, 0xc0, 0xd6, 0x5d, 0xfd, 0xcd, + 0x11, 0x33, 0x10, 0xcd, 0x31, 0x30, 0x2b, 0x2b, 0x2b, 0x2b, 0x01, 0x11, 0x33, 0x15, 0x14, 0x06, + 0x07, 0x27, 0x36, 0x36, 0x37, 0x23, 0x11, 0x23, 0x11, 0x23, 0x11, 0x33, 0x15, 0x33, 0x35, 0x01, + 0xb6, 0x23, 0x3a, 0x3c, 0x4a, 0x18, 0x24, 0x0b, 0x26, 0x92, 0x7b, 0x7b, 0x92, 0x02, 0x6b, 0xfe, + 0x0b, 0x09, 0x47, 0x92, 0x3d, 0x2f, 0x20, 0x3d, 0x1d, 0x01, 0x11, 0xfe, 0xef, 0x02, 0x6b, 0xf4, + 0xf4, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x3b, 0xff, 0x6c, 0x01, 0xdc, 0x01, 0xd6, 0x00, 0x13, + 0x00, 0x68, 0x40, 0x26, 0x12, 0x40, 0x0c, 0x00, 0x4d, 0x11, 0x40, 0x0c, 0x00, 0x4d, 0x0a, 0x40, + 0x0c, 0x00, 0x4d, 0x09, 0x40, 0x0c, 0x00, 0x4d, 0x08, 0x09, 0x0a, 0x01, 0x00, 0x51, 0x0a, 0x30, + 0x11, 0x01, 0x11, 0x10, 0x0b, 0x51, 0x70, 0x0d, 0x01, 0x0d, 0xb8, 0xff, 0xc0, 0x40, 0x18, 0x0b, + 0x0e, 0x48, 0x0d, 0x14, 0x04, 0x05, 0x14, 0x13, 0x0a, 0x0f, 0x0a, 0x11, 0x55, 0x0b, 0x0c, 0x06, + 0x05, 0x04, 0x09, 0x06, 0x00, 0x08, 0x06, 0x00, 0x3f, 0xc5, 0x3f, 0xd4, 0xc5, 0x3f, 0xd5, 0xed, + 0x3f, 0x3f, 0x01, 0x10, 0xd6, 0xc5, 0x10, 0xd6, 0x2b, 0x5d, 0xfd, 0xd0, 0xd6, 0x5d, 0xd0, 0xfd, + 0xcd, 0x10, 0xd0, 0xcd, 0x31, 0x30, 0x2b, 0x2b, 0x2b, 0x2b, 0x25, 0x33, 0x16, 0x06, 0x07, 0x27, + 0x36, 0x36, 0x37, 0x23, 0x35, 0x23, 0x15, 0x23, 0x11, 0x33, 0x15, 0x33, 0x35, 0x33, 0x01, 0xb6, + 0x24, 0x02, 0x3e, 0x33, 0x4a, 0x12, 0x22, 0x0b, 0x25, 0x85, 0x7b, 0x7b, 0x85, 0x7b, 0x6d, 0x4b, + 0x89, 0x2d, 0x2e, 0x16, 0x37, 0x19, 0xba, 0xba, 0x01, 0xd6, 0xb6, 0xb6, 0x00, 0x01, 0x00, 0x2d, + 0xff, 0x5b, 0x01, 0xc7, 0x02, 0x6b, 0x00, 0x1b, 0x00, 0x4b, 0x40, 0x2d, 0x00, 0x19, 0x01, 0x00, + 0x18, 0x01, 0x1b, 0x01, 0x15, 0x44, 0x00, 0x16, 0x01, 0x16, 0x20, 0x18, 0x30, 0x18, 0x02, 0x18, + 0x1d, 0x0b, 0x44, 0x20, 0x0a, 0x30, 0x0a, 0x02, 0x0a, 0x1c, 0x1a, 0x12, 0x11, 0x4a, 0x04, 0x1b, + 0x04, 0x1b, 0x15, 0x18, 0x08, 0x15, 0x02, 0x0b, 0x02, 0x00, 0x3f, 0x3f, 0x3f, 0x12, 0x39, 0x39, + 0x2f, 0x2f, 0xed, 0x3f, 0x01, 0x10, 0xd6, 0x5d, 0xed, 0x10, 0xc4, 0x5d, 0xd6, 0x5d, 0xfd, 0xd0, + 0xce, 0x31, 0x30, 0x5d, 0x5d, 0x25, 0x35, 0x06, 0x06, 0x23, 0x22, 0x2e, 0x02, 0x35, 0x35, 0x33, + 0x15, 0x14, 0x1e, 0x02, 0x33, 0x32, 0x36, 0x37, 0x11, 0x33, 0x11, 0x23, 0x15, 0x23, 0x11, 0x01, + 0x4c, 0x17, 0x2c, 0x14, 0x2c, 0x49, 0x35, 0x1e, 0x7b, 0x0b, 0x18, 0x24, 0x18, 0x0d, 0x27, 0x11, + 0x7b, 0x4c, 0x73, 0x66, 0x69, 0x03, 0x04, 0x14, 0x34, 0x59, 0x45, 0xbd, 0xb6, 0x26, 0x30, 0x1d, + 0x0b, 0x03, 0x04, 0x01, 0x2d, 0xfd, 0x95, 0xa5, 0x01, 0x0b, 0x00, 0x00, 0x00, 0x01, 0x00, 0x2b, + 0xff, 0x7a, 0x01, 0xb6, 0x01, 0xd6, 0x00, 0x1a, 0x00, 0x50, 0xb9, 0x00, 0x0e, 0xff, 0xc0, 0xb4, + 0x09, 0x0a, 0x00, 0x4c, 0x0d, 0xb8, 0xff, 0xc0, 0x40, 0x25, 0x09, 0x0a, 0x00, 0x4c, 0x10, 0x40, + 0x11, 0x14, 0x48, 0x10, 0x0d, 0x11, 0x09, 0x51, 0x0b, 0x0c, 0x1c, 0x01, 0x51, 0x30, 0x19, 0x01, + 0x19, 0x1b, 0x06, 0x57, 0x14, 0x11, 0x11, 0x0a, 0x0e, 0x0d, 0x06, 0x0a, 0x0a, 0x00, 0x0a, 0x00, + 0x3f, 0x3f, 0x3f, 0xc5, 0x12, 0x39, 0x2f, 0xde, 0xed, 0x01, 0x10, 0xd6, 0x5d, 0xed, 0x10, 0xc6, + 0xd6, 0xfd, 0xd0, 0xcd, 0xc5, 0x2b, 0x31, 0x30, 0x2b, 0x2b, 0x13, 0x15, 0x14, 0x1e, 0x02, 0x33, + 0x32, 0x36, 0x37, 0x35, 0x33, 0x11, 0x23, 0x15, 0x23, 0x35, 0x33, 0x35, 0x06, 0x23, 0x22, 0x2e, + 0x02, 0x35, 0x35, 0xa6, 0x10, 0x1b, 0x21, 0x11, 0x10, 0x1c, 0x0b, 0x7c, 0x62, 0x72, 0x58, 0x2a, + 0x27, 0x27, 0x45, 0x34, 0x1e, 0x01, 0xd6, 0x95, 0x13, 0x18, 0x0e, 0x05, 0x02, 0x02, 0xcf, 0xfe, + 0x2a, 0x86, 0xec, 0x34, 0x06, 0x0f, 0x27, 0x41, 0x32, 0x99, 0x00, 0x00, 0x00, 0x01, 0x00, 0x17, + 0xff, 0x57, 0x01, 0xec, 0x02, 0x6b, 0x00, 0x23, 0x00, 0x9b, 0xb9, 0x00, 0x1d, 0xff, 0xe0, 0x40, + 0x5e, 0x16, 0x17, 0x00, 0x4c, 0x1c, 0x20, 0x18, 0x1a, 0x00, 0x4c, 0x1b, 0x30, 0x18, 0x00, 0x4d, + 0x6f, 0x18, 0x8f, 0x18, 0x02, 0x18, 0x0e, 0x40, 0x09, 0x0c, 0x48, 0x0e, 0x7f, 0x0f, 0x01, 0x0f, + 0x25, 0x0a, 0x0a, 0x0b, 0x40, 0x09, 0x0c, 0x48, 0x0b, 0x25, 0x1c, 0x1b, 0x24, 0x1a, 0x19, 0x25, + 0x05, 0x05, 0x24, 0x25, 0x00, 0x00, 0x0b, 0x23, 0x1b, 0x23, 0x02, 0xf8, 0x23, 0x01, 0x23, 0x24, + 0x1d, 0xb3, 0x1e, 0x20, 0x12, 0x15, 0x48, 0x1e, 0x14, 0x24, 0x05, 0x1c, 0x19, 0x03, 0x1a, 0x1b, + 0x0e, 0x0e, 0x1b, 0x1a, 0x03, 0x1d, 0x08, 0x18, 0x08, 0x13, 0x92, 0x0a, 0x02, 0x00, 0x02, 0x00, + 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x17, 0x39, 0x2f, 0x2f, 0x2f, 0x17, 0x39, 0x01, 0x10, 0xc6, 0xd6, + 0x2b, 0xed, 0x10, 0xd0, 0x5d, 0x71, 0xc1, 0x2f, 0x11, 0x12, 0x39, 0x3d, 0x2f, 0x12, 0x39, 0x39, + 0x12, 0x39, 0x39, 0x10, 0xd0, 0x2b, 0xc1, 0x18, 0x2f, 0x10, 0xd6, 0x5d, 0xdd, 0x2b, 0xcd, 0x5d, + 0x31, 0x30, 0x2b, 0x2b, 0x2b, 0x13, 0x1e, 0x03, 0x17, 0x3e, 0x03, 0x37, 0x33, 0x16, 0x16, 0x17, + 0x33, 0x15, 0x14, 0x06, 0x07, 0x27, 0x36, 0x36, 0x37, 0x23, 0x11, 0x03, 0x23, 0x03, 0x11, 0x23, + 0x3e, 0x03, 0x37, 0xa1, 0x07, 0x12, 0x15, 0x15, 0x0b, 0x0c, 0x17, 0x15, 0x12, 0x08, 0x65, 0x0c, + 0x12, 0x04, 0x24, 0x3b, 0x3c, 0x49, 0x18, 0x24, 0x0b, 0x13, 0x43, 0x59, 0x3c, 0x71, 0x03, 0x07, + 0x08, 0x0b, 0x07, 0x02, 0x6b, 0x15, 0x42, 0x4c, 0x4e, 0x21, 0x25, 0x4f, 0x49, 0x40, 0x15, 0x84, + 0xf4, 0x7d, 0x09, 0x47, 0x92, 0x3d, 0x2f, 0x20, 0x3d, 0x1d, 0x01, 0xe1, 0xfe, 0xfa, 0x01, 0x06, + 0xfe, 0x1f, 0x4c, 0xa4, 0xa2, 0x98, 0x41, 0x00, 0x00, 0x01, 0x00, 0x18, 0xff, 0x6c, 0x01, 0xec, + 0x01, 0xd6, 0x00, 0x22, 0x00, 0x5e, 0x40, 0x32, 0x17, 0x16, 0x0e, 0x0f, 0x24, 0x0a, 0x0b, 0x24, + 0x1b, 0x1a, 0x19, 0x18, 0x05, 0x18, 0x19, 0x05, 0x1a, 0x1b, 0x05, 0x23, 0x24, 0x00, 0x22, 0xe4, + 0x1c, 0xf4, 0x1c, 0x02, 0x1c, 0x1d, 0x13, 0x23, 0x22, 0x0a, 0x1c, 0x06, 0x05, 0x18, 0x1b, 0x03, + 0x0e, 0x1a, 0x0e, 0x1a, 0x0a, 0x12, 0x17, 0x06, 0x0a, 0x0a, 0x00, 0x3f, 0x3f, 0xc4, 0x12, 0x39, + 0x39, 0x2f, 0x2f, 0x17, 0x39, 0x3f, 0x3f, 0x01, 0x10, 0xc6, 0xd6, 0xc5, 0x5d, 0xd5, 0xc5, 0x11, + 0x12, 0x17, 0x39, 0x3d, 0x2f, 0x18, 0x2f, 0x2f, 0x2f, 0x2f, 0x10, 0xd4, 0xc5, 0x10, 0xd6, 0xd5, + 0xd5, 0xc5, 0x31, 0x30, 0x13, 0x1e, 0x03, 0x17, 0x3e, 0x03, 0x37, 0x33, 0x16, 0x16, 0x17, 0x33, + 0x14, 0x06, 0x07, 0x27, 0x36, 0x36, 0x37, 0x23, 0x11, 0x03, 0x23, 0x03, 0x11, 0x23, 0x3e, 0x03, + 0x37, 0xab, 0x06, 0x0f, 0x12, 0x13, 0x09, 0x0a, 0x16, 0x14, 0x11, 0x06, 0x6e, 0x0b, 0x10, 0x05, + 0x25, 0x3c, 0x34, 0x49, 0x11, 0x23, 0x0b, 0x11, 0x45, 0x59, 0x3a, 0x71, 0x03, 0x07, 0x08, 0x0b, + 0x07, 0x01, 0xd6, 0x19, 0x48, 0x53, 0x58, 0x28, 0x28, 0x59, 0x53, 0x48, 0x18, 0x60, 0xae, 0x5b, + 0x4c, 0x88, 0x2d, 0x2e, 0x16, 0x37, 0x19, 0x01, 0x4c, 0xfe, 0xf3, 0x01, 0x0d, 0xfe, 0xb4, 0x3a, + 0x7c, 0x7b, 0x74, 0x31, 0x00, 0x01, 0x00, 0x36, 0x00, 0x00, 0x01, 0xbf, 0x02, 0x6b, 0x00, 0x0b, + 0x00, 0x2d, 0x40, 0x17, 0x0b, 0x09, 0x07, 0x08, 0x51, 0x02, 0x03, 0x04, 0x30, 0x01, 0x01, 0x01, + 0x0c, 0x08, 0x03, 0x48, 0x05, 0x04, 0x09, 0x02, 0x48, 0x00, 0x08, 0x00, 0x3f, 0xfd, 0xc0, 0x3f, + 0xfd, 0xc0, 0x01, 0x10, 0xd6, 0x5d, 0xd0, 0xd5, 0xc0, 0xfd, 0xc5, 0xd0, 0xc5, 0x31, 0x30, 0x33, + 0x35, 0x33, 0x11, 0x23, 0x35, 0x21, 0x15, 0x23, 0x11, 0x33, 0x15, 0x36, 0x87, 0x87, 0x01, 0x89, + 0x86, 0x86, 0x66, 0x01, 0x9f, 0x66, 0x66, 0xfe, 0x61, 0x66, 0x00, 0x00, 0xff, 0xff, 0x00, 0x09, + 0x00, 0x00, 0x01, 0xeb, 0x03, 0x39, 0x02, 0x26, 0x00, 0x24, 0x00, 0x00, 0x01, 0x07, 0x03, 0x90, + 0x00, 0x00, 0x00, 0x8b, 0x00, 0x10, 0x40, 0x0b, 0x02, 0x00, 0x1c, 0x24, 0x04, 0x0b, 0x50, 0x02, + 0x07, 0x17, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0x00, 0xff, 0xff, 0x00, 0x2c, 0xff, 0xf5, 0x01, 0xb9, + 0x02, 0xae, 0x02, 0x26, 0x00, 0x44, 0x00, 0x00, 0x01, 0x06, 0x03, 0x90, 0x00, 0x00, 0x00, 0x10, + 0x40, 0x0b, 0x02, 0x08, 0x34, 0x3c, 0x1c, 0x13, 0x50, 0x02, 0x0f, 0x2f, 0x4f, 0x2b, 0x2b, 0x34, + 0xff, 0xff, 0x00, 0x09, 0x00, 0x00, 0x01, 0xeb, 0x03, 0x2c, 0x02, 0x26, 0x00, 0x24, 0x00, 0x00, + 0x01, 0x07, 0x00, 0x83, 0x00, 0x00, 0x00, 0x8b, 0x00, 0x17, 0x40, 0x10, 0x03, 0x02, 0x01, 0x19, + 0x2b, 0x04, 0x0b, 0x50, 0x03, 0x07, 0x23, 0x4f, 0x02, 0x07, 0x17, 0x4f, 0x2b, 0x2b, 0x2b, 0x34, + 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x2c, 0xff, 0xf5, 0x01, 0xb9, 0x02, 0xa1, 0x02, 0x26, + 0x00, 0x44, 0x00, 0x00, 0x01, 0x06, 0x00, 0x83, 0x00, 0x00, 0x00, 0x17, 0x40, 0x10, 0x03, 0x02, + 0x09, 0x31, 0x43, 0x1c, 0x13, 0x50, 0x03, 0x0f, 0x3b, 0x4f, 0x02, 0x0f, 0x2f, 0x4f, 0x2b, 0x2b, + 0x2b, 0x34, 0x34, 0x00, 0xff, 0xff, 0x00, 0x09, 0x00, 0x00, 0x01, 0xeb, 0x02, 0x6b, 0x02, 0x06, + 0x00, 0xa1, 0x00, 0x00, 0xff, 0xff, 0x00, 0x17, 0xff, 0xf5, 0x01, 0xe8, 0x01, 0xe2, 0x02, 0x06, + 0x00, 0xc1, 0x00, 0x00, 0xff, 0xff, 0x00, 0x3f, 0x00, 0x00, 0x01, 0xcc, 0x03, 0x39, 0x02, 0x26, + 0x00, 0x28, 0x00, 0x00, 0x01, 0x07, 0x03, 0x90, 0x00, 0x1b, 0x00, 0x8b, 0x00, 0x10, 0x40, 0x0b, + 0x01, 0x10, 0x11, 0x19, 0x00, 0x0a, 0x50, 0x01, 0x01, 0x0c, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x1f, 0xff, 0xf5, 0x01, 0xd1, 0x02, 0xae, 0x02, 0x26, 0x00, 0x48, 0x00, 0x00, + 0x01, 0x06, 0x03, 0x90, 0x09, 0x00, 0x00, 0x10, 0x40, 0x0b, 0x02, 0x0b, 0x2b, 0x33, 0x00, 0x07, + 0x50, 0x02, 0x04, 0x26, 0x4f, 0x2b, 0x2b, 0x34, 0xff, 0xff, 0x00, 0x19, 0xff, 0xf3, 0x01, 0xd5, + 0x02, 0x79, 0x02, 0x06, 0x01, 0xe8, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1f, 0xff, 0xf5, 0x01, 0xd1, + 0x01, 0xe2, 0x00, 0x1a, 0x00, 0x23, 0x00, 0x4d, 0x40, 0x30, 0x23, 0x0c, 0x53, 0x00, 0x00, 0x20, + 0x00, 0x40, 0x00, 0x03, 0x00, 0x25, 0x1b, 0x53, 0x13, 0x70, 0x08, 0x01, 0x08, 0x24, 0x12, 0x4f, + 0x0f, 0x01, 0x0f, 0x57, 0x16, 0x4f, 0x23, 0x5f, 0x23, 0x6f, 0x23, 0x03, 0x23, 0x55, 0x0c, 0x0c, + 0x05, 0x16, 0x0b, 0x3f, 0x20, 0x01, 0x20, 0x57, 0x05, 0x07, 0x00, 0x3f, 0xed, 0x5d, 0x3f, 0x12, + 0x39, 0x2f, 0xed, 0x5d, 0x10, 0xfd, 0x5d, 0xc6, 0x01, 0x10, 0xd6, 0x5d, 0xc4, 0xed, 0x10, 0xd6, + 0x5d, 0xfd, 0xc0, 0x31, 0x30, 0x25, 0x14, 0x0e, 0x02, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x37, + 0x21, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x27, 0x36, 0x36, 0x33, 0x32, 0x1e, 0x02, 0x05, 0x14, + 0x1e, 0x02, 0x33, 0x32, 0x36, 0x37, 0x01, 0xd1, 0x26, 0x3d, 0x50, 0x2a, 0x69, 0x6c, 0x01, 0x02, + 0x01, 0x30, 0x4b, 0x3c, 0x25, 0x44, 0x16, 0x12, 0x20, 0x48, 0x2d, 0x3c, 0x5f, 0x43, 0x24, 0xfe, + 0xc5, 0x0a, 0x16, 0x23, 0x19, 0x2f, 0x2d, 0x04, 0xf0, 0x3e, 0x5e, 0x3f, 0x20, 0x7b, 0x76, 0x0c, + 0x19, 0x0a, 0x2e, 0x34, 0x0f, 0x08, 0x68, 0x0c, 0x0e, 0x1f, 0x3d, 0x5a, 0x6d, 0x12, 0x24, 0x1b, + 0x11, 0x3b, 0x27, 0x00, 0xff, 0xff, 0x00, 0x19, 0xff, 0xf3, 0x01, 0xd5, 0x03, 0x2c, 0x02, 0x26, + 0x01, 0xe8, 0x00, 0x00, 0x01, 0x07, 0x00, 0x83, 0xff, 0xef, 0x00, 0x8b, 0x00, 0x1a, 0xb1, 0x03, + 0x02, 0xb8, 0xff, 0xf4, 0x40, 0x0d, 0x2a, 0x3c, 0x1a, 0x12, 0x50, 0x03, 0x0d, 0x34, 0x4f, 0x02, + 0x0d, 0x28, 0x4f, 0x2b, 0x2b, 0x2b, 0x34, 0x34, 0xff, 0xff, 0x00, 0x1f, 0xff, 0xf5, 0x01, 0xd1, + 0x02, 0xa1, 0x02, 0x26, 0x03, 0x69, 0x00, 0x00, 0x01, 0x06, 0x00, 0x83, 0xf8, 0x00, 0x00, 0x1a, + 0xb1, 0x03, 0x02, 0xb8, 0xff, 0xfc, 0x40, 0x0d, 0x26, 0x38, 0x07, 0x00, 0x50, 0x03, 0x15, 0x30, + 0x4f, 0x02, 0x15, 0x24, 0x4f, 0x2b, 0x2b, 0x2b, 0x34, 0x34, 0x00, 0x00, 0xff, 0xff, 0x00, 0x09, + 0x00, 0x00, 0x01, 0xeb, 0x03, 0x2c, 0x02, 0x26, 0x02, 0xc9, 0x00, 0x00, 0x01, 0x07, 0x00, 0x83, + 0x00, 0x00, 0x00, 0x8b, 0x00, 0x17, 0x40, 0x10, 0x02, 0x01, 0x01, 0x30, 0x42, 0x25, 0x0e, 0x50, + 0x02, 0x00, 0x3a, 0x4f, 0x01, 0x00, 0x2e, 0x4f, 0x2b, 0x2b, 0x2b, 0x34, 0x34, 0x00, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x0e, 0x00, 0x00, 0x01, 0xe6, 0x02, 0xa1, 0x02, 0x26, 0x02, 0xe9, 0x00, 0x00, + 0x01, 0x06, 0x00, 0x83, 0x00, 0x00, 0x00, 0x17, 0x40, 0x10, 0x02, 0x01, 0x01, 0x2e, 0x40, 0x23, + 0x06, 0x50, 0x02, 0x05, 0x38, 0x4f, 0x01, 0x05, 0x2c, 0x4f, 0x2b, 0x2b, 0x2b, 0x34, 0x34, 0x00, + 0xff, 0xff, 0x00, 0x17, 0xff, 0xf3, 0x01, 0xdf, 0x03, 0x2c, 0x02, 0x26, 0x02, 0xca, 0x00, 0x00, + 0x01, 0x07, 0x00, 0x83, 0x00, 0x00, 0x00, 0x8b, 0x00, 0x17, 0x40, 0x10, 0x02, 0x01, 0x00, 0x35, + 0x47, 0x23, 0x1a, 0x50, 0x02, 0x0f, 0x3f, 0x4f, 0x01, 0x0f, 0x33, 0x4f, 0x2b, 0x2b, 0x2b, 0x34, + 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x33, 0xff, 0xf3, 0x01, 0xb3, 0x02, 0xa1, 0x02, 0x26, + 0x02, 0xea, 0x00, 0x00, 0x01, 0x06, 0x00, 0x83, 0xf8, 0x00, 0x00, 0x17, 0x40, 0x10, 0x02, 0x01, + 0x00, 0x33, 0x45, 0x16, 0x0d, 0x50, 0x02, 0x02, 0x3d, 0x4f, 0x01, 0x02, 0x31, 0x4f, 0x2b, 0x2b, + 0x2b, 0x34, 0x34, 0x00, 0xff, 0xff, 0x00, 0x1a, 0xff, 0xf3, 0x01, 0xe1, 0x02, 0x6b, 0x02, 0x06, + 0x02, 0x0f, 0x00, 0x00, 0xff, 0xff, 0x00, 0x1f, 0xff, 0x5b, 0x01, 0xba, 0x01, 0xd6, 0x02, 0x06, + 0x02, 0xa3, 0x00, 0x00, 0xff, 0xff, 0x00, 0x2e, 0x00, 0x00, 0x01, 0xc6, 0x03, 0x12, 0x02, 0x26, + 0x02, 0xcb, 0x00, 0x00, 0x01, 0x07, 0x00, 0x8a, 0x00, 0x00, 0x00, 0x8b, 0x00, 0x10, 0x40, 0x0b, + 0x01, 0x02, 0x10, 0x11, 0x00, 0x09, 0x50, 0x01, 0x01, 0x12, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x3f, 0x00, 0x00, 0x01, 0xb6, 0x02, 0x87, 0x02, 0x26, 0x02, 0xeb, 0x00, 0x00, + 0x01, 0x06, 0x00, 0x8a, 0x00, 0x00, 0x00, 0x10, 0x40, 0x0b, 0x01, 0x01, 0x10, 0x11, 0x00, 0x07, + 0x50, 0x01, 0x01, 0x12, 0x4f, 0x2b, 0x2b, 0x34, 0xff, 0xff, 0x00, 0x2e, 0x00, 0x00, 0x01, 0xc6, + 0x03, 0x2c, 0x02, 0x26, 0x02, 0xcb, 0x00, 0x00, 0x01, 0x07, 0x00, 0x83, 0x00, 0x00, 0x00, 0x8b, + 0x00, 0x17, 0x40, 0x10, 0x02, 0x01, 0x01, 0x12, 0x24, 0x00, 0x09, 0x50, 0x02, 0x01, 0x1c, 0x4f, + 0x01, 0x01, 0x10, 0x4f, 0x2b, 0x2b, 0x2b, 0x34, 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x3f, + 0x00, 0x00, 0x01, 0xb6, 0x02, 0xa1, 0x02, 0x26, 0x02, 0xeb, 0x00, 0x00, 0x01, 0x06, 0x00, 0x83, + 0x00, 0x00, 0x00, 0x17, 0x40, 0x10, 0x02, 0x01, 0x01, 0x12, 0x24, 0x00, 0x07, 0x50, 0x02, 0x01, + 0x1c, 0x4f, 0x01, 0x01, 0x10, 0x4f, 0x2b, 0x2b, 0x2b, 0x34, 0x34, 0x00, 0xff, 0xff, 0x00, 0x1b, + 0xff, 0xf3, 0x01, 0xd9, 0x03, 0x2c, 0x02, 0x26, 0x00, 0x32, 0x00, 0x00, 0x01, 0x07, 0x00, 0x83, + 0x00, 0x00, 0x00, 0x8b, 0x00, 0x17, 0x40, 0x10, 0x03, 0x02, 0x01, 0x22, 0x34, 0x14, 0x19, 0x50, + 0x03, 0x16, 0x2c, 0x4f, 0x02, 0x16, 0x20, 0x4f, 0x2b, 0x2b, 0x2b, 0x34, 0x34, 0x00, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x1d, 0xff, 0xf3, 0x01, 0xd8, 0x02, 0xa1, 0x02, 0x26, 0x00, 0x52, 0x00, 0x00, + 0x01, 0x06, 0x00, 0x83, 0x00, 0x00, 0x00, 0x17, 0x40, 0x10, 0x03, 0x02, 0x01, 0x22, 0x34, 0x09, + 0x00, 0x50, 0x03, 0x0e, 0x2c, 0x4f, 0x02, 0x0e, 0x20, 0x4f, 0x2b, 0x2b, 0x2b, 0x34, 0x34, 0x00, + 0x00, 0x03, 0x00, 0x1b, 0xff, 0xf3, 0x01, 0xd9, 0x02, 0x79, 0x00, 0x0b, 0x00, 0x16, 0x00, 0x21, + 0x00, 0x35, 0x40, 0x1e, 0x1c, 0x12, 0x46, 0x00, 0x06, 0x40, 0x06, 0x60, 0x06, 0x03, 0x06, 0x23, + 0x1d, 0x11, 0x46, 0x00, 0x22, 0x12, 0x48, 0x1c, 0x1c, 0x03, 0x17, 0x4a, 0x09, 0x09, 0x0c, 0x4a, + 0x03, 0x03, 0x00, 0x3f, 0xed, 0x3f, 0xed, 0x12, 0x39, 0x2f, 0xed, 0x01, 0x10, 0xd6, 0xfd, 0xc0, + 0x10, 0xd6, 0x5d, 0xfd, 0xc5, 0x31, 0x30, 0x13, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, + 0x23, 0x22, 0x26, 0x13, 0x22, 0x0e, 0x02, 0x07, 0x33, 0x2e, 0x03, 0x03, 0x32, 0x3e, 0x02, 0x37, + 0x23, 0x1e, 0x03, 0x1b, 0x76, 0x69, 0x6d, 0x72, 0x74, 0x6a, 0x6d, 0x73, 0xdf, 0x1b, 0x24, 0x16, + 0x0b, 0x01, 0xc2, 0x02, 0x0a, 0x16, 0x24, 0x1b, 0x1b, 0x23, 0x16, 0x0a, 0x02, 0xc1, 0x01, 0x0b, + 0x16, 0x24, 0x01, 0x36, 0xa0, 0xa3, 0xa3, 0xa0, 0xa0, 0xa3, 0xa3, 0x01, 0x78, 0x1a, 0x2d, 0x3d, + 0x24, 0x24, 0x3e, 0x2d, 0x19, 0xfe, 0x50, 0x19, 0x2c, 0x3d, 0x24, 0x24, 0x3d, 0x2c, 0x19, 0x00, + 0x00, 0x03, 0x00, 0x1d, 0xff, 0xf3, 0x01, 0xd8, 0x01, 0xe2, 0x00, 0x13, 0x00, 0x1a, 0x00, 0x21, + 0x00, 0x41, 0x40, 0x28, 0x17, 0x1f, 0x53, 0x00, 0x00, 0x20, 0x00, 0x40, 0x00, 0x60, 0x00, 0x80, + 0x00, 0x05, 0x00, 0x23, 0x18, 0x1e, 0x53, 0x80, 0x0a, 0x01, 0x0a, 0x22, 0x1f, 0x73, 0x17, 0x17, + 0x05, 0x4f, 0x1b, 0x01, 0x1b, 0x57, 0x0f, 0x0b, 0x14, 0x57, 0x05, 0x07, 0x00, 0x3f, 0xed, 0x3f, + 0xed, 0x5d, 0x12, 0x39, 0x2f, 0xed, 0x01, 0x10, 0xd6, 0x5d, 0xfd, 0xc5, 0x10, 0xd6, 0x5d, 0xfd, + 0xc0, 0x31, 0x30, 0x25, 0x14, 0x0e, 0x02, 0x23, 0x22, 0x2e, 0x02, 0x35, 0x34, 0x3e, 0x02, 0x33, + 0x32, 0x1e, 0x02, 0x07, 0x32, 0x36, 0x37, 0x23, 0x16, 0x16, 0x13, 0x22, 0x06, 0x07, 0x33, 0x26, + 0x26, 0x01, 0xd8, 0x20, 0x3a, 0x51, 0x32, 0x32, 0x51, 0x3b, 0x20, 0x21, 0x3b, 0x52, 0x30, 0x31, + 0x51, 0x3b, 0x20, 0xdf, 0x28, 0x2f, 0x08, 0xbd, 0x07, 0x2d, 0x2c, 0x28, 0x2f, 0x08, 0xbc, 0x07, + 0x2d, 0xec, 0x38, 0x5b, 0x42, 0x24, 0x24, 0x42, 0x5b, 0x38, 0x37, 0x5b, 0x41, 0x23, 0x23, 0x41, + 0x5b, 0xc5, 0x36, 0x30, 0x30, 0x36, 0x01, 0x19, 0x35, 0x2e, 0x2e, 0x35, 0xff, 0xff, 0x00, 0x1b, + 0xff, 0xf3, 0x01, 0xd9, 0x03, 0x2c, 0x02, 0x26, 0x03, 0x78, 0x00, 0x00, 0x01, 0x07, 0x00, 0x83, + 0x00, 0x00, 0x00, 0x8b, 0x00, 0x17, 0x40, 0x10, 0x04, 0x03, 0x01, 0x24, 0x36, 0x00, 0x05, 0x50, + 0x04, 0x02, 0x2e, 0x4f, 0x03, 0x02, 0x22, 0x4f, 0x2b, 0x2b, 0x2b, 0x34, 0x34, 0x00, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x1d, 0xff, 0xf3, 0x01, 0xd8, 0x02, 0xa1, 0x02, 0x26, 0x03, 0x79, 0x00, 0x00, + 0x01, 0x06, 0x00, 0x83, 0x00, 0x00, 0x00, 0x17, 0x40, 0x10, 0x04, 0x03, 0x01, 0x24, 0x36, 0x09, + 0x00, 0x50, 0x04, 0x0e, 0x2e, 0x4f, 0x03, 0x0e, 0x22, 0x4f, 0x2b, 0x2b, 0x2b, 0x34, 0x34, 0x00, + 0xff, 0xff, 0x00, 0x2a, 0xff, 0xf3, 0x01, 0xe4, 0x03, 0x2c, 0x02, 0x26, 0x02, 0xe0, 0x00, 0x00, + 0x01, 0x07, 0x00, 0x83, 0xff, 0xf8, 0x00, 0x8b, 0x00, 0x1a, 0xb1, 0x02, 0x01, 0xb8, 0xff, 0xed, + 0x40, 0x0d, 0x27, 0x39, 0x03, 0x1f, 0x50, 0x02, 0x1a, 0x31, 0x4f, 0x01, 0x1a, 0x25, 0x4f, 0x2b, + 0x2b, 0x2b, 0x34, 0x34, 0xff, 0xff, 0x00, 0x18, 0xff, 0xf5, 0x01, 0xcb, 0x02, 0xa1, 0x02, 0x26, + 0x03, 0x00, 0x00, 0x00, 0x01, 0x06, 0x00, 0x83, 0xf8, 0x00, 0x00, 0x17, 0x40, 0x10, 0x02, 0x01, + 0x02, 0x25, 0x37, 0x08, 0x00, 0x50, 0x02, 0x1d, 0x2f, 0x4f, 0x01, 0x1d, 0x23, 0x4f, 0x2b, 0x2b, + 0x2b, 0x34, 0x34, 0x00, 0xff, 0xff, 0x00, 0x05, 0xff, 0xf3, 0x01, 0xee, 0x03, 0x12, 0x02, 0x26, + 0x02, 0xd6, 0x00, 0x00, 0x01, 0x07, 0x00, 0x8a, 0x00, 0x00, 0x00, 0x8b, 0x00, 0x10, 0x40, 0x0b, + 0x01, 0x02, 0x21, 0x22, 0x17, 0x00, 0x50, 0x01, 0x00, 0x23, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x14, 0xff, 0x58, 0x01, 0xd8, 0x02, 0x87, 0x02, 0x26, 0x00, 0x5c, 0x00, 0x00, + 0x01, 0x06, 0x00, 0x8a, 0x00, 0x00, 0x00, 0x10, 0x40, 0x0b, 0x01, 0x06, 0x23, 0x24, 0x0d, 0x00, + 0x50, 0x01, 0x00, 0x25, 0x4f, 0x2b, 0x2b, 0x34, 0xff, 0xff, 0x00, 0x05, 0xff, 0xf3, 0x01, 0xee, + 0x03, 0x2c, 0x02, 0x26, 0x02, 0xd6, 0x00, 0x00, 0x01, 0x07, 0x00, 0x83, 0x00, 0x00, 0x00, 0x8b, + 0x00, 0x17, 0x40, 0x10, 0x02, 0x01, 0x02, 0x23, 0x35, 0x17, 0x00, 0x50, 0x02, 0x00, 0x2d, 0x4f, + 0x01, 0x00, 0x21, 0x4f, 0x2b, 0x2b, 0x2b, 0x34, 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x14, + 0xff, 0x58, 0x01, 0xd8, 0x02, 0xa1, 0x02, 0x26, 0x00, 0x5c, 0x00, 0x00, 0x01, 0x06, 0x00, 0x83, + 0x09, 0x00, 0x00, 0x17, 0x40, 0x10, 0x02, 0x01, 0x0e, 0x25, 0x37, 0x0d, 0x00, 0x50, 0x02, 0x00, + 0x2f, 0x4f, 0x01, 0x00, 0x23, 0x4f, 0x2b, 0x2b, 0x2b, 0x34, 0x34, 0x00, 0xff, 0xff, 0x00, 0x05, + 0xff, 0xf3, 0x01, 0xee, 0x03, 0x3f, 0x02, 0x26, 0x02, 0xd6, 0x00, 0x00, 0x01, 0x07, 0x01, 0x65, + 0x00, 0x24, 0x00, 0x8b, 0x00, 0x17, 0x40, 0x10, 0x02, 0x01, 0x27, 0x23, 0x25, 0x17, 0x00, 0x50, + 0x02, 0x00, 0x26, 0x4f, 0x01, 0x00, 0x22, 0x4f, 0x2b, 0x2b, 0x2b, 0x34, 0x34, 0x00, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x14, 0xff, 0x58, 0x01, 0xda, 0x02, 0xb4, 0x02, 0x26, 0x00, 0x5c, 0x00, 0x00, + 0x01, 0x06, 0x01, 0x65, 0x24, 0x00, 0x00, 0x17, 0x40, 0x10, 0x02, 0x01, 0x2a, 0x25, 0x27, 0x0d, + 0x00, 0x50, 0x02, 0x00, 0x28, 0x4f, 0x01, 0x00, 0x24, 0x4f, 0x2b, 0x2b, 0x2b, 0x34, 0x34, 0x00, + 0xff, 0xff, 0x00, 0x2d, 0x00, 0x00, 0x01, 0xc7, 0x03, 0x2c, 0x02, 0x26, 0x02, 0xda, 0x00, 0x00, + 0x01, 0x07, 0x00, 0x83, 0x00, 0x00, 0x00, 0x8b, 0x00, 0x17, 0x40, 0x10, 0x02, 0x01, 0x01, 0x1a, + 0x2c, 0x14, 0x0a, 0x50, 0x02, 0x09, 0x24, 0x4f, 0x01, 0x09, 0x18, 0x4f, 0x2b, 0x2b, 0x2b, 0x34, + 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x2b, 0x00, 0x00, 0x01, 0xb6, 0x02, 0xa1, 0x02, 0x26, + 0x02, 0xfa, 0x00, 0x00, 0x01, 0x06, 0x00, 0x83, 0x00, 0x00, 0x00, 0x17, 0x40, 0x10, 0x02, 0x01, + 0x0b, 0x19, 0x2b, 0x14, 0x0b, 0x50, 0x02, 0x00, 0x23, 0x4f, 0x01, 0x00, 0x17, 0x4f, 0x2b, 0x2b, + 0x2b, 0x34, 0x34, 0x00, 0x00, 0x01, 0x00, 0x24, 0xff, 0x7a, 0x01, 0xe4, 0x02, 0x6b, 0x00, 0x0b, + 0x00, 0x4a, 0x40, 0x2f, 0x08, 0x40, 0x1e, 0x00, 0x4d, 0x20, 0x08, 0x30, 0x08, 0x40, 0x08, 0x03, + 0x08, 0xb3, 0x5f, 0x06, 0x9f, 0x06, 0xdf, 0x06, 0x03, 0x06, 0x0d, 0x3f, 0x03, 0x01, 0x03, 0x01, + 0x0b, 0x05, 0x51, 0x00, 0x80, 0x0b, 0x01, 0x0b, 0x0c, 0x00, 0x05, 0x72, 0x07, 0x09, 0x08, 0x04, + 0x72, 0x01, 0x02, 0x00, 0x3f, 0xed, 0x3f, 0xc5, 0xed, 0x32, 0x01, 0x10, 0xd6, 0x5d, 0xd5, 0xed, + 0x10, 0xd6, 0xc5, 0x5d, 0x10, 0xd6, 0x5d, 0xed, 0x5d, 0x2b, 0x31, 0x30, 0x37, 0x11, 0x21, 0x15, + 0x23, 0x11, 0x33, 0x15, 0x23, 0x35, 0x23, 0x35, 0x7d, 0x01, 0x67, 0xec, 0x87, 0x72, 0xe9, 0x66, + 0x02, 0x05, 0x66, 0xfe, 0x61, 0xec, 0x86, 0x66, 0x00, 0x01, 0x00, 0x59, 0xff, 0x7a, 0x01, 0xbf, + 0x01, 0xd6, 0x00, 0x09, 0x00, 0x2d, 0x40, 0x19, 0x07, 0x08, 0x51, 0x05, 0x0a, 0x2f, 0x01, 0x3f, + 0x01, 0x4f, 0x01, 0x03, 0x01, 0x03, 0x04, 0x0a, 0x07, 0x48, 0x05, 0x0a, 0x02, 0x00, 0x48, 0x04, + 0x06, 0x00, 0x3f, 0xed, 0xc6, 0x3f, 0xed, 0x01, 0x10, 0xd6, 0xd5, 0xc5, 0x5d, 0x10, 0xd6, 0xfd, + 0xc5, 0x31, 0x30, 0x25, 0x15, 0x23, 0x35, 0x23, 0x11, 0x21, 0x15, 0x23, 0x11, 0x01, 0x2d, 0x72, + 0x62, 0x01, 0x66, 0xea, 0x66, 0xec, 0x86, 0x01, 0xd6, 0x66, 0xfe, 0xf6, 0xff, 0xff, 0x00, 0x22, + 0xff, 0xf8, 0x01, 0xcf, 0x03, 0x2c, 0x02, 0x26, 0x02, 0xde, 0x00, 0x00, 0x01, 0x07, 0x00, 0x83, + 0x00, 0x00, 0x00, 0x8b, 0x00, 0x17, 0x40, 0x10, 0x04, 0x03, 0x03, 0x20, 0x32, 0x08, 0x1a, 0x50, + 0x04, 0x09, 0x2a, 0x4f, 0x03, 0x09, 0x1e, 0x4f, 0x2b, 0x2b, 0x2b, 0x34, 0x34, 0x00, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x22, 0xff, 0xf6, 0x01, 0xcf, 0x02, 0xa1, 0x02, 0x26, 0x02, 0xfe, 0x00, 0x00, + 0x01, 0x06, 0x00, 0x83, 0x00, 0x00, 0x00, 0x17, 0x40, 0x10, 0x04, 0x03, 0x03, 0x26, 0x38, 0x10, + 0x14, 0x50, 0x04, 0x11, 0x30, 0x4f, 0x03, 0x11, 0x24, 0x4f, 0x2b, 0x2b, 0x2b, 0x34, 0x34, 0x00, + 0x00, 0x04, 0x00, 0x12, 0x00, 0x00, 0x01, 0xeb, 0x02, 0x79, 0x00, 0x09, 0x00, 0x0d, 0x00, 0x19, + 0x00, 0x25, 0x00, 0xca, 0x40, 0x36, 0x0f, 0x1a, 0x1f, 0x1a, 0x02, 0x13, 0x0f, 0x1a, 0x1f, 0x1a, + 0x02, 0x3f, 0x1a, 0x01, 0x7f, 0x1a, 0x8f, 0x1a, 0x9f, 0x1a, 0x03, 0x1a, 0x7c, 0x00, 0x14, 0x10, + 0x14, 0x20, 0x14, 0x40, 0x14, 0x60, 0x14, 0x05, 0x19, 0x14, 0x27, 0x00, 0x20, 0x10, 0x20, 0x02, + 0x39, 0x30, 0x20, 0x01, 0x70, 0x20, 0x80, 0x20, 0x90, 0x20, 0x03, 0x20, 0xb8, 0xff, 0xc0, 0x40, + 0x5b, 0x13, 0x16, 0x48, 0x20, 0x7c, 0x0e, 0x08, 0x50, 0x0b, 0x60, 0x0b, 0x70, 0x0b, 0x03, 0x00, + 0x0b, 0x10, 0x0b, 0x90, 0x0b, 0xa0, 0x0b, 0xb0, 0x0b, 0x05, 0x0b, 0x0a, 0x2f, 0x08, 0x4f, 0x08, + 0x02, 0x90, 0x08, 0x01, 0x6f, 0x08, 0x7f, 0x08, 0x8f, 0x08, 0x03, 0x08, 0x8f, 0x8f, 0x07, 0x01, + 0x07, 0x01, 0x8f, 0x40, 0x03, 0x60, 0x03, 0x80, 0x03, 0x90, 0x03, 0x04, 0x03, 0x26, 0x23, 0x80, + 0x2f, 0x17, 0x5f, 0x17, 0x02, 0x17, 0xa1, 0x1d, 0x80, 0x11, 0x03, 0x0c, 0x55, 0x10, 0x0b, 0x01, + 0x0b, 0x8c, 0x01, 0x06, 0x07, 0x02, 0x05, 0x02, 0x02, 0x08, 0x00, 0x08, 0x00, 0x3f, 0x3f, 0x3f, + 0x3f, 0x39, 0x39, 0x3f, 0x5d, 0xed, 0x3f, 0xed, 0x3f, 0x5d, 0xed, 0x01, 0x10, 0xd6, 0x71, 0xfd, + 0xd4, 0x5d, 0xfd, 0x5d, 0x5d, 0x71, 0xde, 0xc5, 0x5d, 0x71, 0x10, 0xde, 0xed, 0x2b, 0x71, 0x72, + 0x5e, 0x5d, 0x10, 0xd6, 0x5e, 0x5d, 0xed, 0x5d, 0x71, 0x72, 0x31, 0x30, 0x5e, 0x5d, 0x33, 0x03, + 0x11, 0x23, 0x11, 0x33, 0x13, 0x11, 0x33, 0x11, 0x37, 0x33, 0x15, 0x23, 0x11, 0x34, 0x36, 0x33, + 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x37, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, + 0x16, 0x33, 0x32, 0x36, 0xc7, 0x63, 0x52, 0x42, 0x63, 0x52, 0x1b, 0xc7, 0xc7, 0x30, 0x33, 0x33, + 0x31, 0x31, 0x33, 0x33, 0x30, 0x80, 0x12, 0x0b, 0x0c, 0x10, 0x10, 0x0c, 0x0b, 0x12, 0x01, 0x65, + 0xfe, 0x9b, 0x02, 0x6b, 0xfe, 0xb9, 0x01, 0x47, 0xfd, 0x95, 0xf0, 0x62, 0x01, 0x50, 0x4c, 0x4f, + 0x4f, 0x4c, 0x4c, 0x50, 0x50, 0x4c, 0x30, 0x25, 0x25, 0x30, 0x31, 0x25, 0x25, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0xdd, 0x01, 0xf4, 0x01, 0x39, 0x00, 0x03, 0x00, 0x10, 0xb5, 0x02, + 0x03, 0x04, 0x02, 0x01, 0xa1, 0x00, 0x3f, 0xc5, 0x01, 0x10, 0xd0, 0xc5, 0x31, 0x30, 0x11, 0x21, + 0x15, 0x21, 0x01, 0xf4, 0xfe, 0x0c, 0x01, 0x39, 0x5c, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x15, + 0xff, 0xf3, 0x01, 0xe7, 0x02, 0x79, 0x00, 0x35, 0x00, 0x73, 0xb9, 0x00, 0x23, 0xff, 0xc0, 0x40, + 0x40, 0x0d, 0x12, 0x00, 0x4c, 0x08, 0x40, 0x12, 0x14, 0x00, 0x4c, 0x08, 0x40, 0x0f, 0x10, 0x00, + 0x4c, 0x00, 0x46, 0x12, 0x13, 0x1a, 0x5f, 0x24, 0x01, 0x24, 0x37, 0x2f, 0x1b, 0x46, 0x2d, 0x09, + 0x36, 0x23, 0x40, 0x20, 0x01, 0x20, 0x4a, 0x29, 0x12, 0x00, 0x73, 0x33, 0x15, 0x33, 0x30, 0x18, + 0x73, 0x1b, 0x2d, 0x1b, 0x33, 0x1b, 0x33, 0x1b, 0x0c, 0x24, 0x29, 0x09, 0x08, 0x05, 0x4a, 0x0c, + 0x03, 0x00, 0x3f, 0xfd, 0xc6, 0x3f, 0xc5, 0x12, 0x39, 0x39, 0x2f, 0x2f, 0x11, 0x33, 0x10, 0xed, + 0x32, 0x11, 0x33, 0x10, 0xed, 0x32, 0x10, 0xfd, 0x5d, 0xc6, 0x01, 0x10, 0xc4, 0xd6, 0xed, 0xcd, + 0x10, 0xd6, 0x5d, 0xc6, 0xd4, 0xd5, 0xed, 0x31, 0x30, 0x00, 0x2b, 0x2b, 0x2b, 0x01, 0x36, 0x35, + 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x27, 0x36, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x15, + 0x33, 0x15, 0x23, 0x06, 0x06, 0x07, 0x33, 0x15, 0x21, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, + 0x37, 0x17, 0x0e, 0x03, 0x23, 0x22, 0x26, 0x35, 0x35, 0x23, 0x35, 0x33, 0x36, 0x36, 0x37, 0x23, + 0x35, 0x01, 0x3c, 0x05, 0x37, 0x25, 0x23, 0x46, 0x14, 0x24, 0x1b, 0x57, 0x39, 0x61, 0x67, 0x01, + 0x31, 0x68, 0x19, 0x3c, 0x1b, 0xd8, 0xfe, 0xc9, 0x01, 0x39, 0x29, 0x25, 0x54, 0x20, 0x22, 0x0b, + 0x21, 0x2d, 0x3a, 0x25, 0x72, 0x6a, 0x23, 0x4d, 0x16, 0x36, 0x1c, 0xb5, 0x01, 0xb1, 0x0d, 0x0c, + 0x28, 0x20, 0x15, 0x0d, 0x5f, 0x10, 0x1a, 0x62, 0x58, 0x05, 0x05, 0x04, 0x59, 0x15, 0x22, 0x11, + 0x59, 0x03, 0x09, 0x2c, 0x25, 0x14, 0x13, 0x5f, 0x07, 0x11, 0x0e, 0x09, 0x60, 0x57, 0x0d, 0x59, + 0x17, 0x21, 0x10, 0x59, 0x00, 0x01, 0x00, 0x19, 0x00, 0x00, 0x01, 0xdb, 0x02, 0x6b, 0x00, 0x17, + 0x00, 0x7a, 0xb9, 0x00, 0x0c, 0xff, 0xd0, 0x40, 0x09, 0x0e, 0x00, 0x4d, 0x03, 0x20, 0x0e, 0x00, + 0x4d, 0x0c, 0xb8, 0xff, 0xe0, 0x40, 0x09, 0x0e, 0x00, 0x4d, 0x0b, 0x28, 0x0e, 0x00, 0x4d, 0x02, + 0xb8, 0xff, 0xe0, 0xb3, 0x0d, 0x00, 0x4d, 0x01, 0xb8, 0xff, 0xe0, 0xb3, 0x0d, 0x00, 0x4d, 0x00, + 0xb8, 0xff, 0xf0, 0x40, 0x27, 0x13, 0x00, 0x4d, 0x0f, 0x13, 0x01, 0x13, 0x04, 0x00, 0x14, 0x44, + 0x0b, 0x07, 0x0f, 0x0f, 0x01, 0x0f, 0xd0, 0x10, 0x01, 0x10, 0x18, 0x0f, 0x14, 0x4a, 0x08, 0x09, + 0x03, 0x0c, 0x02, 0x0d, 0x17, 0x16, 0x08, 0x05, 0x12, 0x02, 0x05, 0x08, 0x00, 0x3f, 0x3f, 0x12, + 0x17, 0x39, 0xed, 0x32, 0x01, 0x10, 0xd6, 0x5d, 0xd5, 0x5d, 0x32, 0x32, 0xfd, 0x32, 0x32, 0xc5, + 0x5d, 0x31, 0x30, 0x00, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x01, 0x2b, 0x2b, 0x01, 0x15, 0x37, 0x17, + 0x07, 0x15, 0x23, 0x35, 0x07, 0x27, 0x37, 0x35, 0x07, 0x27, 0x37, 0x35, 0x23, 0x35, 0x21, 0x15, + 0x23, 0x15, 0x37, 0x17, 0x01, 0x38, 0x50, 0x26, 0x76, 0x7c, 0x49, 0x26, 0x6f, 0x4b, 0x24, 0x6f, + 0xa3, 0x01, 0xc2, 0xa3, 0x50, 0x25, 0x01, 0x44, 0x45, 0x25, 0x51, 0x38, 0x9b, 0x61, 0x22, 0x52, + 0x33, 0x46, 0x23, 0x4e, 0x34, 0x9c, 0x66, 0x66, 0x62, 0x25, 0x4d, 0x00, 0x00, 0x02, 0x00, 0x19, + 0x00, 0x00, 0x01, 0xdb, 0x02, 0x6b, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x77, 0x40, 0x53, 0x9f, 0x0b, + 0x01, 0x80, 0x0b, 0x01, 0x4f, 0x0b, 0x01, 0x10, 0x0b, 0x20, 0x0b, 0x02, 0xdf, 0x0b, 0xef, 0x0b, + 0x02, 0xa0, 0x0b, 0xb0, 0x0b, 0x02, 0x7f, 0x0b, 0x01, 0x60, 0x0b, 0x01, 0x2f, 0x0b, 0x3f, 0x0b, + 0x02, 0x00, 0x0b, 0x01, 0x0b, 0x30, 0x08, 0x40, 0x08, 0x90, 0x08, 0x03, 0xd0, 0x08, 0xe0, 0x08, + 0x02, 0x0f, 0x08, 0xaf, 0x08, 0x02, 0x08, 0x0c, 0x01, 0x02, 0x51, 0x06, 0x50, 0x05, 0x60, 0x05, + 0x02, 0x05, 0x0c, 0x05, 0x01, 0x55, 0x00, 0x0b, 0x55, 0x0a, 0x02, 0x09, 0x02, 0x04, 0x08, 0x03, + 0x08, 0x00, 0x3f, 0x3f, 0x3f, 0x3f, 0xfd, 0xde, 0xfd, 0xc0, 0x01, 0x10, 0xd6, 0x5d, 0xc5, 0xfd, + 0xc5, 0x10, 0xd6, 0x5d, 0x5d, 0x71, 0xc5, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x71, 0x71, 0x71, + 0x71, 0x31, 0x30, 0x01, 0x15, 0x23, 0x11, 0x23, 0x11, 0x23, 0x3d, 0x02, 0x21, 0x15, 0x01, 0xdb, + 0xa3, 0x7c, 0xa3, 0x01, 0xc2, 0x01, 0xbf, 0x66, 0xfe, 0xa7, 0x01, 0x59, 0x66, 0x46, 0x66, 0x66, + 0x00, 0x02, 0x00, 0x12, 0x00, 0x00, 0x01, 0xd8, 0x02, 0x72, 0x00, 0x1a, 0x00, 0x25, 0x00, 0x73, + 0x40, 0x43, 0x9b, 0x17, 0x01, 0x23, 0x46, 0x60, 0x13, 0x80, 0x13, 0x02, 0x13, 0x27, 0x08, 0x04, + 0x03, 0x1f, 0x1a, 0x18, 0x17, 0x00, 0x44, 0x0a, 0x07, 0x06, 0x90, 0x03, 0x01, 0x03, 0x26, 0x07, + 0x4f, 0x16, 0x5f, 0x16, 0x6f, 0x16, 0x03, 0x16, 0x4a, 0x20, 0x0a, 0x20, 0x03, 0x00, 0x48, 0x18, + 0x06, 0x18, 0x0f, 0x18, 0x01, 0x4f, 0x18, 0x01, 0x20, 0x18, 0x20, 0x18, 0x01, 0x1b, 0x4a, 0x10, + 0x02, 0x02, 0x08, 0x01, 0x08, 0x00, 0x3f, 0x3f, 0x3f, 0xed, 0x12, 0x39, 0x39, 0x2f, 0x2f, 0x5d, + 0x71, 0x11, 0x33, 0x10, 0xed, 0x32, 0x11, 0x33, 0x10, 0xed, 0x5d, 0x32, 0x01, 0x10, 0xd6, 0x5d, + 0x32, 0x32, 0x32, 0xfd, 0x32, 0x32, 0xc5, 0x33, 0x10, 0xcd, 0x32, 0x10, 0xd6, 0x5d, 0xed, 0x31, + 0x30, 0x00, 0x5d, 0x37, 0x15, 0x23, 0x35, 0x23, 0x35, 0x33, 0x35, 0x23, 0x35, 0x33, 0x35, 0x3e, + 0x03, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x23, 0x15, 0x33, 0x15, 0x03, 0x22, 0x06, 0x07, + 0x15, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0xd0, 0x7b, 0x43, 0x43, 0x43, 0x43, 0x11, 0x2a, 0x2b, + 0x29, 0x11, 0x6c, 0x77, 0x78, 0x6e, 0x22, 0xc8, 0x96, 0x09, 0x20, 0x09, 0x27, 0x33, 0x30, 0x30, + 0x58, 0x58, 0x58, 0x63, 0x48, 0x62, 0xfe, 0x04, 0x06, 0x03, 0x02, 0x56, 0x61, 0x62, 0x57, 0x47, + 0x63, 0x01, 0xaf, 0x01, 0x02, 0xa0, 0x2d, 0x2b, 0x29, 0x22, 0x00, 0x00, 0x00, 0x01, 0x00, 0x60, + 0x02, 0x16, 0x01, 0x95, 0x02, 0xae, 0x00, 0x11, 0x00, 0x16, 0x40, 0x09, 0x0d, 0x05, 0x12, 0x00, + 0x09, 0x0c, 0xa0, 0x06, 0xa0, 0x00, 0x3f, 0x3f, 0xde, 0xc5, 0x01, 0x10, 0xd6, 0xc4, 0x31, 0x30, + 0x13, 0x22, 0x2e, 0x02, 0x27, 0x37, 0x16, 0x16, 0x33, 0x32, 0x36, 0x37, 0x17, 0x0e, 0x03, 0xfa, + 0x1c, 0x36, 0x2a, 0x1c, 0x02, 0x5c, 0x06, 0x22, 0x16, 0x17, 0x22, 0x06, 0x5c, 0x03, 0x1c, 0x2a, + 0x36, 0x02, 0x16, 0x11, 0x21, 0x30, 0x1e, 0x18, 0x23, 0x1c, 0x1b, 0x23, 0x18, 0x1e, 0x30, 0x20, + 0x11, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x09, 0x00, 0x00, 0x01, 0xeb, 0x02, 0x6b, 0x02, 0x06, + 0x00, 0x24, 0x00, 0x00, 0xff, 0xff, 0x00, 0x36, 0xff, 0xf8, 0x01, 0xd5, 0x02, 0x72, 0x02, 0x06, + 0x00, 0x25, 0x00, 0x00, 0xff, 0xff, 0x00, 0x24, 0x00, 0x00, 0x01, 0xe4, 0x02, 0x6b, 0x02, 0x06, + 0x02, 0xc6, 0x00, 0x00, 0xff, 0xff, 0x00, 0x09, 0x00, 0x00, 0x01, 0xeb, 0x02, 0x6b, 0x02, 0x06, + 0x01, 0x9b, 0x00, 0x00, 0xff, 0xff, 0x00, 0x3f, 0x00, 0x00, 0x01, 0xcc, 0x02, 0x6b, 0x02, 0x06, + 0x00, 0x28, 0x00, 0x00, 0xff, 0xff, 0x00, 0x2e, 0x00, 0x00, 0x01, 0xc6, 0x02, 0x6b, 0x02, 0x06, + 0x00, 0x3d, 0x00, 0x00, 0xff, 0xff, 0x00, 0x2d, 0x00, 0x00, 0x01, 0xc7, 0x02, 0x6b, 0x02, 0x06, + 0x00, 0x2b, 0x00, 0x00, 0x00, 0x03, 0x00, 0x16, 0xff, 0xf3, 0x01, 0xde, 0x02, 0x79, 0x00, 0x03, + 0x00, 0x0f, 0x00, 0x23, 0x00, 0x3e, 0xb2, 0x1a, 0x46, 0x0a, 0xb8, 0xff, 0xc0, 0x40, 0x1f, 0x09, + 0x0f, 0x48, 0x0a, 0x20, 0x01, 0x30, 0x01, 0x02, 0x01, 0x20, 0x00, 0x01, 0x00, 0x04, 0x46, 0x10, + 0x24, 0x02, 0xa5, 0x01, 0x01, 0x15, 0x07, 0x4a, 0x1f, 0x09, 0x0d, 0x4a, 0x15, 0x03, 0x00, 0x3f, + 0xed, 0x3f, 0xed, 0x12, 0x39, 0x2f, 0xed, 0x01, 0x10, 0xd6, 0xfd, 0xde, 0x5d, 0xd5, 0x5d, 0xde, + 0x2b, 0xed, 0x31, 0x30, 0x13, 0x33, 0x15, 0x23, 0x27, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, + 0x26, 0x23, 0x22, 0x06, 0x07, 0x34, 0x3e, 0x02, 0x33, 0x32, 0x1e, 0x02, 0x15, 0x14, 0x0e, 0x02, + 0x23, 0x22, 0x2e, 0x02, 0xb3, 0x8f, 0x8f, 0x29, 0x30, 0x40, 0x3f, 0x31, 0x30, 0x40, 0x3f, 0x31, + 0x74, 0x20, 0x3c, 0x54, 0x34, 0x36, 0x55, 0x3b, 0x1e, 0x20, 0x3a, 0x55, 0x34, 0x36, 0x55, 0x3b, + 0x1f, 0x01, 0x65, 0x5d, 0x2e, 0x68, 0x70, 0x71, 0x67, 0x67, 0x71, 0x71, 0x67, 0x56, 0x7a, 0x4e, + 0x25, 0x25, 0x4e, 0x7a, 0x56, 0x56, 0x7b, 0x4e, 0x24, 0x24, 0x4e, 0x7b, 0xff, 0xff, 0x00, 0x36, + 0x00, 0x00, 0x01, 0xbf, 0x02, 0x6b, 0x02, 0x06, 0x00, 0x2c, 0x00, 0x00, 0xff, 0xff, 0x00, 0x2d, + 0x00, 0x00, 0x01, 0xe9, 0x02, 0x6b, 0x02, 0x06, 0x00, 0x2e, 0x00, 0x00, 0x00, 0x01, 0x00, 0x09, + 0x00, 0x00, 0x01, 0xeb, 0x02, 0x6b, 0x00, 0x10, 0x00, 0x26, 0x40, 0x14, 0x00, 0x0d, 0x03, 0x0c, + 0x08, 0x05, 0x11, 0x10, 0x12, 0x09, 0x11, 0x03, 0x0d, 0x02, 0x0c, 0x02, 0x09, 0x08, 0x00, 0x08, + 0x00, 0x3f, 0x3f, 0x3f, 0x3f, 0x39, 0x01, 0x10, 0xc6, 0x10, 0xc6, 0x12, 0x17, 0x39, 0x31, 0x30, + 0x21, 0x26, 0x26, 0x27, 0x0e, 0x03, 0x07, 0x23, 0x36, 0x12, 0x37, 0x33, 0x16, 0x12, 0x17, 0x01, + 0x67, 0x1f, 0x2e, 0x21, 0x11, 0x1c, 0x1a, 0x1a, 0x0f, 0x80, 0x2c, 0x5a, 0x2a, 0x86, 0x2c, 0x57, + 0x29, 0x92, 0xf5, 0x6c, 0x3b, 0x73, 0x7a, 0x82, 0x49, 0xb7, 0x01, 0x2d, 0x87, 0x88, 0xfe, 0xcf, + 0xb2, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x17, 0x00, 0x00, 0x01, 0xdd, 0x02, 0x6b, 0x02, 0x06, + 0x00, 0x30, 0x00, 0x00, 0xff, 0xff, 0x00, 0x2e, 0x00, 0x00, 0x01, 0xc6, 0x02, 0x6b, 0x02, 0x06, + 0x00, 0x31, 0x00, 0x00, 0x00, 0x03, 0x00, 0x20, 0x00, 0x00, 0x01, 0xd4, 0x02, 0x6b, 0x00, 0x03, + 0x00, 0x07, 0x00, 0x0b, 0x00, 0x2b, 0x40, 0x15, 0x06, 0x04, 0x0a, 0x08, 0x0c, 0x02, 0x00, 0x0c, + 0x04, 0x48, 0x05, 0x05, 0x00, 0x08, 0x48, 0x0b, 0x08, 0x03, 0x48, 0x00, 0x02, 0x00, 0x3f, 0xed, + 0x3f, 0xed, 0x12, 0x39, 0x2f, 0xed, 0x01, 0x10, 0xd6, 0xc5, 0x10, 0xd6, 0xc5, 0xd6, 0xc5, 0x31, + 0x30, 0x13, 0x21, 0x15, 0x21, 0x17, 0x35, 0x21, 0x15, 0x05, 0x21, 0x15, 0x21, 0x20, 0x01, 0xb4, + 0xfe, 0x4c, 0x27, 0x01, 0x67, 0xfe, 0x72, 0x01, 0xb4, 0xfe, 0x4c, 0x02, 0x6b, 0x68, 0xf0, 0x68, + 0x68, 0xab, 0x68, 0x00, 0xff, 0xff, 0x00, 0x1b, 0xff, 0xf3, 0x01, 0xd9, 0x02, 0x79, 0x02, 0x06, + 0x00, 0x32, 0x00, 0x00, 0xff, 0xff, 0x00, 0x2d, 0x00, 0x00, 0x01, 0xc7, 0x02, 0x6b, 0x02, 0x06, + 0x02, 0xd2, 0x00, 0x00, 0xff, 0xff, 0x00, 0x36, 0x00, 0x00, 0x01, 0xd8, 0x02, 0x72, 0x02, 0x06, + 0x00, 0x33, 0x00, 0x00, 0x00, 0x01, 0x00, 0x1c, 0x00, 0x00, 0x01, 0xd6, 0x02, 0x6b, 0x00, 0x1b, + 0x00, 0x7b, 0x40, 0x10, 0x18, 0x40, 0x0a, 0x00, 0x4d, 0x17, 0x08, 0x0a, 0x00, 0x4d, 0x13, 0x40, + 0x12, 0x00, 0x4d, 0x0b, 0xb8, 0xff, 0x80, 0xb3, 0x0c, 0x00, 0x4d, 0x0a, 0xb8, 0xff, 0xc0, 0xb3, + 0x0b, 0x00, 0x4d, 0x09, 0xb8, 0xff, 0x80, 0xb3, 0x0c, 0x00, 0x4d, 0x09, 0xb8, 0xff, 0xc0, 0x40, + 0x25, 0x0b, 0x00, 0x4d, 0x13, 0x09, 0x1c, 0x08, 0x15, 0x1d, 0x0e, 0x00, 0x05, 0x16, 0x1c, 0x13, + 0x14, 0x48, 0x15, 0x05, 0x17, 0x0e, 0x00, 0x17, 0x00, 0x0e, 0x05, 0x04, 0x07, 0x15, 0x08, 0x09, + 0x08, 0x48, 0x07, 0x02, 0x06, 0x02, 0x00, 0x3f, 0x3f, 0xed, 0x32, 0x3f, 0x12, 0x17, 0x39, 0x3d, + 0x2f, 0x2f, 0x18, 0x2f, 0x2f, 0x10, 0xed, 0x32, 0x01, 0x10, 0xd6, 0xd4, 0xd6, 0xc5, 0x10, 0xd6, + 0xc4, 0x12, 0x39, 0x39, 0x31, 0x30, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x13, 0x2e, 0x03, + 0x27, 0x35, 0x21, 0x15, 0x21, 0x1e, 0x03, 0x17, 0x0e, 0x03, 0x07, 0x21, 0x15, 0x21, 0x35, 0x3e, + 0x03, 0xe8, 0x14, 0x34, 0x34, 0x31, 0x12, 0x01, 0xac, 0xfe, 0xf8, 0x13, 0x2a, 0x2b, 0x28, 0x11, + 0x0e, 0x32, 0x37, 0x35, 0x0f, 0x01, 0x23, 0xfe, 0x46, 0x15, 0x33, 0x37, 0x36, 0x01, 0x39, 0x1c, + 0x3f, 0x3f, 0x38, 0x15, 0x4b, 0x66, 0x17, 0x35, 0x36, 0x34, 0x16, 0x10, 0x38, 0x3e, 0x3b, 0x12, + 0x66, 0x51, 0x19, 0x3b, 0x3e, 0x3c, 0x00, 0x00, 0xff, 0xff, 0x00, 0x19, 0x00, 0x00, 0x01, 0xdb, + 0x02, 0x6b, 0x02, 0x06, 0x00, 0x37, 0x00, 0x00, 0xff, 0xff, 0x00, 0x0d, 0x00, 0x00, 0x01, 0xe8, + 0x02, 0x6b, 0x02, 0x06, 0x00, 0x3c, 0x00, 0x00, 0xff, 0xff, 0x00, 0x19, 0x00, 0x00, 0x01, 0xda, + 0x02, 0x93, 0x02, 0x06, 0x02, 0xd7, 0x00, 0x00, 0xff, 0xff, 0x00, 0x0b, 0x00, 0x00, 0x01, 0xe9, + 0x02, 0x6b, 0x02, 0x06, 0x00, 0x3b, 0x00, 0x00, 0x00, 0x01, 0x00, 0x19, 0x00, 0x00, 0x01, 0xdb, + 0x02, 0x6b, 0x00, 0x1b, 0x00, 0xb2, 0x40, 0x70, 0x19, 0x40, 0x0e, 0x00, 0x4d, 0x16, 0x20, 0x0d, + 0x00, 0x4d, 0x10, 0x20, 0x0e, 0x00, 0x4d, 0x0c, 0x40, 0x0d, 0x00, 0x4d, 0x0b, 0x40, 0x0d, 0x00, + 0x4d, 0x00, 0x40, 0x0d, 0x00, 0x4d, 0x5f, 0x19, 0x01, 0x2f, 0x06, 0x3f, 0x06, 0x4f, 0x06, 0x03, + 0x06, 0x52, 0x60, 0x07, 0x01, 0x1f, 0x07, 0x01, 0xbf, 0x07, 0xcf, 0x07, 0xdf, 0x07, 0x03, 0xa0, + 0x07, 0x01, 0x5f, 0x07, 0x6f, 0x07, 0x7f, 0x07, 0x03, 0x07, 0x40, 0x09, 0x0c, 0x48, 0x07, 0x1d, + 0x50, 0x1b, 0x01, 0x1b, 0x52, 0x5f, 0x1a, 0x01, 0x1a, 0x1a, 0x19, 0x19, 0x0d, 0x00, 0x00, 0x0b, + 0x0b, 0x40, 0x0c, 0x01, 0x0c, 0x52, 0x0d, 0x20, 0x13, 0x30, 0x13, 0x40, 0x13, 0x03, 0x13, 0x52, + 0x10, 0x12, 0x20, 0x12, 0x30, 0x12, 0x03, 0x12, 0xb8, 0xff, 0xc0, 0x40, 0x0c, 0x15, 0x18, 0x48, + 0xb1, 0x12, 0x01, 0x12, 0x1c, 0x0c, 0x08, 0x06, 0x02, 0x00, 0x3f, 0x3f, 0x01, 0x10, 0xd6, 0x5d, + 0x2b, 0x71, 0xed, 0x5d, 0xd4, 0xed, 0x5d, 0x32, 0x2f, 0x33, 0x2f, 0x11, 0x33, 0x11, 0x33, 0x2f, + 0x5d, 0xed, 0x5d, 0x10, 0xde, 0x2b, 0x5d, 0x5d, 0x5d, 0x71, 0x71, 0xed, 0x5d, 0x31, 0x30, 0x00, + 0x5d, 0x01, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x25, 0x32, 0x3e, 0x02, 0x35, 0x35, 0x33, 0x15, + 0x14, 0x06, 0x07, 0x15, 0x23, 0x35, 0x26, 0x26, 0x35, 0x35, 0x33, 0x15, 0x14, 0x1e, 0x02, 0x33, + 0x35, 0x33, 0x01, 0x2a, 0x11, 0x1e, 0x16, 0x0c, 0x60, 0x5c, 0x55, 0x60, 0x55, 0x5c, 0x60, 0x0c, + 0x16, 0x1e, 0x11, 0x60, 0xf0, 0x0c, 0x21, 0x3d, 0x30, 0xe1, 0xd6, 0x83, 0x78, 0x07, 0x93, 0x93, + 0x07, 0x78, 0x83, 0xd6, 0xe1, 0x30, 0x3d, 0x21, 0x0c, 0xeb, 0x00, 0x00, 0x00, 0x01, 0x00, 0x09, + 0x00, 0x00, 0x01, 0xeb, 0x02, 0x79, 0x00, 0x27, 0x00, 0x53, 0xb6, 0x25, 0x40, 0x09, 0x0a, 0x00, + 0x4c, 0x0d, 0xb8, 0xff, 0xc0, 0x40, 0x2b, 0x09, 0x0a, 0x00, 0x4c, 0x14, 0x46, 0x0a, 0x60, 0x0f, + 0x01, 0x0f, 0x7f, 0x11, 0x01, 0x60, 0x11, 0x01, 0x3f, 0x11, 0x01, 0x11, 0x29, 0x1e, 0x46, 0x00, + 0x23, 0x2f, 0x21, 0x01, 0x21, 0x28, 0x25, 0x48, 0x22, 0x08, 0x0d, 0x48, 0x10, 0x08, 0x19, 0x4a, + 0x05, 0x03, 0x00, 0x3f, 0xed, 0x3f, 0xed, 0x3f, 0xed, 0x01, 0x10, 0xc4, 0x5d, 0xd6, 0xd4, 0xed, + 0x10, 0xc4, 0x5d, 0x5d, 0x5d, 0xd6, 0x5d, 0xd4, 0xed, 0x31, 0x30, 0x2b, 0x2b, 0x13, 0x34, 0x3e, + 0x02, 0x33, 0x32, 0x1e, 0x02, 0x15, 0x14, 0x06, 0x07, 0x33, 0x15, 0x23, 0x35, 0x36, 0x36, 0x35, + 0x34, 0x2e, 0x02, 0x23, 0x22, 0x0e, 0x02, 0x15, 0x14, 0x16, 0x17, 0x15, 0x23, 0x35, 0x33, 0x26, + 0x26, 0x0e, 0x29, 0x42, 0x55, 0x2d, 0x2c, 0x55, 0x43, 0x29, 0x24, 0x2a, 0x51, 0xd7, 0x22, 0x35, + 0x0b, 0x19, 0x2b, 0x20, 0x20, 0x2b, 0x1b, 0x0b, 0x31, 0x26, 0xd9, 0x54, 0x2a, 0x25, 0x01, 0x62, + 0x4b, 0x6a, 0x43, 0x1f, 0x1f, 0x43, 0x6a, 0x4b, 0x42, 0x7e, 0x3c, 0x66, 0x57, 0x29, 0x77, 0x50, + 0x27, 0x47, 0x38, 0x21, 0x21, 0x38, 0x47, 0x27, 0x50, 0x77, 0x29, 0x57, 0x66, 0x3c, 0x81, 0x00, + 0x00, 0x02, 0x00, 0x28, 0xff, 0xf6, 0x01, 0xe4, 0x01, 0xe0, 0x00, 0x15, 0x00, 0x26, 0x00, 0x49, + 0x40, 0x0f, 0x15, 0x40, 0x09, 0x00, 0x4d, 0x0f, 0x00, 0x01, 0x1e, 0x53, 0x12, 0x00, 0x15, 0x01, + 0x15, 0xb8, 0xff, 0xc0, 0xb7, 0x0d, 0x14, 0x48, 0x15, 0x28, 0x16, 0x53, 0x0b, 0xb8, 0xff, 0xc0, + 0x40, 0x11, 0x0d, 0x14, 0x48, 0x0b, 0x27, 0x22, 0x57, 0x0e, 0x0b, 0x19, 0x57, 0x06, 0x07, 0x15, + 0x57, 0x00, 0x07, 0x00, 0x3f, 0xed, 0x3f, 0xed, 0x3f, 0xed, 0x01, 0x10, 0xd6, 0x2b, 0xed, 0x10, + 0xd6, 0x2b, 0x5d, 0xd6, 0xed, 0x31, 0x30, 0x5d, 0x2b, 0x05, 0x22, 0x26, 0x27, 0x06, 0x06, 0x23, + 0x22, 0x2e, 0x02, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x17, 0x11, 0x14, 0x16, 0x17, 0x25, 0x14, + 0x16, 0x33, 0x32, 0x37, 0x26, 0x26, 0x35, 0x35, 0x26, 0x26, 0x23, 0x22, 0x0e, 0x02, 0x01, 0xd3, + 0x2a, 0x31, 0x13, 0x22, 0x43, 0x1f, 0x27, 0x44, 0x31, 0x1d, 0x7e, 0x6c, 0x24, 0x50, 0x2c, 0x16, + 0x1c, 0xfe, 0xc2, 0x2b, 0x26, 0x20, 0x25, 0x02, 0x03, 0x0c, 0x15, 0x0a, 0x1d, 0x27, 0x18, 0x0a, + 0x0a, 0x17, 0x16, 0x17, 0x16, 0x1e, 0x3a, 0x57, 0x38, 0x83, 0x80, 0x0c, 0x0e, 0xfe, 0xe2, 0x2d, + 0x1c, 0x03, 0x88, 0x44, 0x43, 0x16, 0x10, 0x29, 0x12, 0xb5, 0x03, 0x02, 0x16, 0x27, 0x36, 0x00, + 0x00, 0x02, 0x00, 0x36, 0xff, 0x5a, 0x01, 0xdb, 0x02, 0xb5, 0x00, 0x1a, 0x00, 0x33, 0x00, 0x64, + 0xb9, 0x00, 0x26, 0xff, 0xc0, 0x40, 0x38, 0x0c, 0x00, 0x4d, 0x1f, 0x28, 0x01, 0x28, 0x28, 0x34, + 0x35, 0x2d, 0x40, 0x0b, 0x00, 0x4d, 0x2d, 0x53, 0x00, 0x22, 0x53, 0x00, 0x06, 0x01, 0x06, 0x35, + 0x1b, 0x0e, 0x51, 0x30, 0x10, 0x40, 0x10, 0x50, 0x10, 0x03, 0x10, 0x34, 0x26, 0x55, 0x27, 0x03, + 0x03, 0x27, 0x1d, 0x30, 0x57, 0x16, 0x01, 0x10, 0x0e, 0x0f, 0x12, 0x1d, 0x57, 0x0b, 0x07, 0x00, + 0x3f, 0xed, 0x3f, 0x3f, 0x3f, 0xed, 0x11, 0x39, 0x39, 0x3d, 0x2f, 0x18, 0x2f, 0xed, 0x01, 0x10, + 0xd6, 0x5d, 0xed, 0x32, 0x10, 0xd6, 0x5d, 0xed, 0xd4, 0xed, 0x2b, 0x11, 0x12, 0x39, 0x2f, 0x5d, + 0x31, 0x30, 0x00, 0x2b, 0x01, 0x14, 0x06, 0x07, 0x16, 0x16, 0x15, 0x14, 0x0e, 0x02, 0x23, 0x22, + 0x26, 0x27, 0x15, 0x23, 0x11, 0x34, 0x3e, 0x02, 0x33, 0x32, 0x1e, 0x02, 0x03, 0x16, 0x33, 0x32, + 0x3e, 0x02, 0x35, 0x34, 0x26, 0x23, 0x23, 0x35, 0x33, 0x32, 0x3e, 0x02, 0x35, 0x34, 0x26, 0x23, + 0x22, 0x06, 0x15, 0x01, 0xae, 0x23, 0x2a, 0x44, 0x36, 0x23, 0x39, 0x48, 0x25, 0x1e, 0x2c, 0x17, + 0x7b, 0x1f, 0x35, 0x47, 0x29, 0x22, 0x41, 0x33, 0x1e, 0xfd, 0x22, 0x28, 0x18, 0x25, 0x19, 0x0c, + 0x32, 0x34, 0x17, 0x0b, 0x12, 0x1b, 0x13, 0x09, 0x1f, 0x21, 0x20, 0x23, 0x02, 0x0b, 0x2b, 0x4a, + 0x17, 0x1b, 0x5c, 0x3c, 0x3d, 0x52, 0x32, 0x15, 0x0a, 0x0a, 0xb0, 0x02, 0x86, 0x38, 0x51, 0x34, + 0x18, 0x16, 0x2b, 0x40, 0xfe, 0x42, 0x16, 0x11, 0x1e, 0x27, 0x16, 0x2d, 0x40, 0x62, 0x10, 0x1b, + 0x21, 0x12, 0x1f, 0x32, 0x32, 0x39, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0e, 0xff, 0x5b, 0x01, 0xe8, + 0x01, 0xd6, 0x00, 0x13, 0x00, 0x69, 0xb5, 0x10, 0x20, 0x0a, 0x00, 0x4d, 0x0b, 0xb8, 0xff, 0xe0, + 0xb3, 0x0a, 0x00, 0x4d, 0x0b, 0xb8, 0xff, 0xc0, 0x40, 0x09, 0x09, 0x00, 0x4d, 0x0a, 0x20, 0x13, + 0x00, 0x4d, 0x08, 0xb8, 0xff, 0xc0, 0x40, 0x28, 0x13, 0x00, 0x4d, 0x08, 0x20, 0x09, 0x00, 0x4d, + 0x07, 0x20, 0x09, 0x00, 0x4d, 0x09, 0x20, 0x0a, 0x00, 0x4d, 0x10, 0x09, 0x09, 0x06, 0x0c, 0x51, + 0x0d, 0x15, 0x06, 0x51, 0x05, 0x13, 0x51, 0x00, 0x05, 0x14, 0x10, 0x06, 0x0d, 0x0a, 0x00, 0x12, + 0x00, 0x3f, 0x3f, 0x3f, 0x01, 0x10, 0xd6, 0xd6, 0xed, 0x10, 0xed, 0x10, 0xd6, 0xed, 0x11, 0x39, + 0x3d, 0x2f, 0x39, 0x31, 0x30, 0x00, 0x2b, 0x01, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x17, + 0x2e, 0x03, 0x27, 0x33, 0x16, 0x16, 0x17, 0x36, 0x36, 0x37, 0x33, 0x06, 0x06, 0x07, 0x16, 0x16, + 0x17, 0xc1, 0x09, 0x2c, 0x35, 0x36, 0x13, 0x81, 0x22, 0x32, 0x14, 0x23, 0x3c, 0x13, 0x7f, 0x22, + 0x67, 0x3c, 0x08, 0x0a, 0x02, 0xa5, 0x57, 0xb4, 0xa8, 0x92, 0x36, 0x60, 0x9e, 0x49, 0x49, 0xab, + 0x53, 0x86, 0xeb, 0x69, 0x30, 0x49, 0x28, 0x00, 0x00, 0x02, 0x00, 0x1f, 0xff, 0xf3, 0x01, 0xd7, + 0x02, 0xb5, 0x00, 0x2a, 0x00, 0x3a, 0x00, 0x50, 0xb3, 0x3b, 0x06, 0x01, 0x30, 0xb8, 0xff, 0xc0, + 0x40, 0x2a, 0x0a, 0x00, 0x4d, 0x11, 0x40, 0x0f, 0x00, 0x4d, 0x2b, 0x53, 0x30, 0x10, 0x01, 0x10, + 0x40, 0x21, 0x60, 0x21, 0x02, 0x21, 0x3c, 0x19, 0x53, 0x08, 0x35, 0x53, 0x00, 0x3b, 0x30, 0x05, + 0x1e, 0x03, 0x0d, 0x38, 0x57, 0x26, 0x07, 0x11, 0x14, 0x57, 0x0d, 0x9f, 0x00, 0x3f, 0xfd, 0xc6, + 0x3f, 0xed, 0x12, 0x17, 0x39, 0x01, 0x10, 0xd6, 0xed, 0xd4, 0xed, 0x10, 0xd6, 0x5d, 0xc4, 0x5d, + 0xed, 0x31, 0x30, 0x00, 0x2b, 0x2b, 0x01, 0x5d, 0x37, 0x34, 0x3e, 0x02, 0x37, 0x26, 0x26, 0x35, + 0x34, 0x3e, 0x02, 0x33, 0x32, 0x16, 0x17, 0x07, 0x26, 0x26, 0x23, 0x22, 0x0e, 0x02, 0x15, 0x14, + 0x1e, 0x02, 0x17, 0x16, 0x16, 0x15, 0x14, 0x0e, 0x02, 0x23, 0x22, 0x2e, 0x02, 0x25, 0x34, 0x2e, + 0x02, 0x27, 0x0e, 0x03, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x1f, 0x0b, 0x1e, 0x35, 0x2b, 0x1d, + 0x24, 0x15, 0x2a, 0x40, 0x2b, 0x35, 0x48, 0x22, 0x1a, 0x18, 0x3f, 0x26, 0x09, 0x13, 0x11, 0x0a, + 0x0b, 0x1b, 0x2d, 0x21, 0x3b, 0x46, 0x1f, 0x39, 0x51, 0x31, 0x32, 0x51, 0x3b, 0x20, 0x01, 0x3a, + 0x11, 0x1b, 0x24, 0x13, 0x1c, 0x23, 0x13, 0x07, 0x35, 0x2a, 0x2a, 0x33, 0xda, 0x16, 0x38, 0x3a, + 0x37, 0x15, 0x17, 0x39, 0x29, 0x1d, 0x34, 0x27, 0x16, 0x16, 0x0f, 0x5c, 0x0c, 0x15, 0x02, 0x08, + 0x10, 0x0d, 0x0c, 0x17, 0x1b, 0x22, 0x16, 0x27, 0x67, 0x48, 0x37, 0x59, 0x3e, 0x21, 0x1f, 0x3b, + 0x56, 0x41, 0x1a, 0x2a, 0x23, 0x1e, 0x0e, 0x0d, 0x24, 0x28, 0x28, 0x12, 0x44, 0x43, 0x42, 0x00, + 0x00, 0x01, 0x00, 0x40, 0xff, 0xf3, 0x01, 0xc6, 0x01, 0xe2, 0x00, 0x30, 0x00, 0x83, 0x40, 0x0b, + 0x2a, 0x20, 0x0c, 0x00, 0x4d, 0x20, 0x20, 0x0c, 0x00, 0x4d, 0x19, 0xb8, 0xff, 0xc0, 0xb4, 0x13, + 0x14, 0x00, 0x4c, 0x18, 0xb8, 0xff, 0xe0, 0xb4, 0x19, 0x1a, 0x00, 0x4c, 0x00, 0xb8, 0xff, 0xc0, + 0x40, 0x36, 0x17, 0x00, 0x4d, 0xc0, 0x30, 0xd0, 0x30, 0xe0, 0x30, 0x03, 0x30, 0x1a, 0x32, 0x0c, + 0x25, 0x08, 0x53, 0x28, 0x13, 0x53, 0x22, 0x31, 0x5f, 0x0e, 0x6f, 0x0e, 0x02, 0x30, 0x0e, 0x01, + 0x0e, 0x55, 0x0b, 0x25, 0x0b, 0x25, 0x2d, 0x1d, 0x00, 0x4f, 0x03, 0x01, 0x03, 0x57, 0x2d, 0x0b, + 0x19, 0x40, 0x16, 0x01, 0x16, 0x57, 0x1d, 0x07, 0x00, 0x3f, 0xfd, 0x5d, 0xc6, 0x3f, 0xfd, 0x5d, + 0xc6, 0x11, 0x12, 0x39, 0x39, 0x3d, 0x2f, 0x18, 0x2f, 0xed, 0x5d, 0x5d, 0x01, 0x10, 0xd6, 0xed, + 0xd4, 0xed, 0xd5, 0xc5, 0x10, 0xd6, 0xc6, 0x5d, 0x31, 0x30, 0x00, 0x2b, 0x2b, 0x2b, 0x01, 0x2b, + 0x2b, 0x01, 0x26, 0x26, 0x23, 0x22, 0x0e, 0x02, 0x15, 0x14, 0x16, 0x33, 0x33, 0x15, 0x23, 0x22, + 0x0e, 0x02, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x17, 0x06, 0x06, 0x23, 0x22, 0x2e, 0x02, + 0x35, 0x34, 0x36, 0x37, 0x26, 0x26, 0x35, 0x34, 0x3e, 0x02, 0x33, 0x32, 0x16, 0x17, 0x01, 0x9c, + 0x17, 0x4c, 0x2a, 0x16, 0x1d, 0x12, 0x07, 0x1d, 0x25, 0x6a, 0x69, 0x0f, 0x1e, 0x17, 0x0e, 0x2e, + 0x2c, 0x34, 0x53, 0x14, 0x1d, 0x25, 0x64, 0x32, 0x29, 0x4a, 0x37, 0x21, 0x26, 0x27, 0x1d, 0x21, + 0x20, 0x35, 0x46, 0x26, 0x33, 0x4e, 0x22, 0x01, 0x63, 0x06, 0x0e, 0x09, 0x0e, 0x11, 0x08, 0x11, + 0x1b, 0x5d, 0x04, 0x0b, 0x13, 0x0f, 0x15, 0x19, 0x13, 0x07, 0x65, 0x0f, 0x12, 0x0f, 0x22, 0x37, + 0x28, 0x2b, 0x37, 0x11, 0x11, 0x30, 0x23, 0x26, 0x34, 0x20, 0x0e, 0x0e, 0x0c, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x36, 0xff, 0x56, 0x01, 0xd1, 0x02, 0xaf, 0x00, 0x24, 0x00, 0x3e, 0xb7, 0x04, + 0x07, 0x53, 0x18, 0x00, 0x00, 0x01, 0x00, 0xb8, 0xff, 0xc0, 0x40, 0x0a, 0x0b, 0x0e, 0x48, 0x00, + 0x26, 0x14, 0x16, 0x1d, 0x53, 0x0f, 0xb8, 0xff, 0xc0, 0x40, 0x0c, 0x0a, 0x0e, 0x48, 0x0f, 0x25, + 0x15, 0x55, 0x17, 0x00, 0x04, 0x03, 0x10, 0x00, 0x3f, 0xc5, 0x3f, 0xed, 0x01, 0x10, 0xd6, 0x2b, + 0xed, 0xd4, 0xc5, 0x10, 0xd6, 0x2b, 0x5d, 0xc4, 0xfd, 0xc6, 0x31, 0x30, 0x05, 0x14, 0x06, 0x07, + 0x27, 0x36, 0x36, 0x35, 0x34, 0x26, 0x27, 0x2e, 0x03, 0x35, 0x34, 0x3e, 0x02, 0x37, 0x23, 0x35, + 0x21, 0x15, 0x0e, 0x03, 0x15, 0x14, 0x16, 0x17, 0x1e, 0x03, 0x01, 0xd1, 0x1b, 0x16, 0x67, 0x0e, + 0x0f, 0x38, 0x38, 0x2a, 0x42, 0x2d, 0x17, 0x2f, 0x44, 0x4c, 0x1d, 0xc3, 0x01, 0x6d, 0x1d, 0x59, + 0x55, 0x3d, 0x35, 0x3d, 0x2d, 0x40, 0x2a, 0x14, 0x25, 0x25, 0x40, 0x20, 0x25, 0x1a, 0x24, 0x11, + 0x18, 0x1d, 0x0e, 0x0c, 0x1f, 0x30, 0x44, 0x2f, 0x38, 0x6a, 0x5f, 0x4f, 0x1e, 0x66, 0x51, 0x1a, + 0x4e, 0x61, 0x73, 0x3d, 0x34, 0x33, 0x12, 0x0e, 0x1b, 0x21, 0x2b, 0x00, 0x00, 0x01, 0x00, 0x3f, + 0xff, 0x5b, 0x01, 0xb9, 0x01, 0xe0, 0x00, 0x13, 0x00, 0x32, 0x40, 0x0a, 0x0b, 0x51, 0x09, 0x15, + 0x11, 0x51, 0x50, 0x00, 0x01, 0x00, 0xb8, 0xff, 0xc0, 0x40, 0x10, 0x09, 0x0c, 0x48, 0x00, 0x14, + 0x12, 0x06, 0x09, 0x0e, 0x30, 0x0e, 0x01, 0x0e, 0x57, 0x03, 0x0b, 0x00, 0x3f, 0xed, 0x5d, 0x3f, + 0x3f, 0x01, 0x10, 0xd6, 0x2b, 0x5d, 0xed, 0x10, 0xd6, 0xed, 0x31, 0x30, 0x13, 0x36, 0x36, 0x33, + 0x32, 0x1e, 0x02, 0x15, 0x11, 0x23, 0x11, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x11, 0x23, 0x3f, + 0x21, 0x61, 0x39, 0x38, 0x4a, 0x2b, 0x12, 0x7b, 0x1e, 0x2e, 0x0e, 0x1b, 0x0f, 0x7b, 0x01, 0xc7, + 0x09, 0x10, 0x1f, 0x39, 0x4f, 0x30, 0xfe, 0x52, 0x01, 0x9e, 0x42, 0x3a, 0x02, 0x02, 0xfe, 0x8f, + 0x00, 0x03, 0x00, 0x1f, 0xff, 0xf3, 0x01, 0xd4, 0x02, 0xb5, 0x00, 0x0b, 0x00, 0x16, 0x00, 0x1d, + 0x00, 0x35, 0x40, 0x1e, 0x11, 0x1b, 0x53, 0x00, 0x00, 0x40, 0x00, 0x60, 0x00, 0x03, 0x00, 0x1f, + 0x12, 0x1a, 0x53, 0x06, 0x1e, 0x11, 0x55, 0x1b, 0x1b, 0x03, 0x17, 0x57, 0x09, 0x9f, 0x0c, 0x57, + 0x03, 0x07, 0x00, 0x3f, 0xed, 0x3f, 0xed, 0x12, 0x39, 0x2f, 0xed, 0x01, 0x10, 0xd6, 0xfd, 0xc0, + 0x10, 0xd6, 0x5d, 0xfd, 0xc0, 0x31, 0x30, 0x01, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, + 0x33, 0x32, 0x16, 0x03, 0x32, 0x3e, 0x02, 0x37, 0x23, 0x1e, 0x03, 0x13, 0x22, 0x06, 0x07, 0x33, + 0x26, 0x26, 0x01, 0xd4, 0x74, 0x66, 0x66, 0x75, 0x75, 0x66, 0x66, 0x74, 0xda, 0x18, 0x23, 0x16, + 0x0c, 0x01, 0xbe, 0x01, 0x0c, 0x18, 0x23, 0x18, 0x30, 0x2e, 0x02, 0xbe, 0x02, 0x2c, 0x01, 0x55, + 0xb3, 0xaf, 0xaf, 0xb3, 0xb2, 0xae, 0xae, 0xfe, 0x56, 0x1c, 0x33, 0x47, 0x2b, 0x2b, 0x47, 0x33, + 0x1c, 0x01, 0xef, 0x69, 0x57, 0x57, 0x69, 0x00, 0x00, 0x01, 0x00, 0x24, 0xff, 0xf5, 0x01, 0xd3, + 0x01, 0xd6, 0x00, 0x13, 0x00, 0x2d, 0x40, 0x1b, 0x00, 0x00, 0x10, 0x00, 0x20, 0x00, 0x40, 0x00, + 0xa0, 0x00, 0x05, 0x00, 0x15, 0x0d, 0x51, 0x08, 0x0a, 0x14, 0x09, 0x55, 0x0b, 0x0a, 0x13, 0x10, + 0x57, 0x03, 0x07, 0x00, 0x3f, 0xfd, 0xc6, 0x3f, 0xed, 0x01, 0x10, 0xd6, 0xd6, 0xed, 0x10, 0xc6, + 0x5d, 0x31, 0x30, 0x25, 0x06, 0x06, 0x23, 0x22, 0x2e, 0x02, 0x35, 0x35, 0x23, 0x35, 0x33, 0x11, + 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x01, 0xd3, 0x26, 0x43, 0x1c, 0x30, 0x41, 0x27, 0x10, 0x82, + 0xfd, 0x1f, 0x24, 0x11, 0x2e, 0x1e, 0x14, 0x12, 0x0d, 0x1c, 0x35, 0x4c, 0x31, 0xad, 0x66, 0xfe, + 0xe6, 0x2a, 0x27, 0x08, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x3f, 0x00, 0x00, 0x01, 0xe7, + 0x01, 0xd6, 0x00, 0x1a, 0x00, 0x4b, 0xb9, 0x00, 0x12, 0xff, 0xe0, 0xb3, 0x0a, 0x00, 0x4d, 0x03, + 0xb8, 0xff, 0xe0, 0x40, 0x24, 0x0a, 0x00, 0x4d, 0x05, 0x06, 0x11, 0x60, 0x10, 0x80, 0x10, 0x90, + 0x10, 0xa0, 0x10, 0x04, 0x10, 0x1c, 0x16, 0x0b, 0x00, 0x51, 0x19, 0x1b, 0x1a, 0x0a, 0x17, 0x06, + 0x16, 0x0b, 0x00, 0x03, 0x05, 0x11, 0x06, 0x05, 0x0a, 0x00, 0x3f, 0x3f, 0x12, 0x17, 0x39, 0x3f, + 0x3f, 0x01, 0x10, 0xd6, 0xfd, 0x32, 0xc0, 0x10, 0xd6, 0x5d, 0xc5, 0xd6, 0xc5, 0x31, 0x30, 0x2b, + 0x2b, 0x13, 0x3e, 0x03, 0x37, 0x33, 0x0e, 0x03, 0x07, 0x1e, 0x03, 0x17, 0x23, 0x2e, 0x03, 0x27, + 0x15, 0x23, 0x11, 0x33, 0xbb, 0x12, 0x25, 0x23, 0x20, 0x0c, 0x94, 0x12, 0x2e, 0x31, 0x31, 0x14, + 0x19, 0x3a, 0x38, 0x2f, 0x0e, 0x8d, 0x0c, 0x27, 0x2c, 0x2d, 0x13, 0x7c, 0x7c, 0x01, 0x1c, 0x15, + 0x2f, 0x32, 0x2f, 0x15, 0x17, 0x36, 0x38, 0x34, 0x16, 0x18, 0x43, 0x48, 0x48, 0x1c, 0x19, 0x3f, + 0x3d, 0x37, 0x12, 0xde, 0x01, 0xd0, 0x00, 0x00, 0x00, 0x01, 0x00, 0x13, 0x00, 0x00, 0x01, 0xdd, + 0x02, 0xb5, 0x00, 0x24, 0x00, 0x32, 0x40, 0x1a, 0x1a, 0x51, 0x19, 0x26, 0x14, 0x1f, 0x05, 0x03, + 0x25, 0x26, 0x24, 0x51, 0x00, 0x0e, 0x25, 0x1f, 0x11, 0x24, 0x06, 0x1a, 0x06, 0x0d, 0x0a, 0x57, + 0x11, 0x00, 0x00, 0x3f, 0xfd, 0xc6, 0x3f, 0x3f, 0x12, 0x39, 0x01, 0x10, 0xc6, 0xd6, 0xed, 0x11, + 0x12, 0x17, 0x39, 0x10, 0xd6, 0xed, 0x31, 0x30, 0x33, 0x3e, 0x03, 0x37, 0x2e, 0x03, 0x23, 0x22, + 0x06, 0x07, 0x27, 0x36, 0x36, 0x33, 0x32, 0x16, 0x17, 0x1e, 0x03, 0x17, 0x23, 0x2e, 0x03, 0x27, + 0x0e, 0x03, 0x07, 0x13, 0x11, 0x2d, 0x31, 0x32, 0x18, 0x10, 0x1a, 0x18, 0x19, 0x0f, 0x0d, 0x11, + 0x0b, 0x16, 0x14, 0x26, 0x18, 0x40, 0x4d, 0x1d, 0x1f, 0x38, 0x31, 0x27, 0x0f, 0x8e, 0x08, 0x14, + 0x15, 0x16, 0x0a, 0x0e, 0x1d, 0x1b, 0x16, 0x07, 0x40, 0x7d, 0x75, 0x68, 0x2c, 0x2a, 0x34, 0x1e, + 0x0a, 0x02, 0x05, 0x63, 0x07, 0x06, 0x3d, 0x3d, 0x42, 0x99, 0x98, 0x8f, 0x39, 0x24, 0x51, 0x51, + 0x4e, 0x21, 0x24, 0x51, 0x53, 0x4e, 0x1f, 0x00, 0xff, 0xff, 0x00, 0x3b, 0xff, 0x5b, 0x01, 0xb6, + 0x01, 0xd6, 0x02, 0x06, 0x00, 0x90, 0x00, 0x00, 0xff, 0xff, 0x00, 0x0e, 0x00, 0x00, 0x01, 0xe6, + 0x01, 0xd6, 0x02, 0x06, 0x00, 0x59, 0x00, 0x00, 0x00, 0x01, 0x00, 0x35, 0xff, 0x56, 0x01, 0xd2, + 0x02, 0xb5, 0x00, 0x38, 0x00, 0x67, 0xb7, 0x0b, 0x40, 0x0d, 0x00, 0x4d, 0x03, 0x53, 0x35, 0xb8, + 0xff, 0xc0, 0xb6, 0x09, 0x0e, 0x48, 0x35, 0x3a, 0x24, 0x15, 0xb8, 0xff, 0xc0, 0x40, 0x0b, 0x09, + 0x0e, 0x48, 0x15, 0x3a, 0x1e, 0x53, 0x0f, 0x2b, 0x53, 0x09, 0xb8, 0xff, 0xc0, 0x40, 0x19, 0x0a, + 0x0e, 0x48, 0x09, 0x00, 0x39, 0x26, 0x55, 0x30, 0x06, 0x0c, 0x38, 0x23, 0x0c, 0x23, 0x0c, 0x12, + 0x00, 0x38, 0x0e, 0x16, 0x19, 0x57, 0x12, 0x00, 0x00, 0x3f, 0xfd, 0xc6, 0x3f, 0xc5, 0x12, 0x39, + 0x39, 0x3d, 0x2f, 0x18, 0x2f, 0x11, 0x12, 0x39, 0x39, 0xed, 0x01, 0x10, 0xc6, 0xd6, 0x2b, 0xed, + 0xd4, 0xed, 0x10, 0xd6, 0x2b, 0xc6, 0x10, 0xd6, 0x2b, 0xed, 0x31, 0x30, 0x2b, 0x05, 0x36, 0x36, + 0x35, 0x34, 0x26, 0x27, 0x26, 0x26, 0x35, 0x34, 0x36, 0x37, 0x26, 0x26, 0x35, 0x34, 0x36, 0x33, + 0x32, 0x16, 0x17, 0x07, 0x26, 0x26, 0x23, 0x22, 0x0e, 0x02, 0x15, 0x14, 0x1e, 0x02, 0x33, 0x33, + 0x15, 0x23, 0x22, 0x0e, 0x02, 0x15, 0x14, 0x1e, 0x02, 0x17, 0x1e, 0x03, 0x15, 0x14, 0x06, 0x07, + 0x01, 0x3a, 0x0e, 0x10, 0x41, 0x36, 0x5a, 0x52, 0x43, 0x32, 0x2e, 0x25, 0x6e, 0x67, 0x36, 0x50, + 0x14, 0x19, 0x1d, 0x3a, 0x1d, 0x1f, 0x29, 0x18, 0x09, 0x12, 0x1d, 0x26, 0x15, 0x6a, 0x64, 0x18, + 0x33, 0x28, 0x1a, 0x0f, 0x1c, 0x28, 0x1a, 0x2c, 0x43, 0x2d, 0x16, 0x1b, 0x16, 0x83, 0x1a, 0x22, + 0x11, 0x1a, 0x1c, 0x0d, 0x17, 0x5e, 0x4a, 0x42, 0x50, 0x14, 0x1a, 0x4b, 0x2f, 0x4f, 0x60, 0x11, + 0x08, 0x60, 0x0b, 0x09, 0x0f, 0x1a, 0x20, 0x11, 0x16, 0x20, 0x15, 0x0a, 0x66, 0x06, 0x14, 0x28, + 0x21, 0x18, 0x23, 0x18, 0x12, 0x07, 0x0c, 0x17, 0x20, 0x2c, 0x22, 0x25, 0x40, 0x20, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x1d, 0xff, 0xf3, 0x01, 0xd8, 0x01, 0xe2, 0x02, 0x06, 0x00, 0x52, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x3f, 0x00, 0x00, 0x01, 0xb6, 0x01, 0xd6, 0x02, 0x06, 0x02, 0xf2, 0x00, 0x00, + 0x00, 0x02, 0x00, 0x3f, 0xff, 0x5b, 0x01, 0xd5, 0x01, 0xe0, 0x00, 0x10, 0x00, 0x1d, 0x00, 0x38, + 0xb2, 0x17, 0x53, 0x0c, 0xb8, 0xff, 0xc0, 0x40, 0x09, 0x09, 0x0f, 0x48, 0x0c, 0x1f, 0x03, 0x1d, + 0x51, 0x06, 0xb8, 0xff, 0xc0, 0x40, 0x0f, 0x09, 0x0f, 0x48, 0x06, 0x1e, 0x1a, 0x57, 0x09, 0x0b, + 0x04, 0x0e, 0x14, 0x57, 0x00, 0x07, 0x00, 0x3f, 0xed, 0x3f, 0x3f, 0xed, 0x01, 0x10, 0xd6, 0x2b, + 0xfd, 0xc0, 0x10, 0xd6, 0x2b, 0xed, 0x31, 0x30, 0x05, 0x22, 0x26, 0x27, 0x15, 0x23, 0x11, 0x34, + 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x0e, 0x02, 0x27, 0x16, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, + 0x26, 0x23, 0x22, 0x06, 0x15, 0x01, 0x15, 0x1e, 0x2c, 0x11, 0x7b, 0x64, 0x61, 0x6d, 0x64, 0x19, + 0x30, 0x48, 0x8a, 0x0b, 0x21, 0x16, 0x2b, 0x30, 0x25, 0x2a, 0x20, 0x2e, 0x09, 0x0c, 0x0a, 0xb2, + 0x01, 0xab, 0x63, 0x77, 0x82, 0x73, 0x36, 0x5a, 0x41, 0x23, 0x79, 0x08, 0x09, 0x49, 0x48, 0x45, + 0x43, 0x32, 0x3b, 0x00, 0x00, 0x01, 0x00, 0x2d, 0xff, 0x56, 0x01, 0xd2, 0x01, 0xe2, 0x00, 0x25, + 0x00, 0x4b, 0x40, 0x1b, 0x23, 0x53, 0x00, 0x1c, 0x20, 0x1c, 0x30, 0x1c, 0x40, 0x1c, 0x04, 0x1c, + 0x00, 0x0d, 0x20, 0x0d, 0x30, 0x0d, 0x03, 0x0d, 0x27, 0x50, 0x27, 0x01, 0x14, 0x53, 0x05, 0xb8, + 0xff, 0xc0, 0x40, 0x11, 0x0b, 0x0e, 0x48, 0x05, 0x20, 0x26, 0x17, 0x00, 0x0a, 0x20, 0x1f, 0x0e, + 0x0e, 0x11, 0x57, 0x0a, 0x0b, 0x00, 0x3f, 0xfd, 0xc6, 0x3f, 0xc5, 0x12, 0x39, 0x39, 0x01, 0x10, + 0xc6, 0xd6, 0x2b, 0xed, 0x5d, 0x10, 0xc6, 0x5d, 0xd6, 0x5d, 0xed, 0x31, 0x30, 0x37, 0x2e, 0x03, + 0x35, 0x34, 0x3e, 0x02, 0x33, 0x32, 0x16, 0x17, 0x07, 0x26, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, + 0x16, 0x17, 0x1e, 0x03, 0x15, 0x14, 0x06, 0x07, 0x27, 0x36, 0x36, 0x35, 0x34, 0x26, 0xeb, 0x2b, + 0x46, 0x32, 0x1b, 0x25, 0x45, 0x64, 0x3f, 0x2b, 0x47, 0x22, 0x1e, 0x16, 0x34, 0x21, 0x48, 0x52, + 0x3c, 0x43, 0x30, 0x40, 0x27, 0x11, 0x1b, 0x16, 0x67, 0x0e, 0x0f, 0x30, 0x0d, 0x0a, 0x21, 0x34, + 0x4b, 0x36, 0x34, 0x5a, 0x42, 0x25, 0x0d, 0x0d, 0x61, 0x08, 0x0a, 0x46, 0x43, 0x3b, 0x3c, 0x0f, + 0x0c, 0x1a, 0x21, 0x2b, 0x1d, 0x25, 0x40, 0x20, 0x27, 0x1a, 0x22, 0x11, 0x16, 0x1e, 0x00, 0x00, + 0x00, 0x02, 0x00, 0x1d, 0xff, 0xf3, 0x01, 0xeb, 0x01, 0xd6, 0x00, 0x14, 0x00, 0x27, 0x00, 0x3d, + 0xb2, 0x1a, 0x53, 0x03, 0xb8, 0xff, 0xc0, 0x40, 0x20, 0x09, 0x0c, 0x48, 0x03, 0x80, 0x14, 0x90, + 0x14, 0x02, 0x14, 0x29, 0x23, 0x53, 0x80, 0x0d, 0x90, 0x0d, 0x02, 0x0d, 0x28, 0x00, 0x55, 0x13, + 0x0a, 0x1e, 0x57, 0x12, 0x0a, 0x15, 0x57, 0x08, 0x07, 0x00, 0x3f, 0xed, 0x3f, 0xed, 0x3f, 0xed, + 0x01, 0x10, 0xd6, 0x5d, 0xed, 0x10, 0xd6, 0x5d, 0xd6, 0x2b, 0xed, 0x31, 0x30, 0x01, 0x16, 0x16, + 0x15, 0x14, 0x0e, 0x02, 0x23, 0x22, 0x2e, 0x02, 0x35, 0x34, 0x3e, 0x02, 0x33, 0x33, 0x15, 0x03, + 0x32, 0x3e, 0x02, 0x35, 0x34, 0x26, 0x27, 0x23, 0x22, 0x0e, 0x02, 0x15, 0x14, 0x1e, 0x02, 0x01, + 0x93, 0x17, 0x1a, 0x1a, 0x34, 0x51, 0x37, 0x2f, 0x4d, 0x37, 0x1e, 0x21, 0x3d, 0x57, 0x35, 0xe4, + 0xfd, 0x18, 0x21, 0x15, 0x0a, 0x1a, 0x16, 0x0f, 0x1c, 0x29, 0x1b, 0x0d, 0x0b, 0x15, 0x20, 0x01, + 0x70, 0x23, 0x4f, 0x29, 0x2b, 0x52, 0x3f, 0x26, 0x23, 0x40, 0x5a, 0x37, 0x3a, 0x59, 0x3d, 0x1f, + 0x66, 0xfe, 0xed, 0x15, 0x23, 0x2f, 0x1a, 0x2b, 0x50, 0x17, 0x18, 0x28, 0x35, 0x1c, 0x19, 0x2f, + 0x24, 0x16, 0x00, 0x00, 0x00, 0x01, 0x00, 0x24, 0xff, 0xf5, 0x01, 0xe0, 0x01, 0xd6, 0x00, 0x17, + 0x00, 0x40, 0xb7, 0x00, 0x0f, 0x10, 0x0f, 0x20, 0x0f, 0x03, 0x0f, 0xb8, 0xff, 0xc0, 0x40, 0x0a, + 0x0d, 0x11, 0x48, 0x0f, 0x19, 0x04, 0x05, 0x51, 0x00, 0x01, 0xb8, 0xff, 0xc0, 0x40, 0x0f, 0x0e, + 0x11, 0x48, 0x01, 0x18, 0x0e, 0x09, 0x57, 0x12, 0x07, 0x00, 0x05, 0x55, 0x03, 0x0a, 0x00, 0x3f, + 0xfd, 0xc0, 0x3f, 0xfd, 0xc6, 0x01, 0x10, 0xd6, 0x2b, 0xd5, 0xfd, 0xc5, 0x10, 0xc6, 0x2b, 0x5d, + 0x31, 0x30, 0x13, 0x23, 0x35, 0x21, 0x15, 0x23, 0x15, 0x14, 0x16, 0x33, 0x32, 0x3e, 0x02, 0x37, + 0x17, 0x06, 0x06, 0x23, 0x22, 0x2e, 0x02, 0x35, 0x8b, 0x67, 0x01, 0xa4, 0xc1, 0x29, 0x20, 0x13, + 0x20, 0x1d, 0x1e, 0x11, 0x11, 0x22, 0x50, 0x2c, 0x29, 0x43, 0x30, 0x1b, 0x01, 0x70, 0x66, 0x66, + 0xb4, 0x34, 0x28, 0x03, 0x07, 0x0a, 0x08, 0x69, 0x0f, 0x0f, 0x13, 0x2e, 0x4f, 0x3b, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x33, 0xff, 0xf3, 0x01, 0xbf, 0x01, 0xd6, 0x00, 0x11, 0x00, 0x2c, 0x40, 0x1a, + 0x0c, 0x51, 0x00, 0x0f, 0x01, 0x0f, 0x13, 0x06, 0x51, 0x10, 0x03, 0x20, 0x03, 0x30, 0x03, 0x03, + 0x03, 0x12, 0x0d, 0x0a, 0x05, 0x0a, 0x09, 0x57, 0x00, 0x07, 0x00, 0x3f, 0xed, 0x3f, 0x3f, 0x01, + 0x10, 0xd6, 0x5d, 0xed, 0x10, 0xd6, 0x5d, 0xed, 0x31, 0x30, 0x17, 0x22, 0x26, 0x35, 0x11, 0x33, + 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x35, 0x33, 0x11, 0x14, 0x06, 0xf9, 0x68, 0x5e, 0x7c, + 0x1f, 0x2b, 0x2b, 0x1e, 0x7d, 0x5d, 0x0d, 0x68, 0x70, 0x01, 0x0b, 0xfc, 0x3e, 0x36, 0x36, 0x3e, + 0xfc, 0xfe, 0xf5, 0x70, 0x68, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x18, 0xff, 0x5b, 0x01, 0xdb, + 0x01, 0xd6, 0x00, 0x08, 0x00, 0x11, 0x00, 0x24, 0x00, 0x75, 0x40, 0x51, 0x2f, 0x0e, 0x3f, 0x0e, + 0x02, 0x0e, 0x40, 0x15, 0x18, 0x48, 0x0e, 0x52, 0x60, 0x1f, 0x80, 0x1f, 0x90, 0x1f, 0xa0, 0x1f, + 0x04, 0x1f, 0x26, 0x24, 0x40, 0x11, 0x50, 0x11, 0x60, 0x11, 0x03, 0x11, 0x52, 0x14, 0x80, 0x00, + 0x90, 0x00, 0x02, 0x00, 0x00, 0x25, 0x26, 0x20, 0x03, 0x30, 0x03, 0xc0, 0x03, 0xd0, 0x03, 0x04, + 0x03, 0x52, 0xaf, 0x19, 0xbf, 0x19, 0x02, 0x19, 0x25, 0x08, 0x40, 0x09, 0x01, 0x09, 0x55, 0x24, + 0x06, 0x11, 0x4f, 0x00, 0x01, 0x00, 0x55, 0x1c, 0x0a, 0x14, 0x06, 0x13, 0x0e, 0x00, 0x3f, 0x3f, + 0x3f, 0xed, 0x5d, 0x32, 0x3f, 0xed, 0x5d, 0x32, 0x01, 0x10, 0xd6, 0x5d, 0xed, 0x5d, 0x11, 0x12, + 0x39, 0x2f, 0x5d, 0x33, 0xed, 0x5d, 0x32, 0x10, 0xd6, 0x5d, 0xed, 0x2b, 0x5d, 0x31, 0x30, 0x13, + 0x06, 0x06, 0x15, 0x14, 0x1e, 0x02, 0x17, 0x33, 0x32, 0x3e, 0x02, 0x35, 0x34, 0x26, 0x27, 0x11, + 0x23, 0x35, 0x2e, 0x03, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x0e, 0x02, 0x07, 0xc9, + 0x23, 0x2c, 0x0b, 0x15, 0x1d, 0x12, 0x60, 0x0f, 0x1c, 0x17, 0x0e, 0x2c, 0x24, 0x60, 0x2f, 0x43, + 0x2b, 0x14, 0x71, 0x6d, 0x73, 0x72, 0x13, 0x2b, 0x44, 0x30, 0x01, 0x78, 0x05, 0x40, 0x47, 0x29, + 0x36, 0x22, 0x10, 0x03, 0x10, 0x23, 0x39, 0x29, 0x46, 0x43, 0x02, 0xfd, 0xe3, 0xa3, 0x04, 0x28, + 0x3f, 0x51, 0x2f, 0x73, 0x7a, 0x7a, 0x73, 0x2f, 0x51, 0x3f, 0x28, 0x04, 0xff, 0xff, 0x00, 0x14, + 0x00, 0x00, 0x01, 0xe1, 0x01, 0xd6, 0x02, 0x06, 0x00, 0x5b, 0x00, 0x00, 0x00, 0x01, 0x00, 0x18, + 0xff, 0x5b, 0x01, 0xda, 0x01, 0xd6, 0x00, 0x1f, 0x00, 0x5d, 0x40, 0x3f, 0x2f, 0x06, 0x3f, 0x06, + 0xcf, 0x06, 0xdf, 0x06, 0x04, 0x06, 0x52, 0x80, 0x07, 0x90, 0x07, 0x02, 0x07, 0x21, 0x20, 0x17, + 0x30, 0x17, 0xc0, 0x17, 0xd0, 0x17, 0x04, 0x17, 0x52, 0x16, 0x20, 0x00, 0x40, 0x0e, 0x50, 0x0e, + 0xe0, 0x0e, 0xf0, 0x0e, 0x04, 0x0e, 0x52, 0x1d, 0x90, 0x0f, 0x01, 0x0f, 0x20, 0x17, 0x0a, 0x1e, + 0x00, 0x1d, 0x57, 0x10, 0x07, 0x0f, 0x0e, 0x0d, 0x07, 0x06, 0x0a, 0x00, 0x3f, 0x3f, 0x3f, 0x3f, + 0xfd, 0x32, 0xc5, 0x3f, 0x01, 0x10, 0xd6, 0x5d, 0x32, 0xed, 0x5d, 0x32, 0x10, 0xd6, 0xed, 0x5d, + 0x10, 0xd6, 0x5d, 0xed, 0x5d, 0x31, 0x30, 0x25, 0x32, 0x3e, 0x02, 0x35, 0x35, 0x33, 0x15, 0x14, + 0x0e, 0x02, 0x07, 0x15, 0x23, 0x35, 0x2e, 0x03, 0x35, 0x35, 0x33, 0x15, 0x14, 0x1e, 0x02, 0x33, + 0x11, 0x33, 0x01, 0x29, 0x11, 0x1e, 0x16, 0x0c, 0x60, 0x18, 0x2d, 0x42, 0x2a, 0x60, 0x2a, 0x42, + 0x2d, 0x18, 0x61, 0x0c, 0x15, 0x1e, 0x11, 0x60, 0x52, 0x0c, 0x21, 0x3d, 0x30, 0xea, 0xe0, 0x42, + 0x5e, 0x3e, 0x20, 0x03, 0x9a, 0x9a, 0x03, 0x20, 0x3e, 0x5e, 0x42, 0xe0, 0xea, 0x30, 0x3d, 0x21, + 0x0c, 0x01, 0x13, 0x00, 0x00, 0x01, 0x00, 0x19, 0xff, 0xf7, 0x01, 0xdd, 0x01, 0xe2, 0x00, 0x30, + 0x00, 0x73, 0x40, 0x37, 0x20, 0x0f, 0x30, 0x0f, 0x40, 0x0f, 0xd0, 0x0f, 0x04, 0x0f, 0x52, 0xf0, + 0x06, 0x01, 0x06, 0x00, 0x30, 0x01, 0xc0, 0x30, 0xe0, 0x30, 0x02, 0xaf, 0x30, 0xbf, 0x30, 0x02, + 0x50, 0x30, 0x01, 0x27, 0x30, 0x01, 0x30, 0x52, 0xc0, 0x2f, 0xf0, 0x2f, 0x02, 0x2f, 0x20, 0x26, + 0x30, 0x26, 0x40, 0x26, 0xd0, 0x26, 0x04, 0x26, 0x52, 0x22, 0x1f, 0xb8, 0xff, 0xc0, 0x40, 0x15, + 0x14, 0x1a, 0x48, 0x1f, 0x31, 0x23, 0x22, 0x0b, 0x2b, 0x57, 0x1a, 0x07, 0x30, 0x17, 0x03, 0x57, + 0x14, 0x07, 0x09, 0x0a, 0x0b, 0x00, 0x3f, 0xc5, 0x3f, 0xed, 0xd5, 0xc5, 0x3f, 0xed, 0x3f, 0xc5, + 0x01, 0x10, 0xd6, 0x2b, 0xc5, 0xfd, 0x5d, 0xde, 0x5d, 0xfd, 0x5d, 0x5d, 0x5d, 0x5d, 0x71, 0xde, + 0x5d, 0xed, 0x5d, 0x31, 0x30, 0x25, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x27, 0x37, + 0x1e, 0x03, 0x15, 0x14, 0x0e, 0x02, 0x23, 0x22, 0x26, 0x27, 0x06, 0x06, 0x23, 0x22, 0x2e, 0x02, + 0x35, 0x34, 0x36, 0x37, 0x17, 0x06, 0x06, 0x15, 0x14, 0x1e, 0x02, 0x33, 0x32, 0x36, 0x35, 0x35, + 0x33, 0x01, 0x2b, 0x11, 0x14, 0x0e, 0x14, 0x1e, 0x23, 0x53, 0x15, 0x21, 0x17, 0x0c, 0x0d, 0x1e, + 0x33, 0x26, 0x21, 0x2d, 0x10, 0x10, 0x31, 0x1d, 0x26, 0x32, 0x1f, 0x0d, 0x2d, 0x2c, 0x52, 0x23, + 0x1e, 0x04, 0x09, 0x0d, 0x09, 0x14, 0x11, 0x60, 0xcc, 0x37, 0x38, 0x3e, 0x31, 0x36, 0x82, 0x39, + 0x25, 0x1c, 0x43, 0x48, 0x4a, 0x22, 0x2b, 0x4e, 0x3c, 0x23, 0x24, 0x23, 0x23, 0x24, 0x23, 0x3c, + 0x4e, 0x2b, 0x45, 0x91, 0x3d, 0x25, 0x39, 0x83, 0x36, 0x15, 0x28, 0x1f, 0x12, 0x38, 0x37, 0x4a, + 0xff, 0xff, 0xff, 0xe8, 0x00, 0x00, 0x01, 0xeb, 0x02, 0x80, 0x02, 0x26, 0x00, 0x24, 0x00, 0x00, + 0x01, 0x07, 0x03, 0xd7, 0xff, 0x3d, 0x00, 0x00, 0x00, 0x0d, 0xb9, 0x00, 0x02, 0xff, 0x3d, 0xb4, + 0x19, 0x17, 0x04, 0x0b, 0x50, 0x2b, 0x34, 0x00, 0xff, 0xff, 0xff, 0x7b, 0x00, 0x00, 0x01, 0xcc, + 0x02, 0x80, 0x02, 0x37, 0x03, 0xd7, 0xfe, 0xd0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x28, 0x00, 0x00, + 0xff, 0xff, 0xff, 0x6a, 0x00, 0x00, 0x01, 0xc7, 0x02, 0x80, 0x02, 0x26, 0x00, 0x2b, 0x00, 0x00, + 0x01, 0x07, 0x03, 0xd7, 0xfe, 0xbf, 0x00, 0x00, 0x00, 0x0d, 0xb9, 0x00, 0x01, 0xfe, 0xbf, 0xb4, + 0x0e, 0x0c, 0x06, 0x00, 0x50, 0x2b, 0x34, 0x00, 0xff, 0xff, 0xff, 0x6d, 0x00, 0x00, 0x01, 0xbf, + 0x02, 0x80, 0x02, 0x26, 0x00, 0x2c, 0x00, 0x00, 0x01, 0x07, 0x03, 0xd7, 0xfe, 0xc2, 0x00, 0x00, + 0x00, 0x0d, 0xb9, 0x00, 0x01, 0xfe, 0xc2, 0xb4, 0x0e, 0x0c, 0x00, 0x06, 0x50, 0x2b, 0x34, 0x00, + 0xff, 0xff, 0x00, 0x36, 0x00, 0x00, 0x01, 0xbf, 0x03, 0x2c, 0x02, 0x26, 0x00, 0x2c, 0x00, 0x00, + 0x01, 0x07, 0x00, 0x83, 0x00, 0x00, 0x00, 0x8b, 0x00, 0x17, 0x40, 0x10, 0x02, 0x01, 0x01, 0x0e, + 0x20, 0x00, 0x06, 0x50, 0x02, 0x05, 0x18, 0x4f, 0x01, 0x05, 0x0c, 0x4f, 0x2b, 0x2b, 0x2b, 0x34, + 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x80, 0xff, 0xf3, 0x01, 0xd9, 0x02, 0x80, 0x02, 0x26, + 0x00, 0x32, 0x00, 0x00, 0x01, 0x07, 0x03, 0xd7, 0xfe, 0xd5, 0x00, 0x00, 0x00, 0x0d, 0xb9, 0x00, + 0x02, 0xfe, 0xd5, 0xb4, 0x22, 0x20, 0x14, 0x19, 0x50, 0x2b, 0x34, 0x00, 0xff, 0xff, 0xff, 0x5a, + 0x00, 0x00, 0x01, 0xe8, 0x02, 0x80, 0x02, 0x26, 0x00, 0x3c, 0x00, 0x00, 0x01, 0x07, 0x03, 0xd7, + 0xfe, 0xaf, 0x00, 0x00, 0x00, 0x0d, 0xb9, 0x00, 0x01, 0xfe, 0xaf, 0xb4, 0x17, 0x15, 0x11, 0x06, + 0x50, 0x2b, 0x34, 0x00, 0xff, 0xff, 0x00, 0x0d, 0x00, 0x00, 0x01, 0xe8, 0x03, 0x2c, 0x02, 0x26, + 0x00, 0x3c, 0x00, 0x00, 0x01, 0x07, 0x00, 0x83, 0x00, 0x00, 0x00, 0x8b, 0x00, 0x17, 0x40, 0x10, + 0x02, 0x01, 0x01, 0x17, 0x29, 0x11, 0x06, 0x50, 0x02, 0x05, 0x21, 0x4f, 0x01, 0x05, 0x15, 0x4f, + 0x2b, 0x2b, 0x2b, 0x34, 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x01, 0xeb, + 0x02, 0x80, 0x02, 0x26, 0x03, 0xa8, 0x00, 0x00, 0x01, 0x07, 0x03, 0xd7, 0xfe, 0xd5, 0x00, 0x00, + 0x00, 0x0d, 0xb9, 0x00, 0x01, 0xfe, 0xd5, 0xb4, 0x2a, 0x28, 0x23, 0x0e, 0x50, 0x2b, 0x34, 0x00, + 0xff, 0xff, 0x00, 0x28, 0xff, 0xf6, 0x01, 0xe4, 0x02, 0xdb, 0x02, 0x26, 0x03, 0xa9, 0x00, 0x00, + 0x01, 0x06, 0x03, 0xd6, 0x16, 0x00, 0x00, 0x10, 0x40, 0x0b, 0x02, 0x09, 0x29, 0x27, 0x0a, 0x15, + 0x50, 0x02, 0x0d, 0x28, 0x4f, 0x2b, 0x2b, 0x34, 0xff, 0xff, 0x00, 0x40, 0xff, 0xf3, 0x01, 0xc6, + 0x02, 0xdb, 0x02, 0x26, 0x03, 0xad, 0x00, 0x00, 0x01, 0x06, 0x03, 0xd6, 0x1f, 0x00, 0x00, 0x10, + 0x40, 0x0b, 0x01, 0x15, 0x33, 0x31, 0x21, 0x1a, 0x50, 0x01, 0x2c, 0x32, 0x4f, 0x2b, 0x2b, 0x34, + 0xff, 0xff, 0x00, 0x3f, 0xff, 0x5b, 0x01, 0xb9, 0x02, 0xdb, 0x02, 0x26, 0x03, 0xaf, 0x00, 0x00, + 0x01, 0x06, 0x03, 0xd6, 0x16, 0x00, 0x00, 0x10, 0x40, 0x0b, 0x01, 0x13, 0x16, 0x14, 0x00, 0x07, + 0x50, 0x01, 0x02, 0x15, 0x4f, 0x2b, 0x2b, 0x34, 0xff, 0xff, 0x00, 0x24, 0xff, 0xf5, 0x01, 0xd3, + 0x02, 0xdb, 0x02, 0x26, 0x03, 0xb1, 0x00, 0x00, 0x01, 0x06, 0x03, 0xd6, 0xfd, 0x00, 0x00, 0x13, + 0xb9, 0x00, 0x01, 0xff, 0xfb, 0x40, 0x09, 0x16, 0x14, 0x0a, 0x00, 0x50, 0x01, 0x0b, 0x15, 0x4f, + 0x2b, 0x2b, 0x34, 0x00, 0xff, 0xff, 0x00, 0x24, 0xff, 0xf5, 0x01, 0xd3, 0x02, 0xa1, 0x02, 0x26, + 0x03, 0xb1, 0x00, 0x00, 0x01, 0x06, 0x00, 0x83, 0x00, 0x00, 0x00, 0x17, 0x40, 0x10, 0x02, 0x01, + 0x00, 0x16, 0x28, 0x0a, 0x00, 0x50, 0x02, 0x0b, 0x20, 0x4f, 0x01, 0x0b, 0x14, 0x4f, 0x2b, 0x2b, + 0x2b, 0x34, 0x34, 0x00, 0xff, 0xff, 0x00, 0x24, 0xff, 0xf5, 0x01, 0xd3, 0x02, 0xda, 0x02, 0x26, + 0x03, 0xb1, 0x00, 0x00, 0x01, 0x06, 0x03, 0xd8, 0x00, 0x00, 0x00, 0x21, 0xb2, 0x03, 0x02, 0x01, + 0xb8, 0xff, 0xff, 0x40, 0x11, 0x19, 0x20, 0x0a, 0x00, 0x50, 0x03, 0x0b, 0x2d, 0x4f, 0x02, 0x0b, + 0x22, 0x4f, 0x01, 0x0b, 0x16, 0x4f, 0x2b, 0x2b, 0x2b, 0x2b, 0x34, 0x34, 0x34, 0x00, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x1d, 0xff, 0xf3, 0x01, 0xd8, 0x02, 0xdb, 0x02, 0x26, 0x00, 0x52, 0x00, 0x00, + 0x01, 0x06, 0x03, 0xd6, 0x16, 0x00, 0x00, 0x10, 0x40, 0x0b, 0x02, 0x15, 0x22, 0x20, 0x09, 0x00, + 0x50, 0x02, 0x0e, 0x21, 0x4f, 0x2b, 0x2b, 0x34, 0xff, 0xff, 0x00, 0x33, 0xff, 0xf3, 0x01, 0xbf, + 0x02, 0xa1, 0x02, 0x26, 0x03, 0xbd, 0x00, 0x00, 0x01, 0x06, 0x00, 0x83, 0x00, 0x00, 0x00, 0x17, + 0x40, 0x10, 0x02, 0x01, 0x02, 0x14, 0x26, 0x02, 0x0e, 0x50, 0x02, 0x04, 0x1e, 0x4f, 0x01, 0x04, + 0x12, 0x4f, 0x2b, 0x2b, 0x2b, 0x34, 0x34, 0x00, 0xff, 0xff, 0x00, 0x33, 0xff, 0xf3, 0x01, 0xbf, + 0x02, 0xdb, 0x02, 0x26, 0x03, 0xbd, 0x00, 0x00, 0x01, 0x06, 0x03, 0xd6, 0x0d, 0x00, 0x00, 0x10, + 0x40, 0x0b, 0x01, 0x0d, 0x14, 0x12, 0x02, 0x0e, 0x50, 0x01, 0x04, 0x13, 0x4f, 0x2b, 0x2b, 0x34, + 0xff, 0xff, 0x00, 0x26, 0xff, 0xf3, 0x01, 0xce, 0x02, 0xda, 0x02, 0x26, 0x03, 0xbd, 0x00, 0x00, + 0x01, 0x06, 0x03, 0xd8, 0x00, 0x00, 0x00, 0x1e, 0x40, 0x15, 0x03, 0x02, 0x01, 0x01, 0x17, 0x1e, + 0x02, 0x0e, 0x50, 0x03, 0x04, 0x2b, 0x4f, 0x02, 0x04, 0x20, 0x4f, 0x01, 0x04, 0x14, 0x4f, 0x2b, + 0x2b, 0x2b, 0x2b, 0x34, 0x34, 0x34, 0x00, 0x00, 0xff, 0xff, 0x00, 0x19, 0xff, 0xf7, 0x01, 0xdd, + 0x02, 0xdb, 0x02, 0x26, 0x03, 0xc1, 0x00, 0x00, 0x01, 0x06, 0x03, 0xd6, 0x0d, 0x00, 0x00, 0x10, + 0x40, 0x0b, 0x01, 0x0b, 0x33, 0x31, 0x1e, 0x0e, 0x50, 0x01, 0x0a, 0x32, 0x4f, 0x2b, 0x2b, 0x34, + 0x00, 0x01, 0x00, 0x97, 0x02, 0x08, 0x01, 0x5c, 0x02, 0xdb, 0x00, 0x03, 0x00, 0x10, 0xb5, 0x00, + 0x02, 0x04, 0x03, 0x01, 0x7e, 0x00, 0x3f, 0xcd, 0x01, 0x10, 0xde, 0xcd, 0x31, 0x30, 0x01, 0x07, + 0x27, 0x37, 0x01, 0x5c, 0x81, 0x44, 0x71, 0x02, 0x9b, 0x93, 0x32, 0xa1, 0x00, 0x01, 0x00, 0xab, + 0x01, 0xa2, 0x01, 0x49, 0x02, 0x80, 0x00, 0x03, 0x00, 0x10, 0xb5, 0x00, 0x02, 0x04, 0x01, 0x03, + 0x93, 0x00, 0x3f, 0xcd, 0x01, 0x10, 0xde, 0xcd, 0x31, 0x30, 0x01, 0x07, 0x27, 0x37, 0x01, 0x49, + 0x47, 0x57, 0x31, 0x02, 0x62, 0xc0, 0x16, 0xc8, 0x00, 0x03, 0x00, 0x26, 0x02, 0x00, 0x01, 0xce, + 0x02, 0xda, 0x00, 0x0b, 0x00, 0x17, 0x00, 0x1b, 0x00, 0x2f, 0x40, 0x1a, 0x0c, 0x95, 0x12, 0x18, + 0x1a, 0x00, 0x95, 0x90, 0x06, 0x01, 0x0f, 0x06, 0x01, 0x06, 0x1c, 0x1b, 0x19, 0x7e, 0x0f, 0x96, + 0x15, 0x98, 0x03, 0x96, 0x09, 0x98, 0x00, 0x3f, 0xed, 0x3f, 0xed, 0x3f, 0xcd, 0x01, 0x10, 0xd6, + 0x5d, 0x5d, 0xfd, 0xd6, 0xd5, 0xd4, 0xed, 0x31, 0x30, 0x13, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, + 0x34, 0x36, 0x33, 0x32, 0x16, 0x05, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, + 0x16, 0x27, 0x07, 0x27, 0x37, 0xab, 0x28, 0x1b, 0x1b, 0x27, 0x27, 0x1b, 0x1b, 0x28, 0x01, 0x23, + 0x28, 0x1a, 0x1b, 0x27, 0x27, 0x1b, 0x1a, 0x28, 0x7c, 0x61, 0x3e, 0x4e, 0x02, 0x5d, 0x1f, 0x23, + 0x23, 0x1f, 0x20, 0x22, 0x22, 0x20, 0x1f, 0x23, 0x23, 0x1f, 0x20, 0x22, 0x22, 0x35, 0xb2, 0x1d, + 0xbd, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x28, 0xff, 0xf6, 0x01, 0xe4, 0x02, 0xe6, 0x02, 0x26, + 0x03, 0xa9, 0x00, 0x00, 0x01, 0x06, 0x04, 0x89, 0x00, 0x00, 0x00, 0x13, 0xb9, 0x00, 0x02, 0xff, + 0xf4, 0x40, 0x09, 0x27, 0x32, 0x0a, 0x15, 0x50, 0x02, 0x0d, 0x36, 0x4f, 0x2b, 0x2b, 0x34, 0x00, + 0xff, 0xff, 0x00, 0x28, 0xff, 0xf6, 0x01, 0xe4, 0x02, 0xe6, 0x02, 0x26, 0x03, 0xa9, 0x00, 0x00, + 0x01, 0x06, 0x04, 0xc1, 0x00, 0x00, 0x00, 0x13, 0xb9, 0x00, 0x02, 0xff, 0xf4, 0x40, 0x09, 0x29, + 0x36, 0x0a, 0x15, 0x50, 0x02, 0x0d, 0x27, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0xff, 0xff, 0x00, 0x28, + 0xff, 0xf6, 0x01, 0xe4, 0x02, 0xe6, 0x02, 0x26, 0x03, 0xa9, 0x00, 0x00, 0x01, 0x06, 0x04, 0x96, + 0x12, 0x00, 0x00, 0x17, 0x40, 0x10, 0x03, 0x02, 0x06, 0x2b, 0x28, 0x0a, 0x15, 0x50, 0x03, 0x0d, + 0x3a, 0x4f, 0x02, 0x0d, 0x29, 0x4f, 0x2b, 0x2b, 0x2b, 0x34, 0x34, 0x00, 0xff, 0xff, 0x00, 0x28, + 0xff, 0xf6, 0x01, 0xe4, 0x02, 0xe6, 0x02, 0x26, 0x03, 0xa9, 0x00, 0x00, 0x01, 0x06, 0x04, 0xa3, + 0x00, 0x00, 0x00, 0x1a, 0xb1, 0x03, 0x02, 0xb8, 0xff, 0xf4, 0x40, 0x0d, 0x2d, 0x28, 0x0a, 0x15, + 0x50, 0x03, 0x0d, 0x2b, 0x4f, 0x02, 0x0d, 0x29, 0x4f, 0x2b, 0x2b, 0x2b, 0x34, 0x34, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x28, 0xff, 0xf6, 0x01, 0xe4, 0x02, 0xe6, 0x02, 0x26, 0x03, 0xa9, 0x00, 0x00, + 0x01, 0x06, 0x04, 0x97, 0x12, 0x00, 0x00, 0x17, 0x40, 0x10, 0x03, 0x02, 0x05, 0x2b, 0x27, 0x0a, + 0x15, 0x50, 0x03, 0x0d, 0x3a, 0x4f, 0x02, 0x0d, 0x28, 0x4f, 0x2b, 0x2b, 0x2b, 0x34, 0x34, 0x00, + 0xff, 0xff, 0x00, 0x28, 0xff, 0xf6, 0x01, 0xe4, 0x02, 0xe6, 0x02, 0x26, 0x03, 0xa9, 0x00, 0x00, + 0x01, 0x06, 0x04, 0xa4, 0x12, 0x00, 0x00, 0x17, 0x40, 0x10, 0x03, 0x02, 0x06, 0x2d, 0x27, 0x0a, + 0x15, 0x50, 0x03, 0x0d, 0x2b, 0x4f, 0x02, 0x0d, 0x28, 0x4f, 0x2b, 0x2b, 0x2b, 0x34, 0x34, 0x00, + 0xff, 0xff, 0x00, 0x28, 0xff, 0xf6, 0x01, 0xe4, 0x03, 0x37, 0x02, 0x26, 0x03, 0xa9, 0x00, 0x00, + 0x01, 0x06, 0x04, 0x98, 0x00, 0x00, 0x00, 0x1a, 0xb1, 0x03, 0x02, 0xb8, 0xff, 0xf4, 0x40, 0x0d, + 0x32, 0x3c, 0x0a, 0x15, 0x50, 0x03, 0x0d, 0x4e, 0x4f, 0x02, 0x0d, 0x27, 0x4f, 0x2b, 0x2b, 0x2b, + 0x34, 0x34, 0x00, 0x00, 0xff, 0xff, 0x00, 0x28, 0xff, 0xf6, 0x01, 0xe4, 0x03, 0x37, 0x02, 0x26, + 0x03, 0xa9, 0x00, 0x00, 0x01, 0x06, 0x04, 0xa5, 0x00, 0x00, 0x00, 0x1a, 0xb1, 0x03, 0x02, 0xb8, + 0xff, 0xf4, 0x40, 0x0d, 0x32, 0x3c, 0x0a, 0x15, 0x50, 0x03, 0x0d, 0x3d, 0x4f, 0x02, 0x0d, 0x27, + 0x4f, 0x2b, 0x2b, 0x2b, 0x34, 0x34, 0x00, 0x00, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x01, 0xeb, + 0x02, 0x7f, 0x02, 0x26, 0x00, 0x24, 0x00, 0x00, 0x01, 0x07, 0x04, 0x89, 0xff, 0x35, 0xff, 0x99, + 0x00, 0x0d, 0xb9, 0x00, 0x02, 0xff, 0x35, 0xb4, 0x17, 0x22, 0x04, 0x0b, 0x50, 0x2b, 0x34, 0x00, + 0xff, 0xff, 0xff, 0xcb, 0x00, 0x00, 0x01, 0xeb, 0x02, 0x7f, 0x02, 0x26, 0x00, 0x24, 0x00, 0x00, + 0x01, 0x07, 0x04, 0xc1, 0xff, 0x20, 0xff, 0x99, 0x00, 0x0d, 0xb9, 0x00, 0x02, 0xff, 0x20, 0xb4, + 0x19, 0x26, 0x04, 0x0b, 0x50, 0x2b, 0x34, 0x00, 0xff, 0xff, 0xfe, 0xfb, 0x00, 0x00, 0x01, 0xeb, + 0x02, 0x7f, 0x02, 0x26, 0x00, 0x24, 0x00, 0x00, 0x01, 0x07, 0x04, 0x96, 0xfe, 0xbb, 0xff, 0x99, + 0x00, 0x0f, 0xb1, 0x03, 0x02, 0xb8, 0xfe, 0xbb, 0xb4, 0x1b, 0x18, 0x04, 0x0b, 0x50, 0x2b, 0x34, + 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x17, 0x00, 0x00, 0x01, 0xeb, 0x02, 0x7f, 0x02, 0x26, + 0x00, 0x24, 0x00, 0x00, 0x01, 0x07, 0x04, 0xa3, 0xfe, 0xc8, 0xff, 0x99, 0x00, 0x0f, 0xb1, 0x03, + 0x02, 0xb8, 0xfe, 0xc8, 0xb4, 0x1d, 0x18, 0x04, 0x0b, 0x50, 0x2b, 0x34, 0x34, 0x00, 0x00, 0x00, + 0xff, 0xff, 0xff, 0x36, 0x00, 0x00, 0x01, 0xeb, 0x02, 0x7f, 0x02, 0x26, 0x00, 0x24, 0x00, 0x00, + 0x01, 0x07, 0x04, 0x97, 0xfe, 0xe8, 0xff, 0x99, 0x00, 0x0f, 0xb1, 0x03, 0x02, 0xb8, 0xfe, 0xe8, + 0xb4, 0x1b, 0x17, 0x04, 0x0b, 0x50, 0x2b, 0x34, 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x29, + 0x00, 0x00, 0x01, 0xeb, 0x02, 0x7f, 0x02, 0x26, 0x00, 0x24, 0x00, 0x00, 0x01, 0x07, 0x04, 0xa4, + 0xfe, 0xe1, 0xff, 0x99, 0x00, 0x0f, 0xb1, 0x03, 0x02, 0xb8, 0xfe, 0xe1, 0xb4, 0x1d, 0x17, 0x04, + 0x0b, 0x50, 0x2b, 0x34, 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x77, 0x00, 0x00, 0x01, 0xeb, + 0x02, 0xd0, 0x02, 0x26, 0x00, 0x24, 0x00, 0x00, 0x01, 0x07, 0x04, 0x98, 0xff, 0x09, 0xff, 0x99, + 0x00, 0x0f, 0xb1, 0x03, 0x02, 0xb8, 0xff, 0x09, 0xb4, 0x22, 0x2c, 0x04, 0x0b, 0x50, 0x2b, 0x34, + 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x78, 0x00, 0x00, 0x01, 0xeb, 0x02, 0xd0, 0x02, 0x26, + 0x00, 0x24, 0x00, 0x00, 0x01, 0x07, 0x04, 0xa5, 0xff, 0x0a, 0xff, 0x99, 0x00, 0x0f, 0xb1, 0x03, + 0x02, 0xb8, 0xff, 0x0a, 0xb4, 0x22, 0x2c, 0x04, 0x0b, 0x50, 0x2b, 0x34, 0x34, 0x00, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x40, 0xff, 0xf3, 0x01, 0xc6, 0x02, 0xe6, 0x02, 0x26, 0x03, 0xad, 0x00, 0x00, + 0x01, 0x06, 0x04, 0x89, 0x12, 0x00, 0x00, 0x10, 0x40, 0x0b, 0x01, 0x09, 0x31, 0x3c, 0x21, 0x1a, + 0x50, 0x01, 0x2c, 0x40, 0x4f, 0x2b, 0x2b, 0x34, 0xff, 0xff, 0x00, 0x40, 0xff, 0xf3, 0x01, 0xc6, + 0x02, 0xe6, 0x02, 0x26, 0x03, 0xad, 0x00, 0x00, 0x01, 0x06, 0x04, 0xc1, 0x00, 0x00, 0x00, 0x13, + 0xb9, 0x00, 0x01, 0xff, 0xf7, 0x40, 0x09, 0x33, 0x40, 0x21, 0x1a, 0x50, 0x01, 0x2c, 0x31, 0x4f, + 0x2b, 0x2b, 0x34, 0x00, 0xff, 0xff, 0x00, 0x40, 0xff, 0xf3, 0x01, 0xc6, 0x02, 0xe6, 0x02, 0x26, + 0x03, 0xad, 0x00, 0x00, 0x01, 0x06, 0x04, 0x96, 0x12, 0x00, 0x00, 0x17, 0x40, 0x10, 0x02, 0x01, + 0x09, 0x35, 0x32, 0x21, 0x1a, 0x50, 0x02, 0x2c, 0x44, 0x4f, 0x01, 0x2c, 0x33, 0x4f, 0x2b, 0x2b, + 0x2b, 0x34, 0x34, 0x00, 0xff, 0xff, 0x00, 0x40, 0xff, 0xf3, 0x01, 0xc6, 0x02, 0xe6, 0x02, 0x26, + 0x03, 0xad, 0x00, 0x00, 0x01, 0x06, 0x04, 0xa3, 0x00, 0x00, 0x00, 0x1a, 0xb1, 0x02, 0x01, 0xb8, + 0xff, 0xf7, 0x40, 0x0d, 0x37, 0x32, 0x21, 0x1a, 0x50, 0x02, 0x2c, 0x35, 0x4f, 0x01, 0x2c, 0x33, + 0x4f, 0x2b, 0x2b, 0x2b, 0x34, 0x34, 0x00, 0x00, 0xff, 0xff, 0x00, 0x40, 0xff, 0xf3, 0x01, 0xc6, + 0x02, 0xe6, 0x02, 0x26, 0x03, 0xad, 0x00, 0x00, 0x01, 0x06, 0x04, 0x97, 0x12, 0x00, 0x00, 0x17, + 0x40, 0x10, 0x02, 0x01, 0x08, 0x35, 0x31, 0x21, 0x1a, 0x50, 0x02, 0x2c, 0x44, 0x4f, 0x01, 0x2c, + 0x32, 0x4f, 0x2b, 0x2b, 0x2b, 0x34, 0x34, 0x00, 0xff, 0xff, 0x00, 0x40, 0xff, 0xf3, 0x01, 0xc6, + 0x02, 0xe6, 0x02, 0x26, 0x03, 0xad, 0x00, 0x00, 0x01, 0x06, 0x04, 0xa4, 0x12, 0x00, 0x00, 0x17, + 0x40, 0x10, 0x02, 0x01, 0x09, 0x37, 0x31, 0x21, 0x1a, 0x50, 0x02, 0x2c, 0x35, 0x4f, 0x01, 0x2c, + 0x32, 0x4f, 0x2b, 0x2b, 0x2b, 0x34, 0x34, 0x00, 0xff, 0xff, 0xff, 0x6b, 0x00, 0x00, 0x01, 0xcc, + 0x02, 0x7f, 0x02, 0x26, 0x00, 0x28, 0x00, 0x00, 0x01, 0x07, 0x04, 0x89, 0xfe, 0xc0, 0xff, 0x99, + 0x00, 0x0d, 0xb9, 0x00, 0x01, 0xfe, 0xb5, 0xb4, 0x0c, 0x17, 0x00, 0x0a, 0x50, 0x2b, 0x34, 0x00, + 0xff, 0xff, 0xff, 0x7b, 0x00, 0x00, 0x01, 0xcc, 0x02, 0x7f, 0x02, 0x26, 0x00, 0x28, 0x00, 0x00, + 0x01, 0x07, 0x04, 0xc1, 0xfe, 0xd0, 0xff, 0x99, 0x00, 0x0d, 0xb9, 0x00, 0x01, 0xfe, 0xc5, 0xb4, + 0x0e, 0x1b, 0x00, 0x0a, 0x50, 0x2b, 0x34, 0x00, 0xff, 0xff, 0xfe, 0xa4, 0x00, 0x00, 0x01, 0xcc, + 0x02, 0x7f, 0x02, 0x26, 0x00, 0x28, 0x00, 0x00, 0x01, 0x07, 0x04, 0x96, 0xfe, 0x64, 0xff, 0x99, + 0x00, 0x0f, 0xb1, 0x02, 0x01, 0xb8, 0xfe, 0x59, 0xb4, 0x10, 0x0d, 0x00, 0x0a, 0x50, 0x2b, 0x34, + 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfe, 0xbf, 0x00, 0x00, 0x01, 0xcc, 0x02, 0x7f, 0x02, 0x26, + 0x00, 0x28, 0x00, 0x00, 0x01, 0x07, 0x04, 0xa3, 0xfe, 0x70, 0xff, 0x99, 0x00, 0x0f, 0xb1, 0x02, + 0x01, 0xb8, 0xfe, 0x65, 0xb4, 0x12, 0x0d, 0x00, 0x0a, 0x50, 0x2b, 0x34, 0x34, 0x00, 0x00, 0x00, + 0xff, 0xff, 0xfe, 0xc3, 0x00, 0x00, 0x01, 0xcc, 0x02, 0x7f, 0x02, 0x26, 0x00, 0x28, 0x00, 0x00, + 0x01, 0x07, 0x04, 0x97, 0xfe, 0x75, 0xff, 0x99, 0x00, 0x0f, 0xb1, 0x02, 0x01, 0xb8, 0xfe, 0x69, + 0xb4, 0x10, 0x0c, 0x00, 0x0a, 0x50, 0x2b, 0x34, 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfe, 0xb2, + 0x00, 0x00, 0x01, 0xcc, 0x02, 0x7f, 0x02, 0x26, 0x00, 0x28, 0x00, 0x00, 0x01, 0x07, 0x04, 0xa4, + 0xfe, 0x6a, 0xff, 0x99, 0x00, 0x0f, 0xb1, 0x02, 0x01, 0xb8, 0xfe, 0x5f, 0xb4, 0x12, 0x0c, 0x00, + 0x0a, 0x50, 0x2b, 0x34, 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x3f, 0xff, 0x5b, 0x01, 0xb9, + 0x02, 0xe6, 0x02, 0x26, 0x03, 0xaf, 0x00, 0x00, 0x01, 0x06, 0x04, 0x89, 0x00, 0x00, 0x00, 0x13, + 0xb9, 0x00, 0x01, 0xff, 0xfe, 0x40, 0x09, 0x14, 0x1f, 0x00, 0x07, 0x50, 0x01, 0x02, 0x23, 0x4f, + 0x2b, 0x2b, 0x34, 0x00, 0xff, 0xff, 0x00, 0x3f, 0xff, 0x5b, 0x01, 0xb9, 0x02, 0xe6, 0x02, 0x26, + 0x03, 0xaf, 0x00, 0x00, 0x01, 0x06, 0x04, 0xc1, 0x00, 0x00, 0x00, 0x13, 0xb9, 0x00, 0x01, 0xff, + 0xfe, 0x40, 0x09, 0x16, 0x23, 0x00, 0x07, 0x50, 0x01, 0x02, 0x14, 0x4f, 0x2b, 0x2b, 0x34, 0x00, + 0xff, 0xff, 0x00, 0x3f, 0xff, 0x5b, 0x01, 0xc6, 0x02, 0xe6, 0x02, 0x26, 0x03, 0xaf, 0x00, 0x00, + 0x01, 0x06, 0x04, 0x96, 0x12, 0x00, 0x00, 0x17, 0x40, 0x10, 0x02, 0x01, 0x10, 0x18, 0x15, 0x00, + 0x07, 0x50, 0x02, 0x02, 0x27, 0x4f, 0x01, 0x02, 0x16, 0x4f, 0x2b, 0x2b, 0x2b, 0x34, 0x34, 0x00, + 0xff, 0xff, 0x00, 0x3f, 0xff, 0x5b, 0x01, 0xb9, 0x02, 0xe6, 0x02, 0x26, 0x03, 0xaf, 0x00, 0x00, + 0x01, 0x06, 0x04, 0xa3, 0x00, 0x00, 0x00, 0x1a, 0xb1, 0x02, 0x01, 0xb8, 0xff, 0xfe, 0x40, 0x0d, + 0x1a, 0x15, 0x00, 0x07, 0x50, 0x02, 0x02, 0x18, 0x4f, 0x01, 0x02, 0x16, 0x4f, 0x2b, 0x2b, 0x2b, + 0x34, 0x34, 0x00, 0x00, 0xff, 0xff, 0x00, 0x3f, 0xff, 0x5b, 0x01, 0xb9, 0x02, 0xe6, 0x02, 0x26, + 0x03, 0xaf, 0x00, 0x00, 0x01, 0x06, 0x04, 0x97, 0x12, 0x00, 0x00, 0x17, 0x40, 0x10, 0x02, 0x01, + 0x0f, 0x18, 0x14, 0x00, 0x07, 0x50, 0x02, 0x02, 0x27, 0x4f, 0x01, 0x02, 0x15, 0x4f, 0x2b, 0x2b, + 0x2b, 0x34, 0x34, 0x00, 0xff, 0xff, 0x00, 0x3f, 0xff, 0x5b, 0x01, 0xbe, 0x02, 0xe6, 0x02, 0x26, + 0x03, 0xaf, 0x00, 0x00, 0x01, 0x06, 0x04, 0xa4, 0x12, 0x00, 0x00, 0x17, 0x40, 0x10, 0x02, 0x01, + 0x10, 0x1a, 0x14, 0x00, 0x07, 0x50, 0x02, 0x02, 0x18, 0x4f, 0x01, 0x02, 0x15, 0x4f, 0x2b, 0x2b, + 0x2b, 0x34, 0x34, 0x00, 0xff, 0xff, 0x00, 0x3f, 0xff, 0x5b, 0x01, 0xb9, 0x03, 0x37, 0x02, 0x26, + 0x03, 0xaf, 0x00, 0x00, 0x01, 0x06, 0x04, 0x98, 0x00, 0x00, 0x00, 0x1a, 0xb1, 0x02, 0x01, 0xb8, + 0xff, 0xfe, 0x40, 0x0d, 0x1f, 0x29, 0x00, 0x07, 0x50, 0x02, 0x02, 0x3b, 0x4f, 0x01, 0x02, 0x14, + 0x4f, 0x2b, 0x2b, 0x2b, 0x34, 0x34, 0x00, 0x00, 0xff, 0xff, 0x00, 0x3f, 0xff, 0x5b, 0x01, 0xb9, + 0x03, 0x37, 0x02, 0x26, 0x03, 0xaf, 0x00, 0x00, 0x01, 0x06, 0x04, 0xa5, 0x00, 0x00, 0x00, 0x1a, + 0xb1, 0x02, 0x01, 0xb8, 0xff, 0xfe, 0x40, 0x0d, 0x1f, 0x29, 0x00, 0x07, 0x50, 0x02, 0x02, 0x2a, + 0x4f, 0x01, 0x02, 0x14, 0x4f, 0x2b, 0x2b, 0x2b, 0x34, 0x34, 0x00, 0x00, 0xff, 0xff, 0xff, 0x5a, + 0x00, 0x00, 0x01, 0xc7, 0x02, 0x7f, 0x02, 0x26, 0x00, 0x2b, 0x00, 0x00, 0x01, 0x07, 0x04, 0x89, + 0xfe, 0xaf, 0xff, 0x99, 0x00, 0x0d, 0xb9, 0x00, 0x01, 0xfe, 0xaf, 0xb4, 0x0c, 0x17, 0x06, 0x00, + 0x50, 0x2b, 0x34, 0x00, 0xff, 0xff, 0xff, 0x66, 0x00, 0x00, 0x01, 0xc7, 0x02, 0x7f, 0x02, 0x26, + 0x00, 0x2b, 0x00, 0x00, 0x01, 0x07, 0x04, 0xc1, 0xfe, 0xbb, 0xff, 0x99, 0x00, 0x0d, 0xb9, 0x00, + 0x01, 0xfe, 0xbb, 0xb4, 0x0e, 0x1b, 0x06, 0x00, 0x50, 0x2b, 0x34, 0x00, 0xff, 0xff, 0xfe, 0x90, + 0x00, 0x00, 0x01, 0xc7, 0x02, 0x7f, 0x02, 0x26, 0x00, 0x2b, 0x00, 0x00, 0x01, 0x07, 0x04, 0x96, + 0xfe, 0x50, 0xff, 0x99, 0x00, 0x0f, 0xb1, 0x02, 0x01, 0xb8, 0xfe, 0x50, 0xb4, 0x10, 0x0d, 0x06, + 0x00, 0x50, 0x2b, 0x34, 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfe, 0xad, 0x00, 0x00, 0x01, 0xc7, + 0x02, 0x7f, 0x02, 0x26, 0x00, 0x2b, 0x00, 0x00, 0x01, 0x07, 0x04, 0xa3, 0xfe, 0x5e, 0xff, 0x99, + 0x00, 0x0f, 0xb1, 0x02, 0x01, 0xb8, 0xfe, 0x5e, 0xb4, 0x12, 0x0d, 0x06, 0x00, 0x50, 0x2b, 0x34, + 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfe, 0xb0, 0x00, 0x00, 0x01, 0xc7, 0x02, 0x7f, 0x02, 0x26, + 0x00, 0x2b, 0x00, 0x00, 0x01, 0x07, 0x04, 0x97, 0xfe, 0x62, 0xff, 0x99, 0x00, 0x0f, 0xb1, 0x02, + 0x01, 0xb8, 0xfe, 0x62, 0xb4, 0x10, 0x0c, 0x06, 0x00, 0x50, 0x2b, 0x34, 0x34, 0x00, 0x00, 0x00, + 0xff, 0xff, 0xfe, 0x9e, 0x00, 0x00, 0x01, 0xc7, 0x02, 0x7f, 0x02, 0x26, 0x00, 0x2b, 0x00, 0x00, + 0x01, 0x07, 0x04, 0xa4, 0xfe, 0x56, 0xff, 0x99, 0x00, 0x0f, 0xb1, 0x02, 0x01, 0xb8, 0xfe, 0x56, + 0xb4, 0x12, 0x0c, 0x06, 0x00, 0x50, 0x2b, 0x34, 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfe, 0xf6, + 0x00, 0x00, 0x01, 0xc7, 0x02, 0xd0, 0x02, 0x26, 0x00, 0x2b, 0x00, 0x00, 0x01, 0x07, 0x04, 0x98, + 0xfe, 0x88, 0xff, 0x99, 0x00, 0x0f, 0xb1, 0x02, 0x01, 0xb8, 0xfe, 0x88, 0xb4, 0x17, 0x21, 0x06, + 0x00, 0x50, 0x2b, 0x34, 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfe, 0xf6, 0x00, 0x00, 0x01, 0xc7, + 0x02, 0xd0, 0x02, 0x26, 0x00, 0x2b, 0x00, 0x00, 0x01, 0x07, 0x04, 0xa5, 0xfe, 0x88, 0xff, 0x99, + 0x00, 0x0f, 0xb1, 0x02, 0x01, 0xb8, 0xfe, 0x88, 0xb4, 0x17, 0x21, 0x06, 0x00, 0x50, 0x2b, 0x34, + 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x24, 0xff, 0xf5, 0x01, 0xd3, 0x02, 0xe6, 0x02, 0x26, + 0x03, 0xb1, 0x00, 0x00, 0x01, 0x06, 0x04, 0x89, 0x00, 0x00, 0x00, 0x13, 0xb9, 0x00, 0x01, 0xff, + 0xff, 0x40, 0x09, 0x14, 0x1f, 0x0a, 0x00, 0x50, 0x01, 0x0b, 0x23, 0x4f, 0x2b, 0x2b, 0x34, 0x00, + 0xff, 0xff, 0x00, 0x24, 0xff, 0xf5, 0x01, 0xd3, 0x02, 0xe6, 0x02, 0x26, 0x03, 0xb1, 0x00, 0x00, + 0x01, 0x06, 0x04, 0xc1, 0x00, 0x00, 0x00, 0x13, 0xb9, 0x00, 0x01, 0xff, 0xff, 0x40, 0x09, 0x16, + 0x23, 0x0a, 0x00, 0x50, 0x01, 0x0b, 0x14, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0xff, 0xff, 0x00, 0x24, + 0xff, 0xf5, 0x01, 0xd3, 0x02, 0xe6, 0x02, 0x26, 0x03, 0xb1, 0x00, 0x00, 0x01, 0x06, 0x04, 0x96, + 0x12, 0x00, 0x00, 0x17, 0x40, 0x10, 0x02, 0x01, 0x10, 0x18, 0x15, 0x0a, 0x00, 0x50, 0x02, 0x0b, + 0x27, 0x4f, 0x01, 0x0b, 0x16, 0x4f, 0x2b, 0x2b, 0x2b, 0x34, 0x34, 0x00, 0xff, 0xff, 0x00, 0x24, + 0xff, 0xf5, 0x01, 0xd3, 0x02, 0xe6, 0x02, 0x26, 0x03, 0xb1, 0x00, 0x00, 0x01, 0x06, 0x04, 0xa3, + 0x00, 0x00, 0x00, 0x1a, 0xb1, 0x02, 0x01, 0xb8, 0xff, 0xff, 0x40, 0x0d, 0x1a, 0x15, 0x0a, 0x00, + 0x50, 0x02, 0x0b, 0x18, 0x4f, 0x01, 0x0b, 0x16, 0x4f, 0x2b, 0x2b, 0x2b, 0x34, 0x34, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x24, 0xff, 0xf5, 0x01, 0xd3, 0x02, 0xe6, 0x02, 0x26, 0x03, 0xb1, 0x00, 0x00, + 0x01, 0x06, 0x04, 0x97, 0x12, 0x00, 0x00, 0x17, 0x40, 0x10, 0x02, 0x01, 0x10, 0x18, 0x14, 0x0a, + 0x00, 0x50, 0x02, 0x0b, 0x27, 0x4f, 0x01, 0x0b, 0x15, 0x4f, 0x2b, 0x2b, 0x2b, 0x34, 0x34, 0x00, + 0xff, 0xff, 0x00, 0x24, 0xff, 0xf5, 0x01, 0xd3, 0x02, 0xe6, 0x02, 0x26, 0x03, 0xb1, 0x00, 0x00, + 0x01, 0x06, 0x04, 0xa4, 0x12, 0x00, 0x00, 0x17, 0x40, 0x10, 0x02, 0x01, 0x10, 0x1a, 0x14, 0x0a, + 0x00, 0x50, 0x02, 0x0b, 0x18, 0x4f, 0x01, 0x0b, 0x15, 0x4f, 0x2b, 0x2b, 0x2b, 0x34, 0x34, 0x00, + 0xff, 0xff, 0x00, 0x24, 0xff, 0xf5, 0x01, 0xd3, 0x03, 0x37, 0x02, 0x26, 0x03, 0xb1, 0x00, 0x00, + 0x01, 0x06, 0x04, 0x98, 0x00, 0x00, 0x00, 0x1a, 0xb1, 0x02, 0x01, 0xb8, 0xff, 0xff, 0x40, 0x0d, + 0x1f, 0x29, 0x0a, 0x00, 0x50, 0x02, 0x0b, 0x3b, 0x4f, 0x01, 0x0b, 0x14, 0x4f, 0x2b, 0x2b, 0x2b, + 0x34, 0x34, 0x00, 0x00, 0xff, 0xff, 0x00, 0x24, 0xff, 0xf5, 0x01, 0xd3, 0x03, 0x37, 0x02, 0x26, + 0x03, 0xb1, 0x00, 0x00, 0x01, 0x06, 0x04, 0xa5, 0x00, 0x00, 0x00, 0x1a, 0xb1, 0x02, 0x01, 0xb8, + 0xff, 0xff, 0x40, 0x0d, 0x1f, 0x29, 0x0a, 0x00, 0x50, 0x02, 0x0b, 0x2a, 0x4f, 0x01, 0x0b, 0x14, + 0x4f, 0x2b, 0x2b, 0x2b, 0x34, 0x34, 0x00, 0x00, 0xff, 0xff, 0xff, 0x64, 0x00, 0x00, 0x01, 0xbf, + 0x02, 0x7f, 0x02, 0x26, 0x00, 0x2c, 0x00, 0x00, 0x01, 0x07, 0x04, 0x89, 0xfe, 0xb9, 0xff, 0x99, + 0x00, 0x0d, 0xb9, 0x00, 0x01, 0xfe, 0xb9, 0xb4, 0x0c, 0x17, 0x00, 0x06, 0x50, 0x2b, 0x34, 0x00, + 0xff, 0xff, 0xff, 0x60, 0x00, 0x00, 0x01, 0xbf, 0x02, 0x7f, 0x02, 0x26, 0x00, 0x2c, 0x00, 0x00, + 0x01, 0x07, 0x04, 0xc1, 0xfe, 0xb5, 0xff, 0x99, 0x00, 0x0d, 0xb9, 0x00, 0x01, 0xfe, 0xb5, 0xb4, + 0x0e, 0x1b, 0x00, 0x06, 0x50, 0x2b, 0x34, 0x00, 0xff, 0xff, 0xfe, 0x99, 0x00, 0x00, 0x01, 0xbf, + 0x02, 0x7f, 0x02, 0x26, 0x00, 0x2c, 0x00, 0x00, 0x01, 0x07, 0x04, 0x96, 0xfe, 0x59, 0xff, 0x99, + 0x00, 0x0f, 0xb1, 0x02, 0x01, 0xb8, 0xfe, 0x59, 0xb4, 0x10, 0x0d, 0x00, 0x06, 0x50, 0x2b, 0x34, + 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfe, 0xb5, 0x00, 0x00, 0x01, 0xbf, 0x02, 0x7f, 0x02, 0x26, + 0x00, 0x2c, 0x00, 0x00, 0x01, 0x07, 0x04, 0xa3, 0xfe, 0x66, 0xff, 0x99, 0x00, 0x0f, 0xb1, 0x02, + 0x01, 0xb8, 0xfe, 0x66, 0xb4, 0x12, 0x0d, 0x00, 0x06, 0x50, 0x2b, 0x34, 0x34, 0x00, 0x00, 0x00, + 0xff, 0xff, 0xfe, 0xb9, 0x00, 0x00, 0x01, 0xbf, 0x02, 0x7f, 0x02, 0x26, 0x00, 0x2c, 0x00, 0x00, + 0x01, 0x07, 0x04, 0x97, 0xfe, 0x6b, 0xff, 0x99, 0x00, 0x0f, 0xb1, 0x02, 0x01, 0xb8, 0xfe, 0x6a, + 0xb4, 0x10, 0x0c, 0x00, 0x06, 0x50, 0x2b, 0x34, 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfe, 0xa7, + 0x00, 0x00, 0x01, 0xbf, 0x02, 0x7f, 0x02, 0x26, 0x00, 0x2c, 0x00, 0x00, 0x01, 0x07, 0x04, 0xa4, + 0xfe, 0x5f, 0xff, 0x99, 0x00, 0x0f, 0xb1, 0x02, 0x01, 0xb8, 0xfe, 0x5f, 0xb4, 0x12, 0x0c, 0x00, + 0x06, 0x50, 0x2b, 0x34, 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfe, 0xfe, 0x00, 0x00, 0x01, 0xbf, + 0x02, 0xd0, 0x02, 0x26, 0x00, 0x2c, 0x00, 0x00, 0x01, 0x07, 0x04, 0x98, 0xfe, 0x90, 0xff, 0x99, + 0x00, 0x0f, 0xb1, 0x02, 0x01, 0xb8, 0xfe, 0x90, 0xb4, 0x17, 0x21, 0x00, 0x06, 0x50, 0x2b, 0x34, + 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfe, 0xff, 0x00, 0x00, 0x01, 0xbf, 0x02, 0xd0, 0x02, 0x26, + 0x00, 0x2c, 0x00, 0x00, 0x01, 0x07, 0x04, 0xa5, 0xfe, 0x91, 0xff, 0x99, 0x00, 0x0f, 0xb1, 0x02, + 0x01, 0xb8, 0xfe, 0x91, 0xb4, 0x17, 0x21, 0x00, 0x06, 0x50, 0x2b, 0x34, 0x34, 0x00, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x1d, 0xff, 0xf3, 0x01, 0xd8, 0x02, 0xe6, 0x02, 0x26, 0x00, 0x52, 0x00, 0x00, + 0x01, 0x06, 0x04, 0x89, 0x00, 0x00, 0x00, 0x10, 0x40, 0x0b, 0x02, 0x00, 0x20, 0x2b, 0x09, 0x00, + 0x50, 0x02, 0x0e, 0x2f, 0x4f, 0x2b, 0x2b, 0x34, 0xff, 0xff, 0x00, 0x1d, 0xff, 0xf3, 0x01, 0xd8, + 0x02, 0xe6, 0x02, 0x26, 0x00, 0x52, 0x00, 0x00, 0x01, 0x06, 0x04, 0xc1, 0x00, 0x00, 0x00, 0x10, + 0x40, 0x0b, 0x02, 0x00, 0x22, 0x2f, 0x09, 0x00, 0x50, 0x02, 0x0e, 0x20, 0x4f, 0x2b, 0x2b, 0x34, + 0xff, 0xff, 0x00, 0x1d, 0xff, 0xf3, 0x01, 0xd8, 0x02, 0xe6, 0x02, 0x26, 0x00, 0x52, 0x00, 0x00, + 0x01, 0x06, 0x04, 0x96, 0x12, 0x00, 0x00, 0x17, 0x40, 0x10, 0x03, 0x02, 0x11, 0x24, 0x21, 0x09, + 0x00, 0x50, 0x03, 0x0e, 0x33, 0x4f, 0x02, 0x0e, 0x22, 0x4f, 0x2b, 0x2b, 0x2b, 0x34, 0x34, 0x00, + 0xff, 0xff, 0x00, 0x1d, 0xff, 0xf3, 0x01, 0xd8, 0x02, 0xe6, 0x02, 0x26, 0x00, 0x52, 0x00, 0x00, + 0x01, 0x06, 0x04, 0xa3, 0x00, 0x00, 0x00, 0x17, 0x40, 0x10, 0x03, 0x02, 0x00, 0x26, 0x21, 0x09, + 0x00, 0x50, 0x03, 0x0e, 0x24, 0x4f, 0x02, 0x0e, 0x22, 0x4f, 0x2b, 0x2b, 0x2b, 0x34, 0x34, 0x00, + 0xff, 0xff, 0x00, 0x1d, 0xff, 0xf3, 0x01, 0xd8, 0x02, 0xe6, 0x02, 0x26, 0x00, 0x52, 0x00, 0x00, + 0x01, 0x06, 0x04, 0x97, 0x12, 0x00, 0x00, 0x17, 0x40, 0x10, 0x03, 0x02, 0x11, 0x24, 0x20, 0x09, + 0x00, 0x50, 0x03, 0x0e, 0x33, 0x4f, 0x02, 0x0e, 0x21, 0x4f, 0x2b, 0x2b, 0x2b, 0x34, 0x34, 0x00, + 0xff, 0xff, 0x00, 0x1d, 0xff, 0xf3, 0x01, 0xd8, 0x02, 0xe6, 0x02, 0x26, 0x00, 0x52, 0x00, 0x00, + 0x01, 0x06, 0x04, 0xa4, 0x12, 0x00, 0x00, 0x17, 0x40, 0x10, 0x03, 0x02, 0x11, 0x26, 0x20, 0x09, + 0x00, 0x50, 0x03, 0x0e, 0x24, 0x4f, 0x02, 0x0e, 0x21, 0x4f, 0x2b, 0x2b, 0x2b, 0x34, 0x34, 0x00, + 0xff, 0xff, 0xff, 0x7d, 0xff, 0xf3, 0x01, 0xd9, 0x02, 0x7f, 0x02, 0x26, 0x00, 0x32, 0x00, 0x00, + 0x01, 0x07, 0x04, 0x89, 0xfe, 0xd2, 0xff, 0x99, 0x00, 0x0d, 0xb9, 0x00, 0x02, 0xfe, 0xd2, 0xb4, + 0x20, 0x2b, 0x14, 0x19, 0x50, 0x2b, 0x34, 0x00, 0xff, 0xff, 0xff, 0x60, 0xff, 0xf3, 0x01, 0xd9, + 0x02, 0x7f, 0x02, 0x26, 0x00, 0x32, 0x00, 0x00, 0x01, 0x07, 0x04, 0xc1, 0xfe, 0xb5, 0xff, 0x99, + 0x00, 0x0d, 0xb9, 0x00, 0x02, 0xfe, 0xb5, 0xb4, 0x22, 0x2f, 0x14, 0x19, 0x50, 0x2b, 0x34, 0x00, + 0xff, 0xff, 0xfe, 0x99, 0xff, 0xf3, 0x01, 0xd9, 0x02, 0x7f, 0x02, 0x26, 0x00, 0x32, 0x00, 0x00, + 0x01, 0x07, 0x04, 0x96, 0xfe, 0x59, 0xff, 0x99, 0x00, 0x0f, 0xb1, 0x03, 0x02, 0xb8, 0xfe, 0x59, + 0xb4, 0x24, 0x21, 0x14, 0x19, 0x50, 0x2b, 0x34, 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfe, 0xb5, + 0xff, 0xf3, 0x01, 0xd9, 0x02, 0x7f, 0x02, 0x26, 0x00, 0x32, 0x00, 0x00, 0x01, 0x07, 0x04, 0xa3, + 0xfe, 0x66, 0xff, 0x99, 0x00, 0x0f, 0xb1, 0x03, 0x02, 0xb8, 0xfe, 0x66, 0xb4, 0x26, 0x21, 0x14, + 0x19, 0x50, 0x2b, 0x34, 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfe, 0xcf, 0xff, 0xf3, 0x01, 0xd9, + 0x02, 0x7f, 0x02, 0x26, 0x00, 0x32, 0x00, 0x00, 0x01, 0x07, 0x04, 0x97, 0xfe, 0x81, 0xff, 0x99, + 0x00, 0x0f, 0xb1, 0x03, 0x02, 0xb8, 0xfe, 0x81, 0xb4, 0x24, 0x20, 0x14, 0x19, 0x50, 0x2b, 0x34, + 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfe, 0xba, 0xff, 0xf3, 0x01, 0xd9, 0x02, 0x7f, 0x02, 0x26, + 0x00, 0x32, 0x00, 0x00, 0x01, 0x07, 0x04, 0xa4, 0xfe, 0x72, 0xff, 0x99, 0x00, 0x0f, 0xb1, 0x03, + 0x02, 0xb8, 0xfe, 0x72, 0xb4, 0x26, 0x20, 0x14, 0x19, 0x50, 0x2b, 0x34, 0x34, 0x00, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x33, 0xff, 0xf3, 0x01, 0xbf, 0x02, 0xe6, 0x02, 0x26, 0x03, 0xbd, 0x00, 0x00, + 0x01, 0x06, 0x04, 0x89, 0x00, 0x00, 0x00, 0x10, 0x40, 0x0b, 0x01, 0x01, 0x12, 0x1d, 0x02, 0x0e, + 0x50, 0x01, 0x04, 0x21, 0x4f, 0x2b, 0x2b, 0x34, 0xff, 0xff, 0x00, 0x33, 0xff, 0xf3, 0x01, 0xbf, + 0x02, 0xe6, 0x02, 0x26, 0x03, 0xbd, 0x00, 0x00, 0x01, 0x06, 0x04, 0xc1, 0x00, 0x00, 0x00, 0x10, + 0x40, 0x0b, 0x01, 0x01, 0x14, 0x21, 0x02, 0x0e, 0x50, 0x01, 0x04, 0x12, 0x4f, 0x2b, 0x2b, 0x34, + 0xff, 0xff, 0x00, 0x33, 0xff, 0xf3, 0x01, 0xc6, 0x02, 0xe6, 0x02, 0x26, 0x03, 0xbd, 0x00, 0x00, + 0x01, 0x06, 0x04, 0x96, 0x12, 0x00, 0x00, 0x17, 0x40, 0x10, 0x02, 0x01, 0x13, 0x16, 0x13, 0x02, + 0x0e, 0x50, 0x02, 0x04, 0x25, 0x4f, 0x01, 0x04, 0x14, 0x4f, 0x2b, 0x2b, 0x2b, 0x34, 0x34, 0x00, + 0xff, 0xff, 0x00, 0x33, 0xff, 0xf3, 0x01, 0xbf, 0x02, 0xe6, 0x02, 0x26, 0x03, 0xbd, 0x00, 0x00, + 0x01, 0x06, 0x04, 0xa3, 0x00, 0x00, 0x00, 0x17, 0x40, 0x10, 0x02, 0x01, 0x01, 0x18, 0x13, 0x02, + 0x0e, 0x50, 0x02, 0x04, 0x16, 0x4f, 0x01, 0x04, 0x14, 0x4f, 0x2b, 0x2b, 0x2b, 0x34, 0x34, 0x00, + 0xff, 0xff, 0x00, 0x33, 0xff, 0xf3, 0x01, 0xbf, 0x02, 0xe6, 0x02, 0x26, 0x03, 0xbd, 0x00, 0x00, + 0x01, 0x06, 0x04, 0x97, 0x12, 0x00, 0x00, 0x17, 0x40, 0x10, 0x02, 0x01, 0x12, 0x16, 0x12, 0x02, + 0x0e, 0x50, 0x02, 0x04, 0x25, 0x4f, 0x01, 0x04, 0x13, 0x4f, 0x2b, 0x2b, 0x2b, 0x34, 0x34, 0x00, + 0xff, 0xff, 0x00, 0x33, 0xff, 0xf3, 0x01, 0xbf, 0x02, 0xe6, 0x02, 0x26, 0x03, 0xbd, 0x00, 0x00, + 0x01, 0x06, 0x04, 0xa4, 0x12, 0x00, 0x00, 0x17, 0x40, 0x10, 0x02, 0x01, 0x13, 0x18, 0x12, 0x02, + 0x0e, 0x50, 0x02, 0x04, 0x16, 0x4f, 0x01, 0x04, 0x13, 0x4f, 0x2b, 0x2b, 0x2b, 0x34, 0x34, 0x00, + 0xff, 0xff, 0x00, 0x33, 0xff, 0xf3, 0x01, 0xbf, 0x03, 0x37, 0x02, 0x26, 0x03, 0xbd, 0x00, 0x00, + 0x01, 0x06, 0x04, 0x98, 0x00, 0x00, 0x00, 0x17, 0x40, 0x10, 0x02, 0x01, 0x01, 0x1d, 0x27, 0x02, + 0x0e, 0x50, 0x02, 0x04, 0x39, 0x4f, 0x01, 0x04, 0x12, 0x4f, 0x2b, 0x2b, 0x2b, 0x34, 0x34, 0x00, + 0xff, 0xff, 0x00, 0x33, 0xff, 0xf3, 0x01, 0xbf, 0x03, 0x37, 0x02, 0x26, 0x03, 0xbd, 0x00, 0x00, + 0x01, 0x06, 0x04, 0xa5, 0x00, 0x00, 0x00, 0x17, 0x40, 0x10, 0x02, 0x01, 0x01, 0x1d, 0x27, 0x02, + 0x0e, 0x50, 0x02, 0x04, 0x28, 0x4f, 0x01, 0x04, 0x12, 0x4f, 0x2b, 0x2b, 0x2b, 0x34, 0x34, 0x00, + 0xff, 0xff, 0xff, 0x72, 0x00, 0x00, 0x01, 0xe8, 0x02, 0x7f, 0x02, 0x26, 0x00, 0x3c, 0x00, 0x00, + 0x01, 0x07, 0x04, 0xc1, 0xfe, 0xc7, 0xff, 0x99, 0x00, 0x0d, 0xb9, 0x00, 0x01, 0xfe, 0xc7, 0xb4, + 0x17, 0x24, 0x11, 0x06, 0x50, 0x2b, 0x34, 0x00, 0xff, 0xff, 0xfe, 0xc7, 0x00, 0x00, 0x01, 0xe8, + 0x02, 0x7f, 0x02, 0x26, 0x00, 0x3c, 0x00, 0x00, 0x01, 0x07, 0x04, 0xa3, 0xfe, 0x78, 0xff, 0x99, + 0x00, 0x0f, 0xb1, 0x02, 0x01, 0xb8, 0xfe, 0x78, 0xb4, 0x1b, 0x16, 0x11, 0x06, 0x50, 0x2b, 0x34, + 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfe, 0x9a, 0x00, 0x00, 0x01, 0xe8, 0x02, 0x7f, 0x02, 0x26, + 0x00, 0x3c, 0x00, 0x00, 0x01, 0x07, 0x04, 0xa4, 0xfe, 0x52, 0xff, 0x99, 0x00, 0x0f, 0xb1, 0x02, + 0x01, 0xb8, 0xfe, 0x52, 0xb4, 0x1b, 0x15, 0x11, 0x06, 0x50, 0x2b, 0x34, 0x34, 0x00, 0x00, 0x00, + 0xff, 0xff, 0xfe, 0xdb, 0x00, 0x00, 0x01, 0xe8, 0x02, 0xd0, 0x02, 0x26, 0x00, 0x3c, 0x00, 0x00, + 0x01, 0x07, 0x04, 0xa5, 0xfe, 0x6d, 0xff, 0x99, 0x00, 0x0f, 0xb1, 0x02, 0x01, 0xb8, 0xfe, 0x6d, + 0xb4, 0x20, 0x2a, 0x11, 0x06, 0x50, 0x2b, 0x34, 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x19, + 0xff, 0xf7, 0x01, 0xdd, 0x02, 0xe6, 0x02, 0x26, 0x03, 0xc1, 0x00, 0x00, 0x01, 0x06, 0x04, 0x89, + 0x00, 0x00, 0x00, 0x13, 0xb9, 0x00, 0x01, 0xff, 0xff, 0x40, 0x09, 0x31, 0x3c, 0x1e, 0x0e, 0x50, + 0x01, 0x0a, 0x40, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0xff, 0xff, 0x00, 0x19, 0xff, 0xf7, 0x01, 0xdd, + 0x02, 0xe6, 0x02, 0x26, 0x03, 0xc1, 0x00, 0x00, 0x01, 0x06, 0x04, 0xc1, 0x00, 0x00, 0x00, 0x13, + 0xb9, 0x00, 0x01, 0xff, 0xff, 0x40, 0x09, 0x33, 0x40, 0x1e, 0x0e, 0x50, 0x01, 0x0a, 0x31, 0x4f, + 0x2b, 0x2b, 0x34, 0x00, 0xff, 0xff, 0x00, 0x19, 0xff, 0xf7, 0x01, 0xdd, 0x02, 0xe6, 0x02, 0x26, + 0x03, 0xc1, 0x00, 0x00, 0x01, 0x06, 0x04, 0x96, 0x12, 0x00, 0x00, 0x17, 0x40, 0x10, 0x02, 0x01, + 0x11, 0x35, 0x32, 0x1e, 0x0e, 0x50, 0x02, 0x0a, 0x44, 0x4f, 0x01, 0x0a, 0x33, 0x4f, 0x2b, 0x2b, + 0x2b, 0x34, 0x34, 0x00, 0xff, 0xff, 0x00, 0x19, 0xff, 0xf7, 0x01, 0xdd, 0x02, 0xe6, 0x02, 0x26, + 0x03, 0xc1, 0x00, 0x00, 0x01, 0x06, 0x04, 0xa3, 0x00, 0x00, 0x00, 0x1a, 0xb1, 0x02, 0x01, 0xb8, + 0xff, 0xff, 0x40, 0x0d, 0x37, 0x32, 0x1e, 0x0e, 0x50, 0x02, 0x0a, 0x35, 0x4f, 0x01, 0x0a, 0x33, + 0x4f, 0x2b, 0x2b, 0x2b, 0x34, 0x34, 0x00, 0x00, 0xff, 0xff, 0x00, 0x19, 0xff, 0xf7, 0x01, 0xdd, + 0x02, 0xe6, 0x02, 0x26, 0x03, 0xc1, 0x00, 0x00, 0x01, 0x06, 0x04, 0x97, 0x12, 0x00, 0x00, 0x17, + 0x40, 0x10, 0x02, 0x01, 0x10, 0x35, 0x31, 0x1e, 0x0e, 0x50, 0x02, 0x0a, 0x44, 0x4f, 0x01, 0x0a, + 0x32, 0x4f, 0x2b, 0x2b, 0x2b, 0x34, 0x34, 0x00, 0xff, 0xff, 0x00, 0x19, 0xff, 0xf7, 0x01, 0xdd, + 0x02, 0xe6, 0x02, 0x26, 0x03, 0xc1, 0x00, 0x00, 0x01, 0x06, 0x04, 0xa4, 0x12, 0x00, 0x00, 0x17, + 0x40, 0x10, 0x02, 0x01, 0x11, 0x37, 0x31, 0x1e, 0x0e, 0x50, 0x02, 0x0a, 0x35, 0x4f, 0x01, 0x0a, + 0x32, 0x4f, 0x2b, 0x2b, 0x2b, 0x34, 0x34, 0x00, 0xff, 0xff, 0x00, 0x19, 0xff, 0xf7, 0x01, 0xdd, + 0x03, 0x37, 0x02, 0x26, 0x03, 0xc1, 0x00, 0x00, 0x01, 0x06, 0x04, 0x98, 0x00, 0x00, 0x00, 0x1a, + 0xb1, 0x02, 0x01, 0xb8, 0xff, 0xff, 0x40, 0x0d, 0x3c, 0x46, 0x1e, 0x0e, 0x50, 0x02, 0x0a, 0x58, + 0x4f, 0x01, 0x0a, 0x31, 0x4f, 0x2b, 0x2b, 0x2b, 0x34, 0x34, 0x00, 0x00, 0xff, 0xff, 0x00, 0x19, + 0xff, 0xf7, 0x01, 0xdd, 0x03, 0x37, 0x02, 0x26, 0x03, 0xc1, 0x00, 0x00, 0x01, 0x06, 0x04, 0xa5, + 0x00, 0x00, 0x00, 0x1a, 0xb1, 0x02, 0x01, 0xb8, 0xff, 0xff, 0x40, 0x0d, 0x3c, 0x46, 0x1e, 0x0e, + 0x50, 0x02, 0x0a, 0x47, 0x4f, 0x01, 0x0a, 0x31, 0x4f, 0x2b, 0x2b, 0x2b, 0x34, 0x34, 0x00, 0x00, + 0xff, 0xff, 0xff, 0x6b, 0x00, 0x00, 0x01, 0xeb, 0x02, 0x7f, 0x02, 0x26, 0x03, 0xa8, 0x00, 0x00, + 0x01, 0x07, 0x04, 0x89, 0xfe, 0xc0, 0xff, 0x99, 0x00, 0x0d, 0xb9, 0x00, 0x01, 0xfe, 0xc0, 0xb4, + 0x28, 0x33, 0x23, 0x0e, 0x50, 0x2b, 0x34, 0x00, 0xff, 0xff, 0xff, 0x47, 0x00, 0x00, 0x01, 0xeb, + 0x02, 0x7f, 0x02, 0x26, 0x03, 0xa8, 0x00, 0x00, 0x01, 0x07, 0x04, 0xc1, 0xfe, 0x9c, 0xff, 0x99, + 0x00, 0x0d, 0xb9, 0x00, 0x01, 0xfe, 0x9c, 0xb4, 0x2a, 0x37, 0x23, 0x0e, 0x50, 0x2b, 0x34, 0x00, + 0xff, 0xff, 0xfe, 0x7e, 0x00, 0x00, 0x01, 0xeb, 0x02, 0x7f, 0x02, 0x26, 0x03, 0xa8, 0x00, 0x00, + 0x01, 0x07, 0x04, 0x96, 0xfe, 0x3e, 0xff, 0x99, 0x00, 0x0f, 0xb1, 0x02, 0x01, 0xb8, 0xfe, 0x3e, + 0xb4, 0x2c, 0x29, 0x23, 0x0e, 0x50, 0x2b, 0x34, 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfe, 0x9c, + 0x00, 0x00, 0x01, 0xeb, 0x02, 0x7f, 0x02, 0x26, 0x03, 0xa8, 0x00, 0x00, 0x01, 0x07, 0x04, 0xa3, + 0xfe, 0x4d, 0xff, 0x99, 0x00, 0x0f, 0xb1, 0x02, 0x01, 0xb8, 0xfe, 0x4d, 0xb4, 0x2e, 0x29, 0x23, + 0x0e, 0x50, 0x2b, 0x34, 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfe, 0xcb, 0x00, 0x00, 0x01, 0xeb, + 0x02, 0x7f, 0x02, 0x26, 0x03, 0xa8, 0x00, 0x00, 0x01, 0x07, 0x04, 0x97, 0xfe, 0x7d, 0xff, 0x99, + 0x00, 0x0f, 0xb1, 0x02, 0x01, 0xb8, 0xfe, 0x7d, 0xb4, 0x2c, 0x28, 0x23, 0x0e, 0x50, 0x2b, 0x34, + 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfe, 0xbd, 0x00, 0x00, 0x01, 0xeb, 0x02, 0x7f, 0x02, 0x26, + 0x03, 0xa8, 0x00, 0x00, 0x01, 0x07, 0x04, 0xa4, 0xfe, 0x75, 0xff, 0x99, 0x00, 0x0f, 0xb1, 0x02, + 0x01, 0xb8, 0xfe, 0x75, 0xb4, 0x2e, 0x28, 0x23, 0x0e, 0x50, 0x2b, 0x34, 0x34, 0x00, 0x00, 0x00, + 0xff, 0xff, 0xfe, 0xff, 0x00, 0x00, 0x01, 0xeb, 0x02, 0xd0, 0x02, 0x26, 0x03, 0xa8, 0x00, 0x00, + 0x01, 0x07, 0x04, 0x98, 0xfe, 0x91, 0xff, 0x99, 0x00, 0x0f, 0xb1, 0x02, 0x01, 0xb8, 0xfe, 0x91, + 0xb4, 0x33, 0x3d, 0x23, 0x0e, 0x50, 0x2b, 0x34, 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfe, 0xfe, + 0x00, 0x00, 0x01, 0xeb, 0x02, 0xd0, 0x02, 0x26, 0x03, 0xa8, 0x00, 0x00, 0x01, 0x07, 0x04, 0xa5, + 0xfe, 0x90, 0xff, 0x99, 0x00, 0x0f, 0xb1, 0x02, 0x01, 0xb8, 0xfe, 0x90, 0xb4, 0x33, 0x3d, 0x23, + 0x0e, 0x50, 0x2b, 0x34, 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x28, 0xff, 0xf6, 0x01, 0xe4, + 0x02, 0xc1, 0x02, 0x26, 0x03, 0xa9, 0x00, 0x00, 0x01, 0x06, 0x04, 0xb5, 0x12, 0x00, 0x00, 0x10, + 0x40, 0x0b, 0x02, 0x06, 0x2a, 0x28, 0x0a, 0x15, 0x50, 0x02, 0x0d, 0x29, 0x4f, 0x2b, 0x2b, 0x34, + 0xff, 0xff, 0x00, 0x28, 0xff, 0xf6, 0x01, 0xe4, 0x02, 0xc1, 0x02, 0x26, 0x03, 0xa9, 0x00, 0x00, + 0x01, 0x06, 0x04, 0xc0, 0x12, 0x00, 0x00, 0x10, 0x40, 0x0b, 0x02, 0x06, 0x29, 0x27, 0x0a, 0x15, + 0x50, 0x02, 0x0d, 0x28, 0x4f, 0x2b, 0x2b, 0x34, 0xff, 0xff, 0x00, 0x40, 0xff, 0xf3, 0x01, 0xc6, + 0x02, 0xc1, 0x02, 0x26, 0x03, 0xad, 0x00, 0x00, 0x01, 0x06, 0x04, 0xb5, 0x12, 0x00, 0x00, 0x10, + 0x40, 0x0b, 0x01, 0x09, 0x34, 0x32, 0x21, 0x1a, 0x50, 0x01, 0x2c, 0x33, 0x4f, 0x2b, 0x2b, 0x34, + 0xff, 0xff, 0x00, 0x40, 0xff, 0xf3, 0x01, 0xc6, 0x02, 0xc1, 0x02, 0x26, 0x03, 0xad, 0x00, 0x00, + 0x01, 0x06, 0x04, 0xc0, 0x12, 0x00, 0x00, 0x10, 0x40, 0x0b, 0x01, 0x09, 0x33, 0x31, 0x21, 0x1a, + 0x50, 0x01, 0x2c, 0x32, 0x4f, 0x2b, 0x2b, 0x34, 0xff, 0xff, 0x00, 0x3f, 0xff, 0x5b, 0x01, 0xb9, + 0x02, 0xc1, 0x02, 0x26, 0x03, 0xaf, 0x00, 0x00, 0x01, 0x06, 0x04, 0xb5, 0x12, 0x00, 0x00, 0x10, + 0x40, 0x0b, 0x01, 0x10, 0x17, 0x15, 0x00, 0x07, 0x50, 0x01, 0x02, 0x16, 0x4f, 0x2b, 0x2b, 0x34, + 0xff, 0xff, 0x00, 0x3f, 0xff, 0x5b, 0x01, 0xb9, 0x02, 0xc1, 0x02, 0x26, 0x03, 0xaf, 0x00, 0x00, + 0x01, 0x06, 0x04, 0xc0, 0x12, 0x00, 0x00, 0x10, 0x40, 0x0b, 0x01, 0x10, 0x16, 0x14, 0x00, 0x07, + 0x50, 0x01, 0x02, 0x15, 0x4f, 0x2b, 0x2b, 0x34, 0xff, 0xff, 0x00, 0x24, 0xff, 0xf5, 0x01, 0xd3, + 0x02, 0xc1, 0x02, 0x26, 0x03, 0xb1, 0x00, 0x00, 0x01, 0x06, 0x04, 0xb5, 0x12, 0x00, 0x00, 0x10, + 0x40, 0x0b, 0x01, 0x10, 0x17, 0x15, 0x0a, 0x00, 0x50, 0x01, 0x0b, 0x16, 0x4f, 0x2b, 0x2b, 0x34, + 0xff, 0xff, 0x00, 0x24, 0xff, 0xf5, 0x01, 0xd3, 0x02, 0xc1, 0x02, 0x26, 0x03, 0xb1, 0x00, 0x00, + 0x01, 0x06, 0x04, 0xc0, 0x12, 0x00, 0x00, 0x10, 0x40, 0x0b, 0x01, 0x10, 0x16, 0x14, 0x0a, 0x00, + 0x50, 0x01, 0x0b, 0x15, 0x4f, 0x2b, 0x2b, 0x34, 0xff, 0xff, 0x00, 0x1d, 0xff, 0xf3, 0x01, 0xd8, + 0x02, 0xc1, 0x02, 0x26, 0x00, 0x52, 0x00, 0x00, 0x01, 0x06, 0x04, 0xb5, 0x12, 0x00, 0x00, 0x10, + 0x40, 0x0b, 0x02, 0x11, 0x23, 0x21, 0x09, 0x00, 0x50, 0x02, 0x0e, 0x22, 0x4f, 0x2b, 0x2b, 0x34, + 0xff, 0xff, 0x00, 0x1d, 0xff, 0xf3, 0x01, 0xd8, 0x02, 0xc1, 0x02, 0x26, 0x00, 0x52, 0x00, 0x00, + 0x01, 0x06, 0x04, 0xc0, 0x12, 0x00, 0x00, 0x10, 0x40, 0x0b, 0x02, 0x11, 0x22, 0x20, 0x09, 0x00, + 0x50, 0x02, 0x0e, 0x21, 0x4f, 0x2b, 0x2b, 0x34, 0xff, 0xff, 0x00, 0x33, 0xff, 0xf3, 0x01, 0xbf, + 0x02, 0xc1, 0x02, 0x26, 0x03, 0xbd, 0x00, 0x00, 0x01, 0x06, 0x04, 0xb5, 0x12, 0x00, 0x00, 0x10, + 0x40, 0x0b, 0x01, 0x13, 0x15, 0x13, 0x02, 0x0e, 0x50, 0x01, 0x04, 0x14, 0x4f, 0x2b, 0x2b, 0x34, + 0xff, 0xff, 0x00, 0x33, 0xff, 0xf3, 0x01, 0xbf, 0x02, 0xc1, 0x02, 0x26, 0x03, 0xbd, 0x00, 0x00, + 0x01, 0x06, 0x04, 0xc0, 0x12, 0x00, 0x00, 0x10, 0x40, 0x0b, 0x01, 0x13, 0x14, 0x12, 0x02, 0x0e, + 0x50, 0x01, 0x04, 0x13, 0x4f, 0x2b, 0x2b, 0x34, 0xff, 0xff, 0x00, 0x19, 0xff, 0xf7, 0x01, 0xdd, + 0x02, 0xc1, 0x02, 0x26, 0x03, 0xc1, 0x00, 0x00, 0x01, 0x06, 0x04, 0xb5, 0x12, 0x00, 0x00, 0x10, + 0x40, 0x0b, 0x01, 0x11, 0x34, 0x32, 0x1e, 0x0e, 0x50, 0x01, 0x0a, 0x33, 0x4f, 0x2b, 0x2b, 0x34, + 0xff, 0xff, 0x00, 0x19, 0xff, 0xf7, 0x01, 0xdd, 0x02, 0xc1, 0x02, 0x26, 0x03, 0xc1, 0x00, 0x00, + 0x01, 0x06, 0x04, 0xc0, 0x12, 0x00, 0x00, 0x10, 0x40, 0x0b, 0x01, 0x11, 0x33, 0x31, 0x1e, 0x0e, + 0x50, 0x01, 0x0a, 0x32, 0x4f, 0x2b, 0x2b, 0x34, 0xff, 0xff, 0x00, 0x28, 0xff, 0x56, 0x01, 0xe4, + 0x02, 0xe6, 0x02, 0x26, 0x03, 0xa9, 0x00, 0x00, 0x00, 0x26, 0x04, 0x89, 0x00, 0x00, 0x01, 0x06, + 0x04, 0x88, 0x00, 0x00, 0x00, 0x0f, 0xb1, 0x03, 0x02, 0xb8, 0xff, 0xf4, 0xb4, 0x42, 0x3c, 0x0a, + 0x15, 0x50, 0x2b, 0x34, 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x28, 0xff, 0x56, 0x01, 0xe4, + 0x02, 0xe6, 0x02, 0x26, 0x03, 0xa9, 0x00, 0x00, 0x00, 0x26, 0x04, 0xc1, 0x00, 0x00, 0x01, 0x06, + 0x04, 0x88, 0x00, 0x00, 0x00, 0x0f, 0xb1, 0x03, 0x02, 0xb8, 0xff, 0xf4, 0xb4, 0x42, 0x3c, 0x0a, + 0x15, 0x50, 0x2b, 0x34, 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x28, 0xff, 0x56, 0x01, 0xe4, + 0x02, 0xe6, 0x02, 0x26, 0x03, 0xa9, 0x00, 0x00, 0x00, 0x26, 0x04, 0x96, 0x12, 0x00, 0x01, 0x06, + 0x04, 0x88, 0x00, 0x00, 0x00, 0x0f, 0x40, 0x09, 0x04, 0x03, 0x02, 0x06, 0x2b, 0x28, 0x0a, 0x15, + 0x50, 0x2b, 0x34, 0x34, 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x28, 0xff, 0x56, 0x01, 0xe4, + 0x02, 0xe6, 0x02, 0x26, 0x03, 0xa9, 0x00, 0x00, 0x00, 0x26, 0x04, 0xa3, 0x00, 0x00, 0x01, 0x06, + 0x04, 0x88, 0x00, 0x00, 0x00, 0x11, 0xb2, 0x04, 0x03, 0x02, 0xb8, 0xff, 0xf4, 0xb4, 0x2d, 0x28, + 0x0a, 0x15, 0x50, 0x2b, 0x34, 0x34, 0x34, 0x00, 0xff, 0xff, 0x00, 0x28, 0xff, 0x56, 0x01, 0xe4, + 0x02, 0xe6, 0x02, 0x26, 0x03, 0xa9, 0x00, 0x00, 0x00, 0x26, 0x04, 0x97, 0x12, 0x00, 0x01, 0x06, + 0x04, 0x88, 0x00, 0x00, 0x00, 0x0f, 0x40, 0x09, 0x04, 0x03, 0x02, 0x05, 0x2b, 0x27, 0x0a, 0x15, + 0x50, 0x2b, 0x34, 0x34, 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x28, 0xff, 0x56, 0x01, 0xe4, + 0x02, 0xe6, 0x02, 0x26, 0x03, 0xa9, 0x00, 0x00, 0x00, 0x26, 0x04, 0xa4, 0x12, 0x00, 0x01, 0x06, + 0x04, 0x88, 0x00, 0x00, 0x00, 0x0f, 0x40, 0x09, 0x04, 0x03, 0x02, 0x06, 0x2d, 0x27, 0x0a, 0x15, + 0x50, 0x2b, 0x34, 0x34, 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x28, 0xff, 0x56, 0x01, 0xe4, + 0x03, 0x37, 0x02, 0x26, 0x03, 0xa9, 0x00, 0x00, 0x00, 0x26, 0x04, 0x98, 0x00, 0x00, 0x01, 0x06, + 0x04, 0x88, 0x00, 0x00, 0x00, 0x11, 0xb2, 0x04, 0x03, 0x02, 0xb8, 0xff, 0xf4, 0xb4, 0x32, 0x3c, + 0x0a, 0x15, 0x50, 0x2b, 0x34, 0x34, 0x34, 0x00, 0xff, 0xff, 0x00, 0x28, 0xff, 0x56, 0x01, 0xe4, + 0x03, 0x37, 0x02, 0x26, 0x03, 0xa9, 0x00, 0x00, 0x00, 0x26, 0x04, 0xa5, 0x00, 0x00, 0x01, 0x06, + 0x04, 0x88, 0x00, 0x00, 0x00, 0x11, 0xb2, 0x04, 0x03, 0x02, 0xb8, 0xff, 0xf4, 0xb4, 0x32, 0x3c, + 0x0a, 0x15, 0x50, 0x2b, 0x34, 0x34, 0x34, 0x00, 0xff, 0xff, 0xff, 0xaa, 0xff, 0xf6, 0x01, 0xfc, + 0x02, 0x7f, 0x02, 0x37, 0x04, 0x89, 0xfe, 0xff, 0xff, 0x99, 0x00, 0x06, 0x04, 0x86, 0x00, 0x00, + 0xff, 0xff, 0xff, 0x9e, 0xff, 0xf6, 0x01, 0xfc, 0x02, 0x7f, 0x02, 0x37, 0x04, 0xc1, 0xfe, 0xf3, + 0xff, 0x99, 0x00, 0x06, 0x04, 0x86, 0x00, 0x00, 0xff, 0xff, 0xfe, 0xc5, 0xff, 0xf6, 0x01, 0xfc, + 0x02, 0x7f, 0x02, 0x37, 0x04, 0x96, 0xfe, 0x85, 0xff, 0x99, 0x00, 0x06, 0x04, 0x86, 0x00, 0x00, + 0xff, 0xff, 0xfe, 0xe2, 0xff, 0xf6, 0x01, 0xfc, 0x02, 0x7f, 0x02, 0x37, 0x04, 0xa3, 0xfe, 0x93, + 0xff, 0x99, 0x00, 0x06, 0x04, 0x86, 0x00, 0x00, 0xff, 0xff, 0xfe, 0xf7, 0xff, 0xf6, 0x01, 0xfc, + 0x02, 0x7f, 0x02, 0x37, 0x04, 0x97, 0xfe, 0xa9, 0xff, 0x99, 0x00, 0x06, 0x04, 0x86, 0x00, 0x00, + 0xff, 0xff, 0xfe, 0xea, 0xff, 0xf6, 0x01, 0xfc, 0x02, 0x7f, 0x02, 0x37, 0x04, 0xa4, 0xfe, 0xa2, + 0xff, 0x99, 0x00, 0x06, 0x04, 0x86, 0x00, 0x00, 0xff, 0xff, 0xff, 0x2e, 0xff, 0xf6, 0x01, 0xfc, + 0x02, 0xd0, 0x02, 0x37, 0x04, 0x98, 0xfe, 0xc0, 0xff, 0x99, 0x00, 0x06, 0x04, 0x86, 0x00, 0x00, + 0xff, 0xff, 0xff, 0x2e, 0xff, 0xf6, 0x01, 0xfc, 0x02, 0xd0, 0x02, 0x37, 0x04, 0xa5, 0xfe, 0xc0, + 0xff, 0x99, 0x00, 0x06, 0x04, 0x86, 0x00, 0x00, 0xff, 0xff, 0x00, 0x3f, 0xff, 0x56, 0x01, 0xb9, + 0x02, 0xe6, 0x02, 0x26, 0x03, 0xaf, 0x00, 0x00, 0x00, 0x26, 0x04, 0x89, 0x00, 0x00, 0x01, 0x06, + 0x04, 0x88, 0xa8, 0x00, 0x00, 0x0f, 0xb1, 0x02, 0x01, 0xb8, 0xff, 0xcf, 0xb4, 0x2f, 0x1f, 0x00, + 0x07, 0x50, 0x2b, 0x34, 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x3f, 0xff, 0x56, 0x01, 0xb9, + 0x02, 0xe6, 0x02, 0x26, 0x03, 0xaf, 0x00, 0x00, 0x00, 0x26, 0x04, 0xc1, 0x00, 0x00, 0x01, 0x06, + 0x04, 0x88, 0xa8, 0x00, 0x00, 0x0f, 0xb1, 0x02, 0x01, 0xb8, 0xff, 0xcf, 0xb4, 0x2f, 0x23, 0x00, + 0x07, 0x50, 0x2b, 0x34, 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x3f, 0xff, 0x56, 0x01, 0xc6, + 0x02, 0xe6, 0x02, 0x26, 0x03, 0xaf, 0x00, 0x00, 0x00, 0x26, 0x04, 0x96, 0x12, 0x00, 0x01, 0x06, + 0x04, 0x88, 0xa8, 0x00, 0x00, 0x0f, 0x40, 0x09, 0x03, 0x02, 0x01, 0x0d, 0x33, 0x15, 0x00, 0x07, + 0x50, 0x2b, 0x34, 0x34, 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x3f, 0xff, 0x56, 0x01, 0xb9, + 0x02, 0xe6, 0x02, 0x26, 0x03, 0xaf, 0x00, 0x00, 0x00, 0x26, 0x04, 0xa3, 0x00, 0x00, 0x01, 0x06, + 0x04, 0x88, 0xa8, 0x00, 0x00, 0x11, 0xb2, 0x03, 0x02, 0x01, 0xb8, 0xff, 0xfd, 0xb4, 0x33, 0x15, + 0x00, 0x07, 0x50, 0x2b, 0x34, 0x34, 0x34, 0x00, 0xff, 0xff, 0x00, 0x3f, 0xff, 0x56, 0x01, 0xb9, + 0x02, 0xe6, 0x02, 0x26, 0x03, 0xaf, 0x00, 0x00, 0x00, 0x26, 0x04, 0x97, 0x12, 0x00, 0x01, 0x06, + 0x04, 0x88, 0xa8, 0x00, 0x00, 0x0f, 0x40, 0x09, 0x03, 0x02, 0x01, 0x05, 0x33, 0x14, 0x00, 0x07, + 0x50, 0x2b, 0x34, 0x34, 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x3f, 0xff, 0x56, 0x01, 0xbe, + 0x02, 0xe6, 0x02, 0x26, 0x03, 0xaf, 0x00, 0x00, 0x00, 0x26, 0x04, 0xa4, 0x12, 0x00, 0x01, 0x06, + 0x04, 0x88, 0xa8, 0x00, 0x00, 0x0f, 0x40, 0x09, 0x03, 0x02, 0x01, 0x09, 0x33, 0x14, 0x00, 0x07, + 0x50, 0x2b, 0x34, 0x34, 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x3f, 0xff, 0x56, 0x01, 0xb9, + 0x03, 0x37, 0x02, 0x26, 0x03, 0xaf, 0x00, 0x00, 0x00, 0x26, 0x04, 0x98, 0x00, 0x00, 0x01, 0x06, + 0x04, 0x88, 0xa8, 0x00, 0x00, 0x11, 0xb2, 0x03, 0x02, 0x01, 0xb8, 0xff, 0xed, 0xb4, 0x47, 0x29, + 0x00, 0x07, 0x50, 0x2b, 0x34, 0x34, 0x34, 0x00, 0xff, 0xff, 0x00, 0x3f, 0xff, 0x56, 0x01, 0xb9, + 0x03, 0x37, 0x02, 0x26, 0x03, 0xaf, 0x00, 0x00, 0x00, 0x26, 0x04, 0xa5, 0x00, 0x00, 0x01, 0x06, + 0x04, 0x88, 0xa8, 0x00, 0x00, 0x11, 0xb2, 0x03, 0x02, 0x01, 0xb8, 0xff, 0xed, 0xb4, 0x47, 0x29, + 0x00, 0x07, 0x50, 0x2b, 0x34, 0x34, 0x34, 0x00, 0xff, 0xff, 0xff, 0x51, 0xff, 0xf6, 0x01, 0xf3, + 0x02, 0x7f, 0x02, 0x37, 0x04, 0x89, 0xfe, 0xa6, 0xff, 0x99, 0x00, 0x06, 0x04, 0x95, 0x00, 0x00, + 0xff, 0xff, 0xff, 0x5d, 0xff, 0xf6, 0x01, 0xf3, 0x02, 0x7f, 0x02, 0x37, 0x04, 0xc1, 0xfe, 0xb2, + 0xff, 0x99, 0x00, 0x06, 0x04, 0x95, 0x00, 0x00, 0xff, 0xff, 0xfe, 0x87, 0xff, 0xf6, 0x01, 0xf3, + 0x02, 0x7f, 0x02, 0x37, 0x04, 0x96, 0xfe, 0x47, 0xff, 0x99, 0x00, 0x06, 0x04, 0x95, 0x00, 0x00, + 0xff, 0xff, 0xfe, 0xa4, 0xff, 0xf6, 0x01, 0xf3, 0x02, 0x7f, 0x02, 0x37, 0x04, 0xa3, 0xfe, 0x55, + 0xff, 0x99, 0x00, 0x06, 0x04, 0x95, 0x00, 0x00, 0xff, 0xff, 0xfe, 0xa7, 0xff, 0xf6, 0x01, 0xf3, + 0x02, 0x7f, 0x02, 0x37, 0x04, 0x97, 0xfe, 0x59, 0xff, 0x99, 0x00, 0x06, 0x04, 0x95, 0x00, 0x00, + 0xff, 0xff, 0xfe, 0x9b, 0xff, 0xf6, 0x01, 0xf3, 0x02, 0x7f, 0x02, 0x37, 0x04, 0xa4, 0xfe, 0x53, + 0xff, 0x99, 0x00, 0x06, 0x04, 0x95, 0x00, 0x00, 0xff, 0xff, 0xfe, 0xe0, 0xff, 0xf6, 0x01, 0xf3, + 0x02, 0xd0, 0x02, 0x37, 0x04, 0x98, 0xfe, 0x72, 0xff, 0x99, 0x00, 0x06, 0x04, 0x95, 0x00, 0x00, + 0xff, 0xff, 0xfe, 0xe0, 0xff, 0xf6, 0x01, 0xf3, 0x02, 0xd0, 0x02, 0x37, 0x04, 0xa5, 0xfe, 0x72, + 0xff, 0x99, 0x00, 0x06, 0x04, 0x95, 0x00, 0x00, 0xff, 0xff, 0x00, 0x19, 0xff, 0x56, 0x01, 0xdd, + 0x02, 0xe6, 0x02, 0x26, 0x03, 0xc1, 0x00, 0x00, 0x00, 0x26, 0x04, 0x89, 0x00, 0x00, 0x01, 0x06, + 0x04, 0x88, 0x1b, 0x00, 0x00, 0x0c, 0xb7, 0x02, 0x01, 0x10, 0x31, 0x46, 0x1e, 0x0e, 0x50, 0x2b, + 0x34, 0x34, 0x00, 0x00, 0xff, 0xff, 0x00, 0x19, 0xff, 0x56, 0x01, 0xdd, 0x02, 0xe6, 0x02, 0x26, + 0x03, 0xc1, 0x00, 0x00, 0x00, 0x26, 0x04, 0xc1, 0x00, 0x00, 0x01, 0x06, 0x04, 0x88, 0x1b, 0x00, + 0x00, 0x0c, 0xb7, 0x02, 0x01, 0x10, 0x33, 0x46, 0x1e, 0x0e, 0x50, 0x2b, 0x34, 0x34, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x19, 0xff, 0x56, 0x01, 0xdd, 0x02, 0xe6, 0x02, 0x26, 0x03, 0xc1, 0x00, 0x00, + 0x00, 0x26, 0x04, 0x96, 0x12, 0x00, 0x01, 0x06, 0x04, 0x88, 0x1b, 0x00, 0x00, 0x0f, 0x40, 0x09, + 0x03, 0x02, 0x01, 0x11, 0x35, 0x32, 0x1e, 0x0e, 0x50, 0x2b, 0x34, 0x34, 0x34, 0x00, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x19, 0xff, 0x56, 0x01, 0xdd, 0x02, 0xe6, 0x02, 0x26, 0x03, 0xc1, 0x00, 0x00, + 0x00, 0x26, 0x04, 0xa3, 0x00, 0x00, 0x01, 0x06, 0x04, 0x88, 0x1b, 0x00, 0x00, 0x11, 0xb2, 0x03, + 0x02, 0x01, 0xb8, 0xff, 0xff, 0xb4, 0x37, 0x32, 0x1e, 0x0e, 0x50, 0x2b, 0x34, 0x34, 0x34, 0x00, + 0xff, 0xff, 0x00, 0x19, 0xff, 0x56, 0x01, 0xdd, 0x02, 0xe6, 0x02, 0x26, 0x03, 0xc1, 0x00, 0x00, + 0x00, 0x26, 0x04, 0x97, 0x12, 0x00, 0x01, 0x06, 0x04, 0x88, 0x1b, 0x00, 0x00, 0x0f, 0x40, 0x09, + 0x03, 0x02, 0x01, 0x10, 0x35, 0x31, 0x1e, 0x0e, 0x50, 0x2b, 0x34, 0x34, 0x34, 0x00, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x19, 0xff, 0x56, 0x01, 0xdd, 0x02, 0xe6, 0x02, 0x26, 0x03, 0xc1, 0x00, 0x00, + 0x00, 0x26, 0x04, 0xa4, 0x12, 0x00, 0x01, 0x06, 0x04, 0x88, 0x1b, 0x00, 0x00, 0x0f, 0x40, 0x09, + 0x03, 0x02, 0x01, 0x11, 0x37, 0x31, 0x1e, 0x0e, 0x50, 0x2b, 0x34, 0x34, 0x34, 0x00, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x19, 0xff, 0x56, 0x01, 0xdd, 0x03, 0x37, 0x02, 0x26, 0x03, 0xc1, 0x00, 0x00, + 0x00, 0x26, 0x04, 0x98, 0x00, 0x00, 0x01, 0x06, 0x04, 0x88, 0x1b, 0x00, 0x00, 0x11, 0xb2, 0x03, + 0x02, 0x01, 0xb8, 0xff, 0xff, 0xb4, 0x3c, 0x46, 0x1e, 0x0e, 0x50, 0x2b, 0x34, 0x34, 0x34, 0x00, + 0xff, 0xff, 0x00, 0x19, 0xff, 0x56, 0x01, 0xdd, 0x03, 0x37, 0x02, 0x26, 0x03, 0xc1, 0x00, 0x00, + 0x00, 0x26, 0x04, 0xa5, 0x00, 0x00, 0x01, 0x06, 0x04, 0x88, 0x1b, 0x00, 0x00, 0x11, 0xb2, 0x03, + 0x02, 0x01, 0xb8, 0xff, 0xff, 0xb4, 0x3c, 0x46, 0x1e, 0x0e, 0x50, 0x2b, 0x34, 0x34, 0x34, 0x00, + 0xff, 0xff, 0xff, 0x6b, 0xff, 0xf6, 0x01, 0xfc, 0x02, 0x7f, 0x02, 0x26, 0x04, 0xbf, 0x00, 0x00, + 0x01, 0x07, 0x04, 0x89, 0xfe, 0xc0, 0xff, 0x99, 0x00, 0x0d, 0xb9, 0x00, 0x02, 0xfe, 0xb8, 0xb4, + 0x34, 0x3f, 0x23, 0x33, 0x50, 0x2b, 0x34, 0x00, 0xff, 0xff, 0xff, 0x47, 0xff, 0xf6, 0x01, 0xfc, + 0x02, 0x7f, 0x02, 0x26, 0x04, 0xbf, 0x00, 0x00, 0x01, 0x07, 0x04, 0xc1, 0xfe, 0x9c, 0xff, 0x99, + 0x00, 0x0d, 0xb9, 0x00, 0x02, 0xfe, 0x94, 0xb4, 0x36, 0x43, 0x23, 0x33, 0x50, 0x2b, 0x34, 0x00, + 0xff, 0xff, 0xfe, 0x7e, 0xff, 0xf6, 0x01, 0xfc, 0x02, 0x7f, 0x02, 0x26, 0x04, 0xbf, 0x00, 0x00, + 0x01, 0x07, 0x04, 0x96, 0xfe, 0x3e, 0xff, 0x99, 0x00, 0x0f, 0xb1, 0x03, 0x02, 0xb8, 0xfe, 0x36, + 0xb4, 0x38, 0x35, 0x23, 0x33, 0x50, 0x2b, 0x34, 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfe, 0x9c, + 0xff, 0xf6, 0x01, 0xfc, 0x02, 0x7f, 0x02, 0x26, 0x04, 0xbf, 0x00, 0x00, 0x01, 0x07, 0x04, 0xa3, + 0xfe, 0x4d, 0xff, 0x99, 0x00, 0x0f, 0xb1, 0x03, 0x02, 0xb8, 0xfe, 0x45, 0xb4, 0x3a, 0x35, 0x23, + 0x33, 0x50, 0x2b, 0x34, 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfe, 0xcb, 0xff, 0xf6, 0x01, 0xfc, + 0x02, 0x7f, 0x02, 0x26, 0x04, 0xbf, 0x00, 0x00, 0x01, 0x07, 0x04, 0x97, 0xfe, 0x7d, 0xff, 0x99, + 0x00, 0x0f, 0xb1, 0x03, 0x02, 0xb8, 0xfe, 0x74, 0xb4, 0x38, 0x34, 0x23, 0x33, 0x50, 0x2b, 0x34, + 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfe, 0xbd, 0xff, 0xf6, 0x01, 0xfc, 0x02, 0x7f, 0x02, 0x26, + 0x04, 0xbf, 0x00, 0x00, 0x01, 0x07, 0x04, 0xa4, 0xfe, 0x75, 0xff, 0x99, 0x00, 0x0f, 0xb1, 0x03, + 0x02, 0xb8, 0xfe, 0x6d, 0xb4, 0x3a, 0x34, 0x23, 0x33, 0x50, 0x2b, 0x34, 0x34, 0x00, 0x00, 0x00, + 0xff, 0xff, 0xfe, 0xff, 0xff, 0xf6, 0x01, 0xfc, 0x02, 0xd0, 0x02, 0x26, 0x04, 0xbf, 0x00, 0x00, + 0x01, 0x07, 0x04, 0x98, 0xfe, 0x91, 0xff, 0x99, 0x00, 0x0f, 0xb1, 0x03, 0x02, 0xb8, 0xfe, 0x89, + 0xb4, 0x3f, 0x49, 0x23, 0x33, 0x50, 0x2b, 0x34, 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfe, 0xfe, + 0xff, 0xf6, 0x01, 0xfc, 0x02, 0xd0, 0x02, 0x26, 0x04, 0xbf, 0x00, 0x00, 0x01, 0x07, 0x04, 0xa5, + 0xfe, 0x90, 0xff, 0x99, 0x00, 0x0f, 0xb1, 0x03, 0x02, 0xb8, 0xfe, 0x88, 0xb4, 0x3f, 0x49, 0x23, + 0x33, 0x50, 0x2b, 0x34, 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x28, 0xff, 0xf6, 0x01, 0xe4, + 0x02, 0xaa, 0x02, 0x26, 0x03, 0xa9, 0x00, 0x00, 0x01, 0x06, 0x01, 0x61, 0x00, 0x00, 0x00, 0x13, + 0xb9, 0x00, 0x02, 0xff, 0xf4, 0x40, 0x09, 0x2b, 0x35, 0x0a, 0x15, 0x50, 0x02, 0x0d, 0x27, 0x4f, + 0x2b, 0x2b, 0x34, 0x00, 0xff, 0xff, 0x00, 0x28, 0xff, 0xf6, 0x01, 0xe4, 0x02, 0x87, 0x02, 0x26, + 0x03, 0xa9, 0x00, 0x00, 0x01, 0x06, 0x00, 0x8a, 0xff, 0x00, 0x00, 0x13, 0xb9, 0x00, 0x02, 0xff, + 0xf5, 0x40, 0x09, 0x27, 0x28, 0x0a, 0x15, 0x50, 0x02, 0x0d, 0x29, 0x4f, 0x2b, 0x2b, 0x34, 0x00, + 0xff, 0xff, 0x00, 0x28, 0xff, 0x56, 0x01, 0xe4, 0x02, 0xc1, 0x02, 0x26, 0x03, 0xa9, 0x00, 0x00, + 0x00, 0x26, 0x04, 0xb5, 0x12, 0x00, 0x01, 0x06, 0x04, 0x88, 0x00, 0x00, 0x00, 0x0c, 0xb7, 0x03, + 0x02, 0x06, 0x2a, 0x28, 0x0a, 0x15, 0x50, 0x2b, 0x34, 0x34, 0x00, 0x00, 0xff, 0xff, 0x00, 0x28, + 0xff, 0x56, 0x01, 0xe4, 0x01, 0xe0, 0x02, 0x26, 0x03, 0xa9, 0x00, 0x00, 0x01, 0x06, 0x04, 0x88, + 0x00, 0x00, 0x00, 0x0d, 0xb9, 0x00, 0x02, 0xff, 0xf4, 0xb4, 0x32, 0x2c, 0x0a, 0x15, 0x50, 0x2b, + 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x28, 0xff, 0x56, 0x01, 0xe4, 0x02, 0xc1, 0x02, 0x26, + 0x03, 0xa9, 0x00, 0x00, 0x00, 0x26, 0x04, 0xc0, 0x12, 0x00, 0x01, 0x06, 0x04, 0x88, 0x00, 0x00, + 0x00, 0x0c, 0xb7, 0x03, 0x02, 0x06, 0x29, 0x27, 0x0a, 0x15, 0x50, 0x2b, 0x34, 0x34, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x28, 0xff, 0xf6, 0x01, 0xe4, 0x02, 0xaa, 0x02, 0x26, 0x03, 0xa9, 0x00, 0x00, + 0x01, 0x06, 0x04, 0x8a, 0x12, 0x00, 0x00, 0x10, 0x40, 0x0b, 0x02, 0x06, 0x35, 0x2b, 0x0a, 0x15, + 0x50, 0x02, 0x0d, 0x2d, 0x4f, 0x2b, 0x2b, 0x34, 0xff, 0xff, 0x00, 0x28, 0xff, 0x56, 0x01, 0xe4, + 0x02, 0xaa, 0x02, 0x26, 0x03, 0xa9, 0x00, 0x00, 0x00, 0x26, 0x04, 0x8a, 0x12, 0x00, 0x01, 0x06, + 0x04, 0x88, 0x00, 0x00, 0x00, 0x0c, 0xb7, 0x03, 0x02, 0x06, 0x35, 0x2b, 0x0a, 0x15, 0x50, 0x2b, + 0x34, 0x34, 0x00, 0x00, 0xff, 0xff, 0x00, 0x09, 0x00, 0x00, 0x01, 0xeb, 0x03, 0x35, 0x02, 0x26, + 0x00, 0x24, 0x00, 0x00, 0x01, 0x07, 0x01, 0x61, 0x00, 0x00, 0x00, 0x8b, 0x00, 0x10, 0x40, 0x0b, + 0x02, 0x00, 0x1b, 0x25, 0x04, 0x0b, 0x50, 0x02, 0x07, 0x17, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x09, 0x00, 0x00, 0x01, 0xeb, 0x03, 0x12, 0x02, 0x26, 0x00, 0x24, 0x00, 0x00, + 0x01, 0x07, 0x00, 0x8a, 0x00, 0x00, 0x00, 0x8b, 0x00, 0x10, 0x40, 0x0b, 0x02, 0x02, 0x17, 0x18, + 0x04, 0x0b, 0x50, 0x02, 0x07, 0x19, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0x00, 0xff, 0xff, 0xff, 0x67, + 0x00, 0x00, 0x01, 0xeb, 0x02, 0x6b, 0x02, 0x26, 0x00, 0x24, 0x00, 0x00, 0x01, 0x07, 0x00, 0x43, + 0xfe, 0xcf, 0xff, 0xb4, 0x00, 0x0d, 0xb9, 0x00, 0x02, 0xfe, 0xdb, 0xb4, 0x1a, 0x18, 0x04, 0x0b, + 0x50, 0x2b, 0x34, 0x00, 0xff, 0xff, 0xff, 0x8b, 0x00, 0x00, 0x01, 0xeb, 0x02, 0x6b, 0x02, 0x26, + 0x00, 0x24, 0x00, 0x00, 0x01, 0x07, 0x00, 0x8f, 0xfe, 0xf3, 0xff, 0xb4, 0x00, 0x0d, 0xb9, 0x00, + 0x02, 0xfe, 0xff, 0xb4, 0x19, 0x17, 0x04, 0x0b, 0x50, 0x2b, 0x34, 0x00, 0x00, 0x03, 0x00, 0x09, + 0xff, 0xf6, 0x01, 0xfc, 0x02, 0x6b, 0x00, 0x0b, 0x00, 0x17, 0x00, 0x1a, 0x00, 0x49, 0x40, 0x2c, + 0x02, 0x06, 0x01, 0x18, 0x1a, 0x19, 0x00, 0x07, 0x0b, 0x09, 0x03, 0x0a, 0x12, 0x40, 0x0b, 0x0e, + 0x48, 0x12, 0x52, 0x13, 0x17, 0x1c, 0x03, 0x1b, 0x12, 0x0a, 0x17, 0x57, 0x0c, 0x07, 0x19, 0x73, + 0x1a, 0x00, 0x00, 0x07, 0x0b, 0x08, 0x07, 0x02, 0x06, 0x02, 0x02, 0x08, 0x00, 0x3f, 0x3f, 0x3f, + 0x3f, 0x12, 0x39, 0x2f, 0x39, 0xed, 0x3f, 0xed, 0x3f, 0x01, 0x10, 0xc6, 0x10, 0xd6, 0xde, 0xfd, + 0x2b, 0xc6, 0x11, 0x17, 0x39, 0x31, 0x30, 0x37, 0x23, 0x07, 0x23, 0x36, 0x12, 0x37, 0x33, 0x16, + 0x12, 0x17, 0x23, 0x17, 0x2e, 0x03, 0x35, 0x11, 0x33, 0x11, 0x14, 0x16, 0x17, 0x25, 0x33, 0x03, + 0xe7, 0x65, 0x14, 0x65, 0x1c, 0x36, 0x1a, 0x86, 0x1b, 0x35, 0x1a, 0x69, 0xf3, 0x28, 0x32, 0x1b, + 0x0a, 0x60, 0x10, 0x1c, 0xfe, 0x93, 0x4c, 0x26, 0x98, 0x98, 0xb7, 0x01, 0x2d, 0x87, 0x88, 0xfe, + 0xcf, 0xb2, 0x0a, 0x05, 0x1c, 0x2a, 0x38, 0x23, 0x01, 0x3a, 0xfe, 0xbb, 0x20, 0x23, 0x04, 0xa2, + 0x01, 0x22, 0x00, 0x00, 0xff, 0xff, 0x00, 0xab, 0x02, 0x08, 0x01, 0x49, 0x02, 0xe6, 0x02, 0x06, + 0x04, 0x89, 0x00, 0x00, 0x00, 0x01, 0x00, 0xa4, 0xff, 0x56, 0x01, 0x50, 0xff, 0xd3, 0x00, 0x0f, + 0x00, 0x12, 0xb6, 0x05, 0x0f, 0x0c, 0x10, 0x0e, 0x09, 0x92, 0x00, 0x3f, 0xc5, 0x01, 0x10, 0xd6, + 0xd5, 0xce, 0x31, 0x30, 0x05, 0x14, 0x1e, 0x02, 0x33, 0x15, 0x06, 0x06, 0x23, 0x22, 0x26, 0x35, + 0x34, 0x37, 0x33, 0x01, 0x06, 0x0a, 0x14, 0x1b, 0x11, 0x06, 0x23, 0x0e, 0x38, 0x3d, 0x03, 0x5f, + 0x34, 0x12, 0x15, 0x0b, 0x02, 0x3b, 0x02, 0x05, 0x2e, 0x30, 0x0e, 0x11, 0x00, 0x01, 0x00, 0xab, + 0x02, 0x08, 0x01, 0x49, 0x02, 0xe6, 0x00, 0x0f, 0x00, 0x12, 0xb6, 0x0c, 0x03, 0x00, 0x10, 0x0f, + 0x09, 0xb8, 0x00, 0x3f, 0xc4, 0x01, 0x10, 0xd6, 0xde, 0xc5, 0x31, 0x30, 0x13, 0x36, 0x36, 0x37, + 0x26, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x07, 0xab, 0x16, 0x20, 0x0d, + 0x12, 0x17, 0x24, 0x1c, 0x1d, 0x27, 0x42, 0x33, 0x02, 0x2e, 0x12, 0x21, 0x12, 0x08, 0x1e, 0x12, + 0x1a, 0x21, 0x23, 0x21, 0x28, 0x50, 0x22, 0x00, 0x00, 0x01, 0x00, 0x69, 0x02, 0x16, 0x01, 0x8b, + 0x02, 0xaa, 0x00, 0x13, 0x00, 0x1a, 0x40, 0x0b, 0x06, 0x07, 0x0d, 0x0e, 0x14, 0x00, 0x0a, 0x0d, + 0xa7, 0x07, 0xa7, 0x00, 0x3f, 0x3f, 0xde, 0xc5, 0x01, 0x10, 0xd6, 0xd5, 0xd6, 0xc5, 0x31, 0x30, + 0x13, 0x32, 0x1e, 0x02, 0x15, 0x15, 0x23, 0x26, 0x26, 0x23, 0x22, 0x06, 0x07, 0x23, 0x35, 0x34, + 0x3e, 0x02, 0xfa, 0x1f, 0x35, 0x27, 0x16, 0x5a, 0x03, 0x1e, 0x16, 0x16, 0x1e, 0x02, 0x5b, 0x16, + 0x27, 0x35, 0x02, 0xaa, 0x13, 0x24, 0x35, 0x21, 0x07, 0x26, 0x19, 0x19, 0x26, 0x07, 0x21, 0x35, + 0x24, 0x13, 0x00, 0x00, 0x00, 0x03, 0x00, 0x5e, 0x02, 0x12, 0x01, 0x95, 0x03, 0x37, 0x00, 0x0b, + 0x00, 0x17, 0x00, 0x2d, 0x00, 0x4b, 0x40, 0x2d, 0x2d, 0x18, 0x22, 0x23, 0x2e, 0x0c, 0xb3, 0x12, + 0x00, 0xb3, 0x06, 0x2e, 0x18, 0xef, 0x22, 0xff, 0x22, 0x02, 0x22, 0xa0, 0x1d, 0x01, 0x1d, 0x28, + 0x86, 0xd0, 0x15, 0x01, 0x15, 0xb2, 0x00, 0x0f, 0x01, 0x0f, 0xa7, 0xd0, 0x09, 0x01, 0x09, 0xb2, + 0x00, 0x03, 0x01, 0x03, 0xa7, 0x00, 0x3f, 0x5d, 0xed, 0x5d, 0x3f, 0x5d, 0xed, 0x5d, 0x3f, 0xd5, + 0x5d, 0xce, 0x5d, 0x32, 0x01, 0x10, 0xd6, 0xfd, 0xd6, 0xed, 0x10, 0xdc, 0xd5, 0xd6, 0xc5, 0x31, + 0x30, 0x13, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x17, 0x14, 0x06, + 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x27, 0x2e, 0x03, 0x23, 0x22, 0x0e, 0x02, + 0x07, 0x23, 0x3e, 0x03, 0x33, 0x32, 0x1e, 0x02, 0x17, 0xd5, 0x24, 0x18, 0x19, 0x22, 0x22, 0x19, + 0x18, 0x24, 0xc0, 0x22, 0x19, 0x18, 0x23, 0x23, 0x18, 0x19, 0x22, 0x54, 0x01, 0x0e, 0x14, 0x19, + 0x0c, 0x0c, 0x19, 0x14, 0x0d, 0x01, 0x45, 0x01, 0x18, 0x27, 0x31, 0x1b, 0x1b, 0x31, 0x27, 0x17, + 0x02, 0x02, 0x4d, 0x1a, 0x21, 0x21, 0x1a, 0x1c, 0x20, 0x20, 0x1c, 0x1a, 0x21, 0x21, 0x1a, 0x1c, + 0x20, 0x20, 0x41, 0x12, 0x18, 0x10, 0x07, 0x07, 0x10, 0x18, 0x12, 0x25, 0x35, 0x23, 0x10, 0x10, + 0x23, 0x35, 0x25, 0x00, 0xff, 0xff, 0x00, 0x3f, 0xff, 0x56, 0x01, 0xb9, 0x02, 0xc1, 0x02, 0x26, + 0x03, 0xaf, 0x00, 0x00, 0x00, 0x26, 0x04, 0xb5, 0x16, 0x00, 0x01, 0x06, 0x04, 0x88, 0xa8, 0x00, + 0x00, 0x0f, 0xb1, 0x02, 0x01, 0xb8, 0xff, 0xed, 0xb4, 0x23, 0x15, 0x00, 0x07, 0x50, 0x2b, 0x34, + 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x3f, 0xff, 0x56, 0x01, 0xb9, 0x01, 0xe0, 0x02, 0x26, + 0x03, 0xaf, 0x00, 0x00, 0x01, 0x06, 0x04, 0x88, 0xa8, 0x00, 0x00, 0x0d, 0xb9, 0x00, 0x01, 0xff, + 0xa6, 0xb4, 0x1f, 0x19, 0x00, 0x07, 0x50, 0x2b, 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x3f, + 0xff, 0x56, 0x01, 0xb9, 0x02, 0xc1, 0x02, 0x26, 0x03, 0xaf, 0x00, 0x00, 0x00, 0x26, 0x04, 0xc0, + 0x16, 0x00, 0x01, 0x06, 0x04, 0x88, 0xa8, 0x00, 0x00, 0x0f, 0xb1, 0x02, 0x01, 0xb8, 0xff, 0xed, + 0xb4, 0x23, 0x14, 0x00, 0x07, 0x50, 0x2b, 0x34, 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x3f, + 0xff, 0x5b, 0x01, 0xb9, 0x02, 0xaa, 0x02, 0x26, 0x03, 0xaf, 0x00, 0x00, 0x01, 0x06, 0x04, 0x8a, + 0x00, 0x00, 0x00, 0x13, 0xb9, 0x00, 0x01, 0xff, 0xfe, 0x40, 0x09, 0x22, 0x18, 0x00, 0x07, 0x50, + 0x01, 0x02, 0x1a, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0xff, 0xff, 0x00, 0x3f, 0xff, 0x56, 0x01, 0xb9, + 0x02, 0xaa, 0x02, 0x26, 0x03, 0xaf, 0x00, 0x00, 0x00, 0x26, 0x04, 0x8a, 0x00, 0x00, 0x01, 0x06, + 0x04, 0x88, 0xa8, 0x00, 0x00, 0x0f, 0xb1, 0x02, 0x01, 0xb8, 0xff, 0xf0, 0xb4, 0x33, 0x18, 0x00, + 0x07, 0x50, 0x2b, 0x34, 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x39, 0x00, 0x00, 0x01, 0xcc, + 0x02, 0x6b, 0x02, 0x26, 0x00, 0x28, 0x00, 0x00, 0x01, 0x07, 0x00, 0x43, 0xfe, 0xa1, 0xff, 0xb4, + 0x00, 0x0d, 0xb9, 0x00, 0x01, 0xfe, 0xa1, 0xb4, 0x0f, 0x0d, 0x00, 0x0a, 0x50, 0x2b, 0x34, 0x00, + 0xff, 0xff, 0xff, 0x42, 0x00, 0x00, 0x01, 0xcc, 0x02, 0x6b, 0x02, 0x26, 0x00, 0x28, 0x00, 0x00, + 0x01, 0x07, 0x00, 0x8f, 0xfe, 0xaa, 0xff, 0xb4, 0x00, 0x0d, 0xb9, 0x00, 0x01, 0xfe, 0xaa, 0xb4, + 0x0e, 0x0c, 0x00, 0x0a, 0x50, 0x2b, 0x34, 0x00, 0xff, 0xff, 0xff, 0x27, 0x00, 0x00, 0x01, 0xc7, + 0x02, 0x6b, 0x02, 0x26, 0x00, 0x2b, 0x00, 0x00, 0x01, 0x07, 0x00, 0x43, 0xfe, 0x8f, 0xff, 0xb4, + 0x00, 0x0d, 0xb9, 0x00, 0x01, 0xfe, 0x9b, 0xb4, 0x0f, 0x0d, 0x06, 0x00, 0x50, 0x2b, 0x34, 0x00, + 0xff, 0xff, 0xff, 0x31, 0x00, 0x00, 0x01, 0xc7, 0x02, 0x6b, 0x02, 0x26, 0x00, 0x2b, 0x00, 0x00, + 0x01, 0x07, 0x00, 0x8f, 0xfe, 0x99, 0xff, 0xb4, 0x00, 0x0d, 0xb9, 0x00, 0x01, 0xfe, 0xa5, 0xb4, + 0x0e, 0x0c, 0x06, 0x00, 0x50, 0x2b, 0x34, 0x00, 0x00, 0x02, 0x00, 0x12, 0xff, 0xf6, 0x01, 0xf3, + 0x02, 0x6b, 0x00, 0x0b, 0x00, 0x17, 0x00, 0x71, 0x40, 0x17, 0x19, 0x17, 0x20, 0x14, 0x01, 0x14, + 0x52, 0xa0, 0x12, 0xb0, 0x12, 0xc0, 0x12, 0x03, 0x12, 0xc0, 0x01, 0xd0, 0x01, 0xe0, 0x01, 0x03, + 0x01, 0xb8, 0xff, 0xc0, 0x40, 0x13, 0x0b, 0x0f, 0x48, 0x01, 0x52, 0x03, 0x00, 0x0a, 0x01, 0x0a, + 0x04, 0xc0, 0x08, 0xd0, 0x08, 0xe0, 0x08, 0x03, 0x08, 0xb8, 0xff, 0xc0, 0x40, 0x1a, 0x0b, 0x10, + 0x48, 0x08, 0x52, 0x07, 0x18, 0x12, 0x0a, 0x17, 0x57, 0x0c, 0x07, 0x09, 0x55, 0x04, 0x04, 0x02, + 0x0b, 0x02, 0x08, 0x02, 0x05, 0x08, 0x02, 0x08, 0x00, 0x3f, 0x3f, 0x3f, 0x3f, 0x12, 0x39, 0x2f, + 0xed, 0x3f, 0xed, 0x3f, 0x01, 0x10, 0xd6, 0xfd, 0x2b, 0x5d, 0x32, 0xd6, 0x71, 0x32, 0xfd, 0x2b, + 0x5d, 0xd6, 0x71, 0xfd, 0x5d, 0xde, 0xce, 0x31, 0x30, 0x01, 0x11, 0x23, 0x11, 0x23, 0x11, 0x23, + 0x11, 0x33, 0x15, 0x33, 0x35, 0x01, 0x2e, 0x03, 0x35, 0x11, 0x33, 0x11, 0x14, 0x16, 0x17, 0x01, + 0x39, 0x61, 0x66, 0x60, 0x60, 0x66, 0x01, 0x0e, 0x28, 0x32, 0x1b, 0x0a, 0x60, 0x10, 0x1c, 0x02, + 0x6b, 0xfd, 0x95, 0x01, 0x1a, 0xfe, 0xe6, 0x02, 0x6b, 0xfd, 0xfd, 0xfd, 0x8b, 0x05, 0x1c, 0x2a, + 0x38, 0x23, 0x01, 0x3a, 0xfe, 0xbb, 0x20, 0x23, 0x04, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x40, + 0x02, 0x08, 0x01, 0xb4, 0x02, 0xe6, 0x00, 0x03, 0x00, 0x13, 0x00, 0x21, 0x40, 0x0e, 0x01, 0x02, + 0x00, 0x03, 0x10, 0x07, 0x04, 0x0a, 0x02, 0x13, 0x07, 0x00, 0x0d, 0xb8, 0x00, 0x3f, 0xc4, 0xdd, + 0xdd, 0xc6, 0x01, 0x2f, 0xc6, 0xc5, 0xdd, 0xd6, 0xcd, 0xdd, 0xcd, 0x31, 0x30, 0x01, 0x17, 0x07, + 0x27, 0x07, 0x36, 0x36, 0x37, 0x26, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, + 0x07, 0x01, 0x48, 0x6c, 0x3b, 0x7f, 0xba, 0x16, 0x20, 0x0d, 0x12, 0x15, 0x22, 0x1c, 0x1d, 0x20, + 0x3f, 0x30, 0x02, 0xe4, 0xab, 0x2b, 0x9f, 0x7f, 0x12, 0x21, 0x12, 0x08, 0x1e, 0x12, 0x1a, 0x21, + 0x23, 0x21, 0x29, 0x4f, 0x22, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x4e, 0x02, 0x08, 0x01, 0xa5, + 0x02, 0xe6, 0x00, 0x03, 0x00, 0x13, 0x00, 0x21, 0x40, 0x0e, 0x00, 0x03, 0x01, 0x02, 0x10, 0x04, + 0x0a, 0x14, 0x01, 0x13, 0x07, 0x03, 0x0d, 0xb8, 0x00, 0x3f, 0xc4, 0xdd, 0xdd, 0xc6, 0x01, 0x10, + 0xdc, 0xc6, 0xdd, 0xde, 0xcd, 0xdd, 0xcd, 0x31, 0x30, 0x01, 0x07, 0x27, 0x37, 0x05, 0x36, 0x36, + 0x37, 0x26, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x07, 0x01, 0xa5, 0x7e, + 0x3b, 0x6c, 0xfe, 0xf6, 0x15, 0x21, 0x0d, 0x12, 0x16, 0x22, 0x1c, 0x1d, 0x21, 0x40, 0x2f, 0x02, + 0xad, 0x9f, 0x2b, 0xab, 0xb6, 0x12, 0x21, 0x12, 0x08, 0x1e, 0x12, 0x1a, 0x21, 0x23, 0x21, 0x29, + 0x4f, 0x22, 0x00, 0x00, 0x00, 0x02, 0x00, 0x6e, 0x02, 0x06, 0x01, 0x86, 0x03, 0x37, 0x00, 0x15, + 0x00, 0x27, 0x00, 0x36, 0x40, 0x1b, 0x27, 0x16, 0x19, 0x1c, 0xe0, 0x22, 0x01, 0x22, 0x00, 0x0b, + 0xe0, 0x0a, 0x01, 0x0a, 0x00, 0x15, 0x27, 0x19, 0x1f, 0x15, 0xff, 0x0a, 0x01, 0x0a, 0x10, 0x05, + 0x1f, 0x00, 0x2f, 0xde, 0xcd, 0xde, 0x5d, 0xc0, 0x10, 0xdd, 0xcd, 0x01, 0x2f, 0xdd, 0xdc, 0x5d, + 0xcd, 0x10, 0xd6, 0x5d, 0xdd, 0xc5, 0xc6, 0x32, 0x31, 0x30, 0x01, 0x2e, 0x03, 0x23, 0x22, 0x0e, + 0x02, 0x07, 0x23, 0x3e, 0x03, 0x33, 0x32, 0x1e, 0x02, 0x17, 0x07, 0x36, 0x36, 0x37, 0x26, 0x26, + 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x0e, 0x02, 0x07, 0x01, 0x41, 0x01, 0x0d, 0x14, + 0x19, 0x0c, 0x0c, 0x19, 0x14, 0x0d, 0x01, 0x45, 0x01, 0x18, 0x27, 0x31, 0x1b, 0x1b, 0x31, 0x27, + 0x17, 0x02, 0xd1, 0x0b, 0x18, 0x09, 0x11, 0x0c, 0x1a, 0x1a, 0x15, 0x22, 0x07, 0x14, 0x22, 0x1c, + 0x02, 0xaa, 0x12, 0x18, 0x10, 0x07, 0x07, 0x10, 0x18, 0x12, 0x25, 0x35, 0x23, 0x10, 0x10, 0x23, + 0x35, 0x25, 0x7f, 0x09, 0x15, 0x0b, 0x07, 0x18, 0x0d, 0x12, 0x1d, 0x1a, 0x1b, 0x0c, 0x19, 0x1b, + 0x21, 0x13, 0x00, 0x00, 0xff, 0xff, 0x00, 0x24, 0xff, 0xf5, 0x01, 0xd3, 0x02, 0xaa, 0x02, 0x26, + 0x03, 0xb1, 0x00, 0x00, 0x01, 0x06, 0x01, 0x61, 0xdd, 0x00, 0x00, 0x13, 0xb9, 0x00, 0x01, 0xff, + 0xdc, 0x40, 0x09, 0x18, 0x22, 0x0a, 0x00, 0x50, 0x01, 0x0b, 0x14, 0x4f, 0x2b, 0x2b, 0x34, 0x00, + 0xff, 0xff, 0x00, 0x24, 0xff, 0xf5, 0x01, 0xd3, 0x02, 0x87, 0x02, 0x26, 0x03, 0xb1, 0x00, 0x00, + 0x01, 0x06, 0x00, 0x8a, 0xdd, 0x00, 0x00, 0x13, 0xb9, 0x00, 0x01, 0xff, 0xde, 0x40, 0x09, 0x14, + 0x15, 0x0a, 0x00, 0x50, 0x01, 0x0b, 0x16, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0xff, 0xff, 0x00, 0x15, + 0xff, 0xf5, 0x01, 0xd3, 0x02, 0xda, 0x02, 0x26, 0x03, 0xb1, 0x00, 0x00, 0x01, 0x06, 0x04, 0xb3, + 0xef, 0x00, 0x00, 0x21, 0xb2, 0x03, 0x02, 0x01, 0xb8, 0xff, 0xee, 0x40, 0x11, 0x19, 0x20, 0x0a, + 0x00, 0x50, 0x03, 0x0b, 0x2e, 0x4f, 0x02, 0x0b, 0x22, 0x4f, 0x01, 0x0b, 0x16, 0x4f, 0x2b, 0x2b, + 0x2b, 0x2b, 0x34, 0x34, 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x15, 0xff, 0xf5, 0x01, 0xd3, + 0x02, 0xda, 0x02, 0x26, 0x03, 0xb1, 0x00, 0x00, 0x01, 0x06, 0x03, 0xd8, 0xef, 0x00, 0x00, 0x21, + 0xb2, 0x03, 0x02, 0x01, 0xb8, 0xff, 0xee, 0x40, 0x11, 0x19, 0x20, 0x0a, 0x00, 0x50, 0x03, 0x0b, + 0x2d, 0x4f, 0x02, 0x0b, 0x22, 0x4f, 0x01, 0x0b, 0x16, 0x4f, 0x2b, 0x2b, 0x2b, 0x2b, 0x34, 0x34, + 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x24, 0xff, 0xf5, 0x01, 0xd3, 0x02, 0xaa, 0x02, 0x26, + 0x03, 0xb1, 0x00, 0x00, 0x01, 0x06, 0x04, 0x8a, 0xdd, 0x00, 0x00, 0x13, 0xb9, 0x00, 0x01, 0xff, + 0xdc, 0x40, 0x09, 0x22, 0x18, 0x0a, 0x00, 0x50, 0x01, 0x0b, 0x1a, 0x4f, 0x2b, 0x2b, 0x34, 0x00, + 0xff, 0xff, 0x00, 0x24, 0xff, 0xf5, 0x01, 0xd3, 0x03, 0x37, 0x02, 0x26, 0x03, 0xb1, 0x00, 0x00, + 0x01, 0x06, 0x04, 0x8b, 0xdd, 0x00, 0x00, 0x1e, 0xb2, 0x03, 0x02, 0x01, 0xb8, 0xff, 0xdb, 0x40, + 0x0e, 0x19, 0x20, 0x0a, 0x00, 0x50, 0x03, 0x02, 0x0b, 0x22, 0x4f, 0x01, 0x0b, 0x16, 0x4f, 0x2b, + 0x2b, 0x34, 0x2b, 0x34, 0x34, 0x34, 0x00, 0x00, 0xff, 0xff, 0x00, 0x36, 0x00, 0x00, 0x01, 0xbf, + 0x03, 0x35, 0x02, 0x26, 0x00, 0x2c, 0x00, 0x00, 0x01, 0x07, 0x01, 0x61, 0x00, 0x00, 0x00, 0x8b, + 0x00, 0x10, 0x40, 0x0b, 0x01, 0x00, 0x10, 0x1a, 0x00, 0x06, 0x50, 0x01, 0x05, 0x0c, 0x4f, 0x2b, + 0x2b, 0x34, 0x00, 0x00, 0xff, 0xff, 0x00, 0x36, 0x00, 0x00, 0x01, 0xbf, 0x03, 0x12, 0x02, 0x26, + 0x00, 0x2c, 0x00, 0x00, 0x01, 0x07, 0x00, 0x8a, 0x00, 0x00, 0x00, 0x8b, 0x00, 0x10, 0x40, 0x0b, + 0x01, 0x01, 0x0c, 0x0d, 0x00, 0x06, 0x50, 0x01, 0x05, 0x0e, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0x00, + 0xff, 0xff, 0xff, 0x25, 0x00, 0x00, 0x01, 0xbf, 0x02, 0x6b, 0x02, 0x26, 0x00, 0x2c, 0x00, 0x00, + 0x01, 0x07, 0x00, 0x43, 0xfe, 0x8d, 0xff, 0xb4, 0x00, 0x0d, 0xb9, 0x00, 0x01, 0xfe, 0x98, 0xb4, + 0x0f, 0x0d, 0x00, 0x06, 0x50, 0x2b, 0x34, 0x00, 0xff, 0xff, 0xff, 0x1f, 0x00, 0x00, 0x01, 0xbf, + 0x02, 0x6b, 0x02, 0x26, 0x00, 0x2c, 0x00, 0x00, 0x01, 0x07, 0x00, 0x8f, 0xfe, 0x87, 0xff, 0xb4, + 0x00, 0x0d, 0xb9, 0x00, 0x01, 0xfe, 0x92, 0xb4, 0x0e, 0x0c, 0x00, 0x06, 0x50, 0x2b, 0x34, 0x00, + 0x00, 0x02, 0x00, 0x4f, 0x02, 0x08, 0x01, 0xa5, 0x02, 0xe6, 0x00, 0x03, 0x00, 0x13, 0x00, 0x1c, + 0x40, 0x0c, 0x01, 0x03, 0x0d, 0x13, 0x07, 0x14, 0x0a, 0x04, 0x7e, 0x00, 0x02, 0x7e, 0x00, 0x3f, + 0xc5, 0x3f, 0xc4, 0x01, 0x10, 0xd6, 0xc5, 0xd5, 0xde, 0xc5, 0x31, 0x30, 0x01, 0x17, 0x07, 0x27, + 0x07, 0x26, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x07, 0x16, 0x16, 0x17, + 0x01, 0x39, 0x6c, 0x3b, 0x7f, 0x2e, 0x30, 0x3e, 0x20, 0x1d, 0x1c, 0x22, 0x15, 0x12, 0x0c, 0x21, + 0x16, 0x02, 0xe4, 0xab, 0x2b, 0x9f, 0xa5, 0x20, 0x52, 0x28, 0x21, 0x23, 0x21, 0x1a, 0x12, 0x1e, + 0x08, 0x12, 0x21, 0x12, 0x00, 0x02, 0x00, 0x48, 0x02, 0x08, 0x01, 0xac, 0x02, 0xe6, 0x00, 0x03, + 0x00, 0x13, 0x00, 0x1c, 0x40, 0x0c, 0x00, 0x02, 0x13, 0x0d, 0x07, 0x14, 0x0a, 0x04, 0x7e, 0x03, + 0x01, 0x7e, 0x00, 0x3f, 0xc5, 0x3f, 0xc4, 0x01, 0x10, 0xd6, 0xd5, 0xd6, 0xde, 0xcd, 0x31, 0x30, + 0x01, 0x07, 0x27, 0x37, 0x07, 0x26, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, + 0x07, 0x16, 0x16, 0x17, 0x01, 0xac, 0x7f, 0x3b, 0x6c, 0xa7, 0x30, 0x3f, 0x21, 0x1d, 0x1c, 0x22, + 0x16, 0x12, 0x0d, 0x21, 0x15, 0x02, 0xad, 0x9f, 0x2b, 0xab, 0xdc, 0x20, 0x52, 0x28, 0x21, 0x23, + 0x21, 0x1a, 0x12, 0x1e, 0x08, 0x12, 0x21, 0x12, 0x00, 0x02, 0x00, 0x6e, 0x02, 0x06, 0x01, 0x86, + 0x03, 0x37, 0x00, 0x15, 0x00, 0x27, 0x00, 0x2b, 0x40, 0x14, 0x27, 0x24, 0x21, 0xb0, 0x1b, 0x01, + 0x1b, 0x0b, 0x15, 0x00, 0x0a, 0x0b, 0x28, 0x16, 0x1e, 0x05, 0x15, 0x0b, 0x10, 0x86, 0x00, 0x3f, + 0xc5, 0xc5, 0xd5, 0xde, 0xc5, 0x01, 0x10, 0xde, 0xd5, 0xd4, 0xc5, 0x10, 0xd6, 0x5d, 0xc5, 0xd5, + 0xce, 0x31, 0x30, 0x01, 0x2e, 0x03, 0x23, 0x22, 0x0e, 0x02, 0x07, 0x23, 0x3e, 0x03, 0x33, 0x32, + 0x1e, 0x02, 0x17, 0x07, 0x2e, 0x03, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x07, + 0x16, 0x16, 0x17, 0x01, 0x41, 0x01, 0x0d, 0x14, 0x19, 0x0c, 0x0c, 0x19, 0x14, 0x0d, 0x01, 0x45, + 0x01, 0x18, 0x27, 0x31, 0x1b, 0x1b, 0x31, 0x27, 0x17, 0x02, 0x68, 0x1b, 0x23, 0x14, 0x07, 0x22, + 0x15, 0x1a, 0x1a, 0x0c, 0x11, 0x09, 0x18, 0x0b, 0x02, 0xaa, 0x12, 0x18, 0x10, 0x07, 0x07, 0x10, + 0x18, 0x12, 0x25, 0x35, 0x23, 0x10, 0x10, 0x23, 0x35, 0x25, 0xa4, 0x13, 0x21, 0x1b, 0x19, 0x0c, + 0x1b, 0x1a, 0x1d, 0x12, 0x0d, 0x18, 0x07, 0x0b, 0x15, 0x09, 0x00, 0x00, 0xff, 0xff, 0x00, 0x33, + 0xff, 0xf3, 0x01, 0xbf, 0x02, 0xaa, 0x02, 0x26, 0x03, 0xbd, 0x00, 0x00, 0x01, 0x06, 0x01, 0x61, + 0x00, 0x00, 0x00, 0x10, 0x40, 0x0b, 0x01, 0x01, 0x16, 0x20, 0x02, 0x0e, 0x50, 0x01, 0x04, 0x12, + 0x4f, 0x2b, 0x2b, 0x34, 0xff, 0xff, 0x00, 0x33, 0xff, 0xf3, 0x01, 0xbf, 0x02, 0x87, 0x02, 0x26, + 0x03, 0xbd, 0x00, 0x00, 0x01, 0x06, 0x00, 0x8a, 0x00, 0x00, 0x00, 0x10, 0x40, 0x0b, 0x01, 0x03, + 0x12, 0x13, 0x02, 0x0e, 0x50, 0x01, 0x04, 0x14, 0x4f, 0x2b, 0x2b, 0x34, 0xff, 0xff, 0x00, 0x26, + 0xff, 0xf3, 0x01, 0xce, 0x02, 0xda, 0x02, 0x26, 0x03, 0xbd, 0x00, 0x00, 0x01, 0x06, 0x04, 0xb3, + 0x00, 0x00, 0x00, 0x1e, 0x40, 0x15, 0x03, 0x02, 0x01, 0x01, 0x17, 0x1e, 0x02, 0x0e, 0x50, 0x03, + 0x04, 0x2c, 0x4f, 0x02, 0x04, 0x20, 0x4f, 0x01, 0x04, 0x14, 0x4f, 0x2b, 0x2b, 0x2b, 0x2b, 0x34, + 0x34, 0x34, 0x00, 0x00, 0xff, 0xff, 0x00, 0x26, 0xff, 0xf3, 0x01, 0xce, 0x02, 0xda, 0x02, 0x26, + 0x03, 0xbd, 0x00, 0x00, 0x01, 0x06, 0x03, 0xd8, 0x00, 0x00, 0x00, 0x1e, 0x40, 0x15, 0x03, 0x02, + 0x01, 0x01, 0x17, 0x1e, 0x02, 0x0e, 0x50, 0x03, 0x04, 0x2b, 0x4f, 0x02, 0x04, 0x20, 0x4f, 0x01, + 0x04, 0x14, 0x4f, 0x2b, 0x2b, 0x2b, 0x2b, 0x34, 0x34, 0x34, 0x00, 0x00, 0xff, 0xff, 0x00, 0x3f, + 0xff, 0x5b, 0x01, 0xd5, 0x02, 0xe6, 0x02, 0x26, 0x03, 0xb9, 0x00, 0x00, 0x01, 0x06, 0x04, 0x89, + 0x00, 0x00, 0x00, 0x13, 0xb9, 0x00, 0x02, 0xff, 0xf0, 0x40, 0x09, 0x1e, 0x29, 0x05, 0x0b, 0x50, + 0x02, 0x08, 0x2d, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0xff, 0xff, 0x00, 0x3f, 0xff, 0x5b, 0x01, 0xd5, + 0x02, 0xe6, 0x02, 0x26, 0x03, 0xb9, 0x00, 0x00, 0x01, 0x06, 0x04, 0xc1, 0x00, 0x00, 0x00, 0x13, + 0xb9, 0x00, 0x02, 0xff, 0xf0, 0x40, 0x09, 0x20, 0x2d, 0x05, 0x0b, 0x50, 0x02, 0x08, 0x1e, 0x4f, + 0x2b, 0x2b, 0x34, 0x00, 0xff, 0xff, 0x00, 0x33, 0xff, 0xf3, 0x01, 0xbf, 0x02, 0xaa, 0x02, 0x26, + 0x03, 0xbd, 0x00, 0x00, 0x01, 0x06, 0x04, 0x8a, 0x00, 0x00, 0x00, 0x10, 0x40, 0x0b, 0x01, 0x01, + 0x20, 0x16, 0x02, 0x0e, 0x50, 0x01, 0x04, 0x18, 0x4f, 0x2b, 0x2b, 0x34, 0xff, 0xff, 0x00, 0x33, + 0xff, 0xf3, 0x01, 0xbf, 0x03, 0x37, 0x02, 0x26, 0x03, 0xbd, 0x00, 0x00, 0x01, 0x06, 0x04, 0x8b, + 0x00, 0x00, 0x00, 0x1b, 0x40, 0x12, 0x03, 0x02, 0x01, 0x00, 0x17, 0x1e, 0x02, 0x0e, 0x50, 0x03, + 0x02, 0x04, 0x20, 0x4f, 0x01, 0x04, 0x14, 0x4f, 0x2b, 0x2b, 0x34, 0x2b, 0x34, 0x34, 0x34, 0x00, + 0xff, 0xff, 0x00, 0x0d, 0x00, 0x00, 0x01, 0xe8, 0x03, 0x35, 0x02, 0x26, 0x00, 0x3c, 0x00, 0x00, + 0x01, 0x07, 0x01, 0x61, 0x00, 0x00, 0x00, 0x8b, 0x00, 0x10, 0x40, 0x0b, 0x01, 0x00, 0x19, 0x23, + 0x11, 0x06, 0x50, 0x01, 0x05, 0x15, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0x00, 0xff, 0xff, 0x00, 0x0d, + 0x00, 0x00, 0x01, 0xe8, 0x03, 0x12, 0x02, 0x26, 0x00, 0x3c, 0x00, 0x00, 0x01, 0x07, 0x00, 0x8a, + 0x00, 0x00, 0x00, 0x8b, 0x00, 0x10, 0x40, 0x0b, 0x01, 0x01, 0x15, 0x16, 0x11, 0x06, 0x50, 0x01, + 0x05, 0x17, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0x00, 0xff, 0xff, 0xff, 0x37, 0x00, 0x00, 0x01, 0xe8, + 0x02, 0x6b, 0x02, 0x26, 0x00, 0x3c, 0x00, 0x00, 0x01, 0x07, 0x00, 0x43, 0xfe, 0x9f, 0xff, 0xb4, + 0x00, 0x0d, 0xb9, 0x00, 0x01, 0xfe, 0xaa, 0xb4, 0x18, 0x16, 0x11, 0x06, 0x50, 0x2b, 0x34, 0x00, + 0xff, 0xff, 0xff, 0x27, 0x00, 0x00, 0x01, 0xe8, 0x02, 0x6b, 0x02, 0x26, 0x00, 0x3c, 0x00, 0x00, + 0x01, 0x07, 0x00, 0x8f, 0xfe, 0x8f, 0xff, 0xb4, 0x00, 0x0d, 0xb9, 0x00, 0x01, 0xfe, 0x9a, 0xb4, + 0x17, 0x15, 0x11, 0x06, 0x50, 0x2b, 0x34, 0x00, 0xff, 0xff, 0xff, 0x57, 0x00, 0x00, 0x01, 0xd8, + 0x02, 0x7f, 0x02, 0x26, 0x00, 0x33, 0x00, 0x00, 0x01, 0x07, 0x04, 0xc1, 0xfe, 0xac, 0xff, 0x99, + 0x00, 0x0d, 0xb9, 0x00, 0x02, 0xfe, 0x9f, 0xb4, 0x1c, 0x29, 0x09, 0x02, 0x50, 0x2b, 0x34, 0x00, + 0x00, 0x03, 0x00, 0x26, 0x02, 0x00, 0x01, 0xce, 0x02, 0xda, 0x00, 0x0b, 0x00, 0x17, 0x00, 0x1b, + 0x00, 0x29, 0x40, 0x15, 0x0c, 0x95, 0x12, 0x19, 0x1b, 0x1a, 0x00, 0x95, 0x06, 0x1c, 0x18, 0x1a, + 0x7e, 0x0f, 0x96, 0x15, 0x98, 0x03, 0x96, 0x09, 0x98, 0x00, 0x3f, 0xed, 0x3f, 0xed, 0x3f, 0xc5, + 0x01, 0x10, 0xd6, 0xfd, 0xce, 0xd4, 0xd5, 0xd6, 0xed, 0x31, 0x30, 0x13, 0x14, 0x06, 0x23, 0x22, + 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x05, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, + 0x33, 0x32, 0x16, 0x27, 0x17, 0x07, 0x27, 0xab, 0x28, 0x1b, 0x1b, 0x27, 0x27, 0x1b, 0x1b, 0x28, + 0x01, 0x23, 0x28, 0x1a, 0x1b, 0x27, 0x27, 0x1b, 0x1a, 0x28, 0xdc, 0x4e, 0x3e, 0x61, 0x02, 0x5d, + 0x1f, 0x23, 0x23, 0x1f, 0x20, 0x22, 0x22, 0x20, 0x1f, 0x23, 0x23, 0x1f, 0x20, 0x22, 0x22, 0x5d, + 0xbd, 0x1d, 0xb2, 0x00, 0xff, 0xff, 0x00, 0x26, 0x02, 0x00, 0x01, 0xce, 0x02, 0xda, 0x02, 0x06, + 0x03, 0xd8, 0x00, 0x00, 0x00, 0x01, 0x00, 0x85, 0x02, 0x05, 0x01, 0x6f, 0x02, 0xc1, 0x00, 0x03, + 0x00, 0x10, 0xb5, 0x01, 0x03, 0x04, 0x00, 0x02, 0x7e, 0x00, 0x3f, 0xc5, 0x01, 0x10, 0xd6, 0xc5, + 0x31, 0x30, 0x13, 0x17, 0x07, 0x27, 0xbe, 0xb1, 0x2e, 0xbc, 0x02, 0xc1, 0x75, 0x47, 0x60, 0x00, + 0xff, 0xff, 0x00, 0x19, 0xff, 0x56, 0x01, 0xdd, 0x02, 0xc1, 0x02, 0x26, 0x03, 0xc1, 0x00, 0x00, + 0x00, 0x26, 0x04, 0x88, 0x1b, 0x00, 0x01, 0x06, 0x04, 0xb5, 0x00, 0x00, 0x00, 0x0f, 0xb1, 0x02, + 0x01, 0xb8, 0xff, 0xff, 0xb4, 0x44, 0x42, 0x1e, 0x0e, 0x50, 0x2b, 0x34, 0x34, 0x00, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x19, 0xff, 0x56, 0x01, 0xdd, 0x01, 0xe2, 0x02, 0x26, 0x03, 0xc1, 0x00, 0x00, + 0x01, 0x06, 0x04, 0x88, 0x1b, 0x00, 0x00, 0x0a, 0xb6, 0x01, 0x1a, 0x3c, 0x36, 0x1e, 0x0e, 0x50, + 0x2b, 0x34, 0x00, 0x00, 0xff, 0xff, 0x00, 0x19, 0xff, 0x56, 0x01, 0xdd, 0x02, 0xc1, 0x02, 0x26, + 0x03, 0xc1, 0x00, 0x00, 0x00, 0x26, 0x04, 0x88, 0x1b, 0x00, 0x01, 0x06, 0x04, 0xc0, 0x24, 0x00, + 0x00, 0x0c, 0xb7, 0x02, 0x01, 0x23, 0x43, 0x41, 0x1e, 0x0e, 0x50, 0x2b, 0x34, 0x34, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x19, 0xff, 0xf7, 0x01, 0xdd, 0x02, 0xaa, 0x02, 0x26, 0x03, 0xc1, 0x00, 0x00, + 0x01, 0x06, 0x04, 0x8a, 0x00, 0x00, 0x00, 0x13, 0xb9, 0x00, 0x01, 0xff, 0xff, 0x40, 0x09, 0x3f, + 0x35, 0x1e, 0x0e, 0x50, 0x01, 0x0a, 0x37, 0x4f, 0x2b, 0x2b, 0x34, 0x00, 0xff, 0xff, 0x00, 0x19, + 0xff, 0x56, 0x01, 0xdd, 0x02, 0xaa, 0x02, 0x26, 0x03, 0xc1, 0x00, 0x00, 0x00, 0x26, 0x04, 0x88, + 0x1b, 0x00, 0x01, 0x06, 0x04, 0x8a, 0x00, 0x00, 0x00, 0x0f, 0xb1, 0x02, 0x01, 0xb8, 0xff, 0xff, + 0xb4, 0x4f, 0x45, 0x1e, 0x0e, 0x50, 0x2b, 0x34, 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x14, + 0xff, 0xf3, 0x01, 0xd9, 0x02, 0x79, 0x02, 0x26, 0x00, 0x32, 0x00, 0x00, 0x01, 0x07, 0x00, 0x43, + 0xfe, 0x7c, 0xff, 0xb4, 0x00, 0x0d, 0xb9, 0x00, 0x02, 0xfe, 0x88, 0xb4, 0x23, 0x21, 0x14, 0x19, + 0x50, 0x2b, 0x34, 0x00, 0xff, 0xff, 0xff, 0x44, 0xff, 0xf3, 0x01, 0xd9, 0x02, 0x79, 0x02, 0x26, + 0x00, 0x32, 0x00, 0x00, 0x01, 0x07, 0x00, 0x8f, 0xfe, 0xac, 0xff, 0xb4, 0x00, 0x0d, 0xb9, 0x00, + 0x02, 0xfe, 0xb8, 0xb4, 0x22, 0x20, 0x14, 0x19, 0x50, 0x2b, 0x34, 0x00, 0xff, 0xff, 0xfe, 0xfa, + 0x00, 0x00, 0x01, 0xeb, 0x02, 0x79, 0x02, 0x26, 0x03, 0xa8, 0x00, 0x00, 0x01, 0x07, 0x00, 0x43, + 0xfe, 0x62, 0xff, 0xb4, 0x00, 0x0d, 0xb9, 0x00, 0x01, 0xfe, 0x6e, 0xb4, 0x2b, 0x29, 0x23, 0x0e, + 0x50, 0x2b, 0x34, 0x00, 0xff, 0xff, 0xff, 0x33, 0x00, 0x00, 0x01, 0xeb, 0x02, 0x79, 0x02, 0x26, + 0x03, 0xa8, 0x00, 0x00, 0x01, 0x07, 0x00, 0x8f, 0xfe, 0x9b, 0xff, 0xb4, 0x00, 0x0d, 0xb9, 0x00, + 0x01, 0xfe, 0xa7, 0xb4, 0x2a, 0x28, 0x23, 0x0e, 0x50, 0x2b, 0x34, 0x00, 0x00, 0x02, 0x00, 0x09, + 0xff, 0xf6, 0x01, 0xfc, 0x02, 0x79, 0x00, 0x27, 0x00, 0x33, 0x01, 0x37, 0xb9, 0x00, 0x33, 0xff, + 0xc0, 0xb4, 0x0d, 0x0e, 0x00, 0x4c, 0x25, 0xb8, 0xff, 0xe0, 0xb3, 0x10, 0x00, 0x4d, 0x25, 0xb8, + 0xff, 0xc0, 0x40, 0x15, 0x0d, 0x0e, 0x00, 0x4c, 0x24, 0x40, 0x10, 0x00, 0x4d, 0x24, 0x40, 0x0d, + 0x0e, 0x00, 0x4c, 0x0b, 0x40, 0x0e, 0x00, 0x4d, 0x0b, 0xb8, 0xff, 0xc0, 0xb3, 0x0b, 0x00, 0x4d, + 0x0a, 0xb8, 0xff, 0xc0, 0xb3, 0x10, 0x00, 0x4d, 0x0a, 0xb8, 0xff, 0xc0, 0xb3, 0x0d, 0x00, 0x4d, + 0x0a, 0xb8, 0xff, 0xc0, 0x40, 0x09, 0x0b, 0x00, 0x4d, 0x09, 0x40, 0x10, 0x00, 0x4d, 0x08, 0xb8, + 0xff, 0xf0, 0xb3, 0x16, 0x00, 0x4d, 0x07, 0xb8, 0xff, 0xc0, 0xb3, 0x0b, 0x00, 0x4d, 0x06, 0xb8, + 0xff, 0xc0, 0xb3, 0x0b, 0x00, 0x4d, 0x05, 0xb8, 0xff, 0xc0, 0x40, 0x16, 0x0b, 0x00, 0x4d, 0x04, + 0x33, 0x14, 0x33, 0x02, 0xa4, 0x33, 0xb4, 0x33, 0x02, 0x0b, 0x33, 0x1b, 0x33, 0x8b, 0x33, 0x03, + 0x33, 0x2f, 0xb8, 0xff, 0xc0, 0xb3, 0x13, 0x1a, 0x48, 0x2f, 0xb8, 0xff, 0xc0, 0x40, 0x66, 0x0b, + 0x10, 0x48, 0x2f, 0x52, 0x34, 0x2d, 0x01, 0x20, 0x2d, 0x01, 0x02, 0x00, 0x2d, 0x10, 0x2d, 0x02, + 0x2d, 0x12, 0x40, 0x18, 0x00, 0x4d, 0x12, 0x40, 0x0c, 0x00, 0x4d, 0x4f, 0x12, 0x5f, 0x12, 0xcf, + 0x12, 0xdf, 0x12, 0x04, 0x12, 0x52, 0x09, 0x40, 0x06, 0x01, 0x06, 0x30, 0x0b, 0x50, 0x0b, 0x90, + 0x0b, 0x03, 0x0b, 0x2f, 0x0d, 0x01, 0x0d, 0xaf, 0x21, 0x01, 0x00, 0x21, 0x10, 0x21, 0x20, 0x21, + 0x03, 0x21, 0x25, 0xc0, 0x1c, 0xd0, 0x1c, 0x02, 0x1c, 0x52, 0xe0, 0x00, 0xf0, 0x00, 0x02, 0x00, + 0x25, 0x24, 0x34, 0x2f, 0x0a, 0x33, 0x57, 0x28, 0x09, 0x25, 0x55, 0x22, 0x08, 0x09, 0x55, 0x0b, + 0x08, 0x17, 0x57, 0x03, 0x03, 0x00, 0x3f, 0xed, 0x3f, 0xed, 0x3f, 0xed, 0x3f, 0xed, 0x3f, 0x01, + 0x10, 0xd6, 0xdd, 0xd5, 0x5d, 0xed, 0x5d, 0x10, 0xd5, 0x5d, 0x5d, 0xde, 0x5d, 0xd5, 0x5d, 0xd4, + 0x5d, 0xcd, 0xed, 0x5d, 0x2b, 0x2b, 0xde, 0x5d, 0x5f, 0x5d, 0x5d, 0xed, 0x2b, 0x2b, 0xc4, 0x5d, + 0x5d, 0x71, 0x31, 0x30, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, + 0x2b, 0x2b, 0x2b, 0x13, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x07, 0x33, 0x15, 0x23, + 0x35, 0x3e, 0x03, 0x35, 0x34, 0x2e, 0x02, 0x23, 0x22, 0x0e, 0x02, 0x15, 0x14, 0x1e, 0x02, 0x17, + 0x15, 0x23, 0x35, 0x33, 0x26, 0x26, 0x01, 0x2e, 0x03, 0x35, 0x11, 0x33, 0x11, 0x14, 0x16, 0x17, + 0x0e, 0x54, 0x49, 0x48, 0x54, 0x1b, 0x22, 0x40, 0x8e, 0x08, 0x0f, 0x0b, 0x07, 0x06, 0x0e, 0x16, + 0x10, 0x10, 0x16, 0x0e, 0x06, 0x06, 0x0b, 0x0f, 0x08, 0x90, 0x42, 0x21, 0x1c, 0x01, 0xe1, 0x28, + 0x32, 0x1b, 0x0a, 0x60, 0x10, 0x1c, 0x01, 0x62, 0x8c, 0x8b, 0x8b, 0x8c, 0x42, 0x86, 0x3d, 0x5d, + 0x57, 0x10, 0x35, 0x44, 0x4f, 0x2b, 0x26, 0x45, 0x34, 0x1e, 0x1f, 0x35, 0x46, 0x27, 0x2a, 0x4f, + 0x42, 0x34, 0x10, 0x57, 0x5d, 0x3d, 0x89, 0xfe, 0xd3, 0x05, 0x1c, 0x2a, 0x38, 0x23, 0x01, 0x3a, + 0xfe, 0xbb, 0x20, 0x23, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x85, 0x02, 0x05, 0x01, 0x6f, + 0x02, 0xc1, 0x00, 0x03, 0x00, 0x10, 0xb5, 0x00, 0x02, 0x04, 0x03, 0x01, 0x7e, 0x00, 0x3f, 0xc5, + 0x01, 0x10, 0xd6, 0xc5, 0x31, 0x30, 0x01, 0x07, 0x27, 0x37, 0x01, 0x6f, 0xbc, 0x2e, 0xb1, 0x02, + 0x65, 0x60, 0x47, 0x75, 0x00, 0x01, 0x00, 0xab, 0x02, 0x08, 0x01, 0x49, 0x02, 0xe6, 0x00, 0x0f, + 0x00, 0x12, 0xb6, 0x0f, 0x09, 0x03, 0x10, 0x06, 0x00, 0x7e, 0x00, 0x3f, 0xc4, 0x01, 0x10, 0xd6, + 0xd5, 0xce, 0x31, 0x30, 0x01, 0x26, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, + 0x07, 0x16, 0x16, 0x17, 0x01, 0x20, 0x33, 0x42, 0x27, 0x1d, 0x1c, 0x24, 0x17, 0x12, 0x0d, 0x20, + 0x16, 0x02, 0x08, 0x22, 0x50, 0x28, 0x21, 0x23, 0x21, 0x1a, 0x12, 0x1e, 0x08, 0x12, 0x21, 0x12, + 0xff, 0xff, 0xff, 0xaa, 0xff, 0x56, 0x01, 0xeb, 0x02, 0x7f, 0x02, 0x26, 0x00, 0x24, 0x00, 0x00, + 0x00, 0x27, 0x04, 0x89, 0xfe, 0xff, 0xff, 0x99, 0x01, 0x06, 0x04, 0x88, 0x1b, 0x00, 0x00, 0x0f, + 0xb1, 0x03, 0x02, 0xb8, 0xff, 0x91, 0xb4, 0x17, 0x2c, 0x04, 0x0b, 0x50, 0x2b, 0x34, 0x34, 0x00, + 0xff, 0xff, 0xff, 0xa7, 0xff, 0x56, 0x01, 0xeb, 0x02, 0x7f, 0x02, 0x26, 0x00, 0x24, 0x00, 0x00, + 0x00, 0x27, 0x04, 0xc1, 0xfe, 0xfc, 0xff, 0x99, 0x01, 0x06, 0x04, 0x88, 0x1b, 0x00, 0x00, 0x0f, + 0xb1, 0x03, 0x02, 0xb8, 0xff, 0x8f, 0xb4, 0x19, 0x2c, 0x04, 0x0b, 0x50, 0x2b, 0x34, 0x34, 0x00, + 0xff, 0xff, 0xfe, 0xd7, 0xff, 0x56, 0x01, 0xeb, 0x02, 0x7f, 0x02, 0x26, 0x00, 0x24, 0x00, 0x00, + 0x00, 0x27, 0x04, 0x96, 0xfe, 0x97, 0xff, 0x99, 0x01, 0x06, 0x04, 0x88, 0x1b, 0x00, 0x00, 0x11, + 0xb2, 0x04, 0x03, 0x02, 0xb8, 0xff, 0x27, 0xb4, 0x1b, 0x30, 0x04, 0x0b, 0x50, 0x2b, 0x34, 0x34, + 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfe, 0xf4, 0xff, 0x56, 0x01, 0xeb, 0x02, 0x7f, 0x02, 0x26, + 0x00, 0x24, 0x00, 0x00, 0x00, 0x27, 0x04, 0xa3, 0xfe, 0xa5, 0xff, 0x99, 0x01, 0x06, 0x04, 0x88, + 0x1b, 0x00, 0x00, 0x11, 0xb2, 0x04, 0x03, 0x02, 0xb8, 0xff, 0x36, 0xb4, 0x1d, 0x30, 0x04, 0x0b, + 0x50, 0x2b, 0x34, 0x34, 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x1b, 0xff, 0x56, 0x01, 0xeb, + 0x02, 0x7f, 0x02, 0x26, 0x00, 0x24, 0x00, 0x00, 0x00, 0x27, 0x04, 0x97, 0xfe, 0xcd, 0xff, 0x99, + 0x01, 0x06, 0x04, 0x88, 0x1b, 0x00, 0x00, 0x11, 0xb2, 0x04, 0x03, 0x02, 0xb8, 0xff, 0x49, 0xb4, + 0x1b, 0x30, 0x04, 0x0b, 0x50, 0x2b, 0x34, 0x34, 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x0e, + 0xff, 0x56, 0x01, 0xeb, 0x02, 0x7f, 0x02, 0x26, 0x00, 0x24, 0x00, 0x00, 0x00, 0x27, 0x04, 0xa4, + 0xfe, 0xc6, 0xff, 0x99, 0x01, 0x06, 0x04, 0x88, 0x1b, 0x00, 0x00, 0x11, 0xb2, 0x04, 0x03, 0x02, + 0xb8, 0xff, 0x43, 0xb4, 0x1d, 0x30, 0x04, 0x0b, 0x50, 0x2b, 0x34, 0x34, 0x34, 0x00, 0x00, 0x00, + 0xff, 0xff, 0xff, 0x5c, 0xff, 0x56, 0x01, 0xeb, 0x02, 0xd0, 0x02, 0x26, 0x00, 0x24, 0x00, 0x00, + 0x00, 0x27, 0x04, 0x98, 0xfe, 0xee, 0xff, 0x99, 0x01, 0x06, 0x04, 0x88, 0x1b, 0x00, 0x00, 0x11, + 0xb2, 0x04, 0x03, 0x02, 0xb8, 0xff, 0x6a, 0xb4, 0x22, 0x44, 0x04, 0x0b, 0x50, 0x2b, 0x34, 0x34, + 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x5d, 0xff, 0x56, 0x01, 0xeb, 0x02, 0xd0, 0x02, 0x26, + 0x00, 0x24, 0x00, 0x00, 0x00, 0x27, 0x04, 0xa5, 0xfe, 0xef, 0xff, 0x99, 0x01, 0x06, 0x04, 0x88, + 0x1b, 0x00, 0x00, 0x11, 0xb2, 0x04, 0x03, 0x02, 0xb8, 0xff, 0x6a, 0xb4, 0x22, 0x44, 0x04, 0x0b, + 0x50, 0x2b, 0x34, 0x34, 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x5a, 0xff, 0x56, 0x01, 0xc7, + 0x02, 0x7f, 0x02, 0x26, 0x00, 0x2b, 0x00, 0x00, 0x00, 0x27, 0x04, 0x89, 0xfe, 0xaf, 0xff, 0x99, + 0x01, 0x06, 0x04, 0x88, 0x24, 0x00, 0x00, 0x0f, 0xb1, 0x02, 0x01, 0xb8, 0xff, 0x6d, 0xb4, 0x0c, + 0x21, 0x06, 0x00, 0x50, 0x2b, 0x34, 0x34, 0x00, 0xff, 0xff, 0xff, 0x66, 0xff, 0x56, 0x01, 0xc7, + 0x02, 0x7f, 0x02, 0x26, 0x00, 0x2b, 0x00, 0x00, 0x00, 0x27, 0x04, 0xc1, 0xfe, 0xbb, 0xff, 0x99, + 0x01, 0x06, 0x04, 0x88, 0x24, 0x00, 0x00, 0x0f, 0xb1, 0x02, 0x01, 0xb8, 0xff, 0x73, 0xb4, 0x0e, + 0x21, 0x06, 0x00, 0x50, 0x2b, 0x34, 0x34, 0x00, 0xff, 0xff, 0xfe, 0x90, 0xff, 0x56, 0x01, 0xc7, + 0x02, 0x7f, 0x02, 0x26, 0x00, 0x2b, 0x00, 0x00, 0x00, 0x27, 0x04, 0x96, 0xfe, 0x50, 0xff, 0x99, + 0x01, 0x06, 0x04, 0x88, 0x24, 0x00, 0x00, 0x11, 0xb2, 0x03, 0x02, 0x01, 0xb8, 0xff, 0x08, 0xb4, + 0x10, 0x25, 0x06, 0x00, 0x50, 0x2b, 0x34, 0x34, 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfe, 0xad, + 0xff, 0x56, 0x01, 0xc7, 0x02, 0x7f, 0x02, 0x26, 0x00, 0x2b, 0x00, 0x00, 0x00, 0x27, 0x04, 0xa3, + 0xfe, 0x5e, 0xff, 0x99, 0x01, 0x06, 0x04, 0x88, 0x24, 0x00, 0x00, 0x11, 0xb2, 0x03, 0x02, 0x01, + 0xb8, 0xff, 0x17, 0xb4, 0x12, 0x25, 0x06, 0x00, 0x50, 0x2b, 0x34, 0x34, 0x34, 0x00, 0x00, 0x00, + 0xff, 0xff, 0xfe, 0xb0, 0xff, 0x56, 0x01, 0xc7, 0x02, 0x7f, 0x02, 0x26, 0x00, 0x2b, 0x00, 0x00, + 0x00, 0x27, 0x04, 0x97, 0xfe, 0x62, 0xff, 0x99, 0x01, 0x06, 0x04, 0x88, 0x24, 0x00, 0x00, 0x11, + 0xb2, 0x03, 0x02, 0x01, 0xb8, 0xff, 0x18, 0xb4, 0x10, 0x25, 0x06, 0x00, 0x50, 0x2b, 0x34, 0x34, + 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfe, 0x9e, 0xff, 0x56, 0x01, 0xc7, 0x02, 0x7f, 0x02, 0x26, + 0x00, 0x2b, 0x00, 0x00, 0x00, 0x27, 0x04, 0xa4, 0xfe, 0x56, 0xff, 0x99, 0x01, 0x06, 0x04, 0x88, + 0x24, 0x00, 0x00, 0x11, 0xb2, 0x03, 0x02, 0x01, 0xb8, 0xff, 0x0f, 0xb4, 0x12, 0x25, 0x06, 0x00, + 0x50, 0x2b, 0x34, 0x34, 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfe, 0xf6, 0xff, 0x56, 0x01, 0xc7, + 0x02, 0xd0, 0x02, 0x26, 0x00, 0x2b, 0x00, 0x00, 0x00, 0x27, 0x04, 0x98, 0xfe, 0x88, 0xff, 0x99, + 0x01, 0x06, 0x04, 0x88, 0x24, 0x00, 0x00, 0x11, 0xb2, 0x03, 0x02, 0x01, 0xb8, 0xff, 0x3b, 0xb4, + 0x17, 0x39, 0x06, 0x00, 0x50, 0x2b, 0x34, 0x34, 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfe, 0xf6, + 0xff, 0x56, 0x01, 0xc7, 0x02, 0xd0, 0x02, 0x26, 0x00, 0x2b, 0x00, 0x00, 0x00, 0x27, 0x04, 0xa5, + 0xfe, 0x88, 0xff, 0x99, 0x01, 0x06, 0x04, 0x88, 0x24, 0x00, 0x00, 0x11, 0xb2, 0x03, 0x02, 0x01, + 0xb8, 0xff, 0x3b, 0xb4, 0x17, 0x39, 0x06, 0x00, 0x50, 0x2b, 0x34, 0x34, 0x34, 0x00, 0x00, 0x00, + 0xff, 0xff, 0xff, 0x6b, 0xff, 0x56, 0x01, 0xeb, 0x02, 0x7f, 0x02, 0x26, 0x03, 0xa8, 0x00, 0x00, + 0x00, 0x27, 0x04, 0x89, 0xfe, 0xc0, 0xff, 0x99, 0x01, 0x06, 0x04, 0x88, 0x24, 0x00, 0x00, 0x0f, + 0xb1, 0x02, 0x01, 0xb8, 0xff, 0x76, 0xb4, 0x28, 0x3d, 0x23, 0x0e, 0x50, 0x2b, 0x34, 0x34, 0x00, + 0xff, 0xff, 0xff, 0x47, 0xff, 0x56, 0x01, 0xeb, 0x02, 0x7f, 0x02, 0x26, 0x03, 0xa8, 0x00, 0x00, + 0x00, 0x27, 0x04, 0xc1, 0xfe, 0x9c, 0xff, 0x99, 0x01, 0x06, 0x04, 0x88, 0x24, 0x00, 0x00, 0x0f, + 0xb1, 0x02, 0x01, 0xb8, 0xff, 0x64, 0xb4, 0x2a, 0x3d, 0x23, 0x0e, 0x50, 0x2b, 0x34, 0x34, 0x00, + 0xff, 0xff, 0xfe, 0x7e, 0xff, 0x56, 0x01, 0xeb, 0x02, 0x7f, 0x02, 0x26, 0x03, 0xa8, 0x00, 0x00, + 0x00, 0x27, 0x04, 0x96, 0xfe, 0x3e, 0xff, 0x99, 0x01, 0x06, 0x04, 0x88, 0x24, 0x00, 0x00, 0x11, + 0xb2, 0x03, 0x02, 0x01, 0xb8, 0xfe, 0xff, 0xb4, 0x2c, 0x41, 0x23, 0x0e, 0x50, 0x2b, 0x34, 0x34, + 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfe, 0x9c, 0xff, 0x56, 0x01, 0xeb, 0x02, 0x7f, 0x02, 0x26, + 0x03, 0xa8, 0x00, 0x00, 0x00, 0x27, 0x04, 0xa3, 0xfe, 0x4d, 0xff, 0x99, 0x01, 0x06, 0x04, 0x88, + 0x24, 0x00, 0x00, 0x11, 0xb2, 0x03, 0x02, 0x01, 0xb8, 0xff, 0x0e, 0xb4, 0x2e, 0x41, 0x23, 0x0e, + 0x50, 0x2b, 0x34, 0x34, 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfe, 0xcb, 0xff, 0x56, 0x01, 0xeb, + 0x02, 0x7f, 0x02, 0x26, 0x03, 0xa8, 0x00, 0x00, 0x00, 0x27, 0x04, 0x97, 0xfe, 0x7d, 0xff, 0x99, + 0x01, 0x06, 0x04, 0x88, 0x24, 0x00, 0x00, 0x11, 0xb2, 0x03, 0x02, 0x01, 0xb8, 0xff, 0x26, 0xb4, + 0x2c, 0x41, 0x23, 0x0e, 0x50, 0x2b, 0x34, 0x34, 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfe, 0xbd, + 0xff, 0x56, 0x01, 0xeb, 0x02, 0x7f, 0x02, 0x26, 0x03, 0xa8, 0x00, 0x00, 0x00, 0x27, 0x04, 0xa4, + 0xfe, 0x75, 0xff, 0x99, 0x01, 0x06, 0x04, 0x88, 0x24, 0x00, 0x00, 0x11, 0xb2, 0x03, 0x02, 0x01, + 0xb8, 0xff, 0x1f, 0xb4, 0x2e, 0x41, 0x23, 0x0e, 0x50, 0x2b, 0x34, 0x34, 0x34, 0x00, 0x00, 0x00, + 0xff, 0xff, 0xfe, 0xff, 0xff, 0x56, 0x01, 0xeb, 0x02, 0xd0, 0x02, 0x26, 0x03, 0xa8, 0x00, 0x00, + 0x00, 0x27, 0x04, 0x98, 0xfe, 0x91, 0xff, 0x99, 0x01, 0x06, 0x04, 0x88, 0x24, 0x00, 0x00, 0x11, + 0xb2, 0x03, 0x02, 0x01, 0xb8, 0xff, 0x40, 0xb4, 0x33, 0x55, 0x23, 0x0e, 0x50, 0x2b, 0x34, 0x34, + 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfe, 0xfe, 0xff, 0x56, 0x01, 0xeb, 0x02, 0xd0, 0x02, 0x26, + 0x03, 0xa8, 0x00, 0x00, 0x00, 0x27, 0x04, 0xa5, 0xfe, 0x90, 0xff, 0x99, 0x01, 0x06, 0x04, 0x88, + 0x24, 0x00, 0x00, 0x11, 0xb2, 0x03, 0x02, 0x01, 0xb8, 0xff, 0x3f, 0xb4, 0x33, 0x55, 0x23, 0x0e, + 0x50, 0x2b, 0x34, 0x34, 0x34, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x09, 0xff, 0x56, 0x01, 0xeb, + 0x02, 0x6b, 0x02, 0x26, 0x00, 0x24, 0x00, 0x00, 0x01, 0x06, 0x04, 0x88, 0x1b, 0x00, 0x00, 0x0a, + 0xb6, 0x02, 0x1b, 0x22, 0x1c, 0x04, 0x0b, 0x50, 0x2b, 0x34, 0x00, 0x00, 0xff, 0xff, 0x00, 0x2d, + 0xff, 0x56, 0x01, 0xc7, 0x02, 0x6b, 0x02, 0x26, 0x00, 0x2b, 0x00, 0x00, 0x01, 0x06, 0x04, 0x88, + 0x24, 0x00, 0x00, 0x0a, 0xb6, 0x01, 0x24, 0x17, 0x11, 0x06, 0x00, 0x50, 0x2b, 0x34, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x09, 0xff, 0x56, 0x01, 0xeb, 0x02, 0x79, 0x02, 0x26, 0x03, 0xa8, 0x00, 0x00, + 0x01, 0x06, 0x04, 0x88, 0x24, 0x00, 0x00, 0x0a, 0xb6, 0x01, 0x24, 0x33, 0x2d, 0x23, 0x0e, 0x50, + 0x2b, 0x34, 0x00, 0x00, 0x00, 0x01, 0x00, 0x2e, 0x00, 0x00, 0x01, 0xec, 0x02, 0x6b, 0x00, 0x23, + 0x00, 0x7f, 0x40, 0x0d, 0x1c, 0x40, 0x09, 0x0a, 0x00, 0x4c, 0x19, 0x40, 0x09, 0x0a, 0x00, 0x4c, + 0x17, 0xb8, 0xff, 0xe0, 0xb4, 0x0d, 0x0e, 0x00, 0x4c, 0x17, 0xb8, 0xff, 0xc0, 0xb3, 0x0c, 0x00, + 0x4d, 0x0f, 0xb8, 0xff, 0xe0, 0x40, 0x31, 0x0c, 0x00, 0x4d, 0x11, 0x16, 0x25, 0x1c, 0x1c, 0x24, + 0x25, 0x0c, 0x06, 0x25, 0x17, 0x1d, 0x23, 0x0e, 0x0b, 0x53, 0x21, 0x00, 0x23, 0x04, 0x24, 0x17, + 0x08, 0x16, 0x08, 0x1d, 0x0e, 0x22, 0x40, 0x0d, 0x10, 0x48, 0x22, 0x55, 0x0b, 0x23, 0x08, 0x4f, + 0x04, 0x6f, 0x04, 0x02, 0x04, 0x55, 0x05, 0x02, 0x00, 0x3f, 0xfd, 0x5d, 0x32, 0xde, 0x32, 0xfd, + 0x2b, 0x32, 0xc6, 0x3f, 0x3f, 0x01, 0x10, 0xd6, 0xd0, 0xd5, 0x32, 0xed, 0x32, 0x10, 0xd0, 0xc5, + 0x10, 0xd6, 0xc6, 0x11, 0x12, 0x39, 0x2f, 0x12, 0x39, 0x39, 0x31, 0x30, 0x2b, 0x2b, 0x2b, 0x2b, + 0x2b, 0x01, 0x26, 0x26, 0x23, 0x23, 0x35, 0x21, 0x07, 0x23, 0x16, 0x16, 0x17, 0x33, 0x07, 0x23, + 0x06, 0x06, 0x07, 0x1e, 0x03, 0x17, 0x23, 0x2e, 0x03, 0x27, 0x35, 0x33, 0x32, 0x36, 0x37, 0x23, + 0x35, 0x01, 0x0f, 0x0b, 0x3a, 0x2e, 0x6e, 0x01, 0xbe, 0x11, 0x73, 0x0e, 0x11, 0x05, 0x45, 0x11, + 0x3a, 0x13, 0x68, 0x4a, 0x19, 0x38, 0x34, 0x2e, 0x10, 0x8e, 0x16, 0x34, 0x34, 0x34, 0x16, 0x3f, + 0x40, 0x44, 0x14, 0xd7, 0x01, 0xd3, 0x27, 0x18, 0x59, 0x59, 0x0d, 0x21, 0x11, 0x58, 0x44, 0x44, + 0x0a, 0x19, 0x3d, 0x3f, 0x3c, 0x18, 0x1f, 0x3f, 0x3b, 0x36, 0x15, 0x5a, 0x1a, 0x23, 0x58, 0x00, + 0x00, 0x07, 0x00, 0x39, 0x01, 0x34, 0x01, 0xba, 0x02, 0xb5, 0x00, 0x13, 0x00, 0x1f, 0x00, 0x2b, + 0x00, 0x3b, 0x00, 0x4e, 0x00, 0x61, 0x00, 0x6d, 0x00, 0x29, 0x40, 0x13, 0x0a, 0x00, 0x0a, 0x00, + 0x6e, 0x6f, 0x3c, 0x4f, 0x54, 0x4a, 0x54, 0x05, 0x05, 0x54, 0x4a, 0x03, 0x6f, 0x0f, 0x10, 0x00, + 0x3f, 0x12, 0x17, 0x39, 0x2f, 0x2f, 0x2f, 0x12, 0x39, 0x39, 0x01, 0x11, 0x12, 0x39, 0x39, 0x2f, + 0x2f, 0x31, 0x30, 0x01, 0x14, 0x0e, 0x02, 0x23, 0x22, 0x2e, 0x02, 0x35, 0x34, 0x3e, 0x02, 0x33, + 0x32, 0x1e, 0x02, 0x05, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x17, + 0x06, 0x06, 0x17, 0x16, 0x16, 0x37, 0x36, 0x36, 0x27, 0x26, 0x26, 0x27, 0x34, 0x36, 0x37, 0x27, + 0x06, 0x07, 0x16, 0x15, 0x14, 0x07, 0x16, 0x17, 0x37, 0x26, 0x26, 0x37, 0x32, 0x16, 0x17, 0x37, + 0x26, 0x26, 0x27, 0x06, 0x27, 0x26, 0x26, 0x35, 0x26, 0x23, 0x22, 0x07, 0x17, 0x36, 0x17, 0x22, + 0x27, 0x07, 0x16, 0x33, 0x32, 0x37, 0x34, 0x36, 0x37, 0x36, 0x17, 0x36, 0x36, 0x37, 0x27, 0x06, + 0x06, 0x37, 0x16, 0x36, 0x37, 0x36, 0x26, 0x27, 0x26, 0x06, 0x07, 0x06, 0x16, 0x01, 0xba, 0x1e, + 0x35, 0x46, 0x28, 0x28, 0x46, 0x34, 0x1e, 0x1e, 0x34, 0x46, 0x28, 0x28, 0x46, 0x35, 0x1e, 0xfe, + 0xbd, 0x0b, 0x0f, 0x0f, 0x0b, 0x0b, 0x0f, 0x0f, 0xac, 0x09, 0x06, 0x05, 0x06, 0x14, 0x0a, 0x09, + 0x06, 0x05, 0x06, 0x15, 0x89, 0x13, 0x0e, 0x13, 0x24, 0x0b, 0x0e, 0x0e, 0x0b, 0x24, 0x13, 0x0e, + 0x13, 0x4b, 0x1e, 0x2b, 0x02, 0x25, 0x02, 0x12, 0x0e, 0x0f, 0x10, 0x06, 0x0a, 0x0d, 0x12, 0x1b, + 0x16, 0x12, 0x10, 0x0f, 0x0f, 0x10, 0x12, 0x16, 0x1b, 0x12, 0x0d, 0x0a, 0x06, 0x10, 0x0f, 0x0e, + 0x12, 0x02, 0x25, 0x02, 0x2b, 0x17, 0x09, 0x15, 0x06, 0x05, 0x06, 0x09, 0x0a, 0x14, 0x06, 0x05, + 0x06, 0x01, 0xf4, 0x28, 0x46, 0x34, 0x1e, 0x1e, 0x34, 0x46, 0x28, 0x28, 0x46, 0x35, 0x1e, 0x1e, + 0x35, 0x46, 0x0e, 0x0f, 0x0b, 0x0a, 0x0f, 0x0f, 0x0a, 0x0b, 0x0f, 0x75, 0x05, 0x14, 0x0a, 0x09, + 0x06, 0x06, 0x05, 0x15, 0x09, 0x0a, 0x04, 0x56, 0x14, 0x1f, 0x0b, 0x20, 0x19, 0x29, 0x09, 0x13, + 0x11, 0x0b, 0x28, 0x19, 0x20, 0x0b, 0x1f, 0x5f, 0x28, 0x1d, 0x01, 0x15, 0x25, 0x0e, 0x05, 0x07, + 0x05, 0x0d, 0x08, 0x04, 0x0c, 0x1f, 0x07, 0x97, 0x07, 0x1f, 0x0c, 0x04, 0x08, 0x0d, 0x05, 0x07, + 0x05, 0x0e, 0x25, 0x15, 0x01, 0x1d, 0x28, 0xa7, 0x06, 0x05, 0x0a, 0x09, 0x15, 0x05, 0x05, 0x06, + 0x08, 0x0b, 0x13, 0x00, 0x00, 0x0e, 0xff, 0x5b, 0x00, 0x00, 0x02, 0x99, 0x02, 0xb4, 0x00, 0x03, + 0x00, 0x07, 0x00, 0x0b, 0x00, 0x0f, 0x00, 0x13, 0x00, 0x17, 0x00, 0x1b, 0x00, 0x1f, 0x00, 0x23, + 0x00, 0x27, 0x00, 0x2b, 0x00, 0x2f, 0x00, 0x33, 0x00, 0x37, 0x07, 0xaf, 0x40, 0x1f, 0x33, 0x10, + 0x09, 0x00, 0x4d, 0x32, 0x18, 0x09, 0x00, 0x4d, 0x2b, 0x08, 0x09, 0x00, 0x4d, 0x2a, 0x08, 0x09, + 0x00, 0x4d, 0x27, 0x10, 0x09, 0x00, 0x4d, 0x26, 0x10, 0x09, 0x00, 0x4d, 0x23, 0xb8, 0xff, 0xf0, + 0xb3, 0x09, 0x00, 0x4d, 0x22, 0xb8, 0xff, 0xf8, 0x40, 0x0e, 0x09, 0x00, 0x4d, 0x21, 0x10, 0x09, + 0x00, 0x4d, 0x20, 0x08, 0x09, 0x00, 0x4d, 0x1e, 0xb8, 0xff, 0xf8, 0x40, 0xb9, 0x09, 0x00, 0x4d, + 0x1d, 0x10, 0x09, 0x00, 0x4d, 0x1c, 0x18, 0x09, 0x00, 0x4d, 0x06, 0x1b, 0x26, 0x1b, 0x36, 0x1b, + 0x46, 0x1b, 0x66, 0x1b, 0x86, 0x1b, 0x06, 0x3d, 0x07, 0x1b, 0x01, 0x09, 0x06, 0x1a, 0x26, 0x1a, + 0x36, 0x1a, 0x46, 0x1a, 0x66, 0x1a, 0x86, 0x1a, 0x06, 0x3d, 0x07, 0x1a, 0x01, 0x09, 0x06, 0x13, + 0x16, 0x13, 0x26, 0x13, 0x66, 0x13, 0x04, 0x06, 0x12, 0x16, 0x12, 0x26, 0x12, 0x66, 0x12, 0x04, + 0x3d, 0x09, 0x05, 0x01, 0x09, 0x04, 0x01, 0x3e, 0x09, 0x01, 0x19, 0x01, 0x02, 0x09, 0x00, 0x19, + 0x00, 0x02, 0x41, 0x07, 0x26, 0x01, 0x07, 0x25, 0x01, 0x07, 0x22, 0x01, 0x07, 0x21, 0x01, 0x09, + 0x1f, 0x01, 0x09, 0x1c, 0x78, 0x09, 0x49, 0x09, 0x17, 0x69, 0x17, 0x02, 0x09, 0x14, 0x69, 0x14, + 0x02, 0x06, 0x0e, 0x36, 0x0e, 0x66, 0x0e, 0x03, 0x06, 0x0d, 0x36, 0x0d, 0x66, 0x0d, 0x03, 0x09, + 0x0b, 0x39, 0x0b, 0x02, 0x09, 0x08, 0x39, 0x08, 0x02, 0x3d, 0x9a, 0x31, 0xaa, 0x31, 0x02, 0x69, + 0x31, 0x79, 0x31, 0x89, 0x31, 0x03, 0x31, 0x40, 0x0a, 0x0e, 0x48, 0x0a, 0x31, 0x01, 0x31, 0x2f, + 0x80, 0x34, 0x3b, 0x48, 0x2f, 0x7f, 0x28, 0x8f, 0x28, 0x02, 0x5e, 0x28, 0x6e, 0x28, 0x02, 0x4d, + 0x28, 0x01, 0x3e, 0x28, 0x01, 0x28, 0xb8, 0x01, 0x80, 0x40, 0x4e, 0x28, 0x2b, 0x48, 0x9a, 0x28, + 0xaa, 0x28, 0x02, 0x69, 0x28, 0x79, 0x28, 0x89, 0x28, 0x03, 0x28, 0x40, 0x0a, 0x0e, 0x48, 0x28, + 0xb0, 0x09, 0x49, 0x28, 0x24, 0x80, 0x34, 0x3b, 0x48, 0x7f, 0x24, 0x8f, 0x24, 0x02, 0x5e, 0x24, + 0x6e, 0x24, 0x02, 0x4d, 0x24, 0x01, 0x2e, 0x24, 0x3e, 0x24, 0x02, 0x0d, 0x24, 0x1d, 0x24, 0x02, + 0xfd, 0x24, 0x01, 0x9a, 0x24, 0xaa, 0x24, 0x02, 0x69, 0x24, 0x79, 0x24, 0x89, 0x24, 0x03, 0x24, + 0x40, 0x0a, 0x0e, 0x48, 0x0a, 0x24, 0x01, 0x24, 0x36, 0xb8, 0xff, 0x80, 0x40, 0x09, 0x34, 0x3b, + 0x48, 0x07, 0x36, 0x01, 0x36, 0x35, 0x32, 0xb8, 0xff, 0x80, 0x40, 0x0c, 0x0d, 0x13, 0x48, 0x17, + 0x32, 0x27, 0x32, 0x37, 0x32, 0x03, 0x32, 0x2b, 0xb8, 0xfe, 0x00, 0x40, 0x13, 0x2d, 0x31, 0x48, + 0x31, 0x2b, 0x01, 0x20, 0x2b, 0x01, 0x01, 0x2b, 0x11, 0x2b, 0x02, 0xf1, 0x2b, 0x01, 0x00, 0x2b, + 0xb8, 0xff, 0x80, 0x40, 0x0c, 0x0d, 0x13, 0x48, 0x10, 0x2b, 0x20, 0x2b, 0x30, 0x2b, 0x03, 0x2b, + 0x27, 0xb8, 0xfe, 0x00, 0xb3, 0x2d, 0x31, 0x48, 0x27, 0xb8, 0xfe, 0x40, 0xb3, 0x28, 0x2c, 0x48, + 0x27, 0xb8, 0xff, 0x80, 0x40, 0xff, 0x0d, 0x13, 0x48, 0x10, 0x27, 0x20, 0x27, 0x30, 0x27, 0x03, + 0x27, 0x1c, 0x0c, 0x20, 0x01, 0x09, 0x03, 0x20, 0x22, 0x2f, 0x15, 0x8f, 0x15, 0x02, 0x09, 0x15, + 0x01, 0x3b, 0x8f, 0x15, 0x9f, 0x15, 0xff, 0x15, 0x03, 0x5e, 0x15, 0x01, 0xbd, 0x15, 0xed, 0x15, + 0xfd, 0x15, 0x03, 0x5b, 0x15, 0x01, 0x4c, 0x15, 0x01, 0x1b, 0x15, 0x01, 0xaa, 0x15, 0xba, 0x15, + 0x02, 0x79, 0x15, 0x01, 0x08, 0x15, 0x18, 0x15, 0x02, 0x0a, 0x15, 0x09, 0x13, 0x01, 0x3b, 0x13, + 0x0f, 0x0c, 0x3f, 0x0c, 0x6f, 0x0c, 0x03, 0x3d, 0x4f, 0x0c, 0x8f, 0x0c, 0xbf, 0x0c, 0xef, 0x0c, + 0x04, 0x1e, 0x0c, 0x01, 0xad, 0x0c, 0xed, 0x0c, 0x02, 0x7b, 0x0c, 0x01, 0x4c, 0x0c, 0x01, 0x0b, + 0x0c, 0x01, 0xaa, 0x0c, 0xda, 0x0c, 0x02, 0x39, 0x0c, 0x69, 0x0c, 0x02, 0x08, 0x0c, 0x01, 0x0b, + 0x0c, 0x2f, 0x08, 0x5f, 0x08, 0x02, 0x09, 0x08, 0x01, 0x3b, 0xe9, 0x08, 0x01, 0x8f, 0x08, 0xbf, + 0x08, 0x02, 0x1e, 0x08, 0x01, 0xed, 0x08, 0x01, 0x7b, 0x08, 0x01, 0x4c, 0x08, 0x01, 0xaa, 0x08, + 0xda, 0x08, 0x02, 0x08, 0x08, 0x38, 0x08, 0x02, 0x0b, 0x08, 0x66, 0x1a, 0x86, 0x1a, 0x02, 0x07, + 0x1a, 0x01, 0x33, 0x1a, 0x19, 0x00, 0x17, 0x60, 0x17, 0x02, 0x3d, 0x50, 0x17, 0x80, 0x17, 0x90, + 0x17, 0xf0, 0x17, 0x04, 0xe1, 0x17, 0xf1, 0x17, 0x02, 0xb2, 0x17, 0x01, 0x53, 0x17, 0x01, 0x14, + 0x17, 0x44, 0x17, 0x02, 0xb5, 0x17, 0x01, 0x76, 0x17, 0xa6, 0x17, 0x02, 0x07, 0x17, 0x17, 0x17, + 0x02, 0x0a, 0x17, 0x00, 0x0f, 0x30, 0x0f, 0x60, 0x0f, 0x03, 0x3d, 0x80, 0x0f, 0xb0, 0x0f, 0xe0, + 0x0f, 0x03, 0x11, 0x0f, 0x41, 0x0f, 0x02, 0xe1, 0x0f, 0x01, 0x72, 0x0f, 0xa2, 0x0f, 0x02, 0x04, + 0x0f, 0x44, 0x0f, 0x02, 0xd4, 0x40, 0x3e, 0x0f, 0x01, 0xa5, 0x0f, 0x01, 0x66, 0x0f, 0x01, 0x07, + 0x0f, 0x37, 0x0f, 0x02, 0x0b, 0x0f, 0x00, 0x0a, 0x30, 0x0a, 0x02, 0x3d, 0x90, 0x0a, 0xc0, 0x0a, + 0x02, 0x21, 0x0a, 0x01, 0xf1, 0x0a, 0x01, 0x82, 0x0a, 0x01, 0x54, 0x0a, 0x01, 0xe4, 0x0a, 0x01, + 0xb5, 0x0a, 0x01, 0x46, 0x0a, 0x01, 0x17, 0x0a, 0x01, 0x0a, 0x00, 0x04, 0x39, 0xe6, 0x03, 0x01, + 0x03, 0x06, 0x10, 0x19, 0x1f, 0xb8, 0xff, 0x80, 0x40, 0x09, 0x34, 0x45, 0x48, 0x1f, 0x22, 0x2c, + 0x35, 0x38, 0x35, 0xb8, 0xfe, 0x00, 0x40, 0x3b, 0x31, 0x3b, 0x48, 0x61, 0x35, 0x01, 0x40, 0x35, + 0x50, 0x35, 0x02, 0x21, 0x35, 0x31, 0x35, 0x02, 0x10, 0x35, 0x01, 0x01, 0x35, 0x01, 0xe1, 0x35, + 0xf1, 0x35, 0x02, 0xb2, 0x35, 0xc2, 0x35, 0xd2, 0x35, 0x03, 0x93, 0x35, 0xa3, 0x35, 0x02, 0x82, + 0x35, 0x01, 0x63, 0x35, 0x73, 0x35, 0x02, 0x54, 0x35, 0x01, 0x43, 0x35, 0x01, 0x00, 0x92, 0x35, + 0x01, 0x01, 0x35, 0xb8, 0xff, 0x80, 0x40, 0x12, 0x0e, 0x12, 0x48, 0x33, 0x35, 0x01, 0x02, 0x10, + 0x35, 0x20, 0x35, 0x02, 0x08, 0x35, 0x01, 0x03, 0x35, 0x22, 0xb8, 0xff, 0x00, 0x40, 0x16, 0x18, + 0x1d, 0x48, 0xb5, 0x22, 0xc5, 0x22, 0xd5, 0x22, 0x03, 0xa6, 0x22, 0x01, 0x22, 0x58, 0x33, 0x01, + 0x33, 0xdd, 0x2c, 0x01, 0x2c, 0xb8, 0x01, 0x40, 0x40, 0x0c, 0x20, 0x26, 0x48, 0x4b, 0x2c, 0x5b, + 0x2c, 0x02, 0x3c, 0x2c, 0x01, 0x2c, 0xb8, 0x01, 0x00, 0x40, 0x1c, 0x17, 0x1c, 0x48, 0xaa, 0x2c, + 0xba, 0x2c, 0xca, 0x2c, 0x03, 0x2c, 0x80, 0x10, 0x13, 0x48, 0x5a, 0x2c, 0x01, 0x49, 0x2c, 0x01, + 0x2c, 0x40, 0x0a, 0x0d, 0x48, 0x2c, 0x1f, 0xb8, 0x02, 0x00, 0xb7, 0x32, 0x45, 0x48, 0x1f, 0x31, + 0x31, 0x26, 0x34, 0xb8, 0x02, 0x00, 0xb3, 0x30, 0x3b, 0x48, 0x34, 0xb8, 0x01, 0xc0, 0xb3, 0x2c, + 0x2f, 0x48, 0x34, 0xb8, 0x01, 0x80, 0x40, 0x33, 0x23, 0x2b, 0x48, 0x7c, 0x34, 0x8c, 0x34, 0x02, + 0x6b, 0x34, 0x01, 0x5c, 0x34, 0x01, 0x4b, 0x34, 0x01, 0x34, 0x80, 0x10, 0x13, 0x48, 0x5a, 0x34, + 0x01, 0x34, 0x40, 0x0a, 0x0e, 0x48, 0x34, 0x1b, 0x23, 0x2b, 0x23, 0x3b, 0x23, 0x03, 0x23, 0xc0, + 0x14, 0x1a, 0x48, 0x23, 0x57, 0x29, 0x01, 0x29, 0x2b, 0x08, 0x2d, 0xb8, 0xfe, 0x80, 0xb3, 0x24, + 0x27, 0x48, 0x2d, 0xb8, 0xfe, 0xc0, 0xb3, 0x1e, 0x23, 0x48, 0x2d, 0xb8, 0xff, 0x00, 0xb3, 0x1a, + 0x1d, 0x48, 0x2d, 0xb8, 0xff, 0x40, 0xb3, 0x11, 0x19, 0x48, 0x2d, 0xb8, 0xff, 0x80, 0x40, 0x0d, + 0x0d, 0x10, 0x48, 0x07, 0x2d, 0x17, 0x2d, 0x27, 0x2d, 0x03, 0x0a, 0x2d, 0x1e, 0xb8, 0xfe, 0x00, + 0x40, 0xae, 0x32, 0x45, 0x48, 0x1e, 0x08, 0x24, 0x01, 0x0f, 0x24, 0x26, 0x02, 0x20, 0x19, 0x40, + 0x19, 0x50, 0x19, 0x60, 0x19, 0x80, 0x19, 0xa0, 0x19, 0x06, 0x17, 0x19, 0x01, 0x00, 0x19, 0x01, + 0x3b, 0xc0, 0x19, 0xe0, 0x19, 0x02, 0xb1, 0x19, 0x01, 0x60, 0x19, 0x80, 0x19, 0xa0, 0x19, 0x03, + 0x01, 0x19, 0x11, 0x19, 0x21, 0x19, 0x41, 0x19, 0x04, 0xe1, 0x19, 0x01, 0xa2, 0x19, 0xc2, 0x19, + 0x02, 0x83, 0x19, 0x01, 0x72, 0x19, 0x01, 0x63, 0x19, 0x01, 0x04, 0x19, 0x24, 0x19, 0x44, 0x19, + 0x03, 0xa5, 0x19, 0xc5, 0x19, 0xd5, 0x19, 0xe5, 0x19, 0x04, 0x66, 0x19, 0x86, 0x19, 0x02, 0x47, + 0x19, 0x01, 0x36, 0x19, 0x01, 0x07, 0x19, 0x01, 0x0b, 0x19, 0x20, 0x06, 0x01, 0x07, 0x06, 0x01, + 0x3c, 0xd6, 0x06, 0x01, 0x80, 0x06, 0x01, 0x77, 0x06, 0x01, 0xe1, 0x06, 0x01, 0x43, 0x06, 0x01, + 0xa5, 0x06, 0x01, 0x07, 0x06, 0x01, 0x0c, 0x06, 0x69, 0x17, 0x99, 0x17, 0x02, 0x08, 0x17, 0x01, + 0x33, 0x17, 0x1f, 0x10, 0x2f, 0x10, 0x3f, 0x10, 0x7f, 0x10, 0x04, 0x08, 0x10, 0x01, 0x3c, 0xaf, + 0x10, 0xef, 0x10, 0x02, 0x9e, 0x10, 0x01, 0x4f, 0x10, 0x8f, 0x10, 0x02, 0x0d, 0x10, 0x01, 0x10, + 0xb8, 0x01, 0x60, 0x40, 0xff, 0x2a, 0x49, 0x4c, 0x10, 0x5c, 0x10, 0x6c, 0x10, 0xac, 0x10, 0xec, + 0x10, 0x05, 0x0b, 0x10, 0x01, 0xcb, 0x10, 0x01, 0xaa, 0x10, 0xba, 0x10, 0x02, 0x19, 0x10, 0x29, + 0x10, 0x69, 0x10, 0x03, 0x08, 0x10, 0x01, 0x0b, 0x10, 0x0f, 0x03, 0x1f, 0x03, 0x02, 0x41, 0xd8, + 0x03, 0x01, 0x8f, 0x03, 0x9f, 0x03, 0x02, 0xfd, 0x03, 0x01, 0xee, 0x03, 0x01, 0x4c, 0x03, 0x5c, + 0x03, 0x02, 0xbb, 0x03, 0x01, 0xaa, 0x03, 0x01, 0x09, 0x03, 0x19, 0x03, 0x02, 0x0f, 0x03, 0x17, + 0x15, 0x01, 0x15, 0x15, 0x0a, 0x0f, 0x18, 0x2f, 0x18, 0x4f, 0x18, 0x5f, 0x18, 0x6f, 0x18, 0x8f, + 0x18, 0xaf, 0x18, 0x07, 0x3b, 0xbf, 0x18, 0xcf, 0x18, 0xef, 0x18, 0x03, 0xae, 0x18, 0x01, 0x4f, + 0x18, 0x6f, 0x18, 0x8f, 0x18, 0x03, 0x0e, 0x18, 0x1e, 0x18, 0x2e, 0x18, 0x03, 0x8d, 0x18, 0xad, + 0x18, 0xcd, 0x18, 0xed, 0x18, 0x04, 0x4c, 0x18, 0x6c, 0x18, 0x7c, 0x18, 0x03, 0x0b, 0x18, 0x2b, + 0x18, 0x02, 0xdb, 0x18, 0xeb, 0x18, 0x02, 0x8a, 0x18, 0xaa, 0x18, 0xca, 0x18, 0x03, 0x49, 0x18, + 0x69, 0x18, 0x02, 0x38, 0x18, 0x01, 0x29, 0x18, 0x01, 0x08, 0x18, 0x01, 0x0b, 0x18, 0x0f, 0x07, + 0x01, 0x3e, 0xd9, 0x07, 0x01, 0x8e, 0x07, 0x01, 0x78, 0x07, 0x01, 0xed, 0x07, 0x01, 0x4b, 0x07, + 0x01, 0xaa, 0x07, 0x01, 0x08, 0x07, 0x01, 0x0c, 0x07, 0x66, 0x0d, 0x01, 0x07, 0x0d, 0x01, 0x33, + 0x0d, 0x0f, 0x08, 0x00, 0x11, 0x10, 0x11, 0x20, 0x11, 0x60, 0x11, 0x04, 0x3d, 0x80, 0x11, 0x90, + 0x11, 0xa0, 0x11, 0xe0, 0x11, 0x04, 0x01, 0x11, 0x41, 0x11, 0x02, 0xe1, 0x11, 0xf1, 0x11, 0x02, + 0xa2, 0x11, 0x01, 0x53, 0x11, 0x63, 0x11, 0x02, 0x04, 0x11, 0x44, 0x11, 0x02, 0x65, 0x11, 0xa5, + 0x11, 0xb5, 0x11, 0xc5, 0x40, 0x39, 0x11, 0x04, 0x07, 0x11, 0x17, 0x11, 0x27, 0x11, 0x03, 0x0b, + 0x11, 0x00, 0x02, 0x10, 0x02, 0x02, 0x41, 0xe0, 0x02, 0xf0, 0x02, 0x02, 0xa7, 0x02, 0x01, 0x50, + 0x02, 0x01, 0x41, 0x02, 0x01, 0xb2, 0x02, 0x01, 0xa3, 0x02, 0x01, 0x00, 0x00, 0x02, 0x10, 0x02, + 0x02, 0x01, 0x60, 0x02, 0x70, 0x02, 0x02, 0x02, 0x02, 0xaf, 0x08, 0x01, 0x08, 0x0a, 0x02, 0x00, + 0x3f, 0xcd, 0x72, 0x32, 0x5f, 0x5d, 0x5f, 0x71, 0x5f, 0x71, 0x71, 0x72, 0x72, 0x72, 0x72, 0x5e, + 0x5d, 0x32, 0x5e, 0x5d, 0x5d, 0x71, 0x71, 0x71, 0x71, 0x72, 0x72, 0x5e, 0x5d, 0x3f, 0xcd, 0x5e, + 0x5d, 0x5d, 0x32, 0x5e, 0x5d, 0x5d, 0x71, 0x71, 0x72, 0x72, 0x72, 0x5e, 0x5d, 0x32, 0x5e, 0x5d, + 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x71, 0x71, 0x71, 0x72, 0x72, 0x72, 0x72, 0x5e, 0x5d, 0x12, 0x39, + 0x2f, 0x5d, 0x33, 0x5e, 0x5d, 0x5d, 0x5d, 0x71, 0x71, 0x71, 0x72, 0x72, 0x5e, 0x5d, 0x33, 0x5e, + 0x5d, 0x5d, 0x5d, 0x5d, 0x71, 0x71, 0x2b, 0x72, 0x72, 0x72, 0x72, 0x5e, 0x5d, 0x5d, 0xcd, 0x5e, + 0x5d, 0x5d, 0x32, 0x5e, 0x5d, 0x5d, 0x71, 0x71, 0x72, 0x72, 0x72, 0x5e, 0x5d, 0x5d, 0x32, 0x5e, + 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x72, 0x72, 0x72, 0x72, 0x5e, + 0x5d, 0x5d, 0x5d, 0x3f, 0xcd, 0x5e, 0x5d, 0x32, 0x2b, 0x32, 0x5e, 0x5d, 0x2b, 0x2b, 0x2b, 0x2b, + 0x2b, 0x3f, 0xcd, 0x5d, 0x32, 0x2b, 0x71, 0x32, 0x2b, 0x5d, 0x2b, 0x71, 0x71, 0x71, 0x71, 0x2b, + 0x2b, 0x2b, 0x12, 0x39, 0x2f, 0x33, 0x2b, 0x33, 0x2b, 0x5d, 0x5d, 0x2b, 0x5d, 0x2b, 0x71, 0x71, + 0x2b, 0x71, 0xcd, 0x5d, 0x32, 0x5d, 0x5d, 0x2b, 0x32, 0x5f, 0x5d, 0x5d, 0x5f, 0x5d, 0x2b, 0x5f, + 0x5d, 0x5f, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x72, 0x72, 0x72, 0x72, 0x72, 0x2b, 0x01, + 0x10, 0xdc, 0x32, 0xdc, 0x32, 0x2b, 0xde, 0x32, 0xdc, 0x32, 0x72, 0xcc, 0xcd, 0x32, 0x32, 0x5d, + 0x5d, 0x5d, 0x5d, 0x71, 0x71, 0x71, 0x72, 0x72, 0x5e, 0x5d, 0x32, 0x5e, 0x5d, 0x5d, 0x5d, 0x5d, + 0x71, 0x71, 0x71, 0x72, 0x72, 0x5e, 0x5d, 0x32, 0x5e, 0x5d, 0x5d, 0x5d, 0x71, 0x71, 0x71, 0x71, + 0x72, 0x5e, 0x5d, 0x10, 0xcd, 0x5e, 0x5d, 0x5d, 0x32, 0x5e, 0x5d, 0x5d, 0x71, 0x71, 0x71, 0x72, + 0x72, 0x72, 0x5e, 0x5d, 0x5d, 0x32, 0x5e, 0x5d, 0x5d, 0x5d, 0x71, 0x71, 0x71, 0x71, 0x72, 0x72, + 0x5e, 0x5d, 0x32, 0x5e, 0x5d, 0x32, 0x5e, 0x5d, 0x5d, 0x5d, 0x71, 0x71, 0x71, 0x71, 0x72, 0x72, + 0x5e, 0x5d, 0x5d, 0x10, 0xcd, 0x5f, 0x5e, 0x5d, 0x32, 0x32, 0x5d, 0x2b, 0x2b, 0x2b, 0x32, 0x5d, + 0x2b, 0x5f, 0x71, 0x72, 0x72, 0x72, 0x2b, 0x32, 0x5d, 0x2b, 0x10, 0xcd, 0x5d, 0x2b, 0x32, 0x5d, + 0x2b, 0x5d, 0x5d, 0x71, 0x72, 0x72, 0x72, 0x72, 0x72, 0x2b, 0x32, 0x2b, 0x2b, 0x5d, 0x5d, 0x2b, + 0x72, 0x72, 0x72, 0x72, 0x32, 0x2b, 0x32, 0x5d, 0x2b, 0x5d, 0x5d, 0x31, 0x30, 0x00, 0x5e, 0x5d, + 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x2b, 0x5e, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x01, 0x5e, 0x5d, 0x5d, + 0x5e, 0x5d, 0x5d, 0x5e, 0x5d, 0x5d, 0x5e, 0x5d, 0x5e, 0x5d, 0x5e, 0x5d, 0x5e, 0x5d, 0x2b, 0x2b, + 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x01, 0x11, 0x33, 0x11, 0x03, + 0x11, 0x33, 0x11, 0x01, 0x35, 0x21, 0x15, 0x01, 0x35, 0x21, 0x15, 0x01, 0x11, 0x33, 0x11, 0x15, + 0x35, 0x21, 0x15, 0x01, 0x11, 0x33, 0x11, 0x03, 0x11, 0x33, 0x11, 0x03, 0x11, 0x33, 0x11, 0x01, + 0x35, 0x21, 0x15, 0x01, 0x35, 0x21, 0x15, 0x01, 0x11, 0x33, 0x11, 0x15, 0x35, 0x21, 0x15, 0x01, + 0x11, 0x33, 0x11, 0x02, 0x7c, 0x1d, 0x1d, 0x1d, 0xfe, 0xaf, 0x01, 0x34, 0xfe, 0xcc, 0x01, 0x34, + 0xfe, 0xaf, 0x1d, 0x01, 0x34, 0xfe, 0xaf, 0x1d, 0x9b, 0x1c, 0x1c, 0x1c, 0xfe, 0xaf, 0x01, 0x35, + 0xfe, 0xcb, 0x01, 0x35, 0xfe, 0xae, 0x1d, 0x01, 0x35, 0xfe, 0xae, 0x1d, 0x01, 0x6b, 0x01, 0x2a, + 0xfe, 0xd6, 0xfe, 0xb4, 0x01, 0x2a, 0xfe, 0xd6, 0x02, 0x79, 0x1c, 0x1c, 0xfd, 0x68, 0x1d, 0x1d, + 0x01, 0x6b, 0x01, 0x2a, 0xfe, 0xd6, 0x1f, 0x1d, 0x1d, 0xfe, 0xd3, 0x01, 0x2a, 0xfe, 0xd6, 0x01, + 0x4c, 0x01, 0x2a, 0xfe, 0xd6, 0xfe, 0xb4, 0x01, 0x2a, 0xfe, 0xd6, 0x02, 0x79, 0x1c, 0x1c, 0xfd, + 0x68, 0x1d, 0x1d, 0x01, 0x6b, 0x01, 0x2a, 0xfe, 0xd6, 0x1f, 0x1d, 0x1d, 0xfe, 0xd3, 0x01, 0x2a, + 0xfe, 0xd6, 0x00, 0x00, 0x00, 0x03, 0x00, 0x04, 0xff, 0xf3, 0x01, 0xf0, 0x01, 0xde, 0x00, 0x03, + 0x00, 0x1d, 0x00, 0x29, 0x00, 0xe7, 0x40, 0x1b, 0x28, 0x20, 0x10, 0x00, 0x4d, 0x28, 0x40, 0x0f, + 0x00, 0x4d, 0x27, 0x40, 0x10, 0x00, 0x4d, 0x1b, 0x20, 0x0f, 0x10, 0x00, 0x4c, 0x1a, 0x20, 0x10, + 0x00, 0x4d, 0x08, 0xb8, 0xff, 0xe0, 0xb3, 0x10, 0x00, 0x4d, 0x07, 0xb8, 0xff, 0xe0, 0x40, 0x0e, + 0x13, 0x00, 0x4d, 0x07, 0x40, 0x0a, 0x00, 0x4d, 0x06, 0x40, 0x0a, 0x00, 0x4d, 0x05, 0xb8, 0xff, + 0xc0, 0xb3, 0x14, 0x00, 0x4d, 0x05, 0xb8, 0xff, 0xe0, 0xb3, 0x13, 0x00, 0x4d, 0x1d, 0xb8, 0xff, + 0xc0, 0xb3, 0x0d, 0x00, 0x4d, 0x14, 0xb8, 0xff, 0xd8, 0xb3, 0x12, 0x00, 0x4d, 0x14, 0xb8, 0xff, + 0xc0, 0xb3, 0x11, 0x00, 0x4d, 0x14, 0xb8, 0xff, 0xf0, 0xb3, 0x10, 0x00, 0x4d, 0x14, 0xb8, 0xff, + 0xd8, 0xb3, 0x0a, 0x00, 0x4d, 0x04, 0xb8, 0xff, 0xe0, 0xb3, 0x0d, 0x00, 0x4d, 0x04, 0xb8, 0xff, + 0xc0, 0x40, 0x31, 0x0b, 0x0c, 0x00, 0x4c, 0x12, 0x11, 0x1c, 0x04, 0x27, 0x21, 0x11, 0x27, 0x21, + 0x17, 0x09, 0x09, 0x17, 0x21, 0x27, 0x11, 0x05, 0x00, 0x02, 0x2b, 0x00, 0x2a, 0x0e, 0x14, 0x01, + 0x44, 0x24, 0x01, 0x20, 0x24, 0x30, 0x24, 0x02, 0x1d, 0x24, 0x1e, 0x04, 0x1e, 0x04, 0x1e, 0x01, + 0x03, 0x07, 0x01, 0x0b, 0x00, 0x3f, 0x3f, 0x12, 0x39, 0x39, 0x2f, 0x2f, 0x12, 0x39, 0x39, 0x5d, + 0x5d, 0x12, 0x39, 0x39, 0x01, 0x10, 0xc6, 0x10, 0xc6, 0x11, 0x17, 0x39, 0x2f, 0x2f, 0x2f, 0x2f, + 0x2f, 0x11, 0x12, 0x39, 0x39, 0x11, 0x39, 0x31, 0x30, 0x00, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, + 0x2b, 0x01, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x37, 0x37, 0x17, + 0x07, 0x37, 0x34, 0x3e, 0x02, 0x35, 0x34, 0x2e, 0x02, 0x23, 0x22, 0x06, 0x07, 0x17, 0x36, 0x33, + 0x32, 0x16, 0x15, 0x14, 0x0e, 0x02, 0x15, 0x17, 0x17, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, + 0x06, 0x15, 0x14, 0x16, 0x04, 0xf6, 0xf6, 0xf6, 0x14, 0x18, 0x1c, 0x17, 0x09, 0x15, 0x23, 0x19, + 0x15, 0x2c, 0x12, 0x11, 0x1d, 0x1d, 0x12, 0x15, 0x17, 0x1b, 0x16, 0x01, 0x1f, 0x0e, 0x15, 0x15, + 0x0e, 0x10, 0x16, 0x16, 0xe8, 0xf6, 0xf6, 0xf5, 0xb1, 0x16, 0x21, 0x1d, 0x20, 0x16, 0x0c, 0x1b, + 0x15, 0x0e, 0x0b, 0x0c, 0x2e, 0x11, 0x0d, 0x0f, 0x10, 0x18, 0x1b, 0x20, 0x17, 0x0a, 0x69, 0x14, + 0x11, 0x11, 0x15, 0x15, 0x11, 0x11, 0x14, 0x00, 0xff, 0xff, 0xff, 0xd0, 0xff, 0xf5, 0x02, 0x20, + 0x02, 0x79, 0x00, 0x27, 0x01, 0x6f, 0xff, 0x6a, 0x00, 0x00, 0x00, 0x26, 0x00, 0x11, 0x00, 0x00, + 0x01, 0x07, 0x01, 0x74, 0x00, 0x96, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x01, 0x22, 0x01, 0x22, 0x03, 0x3e, 0x00, 0x05, 0x00, 0x17, 0x40, 0x0a, 0x04, 0x45, 0x01, 0x00, + 0x06, 0x04, 0x49, 0x01, 0x03, 0x86, 0x00, 0x3f, 0xd5, 0xed, 0x01, 0x10, 0xd0, 0xd5, 0xed, 0x31, + 0x30, 0x11, 0x33, 0x11, 0x33, 0x11, 0x21, 0xd2, 0x50, 0xfe, 0xde, 0x01, 0x72, 0x01, 0xcc, 0xfd, + 0xe4, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xd2, 0x01, 0x22, 0x01, 0xf4, 0x03, 0x3e, 0x00, 0x05, + 0x00, 0x17, 0x40, 0x0a, 0x05, 0x45, 0x02, 0x04, 0x07, 0x05, 0x49, 0x02, 0x01, 0x86, 0x00, 0x3f, + 0xd5, 0xed, 0x01, 0x10, 0xd0, 0xd5, 0xed, 0x31, 0x30, 0x13, 0x33, 0x11, 0x33, 0x15, 0x21, 0xd2, + 0x50, 0xd2, 0xfe, 0xde, 0x03, 0x3e, 0xfe, 0x34, 0x50, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xd2, + 0xff, 0x56, 0x01, 0xf4, 0x01, 0x72, 0x00, 0x05, 0x00, 0x17, 0x40, 0x0a, 0x00, 0x45, 0x03, 0x02, + 0x07, 0x01, 0x49, 0x03, 0x04, 0x92, 0x00, 0x3f, 0xd5, 0xed, 0x01, 0x10, 0xd0, 0xd5, 0xed, 0x31, + 0x30, 0x13, 0x21, 0x15, 0x23, 0x11, 0x23, 0xd2, 0x01, 0x22, 0xd2, 0x50, 0x01, 0x72, 0x50, 0xfe, + 0x34, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xd2, 0xff, 0x56, 0x01, 0x22, 0x03, 0x3e, 0x00, 0x03, + 0x00, 0x12, 0xb7, 0x03, 0x45, 0x02, 0x04, 0x03, 0x86, 0x00, 0x92, 0x00, 0x3f, 0x3f, 0x01, 0x10, + 0xd6, 0xed, 0x31, 0x30, 0x05, 0x23, 0x11, 0x33, 0x01, 0x22, 0x50, 0x50, 0xaa, 0x03, 0xe8, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x01, 0x22, 0x01, 0xf4, 0x01, 0x72, 0x00, 0x03, 0x00, 0x11, 0xb6, 0x02, + 0x01, 0x04, 0x03, 0x49, 0x02, 0xa2, 0x00, 0x3f, 0xed, 0x01, 0x10, 0xd0, 0xc5, 0x31, 0x30, 0x11, + 0x35, 0x21, 0x15, 0x01, 0xf4, 0x01, 0x22, 0x50, 0x50, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0xff, 0x56, 0x01, 0x22, 0x03, 0x3e, 0x00, 0x07, 0x00, 0x1c, 0x40, 0x0d, 0x05, 0x00, 0x45, 0x02, + 0x03, 0x08, 0x02, 0x49, 0x05, 0x07, 0x86, 0x00, 0x92, 0x00, 0x3f, 0x3f, 0xd5, 0xed, 0x01, 0x10, + 0xd0, 0xd5, 0xed, 0x33, 0x31, 0x30, 0x05, 0x23, 0x11, 0x23, 0x35, 0x33, 0x11, 0x33, 0x01, 0x22, + 0x50, 0xd2, 0xd2, 0x50, 0xaa, 0x01, 0xcc, 0x50, 0x01, 0xcc, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0xff, 0x56, 0x01, 0xf4, 0x01, 0x72, 0x00, 0x07, 0x00, 0x32, 0x40, 0x1f, 0x10, 0x01, 0x40, 0x01, + 0x50, 0x01, 0x03, 0x20, 0x01, 0x60, 0x01, 0x70, 0x01, 0x03, 0x01, 0x09, 0x02, 0x45, 0x05, 0x06, + 0x08, 0x02, 0x90, 0x05, 0x01, 0x05, 0x49, 0x07, 0x9c, 0x03, 0x92, 0x00, 0x3f, 0x3f, 0xed, 0x5d, + 0x32, 0x01, 0x10, 0xd0, 0xd5, 0xed, 0x10, 0xc0, 0x5d, 0x71, 0x31, 0x30, 0x01, 0x15, 0x23, 0x11, + 0x23, 0x11, 0x23, 0x35, 0x01, 0xf4, 0xd2, 0x50, 0xd2, 0x01, 0x72, 0x50, 0xfe, 0x34, 0x01, 0xcc, + 0x50, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x22, 0x01, 0xf4, 0x03, 0x3e, 0x00, 0x07, + 0x00, 0x31, 0x40, 0x1e, 0x00, 0x07, 0x40, 0x07, 0x02, 0x60, 0x07, 0xc0, 0x07, 0x02, 0x07, 0x09, + 0x7f, 0x05, 0x8f, 0x05, 0x9f, 0x05, 0x03, 0x05, 0x45, 0x02, 0x01, 0x08, 0x07, 0x49, 0x02, 0x05, + 0x04, 0x86, 0x00, 0x3f, 0xd5, 0x32, 0xed, 0x01, 0x10, 0xd0, 0xd5, 0xed, 0x5d, 0x10, 0xc0, 0x5d, + 0x71, 0x31, 0x30, 0x11, 0x35, 0x33, 0x11, 0x33, 0x11, 0x33, 0x15, 0xd2, 0x50, 0xd2, 0x01, 0x22, + 0x50, 0x01, 0xcc, 0xfe, 0x34, 0x50, 0x00, 0x00, 0x00, 0x01, 0x00, 0xd2, 0xff, 0x56, 0x01, 0xf4, + 0x03, 0x3e, 0x00, 0x07, 0x00, 0x28, 0x40, 0x16, 0x05, 0x90, 0x03, 0x01, 0x03, 0x9f, 0x02, 0x01, + 0x02, 0x45, 0x00, 0x08, 0x06, 0x92, 0x90, 0x05, 0x01, 0x05, 0x49, 0x02, 0x01, 0x86, 0x00, 0x3f, + 0xdd, 0xed, 0x5d, 0x3f, 0x01, 0x10, 0xd6, 0xfd, 0x5d, 0xcd, 0x5d, 0x33, 0x31, 0x30, 0x13, 0x33, + 0x11, 0x33, 0x15, 0x23, 0x11, 0x23, 0xd2, 0x50, 0xd2, 0xd2, 0x50, 0x03, 0x3e, 0xfe, 0x34, 0x50, + 0xfe, 0x34, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0xff, 0x56, 0x01, 0xf4, 0x03, 0x3e, 0x00, 0x0b, + 0x00, 0x40, 0x40, 0x28, 0x00, 0x08, 0x10, 0x08, 0x40, 0x08, 0x03, 0x20, 0x08, 0x30, 0x08, 0x70, + 0x08, 0xc0, 0x08, 0x04, 0x08, 0x0d, 0x06, 0x09, 0x45, 0x03, 0x30, 0x00, 0x01, 0x00, 0x01, 0x0c, + 0x0a, 0x92, 0x00, 0x90, 0x09, 0x01, 0x09, 0x49, 0x03, 0x06, 0x05, 0x86, 0x00, 0x3f, 0xd5, 0x32, + 0xed, 0x5d, 0x32, 0x3f, 0x01, 0x10, 0xd0, 0xd5, 0x5d, 0x32, 0xed, 0x32, 0x10, 0xc0, 0x5d, 0x71, + 0x31, 0x30, 0x13, 0x23, 0x35, 0x33, 0x11, 0x33, 0x11, 0x33, 0x15, 0x23, 0x11, 0x23, 0xd2, 0xd2, + 0xd2, 0x50, 0xd2, 0xd2, 0x50, 0x01, 0x22, 0x50, 0x01, 0xcc, 0xfe, 0x34, 0x50, 0xfe, 0x34, 0x00, + 0x00, 0x02, 0x00, 0x00, 0xff, 0x56, 0x01, 0xf4, 0x03, 0x3e, 0x00, 0x07, 0x00, 0x0f, 0x00, 0x56, + 0x40, 0x37, 0x00, 0x09, 0x01, 0x20, 0x09, 0x60, 0x09, 0x70, 0x09, 0xc0, 0x09, 0x04, 0x09, 0x00, + 0x07, 0x01, 0x20, 0x07, 0x60, 0x07, 0x70, 0x07, 0xc0, 0x07, 0x04, 0x07, 0x11, 0x0a, 0x45, 0x0d, + 0x0e, 0x10, 0x05, 0x45, 0x02, 0x01, 0x10, 0x0b, 0x92, 0x0d, 0x0a, 0x49, 0xbf, 0x08, 0x01, 0x08, + 0x07, 0x49, 0x02, 0x80, 0x05, 0x01, 0x05, 0x04, 0x86, 0x00, 0x3f, 0xd5, 0x5d, 0x32, 0xfd, 0xde, + 0x5d, 0xed, 0x32, 0x3f, 0x01, 0x10, 0xd0, 0xd5, 0xed, 0x10, 0xd0, 0xd5, 0xed, 0x10, 0xc0, 0x5d, + 0x71, 0xc0, 0x5d, 0x71, 0x31, 0x30, 0x11, 0x35, 0x33, 0x11, 0x33, 0x11, 0x33, 0x1d, 0x02, 0x23, + 0x11, 0x23, 0x11, 0x23, 0x35, 0xd2, 0x50, 0xd2, 0xd2, 0x50, 0xd2, 0x01, 0x72, 0x50, 0x01, 0x7c, + 0xfe, 0x84, 0x50, 0x50, 0x50, 0xfe, 0x84, 0x01, 0x7c, 0x50, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, + 0xff, 0x56, 0x01, 0xf4, 0x03, 0x3e, 0x00, 0x07, 0x00, 0x0f, 0x00, 0x4a, 0x40, 0x2e, 0x80, 0x0f, + 0x90, 0x0f, 0x02, 0x0f, 0x45, 0x0a, 0x3f, 0x0d, 0xbf, 0x0d, 0x02, 0x0d, 0x0c, 0x11, 0x05, 0x8f, + 0x00, 0x9f, 0x00, 0x02, 0x00, 0x45, 0x30, 0x02, 0xb0, 0x02, 0x02, 0x02, 0x03, 0x10, 0x0f, 0x92, + 0x0d, 0x49, 0x0a, 0x08, 0x86, 0x02, 0x49, 0x05, 0x07, 0x86, 0x01, 0x92, 0x00, 0x3f, 0x3f, 0xd5, + 0xed, 0x3f, 0xd5, 0xed, 0x3f, 0x01, 0x10, 0xd0, 0xd5, 0x5d, 0xed, 0x5d, 0x33, 0x10, 0xd0, 0xd5, + 0x5d, 0x32, 0xed, 0x5d, 0x31, 0x30, 0x17, 0x23, 0x11, 0x23, 0x35, 0x33, 0x11, 0x3b, 0x02, 0x11, + 0x33, 0x15, 0x23, 0x11, 0x23, 0xd2, 0x50, 0x82, 0x82, 0x50, 0x50, 0x50, 0x82, 0x82, 0x50, 0xaa, + 0x01, 0xcc, 0x50, 0x01, 0xcc, 0xfe, 0x34, 0x50, 0xfe, 0x34, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0xff, 0x56, 0x01, 0x22, 0x01, 0x72, 0x00, 0x05, 0x00, 0x17, 0x40, 0x0a, 0x02, 0x45, 0x04, 0x05, + 0x06, 0x01, 0x49, 0x04, 0x03, 0x92, 0x00, 0x3f, 0xd5, 0xed, 0x01, 0x10, 0xd0, 0xd5, 0xed, 0x31, + 0x30, 0x11, 0x21, 0x11, 0x23, 0x11, 0x23, 0x01, 0x22, 0x50, 0xd2, 0x01, 0x72, 0xfd, 0xe4, 0x01, + 0xcc, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0xff, 0x56, 0x01, 0x22, 0x03, 0x3e, 0x00, 0x05, + 0x00, 0x0b, 0x00, 0x5c, 0x40, 0x3e, 0x5f, 0x08, 0x6f, 0x08, 0x02, 0x08, 0x45, 0x0a, 0x0b, 0x0c, + 0x5f, 0x03, 0x6f, 0x03, 0x02, 0x03, 0x45, 0x01, 0x00, 0x0c, 0x07, 0x40, 0x1f, 0x00, 0x4d, 0x5f, + 0x07, 0x01, 0x07, 0x49, 0x5f, 0x0a, 0x7f, 0x0a, 0x8f, 0x0a, 0x03, 0x30, 0x0a, 0x01, 0x0a, 0x08, + 0x92, 0x50, 0x04, 0x60, 0x04, 0x02, 0x04, 0x49, 0xbf, 0x01, 0x01, 0x80, 0x01, 0x01, 0x1f, 0x01, + 0x01, 0x01, 0x03, 0x86, 0x00, 0x3f, 0xd5, 0x5d, 0x5d, 0x5d, 0xed, 0x71, 0x3f, 0xd5, 0x5d, 0x5d, + 0xed, 0x71, 0x2b, 0x01, 0x10, 0xd0, 0xd5, 0xed, 0x71, 0x10, 0xd0, 0xd5, 0xed, 0x71, 0x31, 0x30, + 0x11, 0x33, 0x11, 0x33, 0x11, 0x21, 0x15, 0x21, 0x11, 0x23, 0x11, 0x23, 0xd2, 0x50, 0xfe, 0xde, + 0x01, 0x22, 0x50, 0xd2, 0x01, 0xc2, 0x01, 0x7c, 0xfe, 0x34, 0x50, 0xfe, 0x34, 0x01, 0x7c, 0x00, + 0x00, 0x02, 0x00, 0xd2, 0xff, 0x56, 0x01, 0xf4, 0x03, 0x3e, 0x00, 0x05, 0x00, 0x0b, 0x00, 0x38, + 0x40, 0x20, 0xd0, 0x06, 0x01, 0x06, 0x07, 0x45, 0x0a, 0x0c, 0xd0, 0x05, 0x01, 0x05, 0x04, 0x45, + 0x01, 0x0c, 0x0b, 0x49, 0xb0, 0x07, 0x01, 0x8f, 0x07, 0x01, 0x07, 0x08, 0x92, 0x00, 0x49, 0x04, + 0x03, 0x86, 0x00, 0x3f, 0xd5, 0xed, 0x3f, 0xd5, 0x5d, 0x5d, 0xed, 0x01, 0x10, 0xd6, 0xfd, 0xc5, + 0x5d, 0x10, 0xd6, 0xfd, 0xc5, 0x5d, 0x31, 0x30, 0x01, 0x21, 0x11, 0x33, 0x11, 0x33, 0x15, 0x23, + 0x11, 0x23, 0x11, 0x21, 0x01, 0xf4, 0xfe, 0xde, 0x50, 0xd2, 0xd2, 0x50, 0x01, 0x22, 0x01, 0x72, + 0x01, 0xcc, 0xfe, 0x84, 0xf0, 0xfe, 0x84, 0x01, 0xcc, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, + 0x00, 0xd2, 0x01, 0xf4, 0x03, 0x3e, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x40, 0x40, 0x29, 0x00, 0x09, + 0x10, 0x09, 0x40, 0x09, 0x50, 0x09, 0x04, 0x20, 0x09, 0x60, 0x09, 0x70, 0x09, 0xc0, 0x09, 0x04, + 0x09, 0x0b, 0x0c, 0x30, 0x06, 0xd0, 0x06, 0x02, 0x06, 0x05, 0x45, 0x02, 0x01, 0x0c, 0x09, 0x49, + 0x08, 0x07, 0x49, 0x02, 0x05, 0x04, 0x86, 0x00, 0x3f, 0xd5, 0x32, 0xfd, 0xd6, 0xed, 0x01, 0x10, + 0xd0, 0xd5, 0xfd, 0xc5, 0x5d, 0x10, 0xd0, 0xc5, 0x5d, 0x71, 0x31, 0x30, 0x11, 0x35, 0x33, 0x11, + 0x33, 0x11, 0x33, 0x1d, 0x02, 0x21, 0x35, 0xd2, 0x50, 0xd2, 0xfe, 0x0c, 0x01, 0x72, 0x50, 0x01, + 0x7c, 0xfe, 0x84, 0x50, 0x50, 0x50, 0x50, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0xd2, 0x01, 0x22, + 0x03, 0x3e, 0x00, 0x05, 0x00, 0x09, 0x00, 0x3c, 0x40, 0x25, 0x07, 0x40, 0x0c, 0x00, 0x4d, 0x7f, + 0x07, 0xbf, 0x07, 0x02, 0x10, 0x07, 0x50, 0x07, 0x02, 0xdf, 0x07, 0x01, 0x70, 0x07, 0x01, 0x07, + 0x09, 0x0a, 0x04, 0x45, 0x01, 0x00, 0x0a, 0x08, 0x49, 0x07, 0x04, 0x49, 0x01, 0x03, 0x86, 0x00, + 0x3f, 0xd5, 0xfd, 0xd6, 0xed, 0x01, 0x10, 0xd0, 0xd5, 0xed, 0x10, 0xd0, 0xc5, 0x5d, 0x5d, 0x71, + 0x71, 0x2b, 0x31, 0x30, 0x11, 0x33, 0x11, 0x33, 0x11, 0x21, 0x15, 0x21, 0x15, 0x21, 0xd2, 0x50, + 0xfe, 0xde, 0x01, 0x22, 0xfe, 0xde, 0x01, 0xc2, 0x01, 0x7c, 0xfe, 0x34, 0x50, 0x50, 0x00, 0x00, + 0x00, 0x02, 0x00, 0xd2, 0x00, 0xd2, 0x01, 0xf4, 0x03, 0x3e, 0x00, 0x05, 0x00, 0x09, 0x00, 0x38, + 0x40, 0x21, 0x10, 0x08, 0x01, 0x70, 0x08, 0x01, 0x08, 0x06, 0x0a, 0x70, 0x05, 0x01, 0x5f, 0x05, + 0x01, 0x30, 0x05, 0xd0, 0x05, 0x02, 0x05, 0x04, 0x45, 0x01, 0x0a, 0x09, 0x49, 0x06, 0x01, 0x49, + 0x04, 0x03, 0x86, 0x00, 0x3f, 0xd5, 0xfd, 0xd6, 0xed, 0x01, 0x10, 0xd6, 0xfd, 0xc5, 0x5d, 0x71, + 0x71, 0x10, 0xd6, 0xc5, 0x5d, 0x71, 0x31, 0x30, 0x01, 0x21, 0x11, 0x33, 0x11, 0x33, 0x05, 0x21, + 0x15, 0x21, 0x01, 0xf4, 0xfe, 0xde, 0x50, 0xd2, 0xfe, 0xde, 0x01, 0x22, 0xfe, 0xde, 0x01, 0x72, + 0x01, 0xcc, 0xfe, 0x84, 0xa0, 0x50, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0xff, 0x56, 0x01, 0xf4, + 0x01, 0xc2, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x40, 0x40, 0x29, 0x00, 0x0a, 0x10, 0x0a, 0x40, 0x0a, + 0x50, 0x0a, 0x04, 0x20, 0x0a, 0x60, 0x0a, 0x70, 0x0a, 0xc0, 0x0a, 0x04, 0x0a, 0x08, 0x0c, 0x30, + 0x01, 0xd0, 0x01, 0x02, 0x01, 0x02, 0x45, 0x05, 0x06, 0x0c, 0x0a, 0x49, 0x0b, 0x00, 0x49, 0x05, + 0x02, 0x03, 0x92, 0x00, 0x3f, 0xd5, 0xc0, 0xfd, 0xd6, 0xed, 0x01, 0x10, 0xd0, 0xd5, 0xfd, 0xc5, + 0x5d, 0x10, 0xd0, 0xc5, 0x5d, 0x71, 0x31, 0x30, 0x01, 0x15, 0x23, 0x11, 0x23, 0x11, 0x23, 0x3d, + 0x02, 0x21, 0x15, 0x01, 0xf4, 0xd2, 0x50, 0xd2, 0x01, 0xf4, 0x01, 0x22, 0x50, 0xfe, 0x84, 0x01, + 0x7c, 0x50, 0x50, 0x50, 0x50, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0xff, 0x56, 0x01, 0x22, + 0x01, 0xc2, 0x00, 0x05, 0x00, 0x09, 0x00, 0x34, 0x40, 0x1e, 0x10, 0x07, 0x50, 0x07, 0x02, 0xdf, + 0x07, 0x01, 0x70, 0x07, 0x01, 0x3f, 0x07, 0x01, 0x07, 0x09, 0x0a, 0x02, 0x45, 0x04, 0x05, 0x0a, + 0x07, 0x49, 0x08, 0x01, 0x49, 0x04, 0x03, 0x92, 0x00, 0x3f, 0xd5, 0xfd, 0xd6, 0xed, 0x01, 0x10, + 0xd0, 0xd5, 0xed, 0x10, 0xd0, 0xc5, 0x5d, 0x5d, 0x5d, 0x71, 0x31, 0x30, 0x11, 0x21, 0x11, 0x23, + 0x11, 0x23, 0x35, 0x21, 0x15, 0x21, 0x01, 0x22, 0x50, 0xd2, 0x01, 0x22, 0xfe, 0xde, 0x01, 0x22, + 0xfe, 0x34, 0x01, 0x7c, 0xf0, 0x50, 0x00, 0x00, 0x00, 0x02, 0x00, 0xd2, 0xff, 0x56, 0x01, 0xf4, + 0x01, 0xc2, 0x00, 0x05, 0x00, 0x09, 0x00, 0x38, 0x40, 0x22, 0x10, 0x07, 0x50, 0x07, 0x02, 0x70, + 0x07, 0x01, 0x07, 0x09, 0x0a, 0x70, 0x00, 0xb0, 0x00, 0x02, 0x30, 0x00, 0xd0, 0x00, 0x02, 0x00, + 0x01, 0x45, 0x04, 0x0a, 0x07, 0x49, 0x08, 0x05, 0x49, 0x01, 0x02, 0x92, 0x00, 0x3f, 0xd5, 0xfd, + 0xd6, 0xed, 0x01, 0x10, 0xd6, 0xfd, 0xc5, 0x5d, 0x71, 0x10, 0xd6, 0xc5, 0x5d, 0x71, 0x31, 0x30, + 0x25, 0x23, 0x11, 0x23, 0x11, 0x21, 0x25, 0x21, 0x15, 0x21, 0x01, 0xf4, 0xd2, 0x50, 0x01, 0x22, + 0xfe, 0xde, 0x01, 0x22, 0xfe, 0xde, 0xd2, 0xfe, 0x84, 0x01, 0xcc, 0xa0, 0x50, 0x00, 0x00, 0x00, + 0x00, 0x02, 0x00, 0x82, 0xff, 0x56, 0x01, 0x72, 0x03, 0x3e, 0x00, 0x03, 0x00, 0x07, 0x00, 0x1e, + 0x40, 0x0f, 0x05, 0x45, 0x04, 0x03, 0x45, 0x02, 0x08, 0x06, 0x92, 0x04, 0x86, 0x03, 0x86, 0x00, + 0x92, 0x00, 0x3f, 0x3f, 0x3f, 0x3f, 0x01, 0x10, 0xd6, 0xfd, 0xd6, 0xed, 0x31, 0x30, 0x17, 0x23, + 0x11, 0x3b, 0x02, 0x11, 0x23, 0xd2, 0x50, 0x50, 0x50, 0x50, 0x50, 0xaa, 0x03, 0xe8, 0xfc, 0x18, + 0x00, 0x04, 0x00, 0x00, 0xff, 0x56, 0x01, 0xf4, 0x03, 0x3e, 0x00, 0x05, 0x00, 0x0b, 0x00, 0x11, + 0x00, 0x17, 0x00, 0x76, 0x40, 0x4e, 0x30, 0x06, 0xb0, 0x06, 0x02, 0x06, 0x07, 0x45, 0x70, 0x0a, + 0xa0, 0x0a, 0xb0, 0x0a, 0x03, 0xc0, 0x0a, 0xd0, 0x0a, 0x02, 0x0a, 0x13, 0x45, 0xb0, 0x16, 0x01, + 0x16, 0x12, 0x18, 0x30, 0x11, 0xb0, 0x11, 0x02, 0x11, 0x10, 0x45, 0x70, 0x0d, 0xa0, 0x0d, 0xb0, + 0x0d, 0x03, 0xc0, 0x0d, 0xd0, 0x0d, 0x02, 0x0d, 0x04, 0x45, 0xb0, 0x01, 0x01, 0x01, 0x00, 0x18, + 0x15, 0x92, 0x07, 0x49, 0x0a, 0x0d, 0x49, 0x10, 0x0e, 0x86, 0x09, 0x92, 0x16, 0x49, 0x13, 0x04, + 0x49, 0x01, 0x03, 0x86, 0x00, 0x3f, 0xd5, 0xfd, 0xd6, 0xed, 0x3f, 0x3f, 0xd5, 0xfd, 0xd6, 0xed, + 0x3f, 0x01, 0x10, 0xd0, 0xd5, 0x5d, 0xfd, 0xd6, 0x5d, 0x71, 0xfd, 0xc5, 0x5d, 0x10, 0xd0, 0xd5, + 0x5d, 0xfd, 0xd6, 0x5d, 0x71, 0xfd, 0xc5, 0x5d, 0x31, 0x30, 0x11, 0x33, 0x11, 0x33, 0x11, 0x23, + 0x05, 0x23, 0x11, 0x23, 0x11, 0x33, 0x35, 0x23, 0x11, 0x33, 0x11, 0x33, 0x05, 0x33, 0x11, 0x23, + 0x11, 0x23, 0x82, 0x50, 0xd2, 0x01, 0xf4, 0x82, 0x50, 0xd2, 0xd2, 0x50, 0x82, 0xfe, 0x0c, 0xd2, + 0x50, 0x82, 0x01, 0xc2, 0x01, 0x7c, 0xfe, 0x34, 0xa0, 0xfe, 0x84, 0x01, 0xcc, 0x50, 0x01, 0xcc, + 0xfe, 0x84, 0xa0, 0xfe, 0x34, 0x01, 0x7c, 0x00, 0x00, 0x03, 0x00, 0x00, 0xff, 0x56, 0x01, 0x72, + 0x03, 0x3e, 0x00, 0x03, 0x00, 0x09, 0x00, 0x0f, 0x00, 0x45, 0x40, 0x29, 0x9f, 0x0b, 0x01, 0x0b, + 0x45, 0x0e, 0x0f, 0x10, 0x01, 0x40, 0x12, 0x00, 0x4d, 0x8f, 0x01, 0x01, 0x01, 0x45, 0x00, 0x9f, + 0x07, 0x01, 0x07, 0x45, 0x05, 0x04, 0x10, 0x0d, 0x92, 0x0e, 0x49, 0x0b, 0x08, 0x49, 0x05, 0x07, + 0x86, 0x02, 0x92, 0x00, 0x86, 0x00, 0x3f, 0x3f, 0x3f, 0xd5, 0xfd, 0xd6, 0xed, 0x3f, 0x01, 0x10, + 0xd0, 0xd5, 0xfd, 0x5d, 0xd6, 0xed, 0x5d, 0x2b, 0x10, 0xd0, 0xd5, 0xed, 0x5d, 0x31, 0x30, 0x01, + 0x33, 0x11, 0x23, 0x01, 0x33, 0x11, 0x33, 0x11, 0x23, 0x15, 0x33, 0x11, 0x23, 0x11, 0x23, 0x01, + 0x22, 0x50, 0x50, 0xfe, 0xde, 0x82, 0x50, 0xd2, 0xd2, 0x50, 0x82, 0x03, 0x3e, 0xfc, 0x18, 0x02, + 0x6c, 0x01, 0x7c, 0xfe, 0x34, 0x50, 0xfe, 0x34, 0x01, 0x7c, 0x00, 0x00, 0x00, 0x03, 0x00, 0x82, + 0xff, 0x56, 0x01, 0xf4, 0x03, 0x3e, 0x00, 0x03, 0x00, 0x09, 0x00, 0x0f, 0x00, 0x63, 0x40, 0x40, + 0x90, 0x0d, 0x01, 0x0d, 0x45, 0x0b, 0x20, 0x0a, 0x01, 0x0a, 0x11, 0x90, 0x05, 0x01, 0x05, 0x45, + 0x08, 0x20, 0x09, 0x01, 0x09, 0x11, 0x00, 0x40, 0x12, 0x00, 0x4d, 0x8f, 0x00, 0x01, 0x00, 0x45, + 0x01, 0x40, 0x0f, 0x00, 0x4d, 0xb0, 0x01, 0x01, 0x7f, 0x01, 0x8f, 0x01, 0x02, 0x30, 0x01, 0x01, + 0x01, 0x10, 0x0c, 0x92, 0x0a, 0x49, 0x0f, 0x04, 0x49, 0x09, 0x06, 0x86, 0x03, 0x86, 0x01, 0x92, + 0x00, 0x3f, 0x3f, 0x3f, 0xd4, 0xfd, 0xd6, 0xed, 0x3f, 0x01, 0x10, 0xd6, 0x5d, 0x5d, 0x5d, 0x2b, + 0xed, 0x5d, 0x2b, 0x10, 0xd0, 0x5d, 0xd5, 0xed, 0x5d, 0x10, 0xd0, 0x5d, 0xd5, 0xed, 0x5d, 0x31, + 0x30, 0x17, 0x23, 0x11, 0x33, 0x01, 0x23, 0x11, 0x33, 0x11, 0x33, 0x15, 0x23, 0x11, 0x23, 0x11, + 0x33, 0xd2, 0x50, 0x50, 0x01, 0x22, 0xd2, 0x50, 0x82, 0x82, 0x50, 0xd2, 0xaa, 0x03, 0xe8, 0xfe, + 0x34, 0x01, 0xcc, 0xfe, 0x84, 0xf0, 0xfe, 0x84, 0x01, 0xcc, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, + 0x00, 0xd2, 0x01, 0xf4, 0x03, 0x3e, 0x00, 0x03, 0x00, 0x09, 0x00, 0x0f, 0x00, 0x3f, 0x40, 0x24, + 0x0b, 0x45, 0x3f, 0x0e, 0xbf, 0x0e, 0x02, 0x0e, 0x0f, 0x11, 0x08, 0x45, 0x30, 0x05, 0xb0, 0x05, + 0x02, 0x05, 0x04, 0x10, 0x00, 0x03, 0x10, 0x0a, 0x49, 0x0e, 0x0c, 0x86, 0x02, 0x49, 0x03, 0x08, + 0x49, 0x05, 0x07, 0x86, 0x00, 0x3f, 0xd5, 0xfd, 0xd6, 0xed, 0x3f, 0xd5, 0xed, 0x01, 0x10, 0xd0, + 0xc5, 0x10, 0xd0, 0xd5, 0x5d, 0xed, 0x10, 0xd0, 0xd5, 0x5d, 0xed, 0x31, 0x30, 0x01, 0x15, 0x21, + 0x35, 0x35, 0x33, 0x11, 0x33, 0x11, 0x23, 0x21, 0x23, 0x11, 0x33, 0x11, 0x33, 0x01, 0xf4, 0xfe, + 0x0c, 0x82, 0x50, 0xd2, 0x01, 0xf4, 0xd2, 0x50, 0x82, 0x01, 0x22, 0x50, 0x50, 0xa0, 0x01, 0x7c, + 0xfe, 0x34, 0x01, 0xcc, 0xfe, 0x84, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0xd2, 0x01, 0x72, + 0x03, 0x3e, 0x00, 0x05, 0x00, 0x0b, 0x00, 0x3a, 0x40, 0x22, 0x0a, 0x45, 0xa0, 0x07, 0x01, 0x3f, + 0x07, 0x01, 0x07, 0x0b, 0x0c, 0x04, 0x45, 0x01, 0x05, 0x0c, 0x0a, 0x49, 0x07, 0x09, 0x86, 0x04, + 0x49, 0x50, 0x01, 0x01, 0x1f, 0x01, 0x3f, 0x01, 0x02, 0x01, 0x03, 0x86, 0x00, 0x3f, 0xd5, 0x5d, + 0x5d, 0xed, 0x3f, 0xd5, 0xed, 0x01, 0x10, 0xd0, 0xd5, 0xed, 0x10, 0xd0, 0xd5, 0x5d, 0x5d, 0xed, + 0x31, 0x30, 0x11, 0x33, 0x11, 0x33, 0x11, 0x23, 0x15, 0x21, 0x11, 0x33, 0x11, 0x21, 0x82, 0x50, + 0xd2, 0x01, 0x22, 0x50, 0xfe, 0x8e, 0x01, 0xc2, 0x01, 0x7c, 0xfe, 0x34, 0x50, 0x02, 0x1c, 0xfd, + 0x94, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x82, 0x00, 0xd2, 0x01, 0xf4, 0x03, 0x3e, 0x00, 0x05, + 0x00, 0x0b, 0x00, 0x40, 0x40, 0x27, 0x3f, 0x0b, 0x01, 0x0b, 0x0a, 0x45, 0x30, 0x07, 0xb0, 0x07, + 0x02, 0x07, 0x0c, 0x05, 0x04, 0x45, 0xb0, 0x01, 0x01, 0x01, 0x0c, 0x07, 0x49, 0x0a, 0x09, 0x86, + 0x01, 0x49, 0x50, 0x04, 0x01, 0x1f, 0x04, 0x3f, 0x04, 0x02, 0x04, 0x02, 0x86, 0x00, 0x3f, 0xd5, + 0x5d, 0x5d, 0xed, 0x3f, 0xd5, 0xed, 0x01, 0x10, 0xd4, 0x5d, 0xfd, 0xc5, 0x10, 0xd6, 0x5d, 0xfd, + 0xc5, 0x5d, 0x31, 0x30, 0x01, 0x23, 0x11, 0x33, 0x11, 0x33, 0x15, 0x21, 0x11, 0x33, 0x11, 0x21, + 0x01, 0xf4, 0xd2, 0x50, 0x82, 0xfe, 0x8e, 0x50, 0x01, 0x22, 0x01, 0x72, 0x01, 0xcc, 0xfe, 0x84, + 0xf0, 0x02, 0x6c, 0xfd, 0xe4, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0xff, 0x56, 0x01, 0xf4, + 0x01, 0xc2, 0x00, 0x03, 0x00, 0x09, 0x00, 0x0f, 0x00, 0x63, 0x40, 0x41, 0x80, 0x08, 0x90, 0x08, + 0x02, 0x08, 0x45, 0x3f, 0x05, 0xbf, 0x05, 0x02, 0x05, 0x09, 0x11, 0x8f, 0x0b, 0x9f, 0x0b, 0x02, + 0x0b, 0x45, 0x30, 0x0e, 0xb0, 0x0e, 0x02, 0x0e, 0x0f, 0x10, 0x02, 0x00, 0x10, 0x02, 0x40, 0x12, + 0x00, 0x4d, 0x8f, 0x02, 0x01, 0x02, 0x49, 0xa0, 0x03, 0xb0, 0x03, 0x02, 0x03, 0x0a, 0x49, 0xb0, + 0x0e, 0x01, 0x0e, 0x0d, 0x92, 0x09, 0x49, 0xb0, 0x05, 0x01, 0x05, 0x07, 0x92, 0x00, 0x3f, 0xd5, + 0x5d, 0xed, 0x3f, 0xd5, 0x5d, 0xfd, 0xd6, 0x5d, 0xed, 0x5d, 0x2b, 0x01, 0x10, 0xd0, 0xc5, 0x10, + 0xd0, 0xdd, 0x5d, 0xed, 0x5d, 0x10, 0xd0, 0xd5, 0x5d, 0xed, 0x5d, 0x31, 0x30, 0x11, 0x35, 0x21, + 0x15, 0x15, 0x23, 0x11, 0x23, 0x11, 0x33, 0x21, 0x33, 0x11, 0x23, 0x11, 0x23, 0x01, 0xf4, 0x82, + 0x50, 0xd2, 0xfe, 0x0c, 0xd2, 0x50, 0x82, 0x01, 0x72, 0x50, 0x50, 0xa0, 0xfe, 0x84, 0x01, 0xcc, + 0xfe, 0x34, 0x01, 0x7c, 0x00, 0x02, 0x00, 0x00, 0xff, 0x56, 0x01, 0x72, 0x01, 0xc2, 0x00, 0x05, + 0x00, 0x0b, 0x00, 0x72, 0x40, 0x0d, 0x07, 0x40, 0x10, 0x00, 0x4d, 0x8f, 0x07, 0x9f, 0x07, 0x02, + 0x07, 0x45, 0x0a, 0xb8, 0xff, 0xc0, 0x40, 0x23, 0x10, 0x00, 0x4d, 0x80, 0x0a, 0x01, 0x0a, 0x0b, + 0x0c, 0x01, 0x45, 0x9f, 0x04, 0xaf, 0x04, 0x02, 0x30, 0x04, 0x01, 0x04, 0x05, 0x0c, 0x07, 0x40, + 0x10, 0x00, 0x4d, 0x8f, 0x07, 0x9f, 0x07, 0x02, 0x07, 0x49, 0x0a, 0xb8, 0xff, 0xc0, 0x40, 0x18, + 0x10, 0x00, 0x4d, 0x80, 0x0a, 0x90, 0x0a, 0x02, 0x0a, 0x08, 0x92, 0x01, 0x49, 0x5f, 0x04, 0x01, + 0x10, 0x04, 0x30, 0x04, 0x02, 0x04, 0x02, 0x92, 0x00, 0x3f, 0xd5, 0x5d, 0x5d, 0xed, 0x3f, 0xd5, + 0x5d, 0x2b, 0xed, 0x5d, 0x2b, 0x01, 0x10, 0xd0, 0xd5, 0x5d, 0x5d, 0xed, 0x10, 0xd0, 0xd5, 0x5d, + 0x2b, 0xed, 0x5d, 0x2b, 0x31, 0x30, 0x11, 0x33, 0x11, 0x23, 0x11, 0x23, 0x35, 0x21, 0x11, 0x23, + 0x11, 0x21, 0xd2, 0x50, 0x82, 0x01, 0x72, 0x50, 0xfe, 0xde, 0x01, 0x22, 0xfe, 0x34, 0x01, 0x7c, + 0xf0, 0xfd, 0x94, 0x02, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x82, 0xff, 0x56, 0x01, 0xf4, + 0x01, 0xc2, 0x00, 0x05, 0x00, 0x0b, 0x00, 0x64, 0x40, 0x46, 0x70, 0x06, 0x80, 0x06, 0x02, 0x06, + 0x7f, 0x07, 0x8f, 0x07, 0x9f, 0x07, 0x03, 0x07, 0x45, 0xb0, 0x0a, 0x01, 0x0a, 0x0c, 0x9f, 0x00, + 0xaf, 0x00, 0x02, 0x30, 0x00, 0x01, 0x00, 0x01, 0x45, 0xa0, 0x04, 0xb0, 0x04, 0x02, 0x3f, 0x04, + 0x01, 0x04, 0x0c, 0x7f, 0x0a, 0x8f, 0x0a, 0x9f, 0x0a, 0x03, 0x0a, 0x49, 0x70, 0x07, 0x80, 0x07, + 0x90, 0x07, 0x03, 0x07, 0x08, 0x92, 0x04, 0x49, 0x10, 0x01, 0x30, 0x01, 0x02, 0x01, 0x03, 0x92, + 0x00, 0x3f, 0xd5, 0x5d, 0xed, 0x3f, 0xd5, 0x5d, 0xed, 0x5d, 0x01, 0x10, 0xd4, 0x5d, 0x5d, 0xfd, + 0xc5, 0x5d, 0x5d, 0x10, 0xd6, 0x5d, 0xfd, 0x5d, 0xc5, 0x5d, 0x31, 0x30, 0x25, 0x23, 0x11, 0x23, + 0x11, 0x33, 0x35, 0x21, 0x11, 0x23, 0x11, 0x21, 0x01, 0xf4, 0x82, 0x50, 0xd2, 0xfe, 0xde, 0x50, + 0x01, 0x72, 0xd2, 0xfe, 0x84, 0x01, 0xcc, 0x50, 0xfd, 0xe4, 0x02, 0x6c, 0x00, 0x02, 0x00, 0x00, + 0x00, 0xd2, 0x01, 0xf4, 0x01, 0xc2, 0x00, 0x03, 0x00, 0x07, 0x00, 0x1d, 0x40, 0x0d, 0x07, 0x04, + 0x08, 0x03, 0x00, 0x08, 0x03, 0x49, 0x02, 0x07, 0x49, 0x05, 0x0a, 0x00, 0x3f, 0xfd, 0xd6, 0xed, + 0x01, 0x10, 0xd0, 0xc5, 0x10, 0xd0, 0xc5, 0x31, 0x30, 0x35, 0x35, 0x21, 0x15, 0x25, 0x35, 0x21, + 0x15, 0x01, 0xf4, 0xfe, 0x0c, 0x01, 0xf4, 0xd2, 0x50, 0x50, 0xa0, 0x50, 0x50, 0x00, 0x00, 0x00, + 0x00, 0x02, 0x00, 0x00, 0xff, 0x56, 0x01, 0x72, 0x03, 0x3e, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x27, + 0x40, 0x14, 0x0b, 0x45, 0x0a, 0x07, 0x45, 0x02, 0x05, 0x03, 0x0c, 0x0a, 0x86, 0x09, 0x92, 0x06, + 0x86, 0x05, 0x49, 0x02, 0x01, 0x92, 0x00, 0x3f, 0xd5, 0xed, 0x3f, 0x3f, 0x3f, 0x01, 0x10, 0xd0, + 0xd5, 0x32, 0xfd, 0xd6, 0xed, 0x31, 0x30, 0x17, 0x23, 0x11, 0x23, 0x35, 0x33, 0x11, 0x33, 0x13, + 0x23, 0x11, 0x33, 0xd2, 0x50, 0x82, 0x82, 0x50, 0xa0, 0x50, 0x50, 0xaa, 0x01, 0xcc, 0x50, 0x01, + 0xcc, 0xfc, 0x18, 0x03, 0xe8, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x82, 0xff, 0x56, 0x01, 0xf4, + 0x03, 0x3e, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x27, 0x40, 0x14, 0x0b, 0x45, 0x0a, 0x07, 0x45, 0x02, + 0x05, 0x04, 0x0d, 0x0a, 0x92, 0x09, 0x86, 0x02, 0x49, 0x05, 0x06, 0x92, 0x01, 0x86, 0x00, 0x3f, + 0x3f, 0xd5, 0xed, 0x3f, 0x3f, 0x01, 0x10, 0xd0, 0xd5, 0x32, 0xfd, 0xd6, 0xed, 0x31, 0x30, 0x01, + 0x33, 0x11, 0x33, 0x15, 0x23, 0x11, 0x23, 0x03, 0x33, 0x11, 0x23, 0x01, 0x22, 0x50, 0x82, 0x82, + 0x50, 0xa0, 0x50, 0x50, 0x03, 0x3e, 0xfe, 0x34, 0x50, 0xfe, 0x34, 0x03, 0xe8, 0xfc, 0x18, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x01, 0x22, 0x01, 0xf4, 0x03, 0x3e, 0x00, 0x0b, 0x00, 0x45, 0x40, 0x2d, + 0x01, 0x0d, 0x0b, 0x40, 0x0f, 0x12, 0x48, 0x0b, 0x45, 0x08, 0x07, 0x40, 0x0f, 0x12, 0x48, 0x07, + 0x45, 0x30, 0x04, 0x60, 0x04, 0x70, 0x04, 0xb0, 0x04, 0xc0, 0x04, 0xd0, 0x04, 0x06, 0x04, 0x03, + 0x0c, 0x0a, 0x86, 0x0b, 0x07, 0x90, 0x02, 0x01, 0x02, 0x49, 0x04, 0x05, 0x86, 0x00, 0x3f, 0xd5, + 0xed, 0x5d, 0x33, 0x33, 0x3f, 0x01, 0x10, 0xd0, 0xd5, 0x5d, 0xfd, 0x2b, 0xd6, 0xed, 0x2b, 0x10, + 0xc0, 0x31, 0x30, 0x01, 0x15, 0x21, 0x35, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x01, + 0xf4, 0xfe, 0x0c, 0x82, 0x50, 0x50, 0x50, 0x01, 0x72, 0x50, 0x50, 0x01, 0xcc, 0xfe, 0x34, 0x01, + 0xcc, 0xfe, 0x34, 0x00, 0x00, 0x02, 0x00, 0x00, 0x01, 0x22, 0x01, 0x72, 0x03, 0x3e, 0x00, 0x05, + 0x00, 0x09, 0x00, 0x3b, 0x40, 0x25, 0x8f, 0x08, 0x9f, 0x08, 0x02, 0x08, 0x45, 0x09, 0x8f, 0x04, + 0x9f, 0x04, 0x02, 0x04, 0x45, 0x01, 0x00, 0x0a, 0x90, 0x08, 0x01, 0x08, 0xa1, 0x07, 0x86, 0x9f, + 0x01, 0x01, 0x01, 0x49, 0x90, 0x04, 0x01, 0x04, 0xa1, 0x03, 0x86, 0x00, 0x3f, 0x3f, 0x5d, 0xed, + 0x5d, 0x3f, 0x3f, 0x5d, 0x01, 0x10, 0xd0, 0xd5, 0xfd, 0x5d, 0xd6, 0xed, 0x5d, 0x31, 0x30, 0x11, + 0x33, 0x11, 0x33, 0x11, 0x23, 0x01, 0x33, 0x11, 0x23, 0x82, 0x50, 0xd2, 0x01, 0x22, 0x50, 0x50, + 0x01, 0x72, 0x01, 0xcc, 0xfd, 0xe4, 0x02, 0x1c, 0xfd, 0xe4, 0x00, 0x00, 0x00, 0x02, 0x00, 0x82, + 0x01, 0x22, 0x01, 0xf4, 0x03, 0x3e, 0x00, 0x05, 0x00, 0x09, 0x00, 0x3b, 0x40, 0x25, 0x80, 0x07, + 0x90, 0x07, 0x02, 0x07, 0x45, 0x06, 0x80, 0x01, 0x90, 0x01, 0x02, 0x01, 0x45, 0x04, 0x00, 0x0b, + 0x09, 0x86, 0x90, 0x06, 0x01, 0x06, 0xa1, 0x03, 0x86, 0x9f, 0x04, 0x01, 0x04, 0x49, 0x90, 0x00, + 0x01, 0x00, 0xa1, 0x00, 0x3f, 0x5d, 0xed, 0x5d, 0x3f, 0x3f, 0x5d, 0x3f, 0x01, 0x10, 0xd0, 0xd5, + 0xfd, 0x5d, 0xd6, 0xed, 0x5d, 0x31, 0x30, 0x01, 0x23, 0x11, 0x33, 0x11, 0x33, 0x05, 0x23, 0x11, + 0x33, 0x01, 0xf4, 0xd2, 0x50, 0x82, 0xfe, 0xde, 0x50, 0x50, 0x01, 0x22, 0x02, 0x1c, 0xfe, 0x34, + 0x50, 0x02, 0x1c, 0x00, 0x00, 0x01, 0x00, 0x00, 0xff, 0x56, 0x01, 0xf4, 0x01, 0x72, 0x00, 0x0b, + 0x00, 0x40, 0x40, 0x27, 0x80, 0x07, 0x90, 0x07, 0x02, 0x07, 0x45, 0xbf, 0x04, 0x01, 0x04, 0x03, + 0x0d, 0x8f, 0x08, 0x9f, 0x08, 0x02, 0x08, 0x45, 0x30, 0x0b, 0xb0, 0x0b, 0x02, 0x0b, 0x00, 0x0c, + 0x09, 0x92, 0x06, 0x92, 0x04, 0x08, 0x08, 0x0b, 0x49, 0x01, 0x83, 0x00, 0x3f, 0xed, 0x32, 0x11, + 0x33, 0x3f, 0x3f, 0x01, 0x10, 0xd0, 0xd5, 0x5d, 0xed, 0x5d, 0x10, 0xd0, 0xd5, 0x5d, 0xed, 0x5d, + 0x31, 0x30, 0x11, 0x35, 0x21, 0x15, 0x23, 0x11, 0x23, 0x11, 0x23, 0x11, 0x23, 0x11, 0x01, 0xf4, + 0x82, 0x50, 0x50, 0x50, 0x01, 0x22, 0x50, 0x50, 0xfe, 0x34, 0x01, 0xcc, 0xfe, 0x34, 0x01, 0xcc, + 0x00, 0x02, 0x00, 0x00, 0xff, 0x56, 0x01, 0x72, 0x01, 0x72, 0x00, 0x05, 0x00, 0x09, 0x00, 0x43, + 0x40, 0x2a, 0x84, 0x06, 0x94, 0x06, 0x02, 0x06, 0x45, 0xbf, 0x07, 0x01, 0x02, 0x3f, 0x07, 0x01, + 0x20, 0x07, 0x01, 0x07, 0x0b, 0x8f, 0x01, 0x9f, 0x01, 0x02, 0x01, 0x45, 0x04, 0x05, 0x0a, 0x09, + 0x92, 0x07, 0x83, 0x02, 0x92, 0x90, 0x04, 0x01, 0x04, 0x49, 0x01, 0x83, 0x00, 0x3f, 0xed, 0x5d, + 0x3f, 0x3f, 0x3f, 0x01, 0x10, 0xd0, 0xd5, 0xed, 0x5d, 0x10, 0xd6, 0x5d, 0x5d, 0x5f, 0x5d, 0xed, + 0x5d, 0x31, 0x30, 0x11, 0x33, 0x11, 0x23, 0x11, 0x23, 0x25, 0x33, 0x11, 0x23, 0xd2, 0x50, 0x82, + 0x01, 0x22, 0x50, 0x50, 0x01, 0x72, 0xfd, 0xe4, 0x01, 0xcc, 0x50, 0xfd, 0xe4, 0x00, 0x00, 0x00, + 0x00, 0x02, 0x00, 0x82, 0xff, 0x56, 0x01, 0xf4, 0x01, 0x72, 0x00, 0x05, 0x00, 0x09, 0x00, 0x43, + 0x40, 0x2a, 0x84, 0x04, 0x94, 0x04, 0x02, 0x04, 0x45, 0x01, 0x24, 0x00, 0x01, 0x00, 0x0b, 0x8b, + 0x09, 0x9b, 0x09, 0x02, 0x09, 0x45, 0xb0, 0x08, 0x01, 0x02, 0x30, 0x08, 0x01, 0x08, 0x0a, 0x09, + 0x83, 0x06, 0x92, 0x90, 0x01, 0x01, 0x01, 0x49, 0x04, 0x83, 0x03, 0x92, 0x00, 0x3f, 0x3f, 0xed, + 0x5d, 0x3f, 0x3f, 0x01, 0x10, 0xd6, 0x5d, 0x5f, 0x5d, 0xed, 0x5d, 0x10, 0xd0, 0x5d, 0xd5, 0xed, + 0x5d, 0x31, 0x30, 0x01, 0x23, 0x11, 0x23, 0x11, 0x33, 0x01, 0x23, 0x11, 0x33, 0x01, 0xf4, 0x82, + 0x50, 0xd2, 0xfe, 0xde, 0x50, 0x50, 0x01, 0x22, 0xfe, 0x34, 0x02, 0x1c, 0xfd, 0xe4, 0x02, 0x1c, + 0x00, 0x01, 0x00, 0x00, 0xff, 0x56, 0x01, 0xf4, 0x03, 0x3e, 0x00, 0x03, 0x00, 0x0f, 0xb5, 0x05, + 0x03, 0x03, 0x86, 0x02, 0x92, 0x00, 0x3f, 0x3f, 0x01, 0x2f, 0xc5, 0x31, 0x30, 0x01, 0x11, 0x21, + 0x11, 0x01, 0xf4, 0xfe, 0x0c, 0x03, 0x3e, 0xfc, 0x18, 0x03, 0xe8, 0x00, 0x00, 0x2e, 0x00, 0x00, + 0xff, 0x6e, 0x01, 0xf4, 0x03, 0x3e, 0x00, 0x03, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x0f, 0x00, 0x13, + 0x00, 0x17, 0x00, 0x1b, 0x00, 0x1f, 0x00, 0x23, 0x00, 0x27, 0x00, 0x2b, 0x00, 0x2f, 0x00, 0x33, + 0x00, 0x37, 0x00, 0x3b, 0x00, 0x3f, 0x00, 0x43, 0x00, 0x47, 0x00, 0x4b, 0x00, 0x4f, 0x00, 0x53, + 0x00, 0x57, 0x00, 0x5b, 0x00, 0x5f, 0x00, 0x63, 0x00, 0x67, 0x00, 0x6b, 0x00, 0x6f, 0x00, 0x73, + 0x00, 0x77, 0x00, 0x7b, 0x00, 0x7f, 0x00, 0x83, 0x00, 0x87, 0x00, 0x8b, 0x00, 0x8f, 0x00, 0x93, + 0x00, 0x97, 0x00, 0x9b, 0x00, 0x9f, 0x00, 0xa3, 0x00, 0xa7, 0x00, 0xab, 0x00, 0xaf, 0x00, 0xb3, + 0x00, 0xb7, 0x00, 0x00, 0x11, 0x33, 0x15, 0x23, 0x17, 0x33, 0x15, 0x23, 0x37, 0x33, 0x15, 0x23, + 0x17, 0x33, 0x15, 0x23, 0x07, 0x33, 0x15, 0x23, 0x17, 0x33, 0x15, 0x23, 0x37, 0x33, 0x15, 0x23, + 0x17, 0x33, 0x15, 0x23, 0x07, 0x33, 0x15, 0x23, 0x17, 0x33, 0x15, 0x23, 0x37, 0x33, 0x15, 0x23, + 0x17, 0x33, 0x15, 0x23, 0x07, 0x33, 0x15, 0x23, 0x17, 0x33, 0x15, 0x23, 0x37, 0x33, 0x15, 0x23, + 0x17, 0x33, 0x15, 0x23, 0x07, 0x33, 0x15, 0x23, 0x17, 0x33, 0x15, 0x23, 0x37, 0x33, 0x15, 0x23, + 0x17, 0x33, 0x15, 0x23, 0x07, 0x33, 0x15, 0x23, 0x17, 0x33, 0x15, 0x23, 0x37, 0x33, 0x15, 0x23, + 0x17, 0x33, 0x15, 0x23, 0x07, 0x33, 0x15, 0x23, 0x37, 0x33, 0x15, 0x23, 0x13, 0x33, 0x15, 0x23, + 0x17, 0x33, 0x15, 0x23, 0x37, 0x33, 0x15, 0x23, 0x07, 0x33, 0x15, 0x23, 0x17, 0x33, 0x15, 0x23, + 0x37, 0x33, 0x15, 0x23, 0x07, 0x33, 0x15, 0x23, 0x17, 0x33, 0x15, 0x23, 0x37, 0x33, 0x15, 0x23, + 0x07, 0x33, 0x15, 0x23, 0x17, 0x33, 0x15, 0x23, 0x37, 0x33, 0x15, 0x23, 0x07, 0x33, 0x15, 0x23, + 0x17, 0x33, 0x15, 0x23, 0x37, 0x33, 0x15, 0x23, 0x07, 0x33, 0x15, 0x23, 0x17, 0x33, 0x15, 0x23, + 0x37, 0x33, 0x15, 0x23, 0x07, 0x33, 0x15, 0x23, 0x37, 0x33, 0x15, 0x23, 0x27, 0x27, 0x4e, 0x27, + 0x27, 0x4e, 0x27, 0x27, 0x4e, 0x27, 0x27, 0xea, 0x27, 0x27, 0x4e, 0x27, 0x27, 0x4e, 0x27, 0x27, + 0x4e, 0x27, 0x27, 0xea, 0x27, 0x27, 0x4e, 0x27, 0x27, 0x4e, 0x27, 0x27, 0x4e, 0x27, 0x27, 0xea, + 0x27, 0x27, 0x4e, 0x27, 0x27, 0x4e, 0x27, 0x27, 0x4e, 0x27, 0x27, 0xea, 0x27, 0x27, 0x4e, 0x27, + 0x27, 0x4e, 0x27, 0x27, 0x4e, 0x27, 0x27, 0xea, 0x27, 0x27, 0x4e, 0x27, 0x27, 0x4e, 0x27, 0x27, + 0x4e, 0x27, 0x27, 0xea, 0x27, 0x27, 0x9c, 0x27, 0x27, 0x9c, 0x27, 0x27, 0x4e, 0x27, 0x27, 0x4e, + 0x20, 0x20, 0x9c, 0x27, 0x27, 0x4e, 0x27, 0x27, 0x4e, 0x20, 0x20, 0x9c, 0x27, 0x27, 0x4e, 0x27, + 0x27, 0x4e, 0x20, 0x20, 0x9c, 0x27, 0x27, 0x4e, 0x27, 0x27, 0x4e, 0x20, 0x20, 0x9c, 0x27, 0x27, + 0x4e, 0x27, 0x27, 0x4e, 0x20, 0x20, 0x9c, 0x27, 0x27, 0x4e, 0x27, 0x27, 0x4e, 0x20, 0x20, 0x9c, + 0x27, 0x27, 0x9c, 0x20, 0x20, 0x03, 0x3e, 0x27, 0x27, 0x27, 0x75, 0x27, 0x27, 0x27, 0x27, 0x27, + 0x27, 0x27, 0x75, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x75, 0x27, 0x27, 0x27, 0x28, 0x27, + 0x27, 0x27, 0x75, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x75, 0x27, 0x27, 0x27, 0x27, 0x27, + 0x27, 0x27, 0x75, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x03, 0xd0, 0x27, 0x27, 0x27, 0x75, + 0x27, 0x75, 0x27, 0x27, 0x27, 0x75, 0x27, 0x75, 0x27, 0x27, 0x27, 0x75, 0x27, 0x76, 0x27, 0x27, + 0x27, 0x75, 0x27, 0x75, 0x27, 0x27, 0x27, 0x75, 0x27, 0x75, 0x27, 0x27, 0x27, 0x75, 0x27, 0x75, + 0x27, 0x27, 0x27, 0x00, 0x00, 0x55, 0x00, 0x00, 0xff, 0x6e, 0x01, 0xf4, 0x03, 0x3e, 0x00, 0x03, + 0x00, 0x07, 0x00, 0x0b, 0x00, 0x0f, 0x00, 0x13, 0x00, 0x17, 0x00, 0x1b, 0x00, 0x1f, 0x00, 0x23, + 0x00, 0x27, 0x00, 0x2b, 0x00, 0x2f, 0x00, 0x33, 0x00, 0x37, 0x00, 0x3b, 0x00, 0x3f, 0x00, 0x43, + 0x00, 0x47, 0x00, 0x4b, 0x00, 0x4f, 0x00, 0x53, 0x00, 0x57, 0x00, 0x5b, 0x00, 0x5f, 0x00, 0x63, + 0x00, 0x67, 0x00, 0x6b, 0x00, 0x6f, 0x00, 0x73, 0x00, 0x77, 0x00, 0x7b, 0x00, 0x7f, 0x00, 0x83, + 0x00, 0x87, 0x00, 0x8b, 0x00, 0x8f, 0x00, 0x93, 0x00, 0x97, 0x00, 0x9b, 0x00, 0x9f, 0x00, 0xa3, + 0x00, 0xa7, 0x00, 0xab, 0x00, 0xaf, 0x00, 0xb3, 0x00, 0xb7, 0x00, 0xbb, 0x00, 0xbf, 0x00, 0xc3, + 0x00, 0xc7, 0x00, 0xcb, 0x00, 0xcf, 0x00, 0xd3, 0x00, 0xd7, 0x00, 0xdb, 0x00, 0xdf, 0x00, 0xe3, + 0x00, 0xe7, 0x00, 0xeb, 0x00, 0xef, 0x00, 0xf3, 0x00, 0xf7, 0x00, 0xfb, 0x00, 0xff, 0x01, 0x03, + 0x01, 0x07, 0x01, 0x0b, 0x01, 0x0f, 0x01, 0x13, 0x01, 0x17, 0x01, 0x1b, 0x01, 0x1f, 0x01, 0x23, + 0x01, 0x27, 0x01, 0x2b, 0x01, 0x2f, 0x01, 0x33, 0x01, 0x37, 0x01, 0x3b, 0x01, 0x3f, 0x01, 0x43, + 0x01, 0x47, 0x01, 0x4b, 0x01, 0x4f, 0x01, 0x53, 0x00, 0x00, 0x11, 0x33, 0x15, 0x23, 0x37, 0x33, + 0x15, 0x23, 0x07, 0x33, 0x15, 0x23, 0x37, 0x33, 0x15, 0x23, 0x37, 0x33, 0x15, 0x23, 0x37, 0x33, + 0x15, 0x23, 0x07, 0x33, 0x15, 0x23, 0x37, 0x33, 0x15, 0x23, 0x37, 0x33, 0x15, 0x23, 0x37, 0x33, + 0x15, 0x23, 0x07, 0x33, 0x15, 0x23, 0x37, 0x33, 0x15, 0x23, 0x05, 0x33, 0x15, 0x23, 0x37, 0x33, + 0x15, 0x23, 0x37, 0x33, 0x15, 0x23, 0x37, 0x33, 0x15, 0x23, 0x37, 0x33, 0x15, 0x23, 0x37, 0x33, + 0x15, 0x23, 0x05, 0x33, 0x15, 0x23, 0x37, 0x33, 0x15, 0x23, 0x37, 0x33, 0x15, 0x23, 0x37, 0x33, + 0x15, 0x23, 0x37, 0x33, 0x15, 0x23, 0x37, 0x33, 0x15, 0x23, 0x05, 0x33, 0x15, 0x23, 0x37, 0x33, + 0x15, 0x23, 0x37, 0x33, 0x15, 0x23, 0x37, 0x33, 0x15, 0x23, 0x37, 0x33, 0x15, 0x23, 0x37, 0x33, + 0x15, 0x23, 0x05, 0x33, 0x15, 0x23, 0x37, 0x33, 0x15, 0x23, 0x37, 0x33, 0x15, 0x23, 0x37, 0x33, + 0x15, 0x23, 0x37, 0x33, 0x15, 0x23, 0x37, 0x33, 0x15, 0x23, 0x05, 0x33, 0x15, 0x23, 0x37, 0x33, + 0x15, 0x23, 0x37, 0x33, 0x15, 0x23, 0x37, 0x33, 0x15, 0x23, 0x37, 0x33, 0x15, 0x23, 0x37, 0x33, + 0x15, 0x23, 0x13, 0x33, 0x15, 0x23, 0x05, 0x33, 0x15, 0x23, 0x37, 0x33, 0x15, 0x23, 0x37, 0x33, + 0x15, 0x23, 0x37, 0x33, 0x15, 0x23, 0x37, 0x33, 0x15, 0x23, 0x37, 0x33, 0x15, 0x23, 0x37, 0x33, + 0x15, 0x23, 0x05, 0x33, 0x15, 0x23, 0x37, 0x33, 0x15, 0x23, 0x37, 0x33, 0x15, 0x23, 0x37, 0x33, + 0x15, 0x23, 0x37, 0x33, 0x15, 0x23, 0x37, 0x33, 0x15, 0x23, 0x37, 0x33, 0x15, 0x23, 0x05, 0x33, + 0x15, 0x23, 0x37, 0x33, 0x15, 0x23, 0x37, 0x33, 0x15, 0x23, 0x37, 0x33, 0x15, 0x23, 0x37, 0x33, + 0x15, 0x23, 0x37, 0x33, 0x15, 0x23, 0x37, 0x33, 0x15, 0x23, 0x05, 0x33, 0x15, 0x23, 0x37, 0x33, + 0x15, 0x23, 0x37, 0x33, 0x15, 0x23, 0x37, 0x33, 0x15, 0x23, 0x37, 0x33, 0x15, 0x23, 0x37, 0x33, + 0x15, 0x23, 0x37, 0x33, 0x15, 0x23, 0x05, 0x33, 0x15, 0x23, 0x37, 0x33, 0x15, 0x23, 0x37, 0x33, + 0x15, 0x23, 0x37, 0x33, 0x15, 0x23, 0x37, 0x33, 0x15, 0x23, 0x37, 0x33, 0x15, 0x23, 0x37, 0x33, + 0x15, 0x23, 0x05, 0x33, 0x15, 0x23, 0x37, 0x33, 0x15, 0x23, 0x37, 0x33, 0x15, 0x23, 0x37, 0x33, + 0x15, 0x23, 0x37, 0x33, 0x15, 0x23, 0x37, 0x33, 0x15, 0x23, 0x37, 0x33, 0x15, 0x23, 0x27, 0x27, + 0x4e, 0x27, 0x27, 0x27, 0x27, 0x27, 0x4e, 0x27, 0x27, 0x27, 0x27, 0x27, 0x4e, 0x27, 0x27, 0x27, + 0x27, 0x27, 0x4e, 0x27, 0x27, 0x27, 0x27, 0x27, 0x4e, 0x27, 0x27, 0x27, 0x27, 0x27, 0x4e, 0x27, + 0x27, 0xfe, 0x7a, 0x27, 0x27, 0x4e, 0x27, 0x27, 0x4e, 0x27, 0x27, 0x4e, 0x27, 0x27, 0x4e, 0x27, + 0x27, 0x4e, 0x27, 0x27, 0xfe, 0x7a, 0x27, 0x27, 0x4e, 0x27, 0x27, 0x4e, 0x27, 0x27, 0x4e, 0x27, + 0x27, 0x4e, 0x27, 0x27, 0x4e, 0x27, 0x27, 0xfe, 0x7a, 0x27, 0x27, 0x4e, 0x27, 0x27, 0x4e, 0x27, + 0x27, 0x4e, 0x27, 0x27, 0x4e, 0x27, 0x27, 0x4e, 0x27, 0x27, 0xfe, 0x7a, 0x27, 0x27, 0x4e, 0x27, + 0x27, 0x4e, 0x27, 0x27, 0x4e, 0x27, 0x27, 0x4e, 0x27, 0x27, 0x4e, 0x27, 0x27, 0xfe, 0x7a, 0x27, + 0x27, 0x4e, 0x27, 0x27, 0x4e, 0x27, 0x27, 0x4e, 0x27, 0x27, 0x4e, 0x27, 0x27, 0x4e, 0x27, 0x27, + 0x27, 0x20, 0x20, 0xfe, 0x2c, 0x27, 0x27, 0x4e, 0x27, 0x27, 0x4e, 0x27, 0x27, 0x4e, 0x27, 0x27, + 0x4e, 0x27, 0x27, 0x4e, 0x27, 0x27, 0x4e, 0x20, 0x20, 0xfe, 0x2c, 0x27, 0x27, 0x4e, 0x27, 0x27, + 0x4e, 0x27, 0x27, 0x4e, 0x27, 0x27, 0x4e, 0x27, 0x27, 0x4e, 0x27, 0x27, 0x4e, 0x20, 0x20, 0xfe, + 0x2c, 0x27, 0x27, 0x4e, 0x27, 0x27, 0x4e, 0x27, 0x27, 0x4e, 0x27, 0x27, 0x4e, 0x27, 0x27, 0x4e, + 0x27, 0x27, 0x4e, 0x20, 0x20, 0xfe, 0x2c, 0x27, 0x27, 0x4e, 0x27, 0x27, 0x4e, 0x27, 0x27, 0x4e, + 0x27, 0x27, 0x4e, 0x27, 0x27, 0x4e, 0x27, 0x27, 0x4e, 0x20, 0x20, 0xfe, 0x2c, 0x27, 0x27, 0x4e, + 0x27, 0x27, 0x4e, 0x27, 0x27, 0x4e, 0x27, 0x27, 0x4e, 0x27, 0x27, 0x4e, 0x27, 0x27, 0x4e, 0x20, + 0x20, 0xfe, 0x2c, 0x27, 0x27, 0x4e, 0x27, 0x27, 0x4e, 0x27, 0x27, 0x4e, 0x27, 0x27, 0x4e, 0x27, + 0x27, 0x4e, 0x27, 0x27, 0x4e, 0x20, 0x20, 0x03, 0x3e, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, + 0x75, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x75, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, + 0x75, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x75, 0x27, 0x27, 0x27, + 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x76, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, + 0x27, 0x27, 0x27, 0x27, 0x75, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, + 0x75, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x03, 0x82, 0x27, 0x75, + 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x75, 0x27, 0x27, + 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x76, 0x27, 0x27, 0x27, 0x27, + 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x75, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, + 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x75, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, + 0x27, 0x27, 0x27, 0x27, 0x27, 0x75, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, + 0x27, 0x27, 0x27, 0x00, 0x00, 0x49, 0x00, 0x00, 0xff, 0x56, 0x01, 0xf4, 0x03, 0x3e, 0x00, 0x03, + 0x00, 0x07, 0x00, 0x0b, 0x00, 0x0f, 0x00, 0x13, 0x00, 0x17, 0x00, 0x1b, 0x00, 0x1f, 0x00, 0x23, + 0x00, 0x27, 0x00, 0x2b, 0x00, 0x2f, 0x00, 0x33, 0x00, 0x37, 0x00, 0x3b, 0x00, 0x3f, 0x00, 0x43, + 0x00, 0x47, 0x00, 0x4b, 0x00, 0x4f, 0x00, 0x53, 0x00, 0x57, 0x00, 0x5b, 0x00, 0x5f, 0x00, 0x63, + 0x00, 0x67, 0x00, 0x6b, 0x00, 0x6f, 0x00, 0x73, 0x00, 0x77, 0x00, 0x7b, 0x00, 0x7f, 0x00, 0x83, + 0x00, 0x87, 0x00, 0x8b, 0x00, 0x8f, 0x00, 0x93, 0x00, 0x97, 0x00, 0x9b, 0x00, 0x9f, 0x00, 0xa3, + 0x00, 0xa7, 0x00, 0xab, 0x00, 0xaf, 0x00, 0xb3, 0x00, 0xb7, 0x00, 0xbb, 0x00, 0xbf, 0x00, 0xc3, + 0x00, 0xc7, 0x00, 0xcb, 0x00, 0xcf, 0x00, 0xd3, 0x00, 0xd7, 0x00, 0xdb, 0x00, 0xdf, 0x00, 0xe3, + 0x00, 0xe7, 0x00, 0xeb, 0x00, 0xef, 0x00, 0xf3, 0x00, 0xf7, 0x00, 0xfb, 0x00, 0xff, 0x01, 0x03, + 0x01, 0x07, 0x01, 0x0b, 0x01, 0x0f, 0x01, 0x13, 0x01, 0x17, 0x01, 0x1b, 0x01, 0x1f, 0x01, 0x3b, + 0x00, 0x00, 0x13, 0x33, 0x35, 0x23, 0x17, 0x33, 0x35, 0x23, 0x07, 0x33, 0x35, 0x23, 0x17, 0x33, + 0x35, 0x23, 0x37, 0x33, 0x35, 0x23, 0x17, 0x33, 0x35, 0x23, 0x07, 0x33, 0x35, 0x23, 0x17, 0x33, + 0x35, 0x23, 0x37, 0x33, 0x35, 0x23, 0x17, 0x33, 0x35, 0x23, 0x07, 0x33, 0x35, 0x23, 0x17, 0x33, + 0x35, 0x23, 0x05, 0x33, 0x35, 0x23, 0x17, 0x33, 0x35, 0x23, 0x07, 0x33, 0x35, 0x23, 0x17, 0x33, + 0x35, 0x23, 0x37, 0x33, 0x35, 0x23, 0x17, 0x33, 0x35, 0x23, 0x07, 0x33, 0x35, 0x23, 0x17, 0x33, + 0x35, 0x23, 0x37, 0x33, 0x35, 0x23, 0x17, 0x33, 0x35, 0x23, 0x07, 0x33, 0x35, 0x23, 0x17, 0x33, + 0x35, 0x23, 0x05, 0x33, 0x35, 0x23, 0x17, 0x33, 0x35, 0x23, 0x07, 0x33, 0x35, 0x23, 0x17, 0x33, + 0x35, 0x23, 0x37, 0x33, 0x35, 0x23, 0x17, 0x33, 0x35, 0x23, 0x07, 0x33, 0x35, 0x23, 0x17, 0x33, + 0x35, 0x23, 0x37, 0x33, 0x35, 0x23, 0x17, 0x33, 0x35, 0x23, 0x07, 0x33, 0x35, 0x23, 0x17, 0x33, + 0x35, 0x23, 0x05, 0x33, 0x35, 0x23, 0x17, 0x33, 0x35, 0x23, 0x07, 0x33, 0x35, 0x23, 0x17, 0x33, + 0x35, 0x23, 0x37, 0x33, 0x35, 0x23, 0x17, 0x33, 0x35, 0x23, 0x07, 0x33, 0x35, 0x23, 0x17, 0x33, + 0x35, 0x23, 0x37, 0x33, 0x35, 0x23, 0x17, 0x33, 0x35, 0x23, 0x07, 0x33, 0x35, 0x23, 0x17, 0x33, + 0x35, 0x23, 0x05, 0x33, 0x35, 0x23, 0x17, 0x33, 0x35, 0x23, 0x07, 0x33, 0x35, 0x23, 0x17, 0x33, + 0x35, 0x23, 0x37, 0x33, 0x35, 0x23, 0x17, 0x33, 0x35, 0x23, 0x07, 0x33, 0x35, 0x23, 0x17, 0x33, + 0x35, 0x23, 0x37, 0x33, 0x35, 0x23, 0x17, 0x33, 0x35, 0x23, 0x07, 0x33, 0x35, 0x23, 0x17, 0x33, + 0x35, 0x23, 0x05, 0x33, 0x35, 0x23, 0x17, 0x33, 0x35, 0x23, 0x07, 0x33, 0x35, 0x23, 0x17, 0x33, + 0x35, 0x23, 0x37, 0x33, 0x35, 0x23, 0x17, 0x33, 0x35, 0x23, 0x07, 0x33, 0x35, 0x23, 0x17, 0x33, + 0x35, 0x23, 0x37, 0x33, 0x35, 0x23, 0x17, 0x33, 0x35, 0x23, 0x07, 0x33, 0x35, 0x23, 0x17, 0x33, + 0x35, 0x23, 0x13, 0x11, 0x23, 0x35, 0x23, 0x15, 0x23, 0x35, 0x23, 0x15, 0x23, 0x35, 0x23, 0x15, + 0x23, 0x35, 0x23, 0x15, 0x23, 0x35, 0x23, 0x15, 0x23, 0x35, 0x23, 0x15, 0x23, 0x11, 0x27, 0x27, + 0x27, 0x4e, 0x27, 0x27, 0x4e, 0x27, 0x27, 0x4e, 0x27, 0x27, 0x4e, 0x27, 0x27, 0x4e, 0x27, 0x27, + 0x4e, 0x27, 0x27, 0x4e, 0x27, 0x27, 0x4e, 0x27, 0x27, 0x4e, 0x27, 0x27, 0x4e, 0x27, 0x27, 0x4e, + 0x27, 0x27, 0xfe, 0x7a, 0x27, 0x27, 0x4e, 0x27, 0x27, 0x4e, 0x27, 0x27, 0x4e, 0x27, 0x27, 0x4e, + 0x27, 0x27, 0x4e, 0x27, 0x27, 0x4e, 0x27, 0x27, 0x4e, 0x27, 0x27, 0x4e, 0x27, 0x27, 0x4e, 0x27, + 0x27, 0x4e, 0x27, 0x27, 0x4e, 0x27, 0x27, 0xfe, 0x7a, 0x27, 0x27, 0x4e, 0x27, 0x27, 0x4e, 0x27, + 0x27, 0x4e, 0x27, 0x27, 0x4e, 0x27, 0x27, 0x4e, 0x27, 0x27, 0x4e, 0x27, 0x27, 0x4e, 0x27, 0x27, + 0x4e, 0x27, 0x27, 0x4e, 0x27, 0x27, 0x4e, 0x27, 0x27, 0x4e, 0x27, 0x27, 0xfe, 0x7a, 0x27, 0x27, + 0x4e, 0x27, 0x27, 0x4e, 0x27, 0x27, 0x4e, 0x27, 0x27, 0x4e, 0x27, 0x27, 0x4e, 0x27, 0x27, 0x4e, + 0x27, 0x27, 0x4e, 0x27, 0x27, 0x4e, 0x27, 0x27, 0x4e, 0x27, 0x27, 0x4e, 0x27, 0x27, 0x4e, 0x27, + 0x27, 0xfe, 0x7a, 0x27, 0x27, 0x4e, 0x27, 0x27, 0x4e, 0x27, 0x27, 0x4e, 0x27, 0x27, 0x4e, 0x27, + 0x27, 0x4e, 0x27, 0x27, 0x4e, 0x27, 0x27, 0x4e, 0x27, 0x27, 0x4e, 0x27, 0x27, 0x4e, 0x27, 0x27, + 0x4e, 0x27, 0x27, 0x4e, 0x27, 0x27, 0xfe, 0x7a, 0x27, 0x27, 0x4e, 0x27, 0x27, 0x4e, 0x27, 0x27, + 0x4e, 0x27, 0x27, 0x4e, 0x27, 0x27, 0x4e, 0x27, 0x27, 0x4e, 0x27, 0x27, 0x4e, 0x27, 0x27, 0x4e, + 0x27, 0x27, 0x4e, 0x27, 0x27, 0x4e, 0x27, 0x27, 0x4e, 0x27, 0x27, 0x47, 0x20, 0x27, 0x27, 0x27, + 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x02, 0xf0, 0x27, 0x27, 0x27, 0x75, 0x27, + 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x75, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x75, 0x27, + 0x27, 0x27, 0x75, 0x27, 0x27, 0x27, 0x75, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x75, 0x27, + 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x75, 0x27, 0x27, 0x27, 0x75, 0x27, 0x27, 0x27, 0x76, 0x28, + 0x28, 0x28, 0x27, 0x27, 0x27, 0x27, 0x76, 0x28, 0x28, 0x28, 0x27, 0x27, 0x27, 0x27, 0x76, 0x28, + 0x28, 0x28, 0x76, 0x27, 0x27, 0x27, 0x75, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x75, 0x27, + 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x75, 0x27, 0x27, 0x27, 0x75, 0x27, 0x27, 0x27, 0x75, 0x27, + 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x75, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x75, 0x27, + 0x27, 0x27, 0x75, 0x27, 0x27, 0x27, 0x75, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x75, 0x27, + 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x75, 0x27, 0x27, 0x27, 0x03, 0x82, 0xfc, 0x18, 0x18, 0x18, + 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x03, 0xe8, 0x00, 0x01, 0x00, 0x00, + 0xff, 0x56, 0x01, 0xf4, 0x03, 0x3e, 0x00, 0x13, 0x00, 0x57, 0x40, 0x36, 0x06, 0x80, 0x11, 0x90, + 0x11, 0x02, 0x11, 0x45, 0x00, 0x3f, 0x03, 0xbf, 0x03, 0x02, 0x03, 0x02, 0x15, 0x07, 0x8f, 0x10, + 0x9f, 0x10, 0x02, 0x10, 0x45, 0x0a, 0x30, 0x0d, 0xb0, 0x0d, 0x02, 0x0d, 0x0b, 0x14, 0x13, 0x86, + 0x0a, 0x03, 0x80, 0x07, 0x90, 0x07, 0x02, 0x07, 0x49, 0x0d, 0x00, 0x10, 0x0f, 0x86, 0x08, 0x92, + 0x04, 0x92, 0x00, 0x3f, 0x3f, 0x3f, 0xd5, 0x32, 0x32, 0xed, 0x5d, 0x32, 0x32, 0x3f, 0x01, 0x10, + 0xd0, 0xd5, 0x5d, 0x32, 0xed, 0x5d, 0x32, 0x10, 0xd0, 0xd5, 0x5d, 0x32, 0xed, 0x5d, 0x32, 0x31, + 0x30, 0x01, 0x33, 0x15, 0x23, 0x11, 0x23, 0x11, 0x23, 0x11, 0x23, 0x11, 0x23, 0x35, 0x33, 0x11, + 0x33, 0x11, 0x33, 0x11, 0x33, 0x01, 0x72, 0x82, 0x82, 0x50, 0x50, 0x50, 0x82, 0x82, 0x50, 0x50, + 0x50, 0x01, 0x72, 0x50, 0xfe, 0x34, 0x01, 0xcc, 0xfe, 0x34, 0x01, 0xcc, 0x50, 0x01, 0xcc, 0xfe, + 0x34, 0x01, 0xcc, 0x00, 0x00, 0x01, 0x00, 0x00, 0xff, 0x56, 0x01, 0xf4, 0x03, 0x3e, 0x00, 0x13, + 0x00, 0x31, 0x40, 0x18, 0x13, 0x0f, 0x01, 0x02, 0x45, 0x0c, 0x08, 0x05, 0x06, 0x14, 0x05, 0x02, + 0x49, 0x08, 0x13, 0x09, 0x12, 0x49, 0x0c, 0x0f, 0x0e, 0x86, 0x03, 0x92, 0x00, 0x3f, 0x3f, 0xd5, + 0x32, 0xfd, 0x32, 0xd6, 0x32, 0xed, 0x32, 0x01, 0x10, 0xd0, 0xd5, 0x32, 0x32, 0xfd, 0xc5, 0x33, + 0x33, 0x31, 0x30, 0x01, 0x15, 0x23, 0x11, 0x23, 0x11, 0x23, 0x35, 0x33, 0x35, 0x23, 0x35, 0x33, + 0x11, 0x33, 0x11, 0x33, 0x15, 0x23, 0x15, 0x01, 0xf4, 0xd2, 0x50, 0xd2, 0xd2, 0xd2, 0xd2, 0x50, + 0xd2, 0xd2, 0x01, 0x22, 0x50, 0xfe, 0x84, 0x01, 0x7c, 0x50, 0x50, 0x50, 0x01, 0x7c, 0xfe, 0x84, + 0x50, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x01, 0x6e, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x49, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0b, + 0x00, 0x49, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x04, 0x00, 0x54, 0x00, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x1d, 0x00, 0x58, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x04, 0x00, 0x10, 0x00, 0x75, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x0c, + 0x00, 0x85, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x0f, 0x00, 0x91, 0x00, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x40, 0x00, 0xa0, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x08, 0x00, 0x0f, 0x00, 0xe0, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0f, + 0x00, 0xe0, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x1a, 0x00, 0xef, 0x00, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x1a, 0x00, 0xef, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x10, 0x00, 0x0b, 0x00, 0x49, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x04, + 0x00, 0x54, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x10, 0x00, 0x75, 0x00, 0x03, + 0x00, 0x01, 0x04, 0x09, 0x00, 0x00, 0x00, 0x92, 0x01, 0x09, 0x00, 0x03, 0x00, 0x01, 0x04, 0x09, + 0x00, 0x01, 0x00, 0x16, 0x01, 0x9b, 0x00, 0x03, 0x00, 0x01, 0x04, 0x09, 0x00, 0x02, 0x00, 0x08, + 0x01, 0xb1, 0x00, 0x03, 0x00, 0x01, 0x04, 0x09, 0x00, 0x03, 0x00, 0x3a, 0x01, 0xb9, 0x00, 0x03, + 0x00, 0x01, 0x04, 0x09, 0x00, 0x04, 0x00, 0x20, 0x01, 0xf3, 0x00, 0x03, 0x00, 0x01, 0x04, 0x09, + 0x00, 0x05, 0x00, 0x18, 0x02, 0x13, 0x00, 0x03, 0x00, 0x01, 0x04, 0x09, 0x00, 0x06, 0x00, 0x1e, + 0x02, 0x2b, 0x00, 0x03, 0x00, 0x01, 0x04, 0x09, 0x00, 0x07, 0x00, 0x80, 0x02, 0x49, 0x00, 0x03, + 0x00, 0x01, 0x04, 0x09, 0x00, 0x08, 0x00, 0x1e, 0x02, 0xc9, 0x00, 0x03, 0x00, 0x01, 0x04, 0x09, + 0x00, 0x09, 0x00, 0x1e, 0x02, 0xc9, 0x00, 0x03, 0x00, 0x01, 0x04, 0x09, 0x00, 0x0b, 0x00, 0x34, + 0x02, 0xe7, 0x00, 0x03, 0x00, 0x01, 0x04, 0x09, 0x00, 0x0c, 0x00, 0x34, 0x02, 0xe7, 0x00, 0x03, + 0x00, 0x01, 0x04, 0x09, 0x00, 0x10, 0x00, 0x16, 0x01, 0x9b, 0x00, 0x03, 0x00, 0x01, 0x04, 0x09, + 0x00, 0x11, 0x00, 0x08, 0x01, 0xb1, 0x00, 0x03, 0x00, 0x01, 0x04, 0x09, 0x00, 0x12, 0x00, 0x20, + 0x01, 0xf3, 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x32, 0x30, 0x31, 0x31, + 0x20, 0x43, 0x61, 0x6e, 0x6f, 0x6e, 0x69, 0x63, 0x61, 0x6c, 0x20, 0x4c, 0x74, 0x64, 0x2e, 0x20, + 0x20, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x64, 0x20, 0x75, 0x6e, 0x64, 0x65, 0x72, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x55, 0x62, 0x75, 0x6e, 0x74, 0x75, 0x20, 0x46, 0x6f, 0x6e, 0x74, 0x20, + 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x63, 0x65, 0x20, 0x31, 0x2e, 0x30, 0x55, 0x62, 0x75, 0x6e, 0x74, + 0x75, 0x20, 0x4d, 0x6f, 0x6e, 0x6f, 0x42, 0x6f, 0x6c, 0x64, 0x55, 0x62, 0x75, 0x6e, 0x74, 0x75, + 0x20, 0x4d, 0x6f, 0x6e, 0x6f, 0x20, 0x42, 0x6f, 0x6c, 0x64, 0x20, 0x56, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x20, 0x30, 0x2e, 0x38, 0x30, 0x55, 0x62, 0x75, 0x6e, 0x74, 0x75, 0x20, 0x4d, 0x6f, + 0x6e, 0x6f, 0x20, 0x42, 0x6f, 0x6c, 0x64, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x30, + 0x2e, 0x38, 0x30, 0x55, 0x62, 0x75, 0x6e, 0x74, 0x75, 0x4d, 0x6f, 0x6e, 0x6f, 0x2d, 0x42, 0x6f, + 0x6c, 0x64, 0x55, 0x62, 0x75, 0x6e, 0x74, 0x75, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x43, 0x61, 0x6e, + 0x6f, 0x6e, 0x69, 0x63, 0x61, 0x6c, 0x20, 0x61, 0x72, 0x65, 0x20, 0x72, 0x65, 0x67, 0x69, 0x73, + 0x74, 0x65, 0x72, 0x65, 0x64, 0x20, 0x74, 0x72, 0x61, 0x64, 0x65, 0x6d, 0x61, 0x72, 0x6b, 0x73, + 0x20, 0x6f, 0x66, 0x20, 0x43, 0x61, 0x6e, 0x6f, 0x6e, 0x69, 0x63, 0x61, 0x6c, 0x20, 0x4c, 0x74, + 0x64, 0x2e, 0x44, 0x61, 0x6c, 0x74, 0x6f, 0x6e, 0x20, 0x4d, 0x61, 0x61, 0x67, 0x20, 0x4c, 0x74, + 0x64, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x64, 0x61, 0x6c, 0x74, + 0x6f, 0x6e, 0x6d, 0x61, 0x61, 0x67, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x00, 0x43, 0x00, 0x6f, 0x00, + 0x70, 0x00, 0x79, 0x00, 0x72, 0x00, 0x69, 0x00, 0x67, 0x00, 0x68, 0x00, 0x74, 0x00, 0x20, 0x00, + 0x32, 0x00, 0x30, 0x00, 0x31, 0x00, 0x31, 0x00, 0x20, 0x00, 0x43, 0x00, 0x61, 0x00, 0x6e, 0x00, + 0x6f, 0x00, 0x6e, 0x00, 0x69, 0x00, 0x63, 0x00, 0x61, 0x00, 0x6c, 0x00, 0x20, 0x00, 0x4c, 0x00, + 0x74, 0x00, 0x64, 0x00, 0x2e, 0x00, 0x20, 0x00, 0x20, 0x00, 0x4c, 0x00, 0x69, 0x00, 0x63, 0x00, + 0x65, 0x00, 0x6e, 0x00, 0x73, 0x00, 0x65, 0x00, 0x64, 0x00, 0x20, 0x00, 0x75, 0x00, 0x6e, 0x00, + 0x64, 0x00, 0x65, 0x00, 0x72, 0x00, 0x20, 0x00, 0x74, 0x00, 0x68, 0x00, 0x65, 0x00, 0x20, 0x00, + 0x55, 0x00, 0x62, 0x00, 0x75, 0x00, 0x6e, 0x00, 0x74, 0x00, 0x75, 0x00, 0x20, 0x00, 0x46, 0x00, + 0x6f, 0x00, 0x6e, 0x00, 0x74, 0x00, 0x20, 0x00, 0x4c, 0x00, 0x69, 0x00, 0x63, 0x00, 0x65, 0x00, + 0x6e, 0x00, 0x63, 0x00, 0x65, 0x00, 0x20, 0x00, 0x31, 0x00, 0x2e, 0x00, 0x30, 0x00, 0x55, 0x00, + 0x62, 0x00, 0x75, 0x00, 0x6e, 0x00, 0x74, 0x00, 0x75, 0x00, 0x20, 0x00, 0x4d, 0x00, 0x6f, 0x00, + 0x6e, 0x00, 0x6f, 0x00, 0x42, 0x00, 0x6f, 0x00, 0x6c, 0x00, 0x64, 0x00, 0x55, 0x00, 0x62, 0x00, + 0x75, 0x00, 0x6e, 0x00, 0x74, 0x00, 0x75, 0x00, 0x20, 0x00, 0x4d, 0x00, 0x6f, 0x00, 0x6e, 0x00, + 0x6f, 0x00, 0x20, 0x00, 0x42, 0x00, 0x6f, 0x00, 0x6c, 0x00, 0x64, 0x00, 0x20, 0x00, 0x56, 0x00, + 0x65, 0x00, 0x72, 0x00, 0x73, 0x00, 0x69, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x20, 0x00, 0x30, 0x00, + 0x2e, 0x00, 0x38, 0x00, 0x30, 0x00, 0x55, 0x00, 0x62, 0x00, 0x75, 0x00, 0x6e, 0x00, 0x74, 0x00, + 0x75, 0x00, 0x20, 0x00, 0x4d, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x6f, 0x00, 0x20, 0x00, 0x42, 0x00, + 0x6f, 0x00, 0x6c, 0x00, 0x64, 0x00, 0x56, 0x00, 0x65, 0x00, 0x72, 0x00, 0x73, 0x00, 0x69, 0x00, + 0x6f, 0x00, 0x6e, 0x00, 0x20, 0x00, 0x30, 0x00, 0x2e, 0x00, 0x38, 0x00, 0x30, 0x00, 0x55, 0x00, + 0x62, 0x00, 0x75, 0x00, 0x6e, 0x00, 0x74, 0x00, 0x75, 0x00, 0x4d, 0x00, 0x6f, 0x00, 0x6e, 0x00, + 0x6f, 0x00, 0x2d, 0x00, 0x42, 0x00, 0x6f, 0x00, 0x6c, 0x00, 0x64, 0x00, 0x55, 0x00, 0x62, 0x00, + 0x75, 0x00, 0x6e, 0x00, 0x74, 0x00, 0x75, 0x00, 0x20, 0x00, 0x61, 0x00, 0x6e, 0x00, 0x64, 0x00, + 0x20, 0x00, 0x43, 0x00, 0x61, 0x00, 0x6e, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x69, 0x00, 0x63, 0x00, + 0x61, 0x00, 0x6c, 0x00, 0x20, 0x00, 0x61, 0x00, 0x72, 0x00, 0x65, 0x00, 0x20, 0x00, 0x72, 0x00, + 0x65, 0x00, 0x67, 0x00, 0x69, 0x00, 0x73, 0x00, 0x74, 0x00, 0x65, 0x00, 0x72, 0x00, 0x65, 0x00, + 0x64, 0x00, 0x20, 0x00, 0x74, 0x00, 0x72, 0x00, 0x61, 0x00, 0x64, 0x00, 0x65, 0x00, 0x6d, 0x00, + 0x61, 0x00, 0x72, 0x00, 0x6b, 0x00, 0x73, 0x00, 0x20, 0x00, 0x6f, 0x00, 0x66, 0x00, 0x20, 0x00, + 0x43, 0x00, 0x61, 0x00, 0x6e, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x69, 0x00, 0x63, 0x00, 0x61, 0x00, + 0x6c, 0x00, 0x20, 0x00, 0x4c, 0x00, 0x74, 0x00, 0x64, 0x00, 0x2e, 0x00, 0x44, 0x00, 0x61, 0x00, + 0x6c, 0x00, 0x74, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x20, 0x00, 0x4d, 0x00, 0x61, 0x00, 0x61, 0x00, + 0x67, 0x00, 0x20, 0x00, 0x4c, 0x00, 0x74, 0x00, 0x64, 0x00, 0x68, 0x00, 0x74, 0x00, 0x74, 0x00, + 0x70, 0x00, 0x3a, 0x00, 0x2f, 0x00, 0x2f, 0x00, 0x77, 0x00, 0x77, 0x00, 0x77, 0x00, 0x2e, 0x00, + 0x64, 0x00, 0x61, 0x00, 0x6c, 0x00, 0x74, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x6d, 0x00, 0x61, 0x00, + 0x61, 0x00, 0x67, 0x00, 0x2e, 0x00, 0x63, 0x00, 0x6f, 0x00, 0x6d, 0x00, 0x2f, 0x00, 0x00, 0x00, + 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x85, 0x00, 0x14, 0x00, 0x00, 0x00, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x05, 0x10, 0x00, 0x00, 0x01, 0x02, 0x00, 0x02, 0x00, 0x03, 0x00, 0x04, 0x00, 0x05, 0x00, 0x06, + 0x00, 0x07, 0x00, 0x08, 0x00, 0x09, 0x00, 0x0a, 0x00, 0x0b, 0x00, 0x0c, 0x00, 0x0d, 0x00, 0x0e, + 0x00, 0x0f, 0x00, 0x10, 0x00, 0x11, 0x00, 0x12, 0x00, 0x13, 0x00, 0x14, 0x00, 0x15, 0x00, 0x16, + 0x00, 0x17, 0x00, 0x18, 0x00, 0x19, 0x00, 0x1a, 0x00, 0x1b, 0x00, 0x1c, 0x00, 0x1d, 0x00, 0x1e, + 0x00, 0x1f, 0x00, 0x20, 0x00, 0x21, 0x00, 0x22, 0x00, 0x23, 0x00, 0x24, 0x00, 0x25, 0x00, 0x26, + 0x00, 0x27, 0x00, 0x28, 0x00, 0x29, 0x00, 0x2a, 0x00, 0x2b, 0x00, 0x2c, 0x00, 0x2d, 0x00, 0x2e, + 0x00, 0x2f, 0x00, 0x30, 0x00, 0x31, 0x00, 0x32, 0x00, 0x33, 0x00, 0x34, 0x00, 0x35, 0x00, 0x36, + 0x00, 0x37, 0x00, 0x38, 0x00, 0x39, 0x00, 0x3a, 0x00, 0x3b, 0x00, 0x3c, 0x00, 0x3d, 0x00, 0x3e, + 0x00, 0x3f, 0x00, 0x40, 0x00, 0x41, 0x00, 0x42, 0x00, 0x43, 0x00, 0x44, 0x00, 0x45, 0x00, 0x46, + 0x00, 0x47, 0x00, 0x48, 0x00, 0x49, 0x00, 0x4a, 0x00, 0x4b, 0x00, 0x4c, 0x00, 0x4d, 0x00, 0x4e, + 0x00, 0x4f, 0x00, 0x50, 0x00, 0x51, 0x00, 0x52, 0x00, 0x53, 0x00, 0x54, 0x00, 0x55, 0x00, 0x56, + 0x00, 0x57, 0x00, 0x58, 0x00, 0x59, 0x00, 0x5a, 0x00, 0x5b, 0x00, 0x5c, 0x00, 0x5d, 0x00, 0x5e, + 0x00, 0x5f, 0x00, 0x60, 0x00, 0x61, 0x01, 0x03, 0x00, 0xc4, 0x00, 0xa6, 0x00, 0xc5, 0x00, 0xab, + 0x00, 0x82, 0x00, 0xc2, 0x00, 0xd8, 0x00, 0xc6, 0x00, 0xe4, 0x00, 0xbe, 0x00, 0xb0, 0x00, 0xb6, + 0x00, 0xb7, 0x00, 0xb4, 0x00, 0xb5, 0x00, 0x87, 0x00, 0xb2, 0x00, 0xb3, 0x00, 0xd9, 0x00, 0x8c, + 0x00, 0xe5, 0x00, 0xbf, 0x00, 0xb1, 0x00, 0xbb, 0x01, 0x04, 0x00, 0xa3, 0x00, 0x84, 0x00, 0x85, + 0x00, 0xbd, 0x00, 0x96, 0x00, 0xe8, 0x00, 0x86, 0x00, 0x8e, 0x00, 0x8b, 0x00, 0x9d, 0x00, 0xa9, + 0x00, 0xa4, 0x01, 0x05, 0x00, 0x8a, 0x01, 0x06, 0x00, 0x83, 0x00, 0x93, 0x00, 0xf2, 0x00, 0xf3, + 0x00, 0x8d, 0x00, 0x97, 0x00, 0x88, 0x01, 0x07, 0x00, 0xde, 0x00, 0xf1, 0x00, 0x9e, 0x00, 0xaa, + 0x00, 0xf5, 0x00, 0xf4, 0x00, 0xf6, 0x00, 0xa2, 0x00, 0xad, 0x00, 0xc9, 0x00, 0xc7, 0x00, 0xae, + 0x00, 0x62, 0x00, 0x63, 0x00, 0x90, 0x00, 0x64, 0x00, 0xcb, 0x00, 0x65, 0x00, 0xc8, 0x00, 0xca, + 0x00, 0xcf, 0x00, 0xcc, 0x00, 0xcd, 0x00, 0xce, 0x00, 0xe9, 0x00, 0x66, 0x00, 0xd3, 0x00, 0xd0, + 0x00, 0xd1, 0x00, 0xaf, 0x00, 0x67, 0x00, 0xf0, 0x00, 0x91, 0x00, 0xd6, 0x00, 0xd4, 0x00, 0xd5, + 0x00, 0x68, 0x00, 0xeb, 0x00, 0xed, 0x00, 0x89, 0x00, 0x6a, 0x00, 0x69, 0x00, 0x6b, 0x00, 0x6d, + 0x00, 0x6c, 0x00, 0x6e, 0x00, 0xa0, 0x00, 0x6f, 0x00, 0x71, 0x00, 0x70, 0x00, 0x72, 0x00, 0x73, + 0x00, 0x75, 0x00, 0x74, 0x00, 0x76, 0x00, 0x77, 0x00, 0xea, 0x00, 0x78, 0x00, 0x7a, 0x00, 0x79, + 0x00, 0x7b, 0x00, 0x7d, 0x00, 0x7c, 0x00, 0xb8, 0x00, 0xa1, 0x00, 0x7f, 0x00, 0x7e, 0x00, 0x80, + 0x00, 0x81, 0x00, 0xec, 0x00, 0xee, 0x00, 0xba, 0x01, 0x08, 0x01, 0x09, 0x01, 0x0a, 0x01, 0x0b, + 0x01, 0x0c, 0x01, 0x0d, 0x00, 0xfd, 0x00, 0xfe, 0x01, 0x0e, 0x01, 0x0f, 0x01, 0x10, 0x01, 0x11, + 0x00, 0xff, 0x01, 0x00, 0x01, 0x12, 0x01, 0x13, 0x01, 0x14, 0x01, 0x15, 0x01, 0x16, 0x01, 0x17, + 0x01, 0x18, 0x01, 0x19, 0x01, 0x1a, 0x01, 0x1b, 0x01, 0x1c, 0x01, 0x1d, 0x01, 0x1e, 0x01, 0x1f, + 0x01, 0x20, 0x01, 0x21, 0x00, 0xf8, 0x00, 0xf9, 0x01, 0x22, 0x01, 0x23, 0x01, 0x24, 0x01, 0x25, + 0x01, 0x26, 0x01, 0x27, 0x01, 0x28, 0x01, 0x29, 0x01, 0x2a, 0x01, 0x2b, 0x01, 0x2c, 0x01, 0x2d, + 0x01, 0x2e, 0x01, 0x2f, 0x01, 0x30, 0x01, 0x31, 0x01, 0x32, 0x00, 0xd7, 0x01, 0x33, 0x01, 0x34, + 0x01, 0x35, 0x01, 0x36, 0x01, 0x37, 0x01, 0x38, 0x01, 0x39, 0x01, 0x3a, 0x01, 0x3b, 0x01, 0x3c, + 0x01, 0x3d, 0x01, 0x3e, 0x01, 0x3f, 0x01, 0x40, 0x01, 0x41, 0x01, 0x42, 0x01, 0x43, 0x00, 0xe2, + 0x00, 0xe3, 0x01, 0x44, 0x01, 0x45, 0x01, 0x46, 0x01, 0x47, 0x01, 0x48, 0x01, 0x49, 0x01, 0x4a, + 0x01, 0x4b, 0x01, 0x4c, 0x01, 0x4d, 0x01, 0x4e, 0x01, 0x4f, 0x01, 0x50, 0x01, 0x51, 0x01, 0x52, + 0x01, 0x53, 0x01, 0x54, 0x01, 0x55, 0x01, 0x56, 0x01, 0x57, 0x01, 0x58, 0x01, 0x59, 0x01, 0x5a, + 0x01, 0x5b, 0x01, 0x5c, 0x01, 0x5d, 0x00, 0xfb, 0x00, 0xfc, 0x01, 0x5e, 0x01, 0x5f, 0x01, 0x60, + 0x01, 0x61, 0x01, 0x62, 0x01, 0x63, 0x01, 0x64, 0x01, 0x65, 0x01, 0x66, 0x01, 0x67, 0x01, 0x68, + 0x01, 0x69, 0x01, 0x6a, 0x01, 0x6b, 0x01, 0x6c, 0x01, 0x6d, 0x01, 0x6e, 0x01, 0x6f, 0x01, 0x70, + 0x01, 0x71, 0x01, 0x72, 0x01, 0x73, 0x01, 0x74, 0x01, 0x75, 0x01, 0x76, 0x01, 0x77, 0x00, 0xe6, + 0x00, 0xe7, 0x01, 0x78, 0x01, 0x79, 0x01, 0x7a, 0x01, 0x7b, 0x01, 0x7c, 0x01, 0x7d, 0x01, 0x7e, + 0x00, 0xe1, 0x01, 0x7f, 0x00, 0xdb, 0x00, 0xdc, 0x00, 0xdd, 0x00, 0xe0, 0x00, 0xdf, 0x01, 0x80, + 0x01, 0x81, 0x01, 0x82, 0x01, 0x83, 0x01, 0x84, 0x01, 0x85, 0x01, 0x86, 0x01, 0x87, 0x00, 0xbc, + 0x01, 0x88, 0x01, 0x89, 0x01, 0x8a, 0x01, 0x8b, 0x01, 0x8c, 0x01, 0x8d, 0x01, 0x8e, 0x01, 0x8f, + 0x01, 0x90, 0x01, 0x91, 0x01, 0x92, 0x01, 0x93, 0x01, 0x94, 0x01, 0x95, 0x01, 0x96, 0x01, 0x97, + 0x01, 0x98, 0x01, 0x99, 0x01, 0x9a, 0x01, 0x9b, 0x01, 0x9c, 0x01, 0x9d, 0x01, 0x9e, 0x01, 0x9f, + 0x01, 0xa0, 0x01, 0xa1, 0x01, 0xa2, 0x01, 0xa3, 0x01, 0xa4, 0x01, 0xa5, 0x01, 0xa6, 0x01, 0xa7, + 0x01, 0xa8, 0x01, 0xa9, 0x01, 0xaa, 0x01, 0xab, 0x01, 0xac, 0x01, 0xad, 0x01, 0xae, 0x01, 0xaf, + 0x01, 0xb0, 0x01, 0xb1, 0x01, 0xb2, 0x00, 0x98, 0x01, 0xb3, 0x00, 0x9a, 0x00, 0x99, 0x01, 0xb4, + 0x00, 0xef, 0x01, 0xb5, 0x01, 0xb6, 0x00, 0xa5, 0x00, 0x92, 0x00, 0x9c, 0x00, 0xa7, 0x00, 0x8f, + 0x00, 0x94, 0x00, 0x95, 0x00, 0xb9, 0x00, 0xc0, 0x01, 0xb7, 0x00, 0xc1, 0x01, 0xb8, 0x01, 0xb9, + 0x01, 0xba, 0x01, 0xbb, 0x01, 0xbc, 0x01, 0xbd, 0x01, 0xbe, 0x01, 0xbf, 0x01, 0xc0, 0x01, 0xc1, + 0x01, 0xc2, 0x01, 0xc3, 0x01, 0xc4, 0x01, 0xc5, 0x01, 0xc6, 0x01, 0xc7, 0x01, 0xc8, 0x01, 0xc9, + 0x01, 0xca, 0x01, 0xcb, 0x01, 0xcc, 0x01, 0xcd, 0x01, 0xce, 0x01, 0xcf, 0x01, 0xd0, 0x01, 0xd1, + 0x01, 0xd2, 0x01, 0xd3, 0x01, 0xd4, 0x01, 0xd5, 0x01, 0xd6, 0x01, 0xd7, 0x01, 0xd8, 0x01, 0xd9, + 0x01, 0xda, 0x01, 0xdb, 0x01, 0xdc, 0x01, 0xdd, 0x01, 0xde, 0x01, 0xdf, 0x01, 0xe0, 0x01, 0xe1, + 0x01, 0xe2, 0x01, 0xe3, 0x01, 0xe4, 0x01, 0xe5, 0x01, 0xe6, 0x01, 0xe7, 0x01, 0xe8, 0x01, 0xe9, + 0x01, 0xea, 0x01, 0xeb, 0x01, 0xec, 0x01, 0xed, 0x01, 0xee, 0x01, 0xef, 0x01, 0xf0, 0x01, 0xf1, + 0x01, 0xf2, 0x01, 0xf3, 0x01, 0xf4, 0x01, 0xf5, 0x01, 0xf6, 0x01, 0xf7, 0x01, 0xf8, 0x01, 0xf9, + 0x01, 0xfa, 0x01, 0xfb, 0x01, 0xfc, 0x01, 0xfd, 0x01, 0xfe, 0x01, 0xff, 0x02, 0x00, 0x02, 0x01, + 0x02, 0x02, 0x02, 0x03, 0x02, 0x04, 0x02, 0x05, 0x02, 0x06, 0x02, 0x07, 0x02, 0x08, 0x02, 0x09, + 0x02, 0x0a, 0x02, 0x0b, 0x02, 0x0c, 0x02, 0x0d, 0x02, 0x0e, 0x02, 0x0f, 0x02, 0x10, 0x02, 0x11, + 0x02, 0x12, 0x02, 0x13, 0x02, 0x14, 0x02, 0x15, 0x02, 0x16, 0x02, 0x17, 0x02, 0x18, 0x02, 0x19, + 0x02, 0x1a, 0x02, 0x1b, 0x02, 0x1c, 0x02, 0x1d, 0x02, 0x1e, 0x02, 0x1f, 0x02, 0x20, 0x02, 0x21, + 0x02, 0x22, 0x02, 0x23, 0x02, 0x24, 0x02, 0x25, 0x02, 0x26, 0x02, 0x27, 0x02, 0x28, 0x02, 0x29, + 0x02, 0x2a, 0x02, 0x2b, 0x02, 0x2c, 0x02, 0x2d, 0x02, 0x2e, 0x02, 0x2f, 0x02, 0x30, 0x02, 0x31, + 0x02, 0x32, 0x02, 0x33, 0x02, 0x34, 0x02, 0x35, 0x02, 0x36, 0x02, 0x37, 0x02, 0x38, 0x02, 0x39, + 0x02, 0x3a, 0x02, 0x3b, 0x02, 0x3c, 0x02, 0x3d, 0x02, 0x3e, 0x02, 0x3f, 0x02, 0x40, 0x02, 0x41, + 0x02, 0x42, 0x02, 0x43, 0x02, 0x44, 0x02, 0x45, 0x02, 0x46, 0x02, 0x47, 0x02, 0x48, 0x02, 0x49, + 0x02, 0x4a, 0x02, 0x4b, 0x02, 0x4c, 0x02, 0x4d, 0x02, 0x4e, 0x02, 0x4f, 0x02, 0x50, 0x02, 0x51, + 0x02, 0x52, 0x02, 0x53, 0x02, 0x54, 0x02, 0x55, 0x02, 0x56, 0x02, 0x57, 0x02, 0x58, 0x02, 0x59, + 0x02, 0x5a, 0x02, 0x5b, 0x02, 0x5c, 0x02, 0x5d, 0x02, 0x5e, 0x02, 0x5f, 0x02, 0x60, 0x02, 0x61, + 0x02, 0x62, 0x02, 0x63, 0x02, 0x64, 0x02, 0x65, 0x02, 0x66, 0x02, 0x67, 0x02, 0x68, 0x02, 0x69, + 0x02, 0x6a, 0x02, 0x6b, 0x02, 0x6c, 0x02, 0x6d, 0x02, 0x6e, 0x02, 0x6f, 0x02, 0x70, 0x02, 0x71, + 0x02, 0x72, 0x02, 0x73, 0x02, 0x74, 0x02, 0x75, 0x02, 0x76, 0x02, 0x77, 0x02, 0x78, 0x02, 0x79, + 0x02, 0x7a, 0x02, 0x7b, 0x02, 0x7c, 0x02, 0x7d, 0x02, 0x7e, 0x02, 0x7f, 0x02, 0x80, 0x02, 0x81, + 0x02, 0x82, 0x02, 0x83, 0x02, 0x84, 0x02, 0x85, 0x02, 0x86, 0x02, 0x87, 0x02, 0x88, 0x02, 0x89, + 0x02, 0x8a, 0x02, 0x8b, 0x02, 0x8c, 0x02, 0x8d, 0x02, 0x8e, 0x02, 0x8f, 0x02, 0x90, 0x02, 0x91, + 0x02, 0x92, 0x02, 0x93, 0x02, 0x94, 0x02, 0x95, 0x02, 0x96, 0x02, 0x97, 0x02, 0x98, 0x02, 0x99, + 0x02, 0x9a, 0x02, 0x9b, 0x02, 0x9c, 0x02, 0x9d, 0x02, 0x9e, 0x02, 0x9f, 0x02, 0xa0, 0x02, 0xa1, + 0x02, 0xa2, 0x02, 0xa3, 0x02, 0xa4, 0x02, 0xa5, 0x02, 0xa6, 0x02, 0xa7, 0x02, 0xa8, 0x02, 0xa9, + 0x02, 0xaa, 0x02, 0xab, 0x02, 0xac, 0x02, 0xad, 0x02, 0xae, 0x02, 0xaf, 0x02, 0xb0, 0x02, 0xb1, + 0x02, 0xb2, 0x02, 0xb3, 0x02, 0xb4, 0x02, 0xb5, 0x02, 0xb6, 0x02, 0xb7, 0x02, 0xb8, 0x02, 0xb9, + 0x02, 0xba, 0x02, 0xbb, 0x02, 0xbc, 0x02, 0xbd, 0x02, 0xbe, 0x02, 0xbf, 0x02, 0xc0, 0x02, 0xc1, + 0x02, 0xc2, 0x02, 0xc3, 0x02, 0xc4, 0x02, 0xc5, 0x02, 0xc6, 0x02, 0xc7, 0x02, 0xc8, 0x02, 0xc9, + 0x02, 0xca, 0x02, 0xcb, 0x02, 0xcc, 0x02, 0xcd, 0x02, 0xce, 0x02, 0xcf, 0x02, 0xd0, 0x02, 0xd1, + 0x02, 0xd2, 0x02, 0xd3, 0x02, 0xd4, 0x02, 0xd5, 0x02, 0xd6, 0x02, 0xd7, 0x02, 0xd8, 0x02, 0xd9, + 0x02, 0xda, 0x02, 0xdb, 0x02, 0xdc, 0x02, 0xdd, 0x02, 0xde, 0x02, 0xdf, 0x02, 0xe0, 0x02, 0xe1, + 0x02, 0xe2, 0x02, 0xe3, 0x02, 0xe4, 0x02, 0xe5, 0x02, 0xe6, 0x02, 0xe7, 0x02, 0xe8, 0x02, 0xe9, + 0x02, 0xea, 0x02, 0xeb, 0x02, 0xec, 0x02, 0xed, 0x02, 0xee, 0x02, 0xef, 0x02, 0xf0, 0x02, 0xf1, + 0x02, 0xf2, 0x02, 0xf3, 0x02, 0xf4, 0x02, 0xf5, 0x02, 0xf6, 0x02, 0xf7, 0x02, 0xf8, 0x02, 0xf9, + 0x02, 0xfa, 0x02, 0xfb, 0x02, 0xfc, 0x02, 0xfd, 0x02, 0xfe, 0x02, 0xff, 0x03, 0x00, 0x03, 0x01, + 0x03, 0x02, 0x03, 0x03, 0x03, 0x04, 0x03, 0x05, 0x03, 0x06, 0x03, 0x07, 0x03, 0x08, 0x03, 0x09, + 0x03, 0x0a, 0x03, 0x0b, 0x03, 0x0c, 0x03, 0x0d, 0x03, 0x0e, 0x03, 0x0f, 0x03, 0x10, 0x03, 0x11, + 0x03, 0x12, 0x03, 0x13, 0x03, 0x14, 0x03, 0x15, 0x03, 0x16, 0x03, 0x17, 0x03, 0x18, 0x03, 0x19, + 0x03, 0x1a, 0x03, 0x1b, 0x03, 0x1c, 0x03, 0x1d, 0x03, 0x1e, 0x03, 0x1f, 0x03, 0x20, 0x03, 0x21, + 0x03, 0x22, 0x03, 0x23, 0x03, 0x24, 0x03, 0x25, 0x03, 0x26, 0x03, 0x27, 0x03, 0x28, 0x03, 0x29, + 0x03, 0x2a, 0x03, 0x2b, 0x03, 0x2c, 0x03, 0x2d, 0x03, 0x2e, 0x03, 0x2f, 0x03, 0x30, 0x03, 0x31, + 0x03, 0x32, 0x03, 0x33, 0x03, 0x34, 0x03, 0x35, 0x03, 0x36, 0x03, 0x37, 0x03, 0x38, 0x03, 0x39, + 0x03, 0x3a, 0x03, 0x3b, 0x03, 0x3c, 0x03, 0x3d, 0x03, 0x3e, 0x03, 0x3f, 0x03, 0x40, 0x03, 0x41, + 0x03, 0x42, 0x03, 0x43, 0x03, 0x44, 0x03, 0x45, 0x03, 0x46, 0x03, 0x47, 0x03, 0x48, 0x03, 0x49, + 0x03, 0x4a, 0x03, 0x4b, 0x03, 0x4c, 0x03, 0x4d, 0x03, 0x4e, 0x03, 0x4f, 0x03, 0x50, 0x03, 0x51, + 0x03, 0x52, 0x03, 0x53, 0x03, 0x54, 0x03, 0x55, 0x03, 0x56, 0x03, 0x57, 0x03, 0x58, 0x03, 0x59, + 0x03, 0x5a, 0x03, 0x5b, 0x03, 0x5c, 0x03, 0x5d, 0x03, 0x5e, 0x03, 0x5f, 0x03, 0x60, 0x03, 0x61, + 0x03, 0x62, 0x03, 0x63, 0x03, 0x64, 0x03, 0x65, 0x03, 0x66, 0x03, 0x67, 0x03, 0x68, 0x03, 0x69, + 0x03, 0x6a, 0x03, 0x6b, 0x03, 0x6c, 0x03, 0x6d, 0x03, 0x6e, 0x03, 0x6f, 0x03, 0x70, 0x03, 0x71, + 0x03, 0x72, 0x03, 0x73, 0x03, 0x74, 0x03, 0x75, 0x03, 0x76, 0x03, 0x77, 0x03, 0x78, 0x03, 0x79, + 0x03, 0x7a, 0x03, 0x7b, 0x03, 0x7c, 0x03, 0x7d, 0x03, 0x7e, 0x03, 0x7f, 0x03, 0x80, 0x03, 0x81, + 0x03, 0x82, 0x03, 0x83, 0x03, 0x84, 0x03, 0x85, 0x03, 0x86, 0x03, 0x87, 0x03, 0x88, 0x03, 0x89, + 0x03, 0x8a, 0x03, 0x8b, 0x03, 0x8c, 0x03, 0x8d, 0x03, 0x8e, 0x03, 0x8f, 0x03, 0x90, 0x03, 0x91, + 0x03, 0x92, 0x03, 0x93, 0x03, 0x94, 0x03, 0x95, 0x03, 0x96, 0x03, 0x97, 0x03, 0x98, 0x03, 0x99, + 0x03, 0x9a, 0x03, 0x9b, 0x03, 0x9c, 0x03, 0x9d, 0x03, 0x9e, 0x03, 0x9f, 0x03, 0xa0, 0x03, 0xa1, + 0x03, 0xa2, 0x03, 0xa3, 0x03, 0xa4, 0x03, 0xa5, 0x03, 0xa6, 0x03, 0xa7, 0x03, 0xa8, 0x03, 0xa9, + 0x03, 0xaa, 0x03, 0xab, 0x03, 0xac, 0x03, 0xad, 0x03, 0xae, 0x03, 0xaf, 0x03, 0xb0, 0x03, 0xb1, + 0x03, 0xb2, 0x00, 0x9f, 0x03, 0xb3, 0x03, 0xb4, 0x03, 0xb5, 0x03, 0xb6, 0x03, 0xb7, 0x03, 0xb8, + 0x03, 0xb9, 0x03, 0xba, 0x03, 0xbb, 0x03, 0xbc, 0x03, 0xbd, 0x03, 0xbe, 0x03, 0xbf, 0x03, 0xc0, + 0x03, 0xc1, 0x00, 0x9b, 0x03, 0xc2, 0x03, 0xc3, 0x03, 0xc4, 0x03, 0xc5, 0x03, 0xc6, 0x03, 0xc7, + 0x03, 0xc8, 0x03, 0xc9, 0x03, 0xca, 0x03, 0xcb, 0x03, 0xcc, 0x03, 0xcd, 0x03, 0xce, 0x03, 0xcf, + 0x03, 0xd0, 0x03, 0xd1, 0x03, 0xd2, 0x03, 0xd3, 0x03, 0xd4, 0x03, 0xd5, 0x03, 0xd6, 0x03, 0xd7, + 0x03, 0xd8, 0x03, 0xd9, 0x03, 0xda, 0x03, 0xdb, 0x03, 0xdc, 0x03, 0xdd, 0x03, 0xde, 0x03, 0xdf, + 0x03, 0xe0, 0x03, 0xe1, 0x03, 0xe2, 0x03, 0xe3, 0x03, 0xe4, 0x03, 0xe5, 0x03, 0xe6, 0x03, 0xe7, + 0x03, 0xe8, 0x03, 0xe9, 0x03, 0xea, 0x03, 0xeb, 0x03, 0xec, 0x03, 0xed, 0x03, 0xee, 0x03, 0xef, + 0x03, 0xf0, 0x03, 0xf1, 0x03, 0xf2, 0x03, 0xf3, 0x03, 0xf4, 0x03, 0xf5, 0x03, 0xf6, 0x03, 0xf7, + 0x03, 0xf8, 0x03, 0xf9, 0x03, 0xfa, 0x03, 0xfb, 0x03, 0xfc, 0x03, 0xfd, 0x03, 0xfe, 0x03, 0xff, + 0x04, 0x00, 0x04, 0x01, 0x04, 0x02, 0x04, 0x03, 0x04, 0x04, 0x04, 0x05, 0x04, 0x06, 0x04, 0x07, + 0x04, 0x08, 0x04, 0x09, 0x04, 0x0a, 0x04, 0x0b, 0x04, 0x0c, 0x04, 0x0d, 0x04, 0x0e, 0x04, 0x0f, + 0x04, 0x10, 0x04, 0x11, 0x04, 0x12, 0x04, 0x13, 0x04, 0x14, 0x04, 0x15, 0x04, 0x16, 0x04, 0x17, + 0x04, 0x18, 0x04, 0x19, 0x04, 0x1a, 0x04, 0x1b, 0x04, 0x1c, 0x04, 0x1d, 0x04, 0x1e, 0x04, 0x1f, + 0x04, 0x20, 0x04, 0x21, 0x04, 0x22, 0x04, 0x23, 0x04, 0x24, 0x04, 0x25, 0x04, 0x26, 0x04, 0x27, + 0x04, 0x28, 0x04, 0x29, 0x04, 0x2a, 0x04, 0x2b, 0x04, 0x2c, 0x04, 0x2d, 0x04, 0x2e, 0x04, 0x2f, + 0x04, 0x30, 0x04, 0x31, 0x04, 0x32, 0x04, 0x33, 0x04, 0x34, 0x04, 0x35, 0x04, 0x36, 0x04, 0x37, + 0x04, 0x38, 0x04, 0x39, 0x04, 0x3a, 0x04, 0x3b, 0x04, 0x3c, 0x04, 0x3d, 0x04, 0x3e, 0x04, 0x3f, + 0x04, 0x40, 0x04, 0x41, 0x04, 0x42, 0x04, 0x43, 0x04, 0x44, 0x04, 0x45, 0x04, 0x46, 0x04, 0x47, + 0x04, 0x48, 0x04, 0x49, 0x04, 0x4a, 0x04, 0x4b, 0x04, 0x4c, 0x04, 0x4d, 0x04, 0x4e, 0x04, 0x4f, + 0x04, 0x50, 0x04, 0x51, 0x04, 0x52, 0x04, 0x53, 0x04, 0x54, 0x04, 0x55, 0x04, 0x56, 0x04, 0x57, + 0x04, 0x58, 0x04, 0x59, 0x04, 0x5a, 0x04, 0x5b, 0x04, 0x5c, 0x04, 0x5d, 0x04, 0x5e, 0x04, 0x5f, + 0x04, 0x60, 0x04, 0x61, 0x04, 0x62, 0x04, 0x63, 0x04, 0x64, 0x04, 0x65, 0x04, 0x66, 0x04, 0x67, + 0x04, 0x68, 0x04, 0x69, 0x04, 0x6a, 0x04, 0x6b, 0x04, 0x6c, 0x04, 0x6d, 0x04, 0x6e, 0x04, 0x6f, + 0x04, 0x70, 0x04, 0x71, 0x04, 0x72, 0x04, 0x73, 0x04, 0x74, 0x04, 0x75, 0x04, 0x76, 0x04, 0x77, + 0x04, 0x78, 0x04, 0x79, 0x04, 0x7a, 0x04, 0x7b, 0x04, 0x7c, 0x04, 0x7d, 0x04, 0x7e, 0x04, 0x7f, + 0x04, 0x80, 0x04, 0x81, 0x04, 0x82, 0x04, 0x83, 0x04, 0x84, 0x04, 0x85, 0x04, 0x86, 0x04, 0x87, + 0x04, 0x88, 0x04, 0x89, 0x04, 0x8a, 0x04, 0x8b, 0x04, 0x8c, 0x04, 0x8d, 0x04, 0x8e, 0x04, 0x8f, + 0x04, 0x90, 0x04, 0x91, 0x04, 0x92, 0x04, 0x93, 0x04, 0x94, 0x04, 0x95, 0x04, 0x96, 0x04, 0x97, + 0x04, 0x98, 0x04, 0x99, 0x04, 0x9a, 0x04, 0x9b, 0x04, 0x9c, 0x04, 0x9d, 0x04, 0x9e, 0x04, 0x9f, + 0x04, 0xa0, 0x04, 0xa1, 0x04, 0xa2, 0x04, 0xa3, 0x04, 0xa4, 0x04, 0xa5, 0x04, 0xa6, 0x04, 0xa7, + 0x04, 0xa8, 0x04, 0xa9, 0x04, 0xaa, 0x04, 0xab, 0x04, 0xac, 0x04, 0xad, 0x04, 0xae, 0x04, 0xaf, + 0x04, 0xb0, 0x04, 0xb1, 0x04, 0xb2, 0x04, 0xb3, 0x04, 0xb4, 0x04, 0xb5, 0x04, 0xb6, 0x04, 0xb7, + 0x04, 0xb8, 0x04, 0xb9, 0x04, 0xba, 0x04, 0xbb, 0x04, 0xbc, 0x04, 0xbd, 0x04, 0xbe, 0x04, 0xbf, + 0x04, 0xc0, 0x04, 0xc1, 0x04, 0xc2, 0x04, 0xc3, 0x04, 0xc4, 0x04, 0xc5, 0x04, 0xc6, 0x04, 0xc7, + 0x04, 0xc8, 0x04, 0xc9, 0x04, 0xca, 0x04, 0xcb, 0x04, 0xcc, 0x04, 0xcd, 0x04, 0xce, 0x04, 0xcf, + 0x04, 0xd0, 0x04, 0xd1, 0x04, 0xd2, 0x04, 0xd3, 0x04, 0xd4, 0x04, 0xd5, 0x04, 0xd6, 0x04, 0xd7, + 0x04, 0xd8, 0x04, 0xd9, 0x04, 0xda, 0x04, 0xdb, 0x04, 0xdc, 0x04, 0xdd, 0x04, 0xde, 0x04, 0xdf, + 0x04, 0xe0, 0x04, 0xe1, 0x04, 0xe2, 0x04, 0xe3, 0x04, 0xe4, 0x04, 0xe5, 0x04, 0xe6, 0x04, 0xe7, + 0x04, 0xe8, 0x04, 0xe9, 0x04, 0xea, 0x05, 0x19, 0x05, 0x1a, 0x05, 0x1b, 0x05, 0x1c, 0x05, 0x1d, + 0x05, 0x1e, 0x05, 0x1f, 0x05, 0x20, 0x05, 0x21, 0x05, 0x22, 0x04, 0xf5, 0x04, 0xf6, 0x05, 0x23, + 0x04, 0xf8, 0x04, 0xf9, 0x04, 0xfa, 0x04, 0xfb, 0x04, 0xfc, 0x04, 0xfd, 0x04, 0xfe, 0x04, 0xff, + 0x05, 0x00, 0x05, 0x01, 0x05, 0x02, 0x05, 0x03, 0x05, 0x04, 0x05, 0x05, 0x05, 0x06, 0x05, 0x07, + 0x05, 0x08, 0x05, 0x09, 0x05, 0x0a, 0x05, 0x0b, 0x05, 0x0c, 0x05, 0x0d, 0x05, 0x0e, 0x05, 0x0f, + 0x05, 0x10, 0x05, 0x11, 0x05, 0x12, 0x05, 0x13, 0x05, 0x14, 0x05, 0x15, 0x05, 0x16, 0x05, 0x17, + 0x05, 0x18, 0x05, 0x2e, 0x6e, 0x75, 0x6c, 0x6c, 0x04, 0x45, 0x75, 0x72, 0x6f, 0x07, 0x75, 0x6e, + 0x69, 0x30, 0x30, 0x41, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x30, 0x41, 0x44, 0x06, 0x6d, 0x61, + 0x63, 0x72, 0x6f, 0x6e, 0x0e, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x63, 0x65, 0x6e, 0x74, 0x65, + 0x72, 0x65, 0x64, 0x07, 0x41, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x6e, 0x07, 0x61, 0x6d, 0x61, 0x63, + 0x72, 0x6f, 0x6e, 0x06, 0x41, 0x62, 0x72, 0x65, 0x76, 0x65, 0x06, 0x61, 0x62, 0x72, 0x65, 0x76, + 0x65, 0x07, 0x41, 0x6f, 0x67, 0x6f, 0x6e, 0x65, 0x6b, 0x07, 0x61, 0x6f, 0x67, 0x6f, 0x6e, 0x65, + 0x6b, 0x0b, 0x43, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6d, 0x66, 0x6c, 0x65, 0x78, 0x0b, 0x63, 0x63, + 0x69, 0x72, 0x63, 0x75, 0x6d, 0x66, 0x6c, 0x65, 0x78, 0x0a, 0x43, 0x64, 0x6f, 0x74, 0x61, 0x63, + 0x63, 0x65, 0x6e, 0x74, 0x0a, 0x63, 0x64, 0x6f, 0x74, 0x61, 0x63, 0x63, 0x65, 0x6e, 0x74, 0x06, + 0x44, 0x63, 0x61, 0x72, 0x6f, 0x6e, 0x06, 0x64, 0x63, 0x61, 0x72, 0x6f, 0x6e, 0x06, 0x44, 0x63, + 0x72, 0x6f, 0x61, 0x74, 0x06, 0x64, 0x63, 0x72, 0x6f, 0x61, 0x74, 0x07, 0x45, 0x6d, 0x61, 0x63, + 0x72, 0x6f, 0x6e, 0x07, 0x65, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x6e, 0x06, 0x45, 0x62, 0x72, 0x65, + 0x76, 0x65, 0x06, 0x65, 0x62, 0x72, 0x65, 0x76, 0x65, 0x0a, 0x45, 0x64, 0x6f, 0x74, 0x61, 0x63, + 0x63, 0x65, 0x6e, 0x74, 0x0a, 0x65, 0x64, 0x6f, 0x74, 0x61, 0x63, 0x63, 0x65, 0x6e, 0x74, 0x07, + 0x45, 0x6f, 0x67, 0x6f, 0x6e, 0x65, 0x6b, 0x07, 0x65, 0x6f, 0x67, 0x6f, 0x6e, 0x65, 0x6b, 0x06, + 0x45, 0x63, 0x61, 0x72, 0x6f, 0x6e, 0x06, 0x65, 0x63, 0x61, 0x72, 0x6f, 0x6e, 0x0b, 0x47, 0x63, + 0x69, 0x72, 0x63, 0x75, 0x6d, 0x66, 0x6c, 0x65, 0x78, 0x0b, 0x67, 0x63, 0x69, 0x72, 0x63, 0x75, + 0x6d, 0x66, 0x6c, 0x65, 0x78, 0x0a, 0x47, 0x64, 0x6f, 0x74, 0x61, 0x63, 0x63, 0x65, 0x6e, 0x74, + 0x0a, 0x67, 0x64, 0x6f, 0x74, 0x61, 0x63, 0x63, 0x65, 0x6e, 0x74, 0x0c, 0x47, 0x63, 0x6f, 0x6d, + 0x6d, 0x61, 0x61, 0x63, 0x63, 0x65, 0x6e, 0x74, 0x0c, 0x67, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x61, + 0x63, 0x63, 0x65, 0x6e, 0x74, 0x0b, 0x48, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6d, 0x66, 0x6c, 0x65, + 0x78, 0x0b, 0x68, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6d, 0x66, 0x6c, 0x65, 0x78, 0x04, 0x48, 0x62, + 0x61, 0x72, 0x04, 0x68, 0x62, 0x61, 0x72, 0x06, 0x49, 0x74, 0x69, 0x6c, 0x64, 0x65, 0x06, 0x69, + 0x74, 0x69, 0x6c, 0x64, 0x65, 0x07, 0x49, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x6e, 0x07, 0x69, 0x6d, + 0x61, 0x63, 0x72, 0x6f, 0x6e, 0x06, 0x49, 0x62, 0x72, 0x65, 0x76, 0x65, 0x06, 0x69, 0x62, 0x72, + 0x65, 0x76, 0x65, 0x07, 0x49, 0x6f, 0x67, 0x6f, 0x6e, 0x65, 0x6b, 0x07, 0x69, 0x6f, 0x67, 0x6f, + 0x6e, 0x65, 0x6b, 0x0a, 0x49, 0x64, 0x6f, 0x74, 0x61, 0x63, 0x63, 0x65, 0x6e, 0x74, 0x06, 0x69, + 0x2e, 0x6c, 0x6f, 0x63, 0x6c, 0x02, 0x49, 0x4a, 0x02, 0x69, 0x6a, 0x0b, 0x4a, 0x63, 0x69, 0x72, + 0x63, 0x75, 0x6d, 0x66, 0x6c, 0x65, 0x78, 0x0b, 0x6a, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6d, 0x66, + 0x6c, 0x65, 0x78, 0x0c, 0x4b, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x61, 0x63, 0x63, 0x65, 0x6e, 0x74, + 0x0c, 0x6b, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x61, 0x63, 0x63, 0x65, 0x6e, 0x74, 0x11, 0x6b, 0x67, + 0x72, 0x65, 0x65, 0x6e, 0x6c, 0x61, 0x6e, 0x64, 0x69, 0x63, 0x2e, 0x63, 0x61, 0x73, 0x65, 0x0c, + 0x6b, 0x67, 0x72, 0x65, 0x65, 0x6e, 0x6c, 0x61, 0x6e, 0x64, 0x69, 0x63, 0x06, 0x4c, 0x61, 0x63, + 0x75, 0x74, 0x65, 0x06, 0x6c, 0x61, 0x63, 0x75, 0x74, 0x65, 0x0c, 0x4c, 0x63, 0x6f, 0x6d, 0x6d, + 0x61, 0x61, 0x63, 0x63, 0x65, 0x6e, 0x74, 0x0c, 0x6c, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x61, 0x63, + 0x63, 0x65, 0x6e, 0x74, 0x06, 0x4c, 0x63, 0x61, 0x72, 0x6f, 0x6e, 0x06, 0x6c, 0x63, 0x61, 0x72, + 0x6f, 0x6e, 0x04, 0x4c, 0x64, 0x6f, 0x74, 0x04, 0x6c, 0x64, 0x6f, 0x74, 0x06, 0x4e, 0x61, 0x63, + 0x75, 0x74, 0x65, 0x06, 0x6e, 0x61, 0x63, 0x75, 0x74, 0x65, 0x0c, 0x4e, 0x63, 0x6f, 0x6d, 0x6d, + 0x61, 0x61, 0x63, 0x63, 0x65, 0x6e, 0x74, 0x0c, 0x6e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x61, 0x63, + 0x63, 0x65, 0x6e, 0x74, 0x06, 0x4e, 0x63, 0x61, 0x72, 0x6f, 0x6e, 0x06, 0x6e, 0x63, 0x61, 0x72, + 0x6f, 0x6e, 0x10, 0x6e, 0x61, 0x70, 0x6f, 0x73, 0x74, 0x72, 0x6f, 0x70, 0x68, 0x65, 0x2e, 0x63, + 0x61, 0x73, 0x65, 0x0b, 0x6e, 0x61, 0x70, 0x6f, 0x73, 0x74, 0x72, 0x6f, 0x70, 0x68, 0x65, 0x03, + 0x45, 0x6e, 0x67, 0x03, 0x65, 0x6e, 0x67, 0x07, 0x4f, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x6e, 0x07, + 0x6f, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x6e, 0x06, 0x4f, 0x62, 0x72, 0x65, 0x76, 0x65, 0x06, 0x6f, + 0x62, 0x72, 0x65, 0x76, 0x65, 0x0d, 0x4f, 0x68, 0x75, 0x6e, 0x67, 0x61, 0x72, 0x75, 0x6d, 0x6c, + 0x61, 0x75, 0x74, 0x0d, 0x6f, 0x68, 0x75, 0x6e, 0x67, 0x61, 0x72, 0x75, 0x6d, 0x6c, 0x61, 0x75, + 0x74, 0x06, 0x52, 0x61, 0x63, 0x75, 0x74, 0x65, 0x06, 0x72, 0x61, 0x63, 0x75, 0x74, 0x65, 0x0c, + 0x52, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x61, 0x63, 0x63, 0x65, 0x6e, 0x74, 0x0c, 0x72, 0x63, 0x6f, + 0x6d, 0x6d, 0x61, 0x61, 0x63, 0x63, 0x65, 0x6e, 0x74, 0x06, 0x52, 0x63, 0x61, 0x72, 0x6f, 0x6e, + 0x06, 0x72, 0x63, 0x61, 0x72, 0x6f, 0x6e, 0x06, 0x53, 0x61, 0x63, 0x75, 0x74, 0x65, 0x06, 0x73, + 0x61, 0x63, 0x75, 0x74, 0x65, 0x0b, 0x53, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6d, 0x66, 0x6c, 0x65, + 0x78, 0x0b, 0x73, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6d, 0x66, 0x6c, 0x65, 0x78, 0x07, 0x75, 0x6e, + 0x69, 0x30, 0x31, 0x36, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x36, 0x33, 0x06, 0x54, 0x63, + 0x61, 0x72, 0x6f, 0x6e, 0x06, 0x74, 0x63, 0x61, 0x72, 0x6f, 0x6e, 0x04, 0x54, 0x62, 0x61, 0x72, + 0x04, 0x74, 0x62, 0x61, 0x72, 0x06, 0x55, 0x74, 0x69, 0x6c, 0x64, 0x65, 0x06, 0x75, 0x74, 0x69, + 0x6c, 0x64, 0x65, 0x07, 0x55, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x6e, 0x07, 0x75, 0x6d, 0x61, 0x63, + 0x72, 0x6f, 0x6e, 0x06, 0x55, 0x62, 0x72, 0x65, 0x76, 0x65, 0x06, 0x75, 0x62, 0x72, 0x65, 0x76, + 0x65, 0x05, 0x55, 0x72, 0x69, 0x6e, 0x67, 0x05, 0x75, 0x72, 0x69, 0x6e, 0x67, 0x0d, 0x55, 0x68, + 0x75, 0x6e, 0x67, 0x61, 0x72, 0x75, 0x6d, 0x6c, 0x61, 0x75, 0x74, 0x0d, 0x75, 0x68, 0x75, 0x6e, + 0x67, 0x61, 0x72, 0x75, 0x6d, 0x6c, 0x61, 0x75, 0x74, 0x07, 0x55, 0x6f, 0x67, 0x6f, 0x6e, 0x65, + 0x6b, 0x07, 0x75, 0x6f, 0x67, 0x6f, 0x6e, 0x65, 0x6b, 0x0b, 0x57, 0x63, 0x69, 0x72, 0x63, 0x75, + 0x6d, 0x66, 0x6c, 0x65, 0x78, 0x0b, 0x77, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6d, 0x66, 0x6c, 0x65, + 0x78, 0x0b, 0x59, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6d, 0x66, 0x6c, 0x65, 0x78, 0x0b, 0x79, 0x63, + 0x69, 0x72, 0x63, 0x75, 0x6d, 0x66, 0x6c, 0x65, 0x78, 0x06, 0x5a, 0x61, 0x63, 0x75, 0x74, 0x65, + 0x06, 0x7a, 0x61, 0x63, 0x75, 0x74, 0x65, 0x0a, 0x5a, 0x64, 0x6f, 0x74, 0x61, 0x63, 0x63, 0x65, + 0x6e, 0x74, 0x0a, 0x7a, 0x64, 0x6f, 0x74, 0x61, 0x63, 0x63, 0x65, 0x6e, 0x74, 0x05, 0x6c, 0x6f, + 0x6e, 0x67, 0x73, 0x0c, 0x53, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x61, 0x63, 0x63, 0x65, 0x6e, 0x74, + 0x0c, 0x73, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x61, 0x63, 0x63, 0x65, 0x6e, 0x74, 0x07, 0x75, 0x6e, + 0x69, 0x30, 0x32, 0x31, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x31, 0x42, 0x08, 0x64, 0x6f, + 0x74, 0x6c, 0x65, 0x73, 0x73, 0x6a, 0x0a, 0x61, 0x70, 0x6f, 0x73, 0x74, 0x72, 0x6f, 0x70, 0x68, + 0x65, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x43, 0x39, 0x06, 0x57, 0x67, 0x72, 0x61, 0x76, 0x65, + 0x06, 0x77, 0x67, 0x72, 0x61, 0x76, 0x65, 0x06, 0x57, 0x61, 0x63, 0x75, 0x74, 0x65, 0x06, 0x77, + 0x61, 0x63, 0x75, 0x74, 0x65, 0x09, 0x57, 0x64, 0x69, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x09, + 0x77, 0x64, 0x69, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x06, 0x59, 0x67, 0x72, 0x61, 0x76, 0x65, + 0x06, 0x79, 0x67, 0x72, 0x61, 0x76, 0x65, 0x0c, 0x7a, 0x65, 0x72, 0x6f, 0x73, 0x75, 0x70, 0x65, + 0x72, 0x69, 0x6f, 0x72, 0x0c, 0x66, 0x6f, 0x75, 0x72, 0x73, 0x75, 0x70, 0x65, 0x72, 0x69, 0x6f, + 0x72, 0x0c, 0x66, 0x69, 0x76, 0x65, 0x73, 0x75, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x72, 0x0b, 0x73, + 0x69, 0x78, 0x73, 0x75, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x72, 0x0d, 0x73, 0x65, 0x76, 0x65, 0x6e, + 0x73, 0x75, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x72, 0x0d, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x75, + 0x70, 0x65, 0x72, 0x69, 0x6f, 0x72, 0x0c, 0x6e, 0x69, 0x6e, 0x65, 0x73, 0x75, 0x70, 0x65, 0x72, + 0x69, 0x6f, 0x72, 0x0c, 0x7a, 0x65, 0x72, 0x6f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x69, 0x6f, 0x72, + 0x0b, 0x6f, 0x6e, 0x65, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x69, 0x6f, 0x72, 0x0b, 0x74, 0x77, 0x6f, + 0x69, 0x6e, 0x66, 0x65, 0x72, 0x69, 0x6f, 0x72, 0x0d, 0x74, 0x68, 0x72, 0x65, 0x65, 0x69, 0x6e, + 0x66, 0x65, 0x72, 0x69, 0x6f, 0x72, 0x0c, 0x66, 0x6f, 0x75, 0x72, 0x69, 0x6e, 0x66, 0x65, 0x72, + 0x69, 0x6f, 0x72, 0x0c, 0x66, 0x69, 0x76, 0x65, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x69, 0x6f, 0x72, + 0x0b, 0x73, 0x69, 0x78, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x69, 0x6f, 0x72, 0x0d, 0x73, 0x65, 0x76, + 0x65, 0x6e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x69, 0x6f, 0x72, 0x0d, 0x65, 0x69, 0x67, 0x68, 0x74, + 0x69, 0x6e, 0x66, 0x65, 0x72, 0x69, 0x6f, 0x72, 0x0c, 0x6e, 0x69, 0x6e, 0x65, 0x69, 0x6e, 0x66, + 0x65, 0x72, 0x69, 0x6f, 0x72, 0x09, 0x61, 0x66, 0x69, 0x69, 0x36, 0x31, 0x32, 0x38, 0x39, 0x09, + 0x65, 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x64, 0x08, 0x6f, 0x6e, 0x65, 0x74, 0x68, 0x69, + 0x72, 0x64, 0x09, 0x74, 0x77, 0x6f, 0x74, 0x68, 0x69, 0x72, 0x64, 0x73, 0x09, 0x6f, 0x6e, 0x65, + 0x65, 0x69, 0x67, 0x68, 0x74, 0x68, 0x0c, 0x74, 0x68, 0x72, 0x65, 0x65, 0x65, 0x69, 0x67, 0x68, + 0x74, 0x68, 0x73, 0x0b, 0x66, 0x69, 0x76, 0x65, 0x65, 0x69, 0x67, 0x68, 0x74, 0x68, 0x73, 0x0c, + 0x73, 0x65, 0x76, 0x65, 0x6e, 0x65, 0x69, 0x67, 0x68, 0x74, 0x68, 0x73, 0x08, 0x6f, 0x6e, 0x65, + 0x66, 0x69, 0x66, 0x74, 0x68, 0x09, 0x74, 0x77, 0x6f, 0x66, 0x69, 0x66, 0x74, 0x68, 0x73, 0x0b, + 0x74, 0x68, 0x72, 0x65, 0x65, 0x66, 0x69, 0x66, 0x74, 0x68, 0x73, 0x0a, 0x66, 0x6f, 0x75, 0x72, + 0x66, 0x69, 0x66, 0x74, 0x68, 0x73, 0x08, 0x6f, 0x6e, 0x65, 0x73, 0x69, 0x78, 0x74, 0x68, 0x0a, + 0x66, 0x69, 0x76, 0x65, 0x73, 0x69, 0x78, 0x74, 0x68, 0x73, 0x0a, 0x6f, 0x6e, 0x65, 0x73, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x68, 0x0b, 0x74, 0x77, 0x6f, 0x73, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x68, + 0x73, 0x0d, 0x74, 0x68, 0x72, 0x65, 0x65, 0x73, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x68, 0x73, 0x0c, + 0x66, 0x6f, 0x75, 0x72, 0x73, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x68, 0x73, 0x0c, 0x66, 0x69, 0x76, + 0x65, 0x73, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x68, 0x73, 0x0b, 0x73, 0x69, 0x78, 0x73, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x68, 0x73, 0x08, 0x6f, 0x6e, 0x65, 0x6e, 0x69, 0x6e, 0x74, 0x68, 0x09, 0x74, + 0x77, 0x6f, 0x6e, 0x69, 0x6e, 0x74, 0x68, 0x73, 0x0a, 0x66, 0x6f, 0x75, 0x72, 0x6e, 0x69, 0x6e, + 0x74, 0x68, 0x73, 0x0a, 0x66, 0x69, 0x76, 0x65, 0x6e, 0x69, 0x6e, 0x74, 0x68, 0x73, 0x0b, 0x73, + 0x65, 0x76, 0x65, 0x6e, 0x6e, 0x69, 0x6e, 0x74, 0x68, 0x73, 0x0b, 0x65, 0x69, 0x67, 0x68, 0x74, + 0x6e, 0x69, 0x6e, 0x74, 0x68, 0x73, 0x05, 0x44, 0x65, 0x6c, 0x74, 0x61, 0x07, 0x75, 0x6e, 0x69, + 0x32, 0x31, 0x32, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x31, 0x35, 0x07, 0x75, 0x6e, 0x69, + 0x32, 0x32, 0x31, 0x39, 0x03, 0x66, 0x5f, 0x69, 0x03, 0x66, 0x5f, 0x6c, 0x09, 0x7a, 0x65, 0x72, + 0x6f, 0x2e, 0x73, 0x75, 0x70, 0x73, 0x08, 0x6f, 0x6e, 0x65, 0x2e, 0x73, 0x75, 0x70, 0x73, 0x08, + 0x74, 0x77, 0x6f, 0x2e, 0x73, 0x75, 0x70, 0x73, 0x0a, 0x74, 0x68, 0x72, 0x65, 0x65, 0x2e, 0x73, + 0x75, 0x70, 0x73, 0x09, 0x66, 0x6f, 0x75, 0x72, 0x2e, 0x73, 0x75, 0x70, 0x73, 0x09, 0x66, 0x69, + 0x76, 0x65, 0x2e, 0x73, 0x75, 0x70, 0x73, 0x08, 0x73, 0x69, 0x78, 0x2e, 0x73, 0x75, 0x70, 0x73, + 0x0a, 0x73, 0x65, 0x76, 0x65, 0x6e, 0x2e, 0x73, 0x75, 0x70, 0x73, 0x0a, 0x65, 0x69, 0x67, 0x68, + 0x74, 0x2e, 0x73, 0x75, 0x70, 0x73, 0x09, 0x6e, 0x69, 0x6e, 0x65, 0x2e, 0x73, 0x75, 0x70, 0x73, + 0x09, 0x7a, 0x65, 0x72, 0x6f, 0x2e, 0x73, 0x69, 0x6e, 0x66, 0x08, 0x6f, 0x6e, 0x65, 0x2e, 0x73, + 0x69, 0x6e, 0x66, 0x08, 0x74, 0x77, 0x6f, 0x2e, 0x73, 0x69, 0x6e, 0x66, 0x0a, 0x74, 0x68, 0x72, + 0x65, 0x65, 0x2e, 0x73, 0x69, 0x6e, 0x66, 0x09, 0x66, 0x6f, 0x75, 0x72, 0x2e, 0x73, 0x69, 0x6e, + 0x66, 0x09, 0x66, 0x69, 0x76, 0x65, 0x2e, 0x73, 0x69, 0x6e, 0x66, 0x08, 0x73, 0x69, 0x78, 0x2e, + 0x73, 0x69, 0x6e, 0x66, 0x0a, 0x73, 0x65, 0x76, 0x65, 0x6e, 0x2e, 0x73, 0x69, 0x6e, 0x66, 0x0a, + 0x65, 0x69, 0x67, 0x68, 0x74, 0x2e, 0x73, 0x69, 0x6e, 0x66, 0x09, 0x6e, 0x69, 0x6e, 0x65, 0x2e, + 0x73, 0x69, 0x6e, 0x66, 0x09, 0x63, 0x61, 0x72, 0x6f, 0x6e, 0x2e, 0x61, 0x6c, 0x74, 0x0b, 0x63, + 0x6f, 0x6d, 0x6d, 0x61, 0x61, 0x63, 0x63, 0x65, 0x6e, 0x74, 0x0e, 0x72, 0x65, 0x76, 0x63, 0x6f, + 0x6d, 0x6d, 0x61, 0x61, 0x63, 0x63, 0x65, 0x6e, 0x74, 0x0f, 0x63, 0x61, 0x72, 0x6f, 0x6e, 0x2e, + 0x61, 0x6c, 0x74, 0x2e, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x09, 0x50, 0x61, 0x72, 0x65, 0x6e, 0x6c, + 0x65, 0x66, 0x74, 0x0a, 0x50, 0x61, 0x72, 0x65, 0x6e, 0x72, 0x69, 0x67, 0x68, 0x74, 0x06, 0x48, + 0x79, 0x70, 0x68, 0x65, 0x6e, 0x05, 0x53, 0x6c, 0x61, 0x73, 0x68, 0x02, 0x41, 0x74, 0x0b, 0x42, + 0x72, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x6c, 0x65, 0x66, 0x74, 0x09, 0x42, 0x61, 0x63, 0x6b, 0x73, + 0x6c, 0x61, 0x73, 0x68, 0x0c, 0x42, 0x72, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x72, 0x69, 0x67, 0x68, + 0x74, 0x09, 0x42, 0x72, 0x61, 0x63, 0x65, 0x6c, 0x65, 0x66, 0x74, 0x0a, 0x42, 0x72, 0x61, 0x63, + 0x65, 0x72, 0x69, 0x67, 0x68, 0x74, 0x0d, 0x47, 0x75, 0x69, 0x6c, 0x73, 0x69, 0x6e, 0x67, 0x6c, + 0x6c, 0x65, 0x66, 0x74, 0x06, 0x42, 0x75, 0x6c, 0x6c, 0x65, 0x74, 0x06, 0x45, 0x6e, 0x64, 0x61, + 0x73, 0x68, 0x06, 0x45, 0x6d, 0x64, 0x61, 0x73, 0x68, 0x0e, 0x47, 0x75, 0x69, 0x6c, 0x73, 0x69, + 0x6e, 0x67, 0x6c, 0x72, 0x69, 0x67, 0x68, 0x74, 0x0a, 0x45, 0x78, 0x63, 0x6c, 0x61, 0x6d, 0x64, + 0x6f, 0x77, 0x6e, 0x0d, 0x47, 0x75, 0x69, 0x6c, 0x6c, 0x65, 0x6d, 0x6f, 0x74, 0x6c, 0x65, 0x66, + 0x74, 0x0e, 0x47, 0x75, 0x69, 0x6c, 0x6c, 0x65, 0x6d, 0x6f, 0x74, 0x72, 0x69, 0x67, 0x68, 0x74, + 0x0c, 0x51, 0x75, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x64, 0x6f, 0x77, 0x6e, 0x07, 0x75, 0x6e, + 0x69, 0x30, 0x31, 0x38, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x38, 0x31, 0x07, 0x75, 0x6e, + 0x69, 0x30, 0x31, 0x38, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x38, 0x33, 0x07, 0x75, 0x6e, + 0x69, 0x30, 0x31, 0x38, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x38, 0x35, 0x07, 0x75, 0x6e, + 0x69, 0x30, 0x31, 0x38, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x38, 0x37, 0x07, 0x75, 0x6e, + 0x69, 0x30, 0x31, 0x38, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x38, 0x39, 0x07, 0x75, 0x6e, + 0x69, 0x30, 0x31, 0x38, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x38, 0x42, 0x07, 0x75, 0x6e, + 0x69, 0x30, 0x31, 0x38, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x38, 0x44, 0x07, 0x75, 0x6e, + 0x69, 0x30, 0x31, 0x38, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x38, 0x46, 0x07, 0x75, 0x6e, + 0x69, 0x30, 0x31, 0x39, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x39, 0x31, 0x07, 0x75, 0x6e, + 0x69, 0x30, 0x31, 0x39, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x39, 0x34, 0x07, 0x75, 0x6e, + 0x69, 0x30, 0x31, 0x39, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x39, 0x36, 0x07, 0x75, 0x6e, + 0x69, 0x30, 0x31, 0x39, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x39, 0x38, 0x07, 0x75, 0x6e, + 0x69, 0x30, 0x31, 0x39, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x39, 0x41, 0x07, 0x75, 0x6e, + 0x69, 0x30, 0x31, 0x39, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x39, 0x43, 0x07, 0x75, 0x6e, + 0x69, 0x30, 0x31, 0x39, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x39, 0x45, 0x07, 0x75, 0x6e, + 0x69, 0x30, 0x31, 0x39, 0x46, 0x05, 0x4f, 0x68, 0x6f, 0x72, 0x6e, 0x05, 0x6f, 0x68, 0x6f, 0x72, + 0x6e, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x41, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x41, + 0x33, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x41, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x41, + 0x35, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x41, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x41, + 0x37, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x41, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x41, + 0x39, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x41, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x41, + 0x42, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x41, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x41, + 0x44, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x41, 0x45, 0x05, 0x55, 0x68, 0x6f, 0x72, 0x6e, 0x05, + 0x75, 0x68, 0x6f, 0x72, 0x6e, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x42, 0x31, 0x07, 0x75, 0x6e, + 0x69, 0x30, 0x31, 0x42, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x42, 0x33, 0x07, 0x75, 0x6e, + 0x69, 0x30, 0x31, 0x42, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x42, 0x35, 0x07, 0x75, 0x6e, + 0x69, 0x30, 0x31, 0x42, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x42, 0x37, 0x07, 0x75, 0x6e, + 0x69, 0x30, 0x31, 0x42, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x42, 0x39, 0x07, 0x75, 0x6e, + 0x69, 0x30, 0x31, 0x42, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x42, 0x42, 0x07, 0x75, 0x6e, + 0x69, 0x30, 0x31, 0x42, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x42, 0x44, 0x07, 0x75, 0x6e, + 0x69, 0x30, 0x31, 0x42, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x42, 0x46, 0x07, 0x75, 0x6e, + 0x69, 0x30, 0x31, 0x43, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x43, 0x31, 0x07, 0x75, 0x6e, + 0x69, 0x30, 0x31, 0x43, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x43, 0x33, 0x07, 0x75, 0x6e, + 0x69, 0x30, 0x31, 0x43, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x43, 0x35, 0x07, 0x75, 0x6e, + 0x69, 0x30, 0x31, 0x43, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x43, 0x37, 0x07, 0x75, 0x6e, + 0x69, 0x30, 0x31, 0x43, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x43, 0x39, 0x07, 0x75, 0x6e, + 0x69, 0x30, 0x31, 0x43, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x43, 0x42, 0x07, 0x75, 0x6e, + 0x69, 0x30, 0x31, 0x43, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x43, 0x44, 0x07, 0x75, 0x6e, + 0x69, 0x30, 0x31, 0x43, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x43, 0x46, 0x07, 0x75, 0x6e, + 0x69, 0x30, 0x31, 0x44, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x44, 0x31, 0x07, 0x75, 0x6e, + 0x69, 0x30, 0x31, 0x44, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x44, 0x33, 0x07, 0x75, 0x6e, + 0x69, 0x30, 0x31, 0x44, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x44, 0x35, 0x07, 0x75, 0x6e, + 0x69, 0x30, 0x31, 0x44, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x44, 0x37, 0x07, 0x75, 0x6e, + 0x69, 0x30, 0x31, 0x44, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x44, 0x39, 0x07, 0x75, 0x6e, + 0x69, 0x30, 0x31, 0x44, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x44, 0x42, 0x07, 0x75, 0x6e, + 0x69, 0x30, 0x31, 0x44, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x44, 0x44, 0x07, 0x75, 0x6e, + 0x69, 0x30, 0x31, 0x44, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x44, 0x46, 0x07, 0x75, 0x6e, + 0x69, 0x30, 0x31, 0x45, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x45, 0x31, 0x07, 0x75, 0x6e, + 0x69, 0x30, 0x31, 0x45, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x45, 0x33, 0x07, 0x75, 0x6e, + 0x69, 0x30, 0x31, 0x45, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x45, 0x35, 0x06, 0x47, 0x63, + 0x61, 0x72, 0x6f, 0x6e, 0x06, 0x67, 0x63, 0x61, 0x72, 0x6f, 0x6e, 0x07, 0x75, 0x6e, 0x69, 0x30, + 0x31, 0x45, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x45, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x30, + 0x31, 0x45, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x45, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x30, + 0x31, 0x45, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x45, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x30, + 0x31, 0x45, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x45, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x30, + 0x31, 0x46, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x46, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, + 0x31, 0x46, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x46, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x30, + 0x31, 0x46, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x46, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x30, + 0x31, 0x46, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x46, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x30, + 0x31, 0x46, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x46, 0x39, 0x0a, 0x41, 0x72, 0x69, 0x6e, + 0x67, 0x61, 0x63, 0x75, 0x74, 0x65, 0x0a, 0x61, 0x72, 0x69, 0x6e, 0x67, 0x61, 0x63, 0x75, 0x74, + 0x65, 0x07, 0x41, 0x45, 0x61, 0x63, 0x75, 0x74, 0x65, 0x07, 0x61, 0x65, 0x61, 0x63, 0x75, 0x74, + 0x65, 0x0b, 0x4f, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x61, 0x63, 0x75, 0x74, 0x65, 0x0b, 0x6f, 0x73, + 0x6c, 0x61, 0x73, 0x68, 0x61, 0x63, 0x75, 0x74, 0x65, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x30, + 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x30, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x30, + 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x30, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x30, + 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x30, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x30, + 0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x30, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x30, + 0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x30, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x30, + 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x30, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x30, + 0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x30, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x30, + 0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x30, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x31, + 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x31, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x31, + 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x31, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x31, + 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x31, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x31, + 0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x31, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x31, + 0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x31, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x31, + 0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x31, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x32, + 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x32, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x32, + 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x32, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x32, + 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x32, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x32, + 0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x32, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x32, + 0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x32, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x32, + 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x32, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x32, + 0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x32, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x32, + 0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x32, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x33, + 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x33, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x33, + 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x33, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x33, + 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x33, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x33, + 0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x33, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x33, + 0x39, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x33, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x33, + 0x42, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x33, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x33, + 0x44, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x33, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x33, + 0x46, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x34, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x34, + 0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x34, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x34, + 0x33, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x34, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x34, + 0x35, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x34, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x34, + 0x37, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x34, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x34, + 0x39, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x34, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x34, + 0x42, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x34, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x34, + 0x44, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x34, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x34, + 0x46, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x39, 0x32, 0x0e, 0x62, 0x72, 0x65, 0x76, 0x65, 0x5f, + 0x69, 0x6e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x64, 0x0c, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x5f, + 0x67, 0x72, 0x61, 0x76, 0x65, 0x0a, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x61, 0x63, 0x75, 0x74, 0x65, + 0x0f, 0x64, 0x69, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x5f, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x6e, + 0x0a, 0x64, 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x6e, 0x0e, 0x64, 0x69, 0x65, 0x72, + 0x65, 0x73, 0x69, 0x73, 0x5f, 0x67, 0x72, 0x61, 0x76, 0x65, 0x0e, 0x64, 0x69, 0x65, 0x72, 0x65, + 0x73, 0x69, 0x73, 0x5f, 0x61, 0x63, 0x75, 0x74, 0x65, 0x0e, 0x64, 0x69, 0x65, 0x72, 0x65, 0x73, + 0x69, 0x73, 0x5f, 0x62, 0x72, 0x65, 0x76, 0x65, 0x0c, 0x74, 0x69, 0x6c, 0x64, 0x65, 0x5f, 0x6d, + 0x61, 0x63, 0x72, 0x6f, 0x6e, 0x09, 0x61, 0x63, 0x75, 0x74, 0x65, 0x2e, 0x61, 0x73, 0x63, 0x0e, + 0x63, 0x69, 0x72, 0x63, 0x75, 0x6d, 0x66, 0x6c, 0x65, 0x78, 0x2e, 0x61, 0x73, 0x63, 0x09, 0x63, + 0x61, 0x72, 0x6f, 0x6e, 0x2e, 0x61, 0x73, 0x63, 0x12, 0x64, 0x69, 0x65, 0x72, 0x65, 0x73, 0x69, + 0x73, 0x5f, 0x67, 0x72, 0x61, 0x76, 0x65, 0x2e, 0x63, 0x61, 0x70, 0x12, 0x64, 0x69, 0x65, 0x72, + 0x65, 0x73, 0x69, 0x73, 0x5f, 0x61, 0x63, 0x75, 0x74, 0x65, 0x2e, 0x63, 0x61, 0x70, 0x12, 0x64, + 0x69, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x5f, 0x62, 0x72, 0x65, 0x76, 0x65, 0x2e, 0x63, 0x61, + 0x70, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x30, 0x30, 0x09, 0x61, 0x66, 0x69, 0x69, 0x31, 0x30, + 0x30, 0x32, 0x33, 0x09, 0x61, 0x66, 0x69, 0x69, 0x31, 0x30, 0x30, 0x35, 0x31, 0x09, 0x61, 0x66, + 0x69, 0x69, 0x31, 0x30, 0x30, 0x35, 0x32, 0x09, 0x61, 0x66, 0x69, 0x69, 0x31, 0x30, 0x30, 0x35, + 0x33, 0x09, 0x61, 0x66, 0x69, 0x69, 0x31, 0x30, 0x30, 0x35, 0x34, 0x09, 0x61, 0x66, 0x69, 0x69, + 0x31, 0x30, 0x30, 0x35, 0x35, 0x09, 0x61, 0x66, 0x69, 0x69, 0x31, 0x30, 0x30, 0x35, 0x36, 0x09, + 0x61, 0x66, 0x69, 0x69, 0x31, 0x30, 0x30, 0x35, 0x37, 0x09, 0x61, 0x66, 0x69, 0x69, 0x31, 0x30, + 0x30, 0x35, 0x38, 0x09, 0x61, 0x66, 0x69, 0x69, 0x31, 0x30, 0x30, 0x35, 0x39, 0x09, 0x61, 0x66, + 0x69, 0x69, 0x31, 0x30, 0x30, 0x36, 0x30, 0x09, 0x61, 0x66, 0x69, 0x69, 0x31, 0x30, 0x30, 0x36, + 0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x30, 0x44, 0x09, 0x61, 0x66, 0x69, 0x69, 0x31, 0x30, + 0x30, 0x36, 0x32, 0x09, 0x61, 0x66, 0x69, 0x69, 0x31, 0x30, 0x31, 0x34, 0x35, 0x09, 0x61, 0x66, + 0x69, 0x69, 0x31, 0x30, 0x30, 0x31, 0x37, 0x09, 0x61, 0x66, 0x69, 0x69, 0x31, 0x30, 0x30, 0x31, + 0x38, 0x09, 0x61, 0x66, 0x69, 0x69, 0x31, 0x30, 0x30, 0x31, 0x39, 0x09, 0x61, 0x66, 0x69, 0x69, + 0x31, 0x30, 0x30, 0x32, 0x30, 0x09, 0x61, 0x66, 0x69, 0x69, 0x31, 0x30, 0x30, 0x32, 0x31, 0x09, + 0x61, 0x66, 0x69, 0x69, 0x31, 0x30, 0x30, 0x32, 0x32, 0x09, 0x61, 0x66, 0x69, 0x69, 0x31, 0x30, + 0x30, 0x32, 0x34, 0x09, 0x61, 0x66, 0x69, 0x69, 0x31, 0x30, 0x30, 0x32, 0x35, 0x09, 0x61, 0x66, + 0x69, 0x69, 0x31, 0x30, 0x30, 0x32, 0x36, 0x09, 0x61, 0x66, 0x69, 0x69, 0x31, 0x30, 0x30, 0x32, + 0x37, 0x09, 0x61, 0x66, 0x69, 0x69, 0x31, 0x30, 0x30, 0x32, 0x38, 0x09, 0x61, 0x66, 0x69, 0x69, + 0x31, 0x30, 0x30, 0x32, 0x39, 0x09, 0x61, 0x66, 0x69, 0x69, 0x31, 0x30, 0x30, 0x33, 0x30, 0x09, + 0x61, 0x66, 0x69, 0x69, 0x31, 0x30, 0x30, 0x33, 0x31, 0x09, 0x61, 0x66, 0x69, 0x69, 0x31, 0x30, + 0x30, 0x33, 0x32, 0x09, 0x61, 0x66, 0x69, 0x69, 0x31, 0x30, 0x30, 0x33, 0x33, 0x09, 0x61, 0x66, + 0x69, 0x69, 0x31, 0x30, 0x30, 0x33, 0x34, 0x09, 0x61, 0x66, 0x69, 0x69, 0x31, 0x30, 0x30, 0x33, + 0x35, 0x09, 0x61, 0x66, 0x69, 0x69, 0x31, 0x30, 0x30, 0x33, 0x36, 0x09, 0x61, 0x66, 0x69, 0x69, + 0x31, 0x30, 0x30, 0x33, 0x37, 0x09, 0x61, 0x66, 0x69, 0x69, 0x31, 0x30, 0x30, 0x33, 0x38, 0x09, + 0x61, 0x66, 0x69, 0x69, 0x31, 0x30, 0x30, 0x33, 0x39, 0x09, 0x61, 0x66, 0x69, 0x69, 0x31, 0x30, + 0x30, 0x34, 0x30, 0x09, 0x61, 0x66, 0x69, 0x69, 0x31, 0x30, 0x30, 0x34, 0x31, 0x09, 0x61, 0x66, + 0x69, 0x69, 0x31, 0x30, 0x30, 0x34, 0x32, 0x09, 0x61, 0x66, 0x69, 0x69, 0x31, 0x30, 0x30, 0x34, + 0x33, 0x09, 0x61, 0x66, 0x69, 0x69, 0x31, 0x30, 0x30, 0x34, 0x34, 0x09, 0x61, 0x66, 0x69, 0x69, + 0x31, 0x30, 0x30, 0x34, 0x35, 0x09, 0x61, 0x66, 0x69, 0x69, 0x31, 0x30, 0x30, 0x34, 0x36, 0x09, + 0x61, 0x66, 0x69, 0x69, 0x31, 0x30, 0x30, 0x34, 0x37, 0x09, 0x61, 0x66, 0x69, 0x69, 0x31, 0x30, + 0x30, 0x34, 0x38, 0x09, 0x61, 0x66, 0x69, 0x69, 0x31, 0x30, 0x30, 0x34, 0x39, 0x09, 0x61, 0x66, + 0x69, 0x69, 0x31, 0x30, 0x30, 0x36, 0x35, 0x09, 0x61, 0x66, 0x69, 0x69, 0x31, 0x30, 0x30, 0x36, + 0x36, 0x09, 0x61, 0x66, 0x69, 0x69, 0x31, 0x30, 0x30, 0x36, 0x37, 0x09, 0x61, 0x66, 0x69, 0x69, + 0x31, 0x30, 0x30, 0x36, 0x38, 0x09, 0x61, 0x66, 0x69, 0x69, 0x31, 0x30, 0x30, 0x36, 0x39, 0x09, + 0x61, 0x66, 0x69, 0x69, 0x31, 0x30, 0x30, 0x37, 0x30, 0x09, 0x61, 0x66, 0x69, 0x69, 0x31, 0x30, + 0x30, 0x37, 0x32, 0x09, 0x61, 0x66, 0x69, 0x69, 0x31, 0x30, 0x30, 0x37, 0x33, 0x09, 0x61, 0x66, + 0x69, 0x69, 0x31, 0x30, 0x30, 0x37, 0x34, 0x09, 0x61, 0x66, 0x69, 0x69, 0x31, 0x30, 0x30, 0x37, + 0x35, 0x09, 0x61, 0x66, 0x69, 0x69, 0x31, 0x30, 0x30, 0x37, 0x36, 0x09, 0x61, 0x66, 0x69, 0x69, + 0x31, 0x30, 0x30, 0x37, 0x37, 0x09, 0x61, 0x66, 0x69, 0x69, 0x31, 0x30, 0x30, 0x37, 0x38, 0x09, + 0x61, 0x66, 0x69, 0x69, 0x31, 0x30, 0x30, 0x37, 0x39, 0x09, 0x61, 0x66, 0x69, 0x69, 0x31, 0x30, + 0x30, 0x38, 0x30, 0x09, 0x61, 0x66, 0x69, 0x69, 0x31, 0x30, 0x30, 0x38, 0x31, 0x09, 0x61, 0x66, + 0x69, 0x69, 0x31, 0x30, 0x30, 0x38, 0x32, 0x09, 0x61, 0x66, 0x69, 0x69, 0x31, 0x30, 0x30, 0x38, + 0x33, 0x09, 0x61, 0x66, 0x69, 0x69, 0x31, 0x30, 0x30, 0x38, 0x34, 0x09, 0x61, 0x66, 0x69, 0x69, + 0x31, 0x30, 0x30, 0x38, 0x35, 0x09, 0x61, 0x66, 0x69, 0x69, 0x31, 0x30, 0x30, 0x38, 0x36, 0x09, + 0x61, 0x66, 0x69, 0x69, 0x31, 0x30, 0x30, 0x38, 0x37, 0x09, 0x61, 0x66, 0x69, 0x69, 0x31, 0x30, + 0x30, 0x38, 0x38, 0x09, 0x61, 0x66, 0x69, 0x69, 0x31, 0x30, 0x30, 0x38, 0x39, 0x09, 0x61, 0x66, + 0x69, 0x69, 0x31, 0x30, 0x30, 0x39, 0x30, 0x09, 0x61, 0x66, 0x69, 0x69, 0x31, 0x30, 0x30, 0x39, + 0x31, 0x09, 0x61, 0x66, 0x69, 0x69, 0x31, 0x30, 0x30, 0x39, 0x32, 0x09, 0x61, 0x66, 0x69, 0x69, + 0x31, 0x30, 0x30, 0x39, 0x33, 0x09, 0x61, 0x66, 0x69, 0x69, 0x31, 0x30, 0x30, 0x39, 0x34, 0x09, + 0x61, 0x66, 0x69, 0x69, 0x31, 0x30, 0x30, 0x39, 0x35, 0x09, 0x61, 0x66, 0x69, 0x69, 0x31, 0x30, + 0x30, 0x39, 0x36, 0x09, 0x61, 0x66, 0x69, 0x69, 0x31, 0x30, 0x30, 0x39, 0x37, 0x07, 0x75, 0x6e, + 0x69, 0x30, 0x34, 0x35, 0x30, 0x09, 0x61, 0x66, 0x69, 0x69, 0x31, 0x30, 0x30, 0x37, 0x31, 0x09, + 0x61, 0x66, 0x69, 0x69, 0x31, 0x30, 0x30, 0x39, 0x39, 0x09, 0x61, 0x66, 0x69, 0x69, 0x31, 0x30, + 0x31, 0x30, 0x30, 0x09, 0x61, 0x66, 0x69, 0x69, 0x31, 0x30, 0x31, 0x30, 0x31, 0x09, 0x61, 0x66, + 0x69, 0x69, 0x31, 0x30, 0x31, 0x30, 0x32, 0x09, 0x61, 0x66, 0x69, 0x69, 0x31, 0x30, 0x31, 0x30, + 0x33, 0x09, 0x61, 0x66, 0x69, 0x69, 0x31, 0x30, 0x31, 0x30, 0x34, 0x09, 0x61, 0x66, 0x69, 0x69, + 0x31, 0x30, 0x31, 0x30, 0x35, 0x09, 0x61, 0x66, 0x69, 0x69, 0x31, 0x30, 0x31, 0x30, 0x36, 0x09, + 0x61, 0x66, 0x69, 0x69, 0x31, 0x30, 0x31, 0x30, 0x37, 0x09, 0x61, 0x66, 0x69, 0x69, 0x31, 0x30, + 0x31, 0x30, 0x38, 0x09, 0x61, 0x66, 0x69, 0x69, 0x31, 0x30, 0x31, 0x30, 0x39, 0x07, 0x75, 0x6e, + 0x69, 0x30, 0x34, 0x35, 0x44, 0x09, 0x61, 0x66, 0x69, 0x69, 0x31, 0x30, 0x31, 0x31, 0x30, 0x09, + 0x61, 0x66, 0x69, 0x69, 0x31, 0x30, 0x31, 0x39, 0x33, 0x0e, 0x61, 0x66, 0x69, 0x69, 0x31, 0x30, + 0x30, 0x36, 0x36, 0x2e, 0x6c, 0x6f, 0x63, 0x6c, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x36, 0x32, + 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x36, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x37, 0x32, + 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x37, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x37, 0x34, + 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x37, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x38, 0x41, + 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x38, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x38, 0x43, + 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x38, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x38, 0x45, + 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x38, 0x46, 0x09, 0x61, 0x66, 0x69, 0x69, 0x31, 0x30, 0x30, + 0x35, 0x30, 0x09, 0x61, 0x66, 0x69, 0x69, 0x31, 0x30, 0x30, 0x39, 0x38, 0x07, 0x75, 0x6e, 0x69, + 0x30, 0x34, 0x39, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x39, 0x33, 0x07, 0x75, 0x6e, 0x69, + 0x30, 0x34, 0x39, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x39, 0x35, 0x07, 0x75, 0x6e, 0x69, + 0x30, 0x34, 0x39, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x39, 0x37, 0x07, 0x75, 0x6e, 0x69, + 0x30, 0x34, 0x39, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x39, 0x39, 0x07, 0x75, 0x6e, 0x69, + 0x30, 0x34, 0x39, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x39, 0x42, 0x07, 0x75, 0x6e, 0x69, + 0x30, 0x34, 0x39, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x39, 0x44, 0x07, 0x75, 0x6e, 0x69, + 0x30, 0x34, 0x39, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x39, 0x46, 0x07, 0x75, 0x6e, 0x69, + 0x30, 0x34, 0x41, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x41, 0x31, 0x07, 0x75, 0x6e, 0x69, + 0x30, 0x34, 0x41, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x41, 0x33, 0x07, 0x75, 0x6e, 0x69, + 0x30, 0x34, 0x41, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x41, 0x35, 0x07, 0x75, 0x6e, 0x69, + 0x30, 0x34, 0x41, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x41, 0x37, 0x07, 0x75, 0x6e, 0x69, + 0x30, 0x34, 0x41, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x41, 0x39, 0x07, 0x75, 0x6e, 0x69, + 0x30, 0x34, 0x41, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x41, 0x42, 0x07, 0x75, 0x6e, 0x69, + 0x30, 0x34, 0x41, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x41, 0x44, 0x07, 0x75, 0x6e, 0x69, + 0x30, 0x34, 0x41, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x41, 0x46, 0x07, 0x75, 0x6e, 0x69, + 0x30, 0x34, 0x42, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x42, 0x31, 0x07, 0x75, 0x6e, 0x69, + 0x30, 0x34, 0x42, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x42, 0x33, 0x07, 0x75, 0x6e, 0x69, + 0x30, 0x34, 0x42, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x42, 0x35, 0x07, 0x75, 0x6e, 0x69, + 0x30, 0x34, 0x42, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x42, 0x37, 0x07, 0x75, 0x6e, 0x69, + 0x30, 0x34, 0x42, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x42, 0x39, 0x07, 0x75, 0x6e, 0x69, + 0x30, 0x34, 0x42, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x42, 0x42, 0x07, 0x75, 0x6e, 0x69, + 0x30, 0x34, 0x42, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x42, 0x44, 0x07, 0x75, 0x6e, 0x69, + 0x30, 0x34, 0x42, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x42, 0x46, 0x07, 0x75, 0x6e, 0x69, + 0x30, 0x34, 0x43, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x43, 0x31, 0x07, 0x75, 0x6e, 0x69, + 0x30, 0x34, 0x43, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x43, 0x33, 0x07, 0x75, 0x6e, 0x69, + 0x30, 0x34, 0x43, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x43, 0x35, 0x07, 0x75, 0x6e, 0x69, + 0x30, 0x34, 0x43, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x43, 0x37, 0x07, 0x75, 0x6e, 0x69, + 0x30, 0x34, 0x43, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x43, 0x39, 0x07, 0x75, 0x6e, 0x69, + 0x30, 0x34, 0x43, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x43, 0x42, 0x07, 0x75, 0x6e, 0x69, + 0x30, 0x34, 0x43, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x43, 0x44, 0x07, 0x75, 0x6e, 0x69, + 0x30, 0x34, 0x43, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x43, 0x46, 0x07, 0x75, 0x6e, 0x69, + 0x30, 0x34, 0x44, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x44, 0x31, 0x07, 0x75, 0x6e, 0x69, + 0x30, 0x34, 0x44, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x44, 0x33, 0x07, 0x75, 0x6e, 0x69, + 0x30, 0x34, 0x44, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x44, 0x35, 0x07, 0x75, 0x6e, 0x69, + 0x30, 0x34, 0x44, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x44, 0x37, 0x07, 0x75, 0x6e, 0x69, + 0x30, 0x34, 0x44, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x44, 0x39, 0x07, 0x75, 0x6e, 0x69, + 0x30, 0x34, 0x44, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x44, 0x42, 0x07, 0x75, 0x6e, 0x69, + 0x30, 0x34, 0x44, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x44, 0x44, 0x07, 0x75, 0x6e, 0x69, + 0x30, 0x34, 0x44, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x44, 0x46, 0x07, 0x75, 0x6e, 0x69, + 0x30, 0x34, 0x45, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x45, 0x31, 0x07, 0x75, 0x6e, 0x69, + 0x30, 0x34, 0x45, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x45, 0x33, 0x07, 0x75, 0x6e, 0x69, + 0x30, 0x34, 0x45, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x45, 0x35, 0x07, 0x75, 0x6e, 0x69, + 0x30, 0x34, 0x45, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x45, 0x37, 0x07, 0x75, 0x6e, 0x69, + 0x30, 0x34, 0x45, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x45, 0x39, 0x07, 0x75, 0x6e, 0x69, + 0x30, 0x34, 0x45, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x45, 0x42, 0x07, 0x75, 0x6e, 0x69, + 0x30, 0x34, 0x45, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x45, 0x44, 0x07, 0x75, 0x6e, 0x69, + 0x30, 0x34, 0x45, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x45, 0x46, 0x07, 0x75, 0x6e, 0x69, + 0x30, 0x34, 0x46, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x46, 0x31, 0x07, 0x75, 0x6e, 0x69, + 0x30, 0x34, 0x46, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x46, 0x33, 0x07, 0x75, 0x6e, 0x69, + 0x30, 0x34, 0x46, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x46, 0x35, 0x07, 0x75, 0x6e, 0x69, + 0x30, 0x34, 0x46, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x46, 0x37, 0x07, 0x75, 0x6e, 0x69, + 0x30, 0x34, 0x46, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x46, 0x39, 0x09, 0x61, 0x66, 0x69, + 0x69, 0x36, 0x31, 0x33, 0x35, 0x32, 0x09, 0x61, 0x66, 0x69, 0x69, 0x30, 0x30, 0x32, 0x30, 0x38, + 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x42, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x41, 0x45, + 0x05, 0x74, 0x65, 0x6e, 0x67, 0x65, 0x06, 0x72, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x06, 0x6b, 0x72, + 0x61, 0x74, 0x6b, 0x61, 0x05, 0x41, 0x6c, 0x70, 0x68, 0x61, 0x04, 0x42, 0x65, 0x74, 0x61, 0x05, + 0x47, 0x61, 0x6d, 0x6d, 0x61, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x39, 0x34, 0x07, 0x45, 0x70, + 0x73, 0x69, 0x6c, 0x6f, 0x6e, 0x04, 0x5a, 0x65, 0x74, 0x61, 0x03, 0x45, 0x74, 0x61, 0x05, 0x54, + 0x68, 0x65, 0x74, 0x61, 0x04, 0x49, 0x6f, 0x74, 0x61, 0x05, 0x4b, 0x61, 0x70, 0x70, 0x61, 0x06, + 0x4c, 0x61, 0x6d, 0x62, 0x64, 0x61, 0x02, 0x4d, 0x75, 0x02, 0x4e, 0x75, 0x02, 0x58, 0x69, 0x07, + 0x4f, 0x6d, 0x69, 0x63, 0x72, 0x6f, 0x6e, 0x02, 0x50, 0x69, 0x03, 0x52, 0x68, 0x6f, 0x05, 0x53, + 0x69, 0x67, 0x6d, 0x61, 0x03, 0x54, 0x61, 0x75, 0x07, 0x55, 0x70, 0x73, 0x69, 0x6c, 0x6f, 0x6e, + 0x03, 0x50, 0x68, 0x69, 0x03, 0x43, 0x68, 0x69, 0x03, 0x50, 0x73, 0x69, 0x05, 0x61, 0x6c, 0x70, + 0x68, 0x61, 0x04, 0x62, 0x65, 0x74, 0x61, 0x05, 0x67, 0x61, 0x6d, 0x6d, 0x61, 0x05, 0x64, 0x65, + 0x6c, 0x74, 0x61, 0x07, 0x65, 0x70, 0x73, 0x69, 0x6c, 0x6f, 0x6e, 0x04, 0x7a, 0x65, 0x74, 0x61, + 0x03, 0x65, 0x74, 0x61, 0x05, 0x74, 0x68, 0x65, 0x74, 0x61, 0x04, 0x69, 0x6f, 0x74, 0x61, 0x05, + 0x6b, 0x61, 0x70, 0x70, 0x61, 0x06, 0x6c, 0x61, 0x6d, 0x62, 0x64, 0x61, 0x07, 0x75, 0x6e, 0x69, + 0x30, 0x33, 0x42, 0x43, 0x02, 0x6e, 0x75, 0x02, 0x78, 0x69, 0x07, 0x6f, 0x6d, 0x69, 0x63, 0x72, + 0x6f, 0x6e, 0x03, 0x72, 0x68, 0x6f, 0x06, 0x73, 0x69, 0x67, 0x6d, 0x61, 0x31, 0x05, 0x73, 0x69, + 0x67, 0x6d, 0x61, 0x03, 0x74, 0x61, 0x75, 0x07, 0x75, 0x70, 0x73, 0x69, 0x6c, 0x6f, 0x6e, 0x03, + 0x70, 0x68, 0x69, 0x03, 0x63, 0x68, 0x69, 0x03, 0x70, 0x73, 0x69, 0x05, 0x6f, 0x6d, 0x65, 0x67, + 0x61, 0x0a, 0x41, 0x6c, 0x70, 0x68, 0x61, 0x74, 0x6f, 0x6e, 0x6f, 0x73, 0x0c, 0x45, 0x70, 0x73, + 0x69, 0x6c, 0x6f, 0x6e, 0x74, 0x6f, 0x6e, 0x6f, 0x73, 0x08, 0x45, 0x74, 0x61, 0x74, 0x6f, 0x6e, + 0x6f, 0x73, 0x09, 0x49, 0x6f, 0x74, 0x61, 0x74, 0x6f, 0x6e, 0x6f, 0x73, 0x0c, 0x49, 0x6f, 0x74, + 0x61, 0x64, 0x69, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x0c, 0x4f, 0x6d, 0x69, 0x63, 0x72, 0x6f, + 0x6e, 0x74, 0x6f, 0x6e, 0x6f, 0x73, 0x0c, 0x55, 0x70, 0x73, 0x69, 0x6c, 0x6f, 0x6e, 0x74, 0x6f, + 0x6e, 0x6f, 0x73, 0x0f, 0x55, 0x70, 0x73, 0x69, 0x6c, 0x6f, 0x6e, 0x64, 0x69, 0x65, 0x72, 0x65, + 0x73, 0x69, 0x73, 0x0a, 0x4f, 0x6d, 0x65, 0x67, 0x61, 0x74, 0x6f, 0x6e, 0x6f, 0x73, 0x0a, 0x61, + 0x6c, 0x70, 0x68, 0x61, 0x74, 0x6f, 0x6e, 0x6f, 0x73, 0x0c, 0x65, 0x70, 0x73, 0x69, 0x6c, 0x6f, + 0x6e, 0x74, 0x6f, 0x6e, 0x6f, 0x73, 0x08, 0x65, 0x74, 0x61, 0x74, 0x6f, 0x6e, 0x6f, 0x73, 0x09, + 0x69, 0x6f, 0x74, 0x61, 0x74, 0x6f, 0x6e, 0x6f, 0x73, 0x0c, 0x69, 0x6f, 0x74, 0x61, 0x64, 0x69, + 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x11, 0x69, 0x6f, 0x74, 0x61, 0x64, 0x69, 0x65, 0x72, 0x65, + 0x73, 0x69, 0x73, 0x74, 0x6f, 0x6e, 0x6f, 0x73, 0x0c, 0x6f, 0x6d, 0x69, 0x63, 0x72, 0x6f, 0x6e, + 0x74, 0x6f, 0x6e, 0x6f, 0x73, 0x0f, 0x75, 0x70, 0x73, 0x69, 0x6c, 0x6f, 0x6e, 0x64, 0x69, 0x65, + 0x72, 0x65, 0x73, 0x69, 0x73, 0x0c, 0x75, 0x70, 0x73, 0x69, 0x6c, 0x6f, 0x6e, 0x74, 0x6f, 0x6e, + 0x6f, 0x73, 0x14, 0x75, 0x70, 0x73, 0x69, 0x6c, 0x6f, 0x6e, 0x64, 0x69, 0x65, 0x72, 0x65, 0x73, + 0x69, 0x73, 0x74, 0x6f, 0x6e, 0x6f, 0x73, 0x0a, 0x6f, 0x6d, 0x65, 0x67, 0x61, 0x74, 0x6f, 0x6e, + 0x6f, 0x73, 0x05, 0x74, 0x6f, 0x6e, 0x6f, 0x73, 0x09, 0x74, 0x6f, 0x6e, 0x6f, 0x73, 0x2e, 0x63, + 0x61, 0x70, 0x0d, 0x64, 0x69, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x74, 0x6f, 0x6e, 0x6f, 0x73, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x30, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x30, 0x31, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x30, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x30, 0x33, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x30, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x30, 0x35, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x30, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x30, 0x37, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x30, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x30, 0x39, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x30, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x30, 0x42, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x30, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x30, 0x44, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x30, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x30, 0x46, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x31, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x31, 0x31, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x31, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x31, 0x33, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x31, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x31, 0x35, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x31, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x31, 0x39, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x31, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x31, 0x42, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x31, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x31, 0x44, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x32, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x32, 0x31, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x32, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x32, 0x33, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x32, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x32, 0x35, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x32, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x32, 0x37, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x32, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x32, 0x39, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x32, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x32, 0x42, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x32, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x32, 0x44, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x32, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x32, 0x46, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x33, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x33, 0x31, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x33, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x33, 0x33, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x33, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x33, 0x35, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x33, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x33, 0x37, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x33, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x33, 0x39, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x33, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x33, 0x42, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x33, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x33, 0x44, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x33, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x33, 0x46, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x34, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x34, 0x31, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x34, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x34, 0x33, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x34, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x34, 0x35, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x34, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x34, 0x39, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x34, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x34, 0x42, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x34, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x34, 0x44, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x35, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x35, 0x31, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x35, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x35, 0x33, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x35, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x35, 0x35, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x35, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x35, 0x37, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x35, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x35, 0x42, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x35, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x35, 0x46, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x36, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x36, 0x31, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x36, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x36, 0x33, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x36, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x36, 0x35, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x36, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x36, 0x37, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x36, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x36, 0x39, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x36, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x36, 0x42, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x36, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x36, 0x44, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x36, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x36, 0x46, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x37, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x37, 0x31, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x37, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x37, 0x33, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x37, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x37, 0x35, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x37, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x37, 0x37, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x37, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x37, 0x39, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x37, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x37, 0x42, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x37, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x37, 0x44, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x38, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x38, 0x31, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x38, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x38, 0x33, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x38, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x38, 0x35, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x38, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x38, 0x37, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x38, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x38, 0x39, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x38, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x38, 0x42, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x38, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x38, 0x44, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x38, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x38, 0x46, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x39, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x39, 0x31, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x39, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x39, 0x33, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x39, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x39, 0x35, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x39, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x39, 0x37, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x39, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x39, 0x39, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x39, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x39, 0x42, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x39, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x39, 0x44, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x39, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x39, 0x46, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x41, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x41, 0x31, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x41, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x41, 0x33, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x41, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x41, 0x35, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x41, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x41, 0x37, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x41, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x41, 0x39, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x41, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x41, 0x42, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x41, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x41, 0x44, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x41, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x41, 0x46, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x42, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x42, 0x31, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x42, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x42, 0x33, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x42, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x42, 0x36, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x42, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x42, 0x38, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x42, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x42, 0x41, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x42, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x42, 0x43, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x42, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x42, 0x45, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x42, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x43, 0x30, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x43, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x43, 0x32, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x43, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x43, 0x34, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x43, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x43, 0x37, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x43, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x43, 0x39, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x43, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x43, 0x42, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x43, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x43, 0x44, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x43, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x43, 0x46, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x44, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x44, 0x31, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x44, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x44, 0x33, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x44, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x44, 0x37, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x44, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x44, 0x39, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x44, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x44, 0x42, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x44, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x44, 0x45, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x44, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x45, 0x30, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x45, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x45, 0x32, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x45, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x45, 0x34, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x45, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x45, 0x36, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x45, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x45, 0x38, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x45, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x45, 0x41, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x45, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x45, 0x43, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x45, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x45, 0x45, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x45, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x46, 0x32, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x46, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x46, 0x34, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x46, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x46, 0x37, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x46, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x46, 0x39, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x46, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x46, 0x42, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x46, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x46, 0x44, + 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x46, 0x45, 0x0b, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x38, 0x38, + 0x2e, 0x61, 0x6c, 0x74, 0x0b, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x38, 0x39, 0x2e, 0x61, 0x6c, 0x74, + 0x0b, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x38, 0x41, 0x2e, 0x61, 0x6c, 0x74, 0x0b, 0x75, 0x6e, 0x69, + 0x31, 0x46, 0x38, 0x42, 0x2e, 0x61, 0x6c, 0x74, 0x0b, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x38, 0x43, + 0x2e, 0x61, 0x6c, 0x74, 0x0b, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x38, 0x44, 0x2e, 0x61, 0x6c, 0x74, + 0x0b, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x38, 0x45, 0x2e, 0x61, 0x6c, 0x74, 0x0b, 0x75, 0x6e, 0x69, + 0x31, 0x46, 0x38, 0x46, 0x2e, 0x61, 0x6c, 0x74, 0x0b, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x39, 0x38, + 0x2e, 0x61, 0x6c, 0x74, 0x0b, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x39, 0x39, 0x2e, 0x61, 0x6c, 0x74, + 0x0b, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x39, 0x41, 0x2e, 0x61, 0x6c, 0x74, 0x0b, 0x75, 0x6e, 0x69, + 0x31, 0x46, 0x39, 0x42, 0x2e, 0x61, 0x6c, 0x74, 0x0b, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x39, 0x43, + 0x2e, 0x61, 0x6c, 0x74, 0x0b, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x39, 0x44, 0x2e, 0x61, 0x6c, 0x74, + 0x0b, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x39, 0x45, 0x2e, 0x61, 0x6c, 0x74, 0x0b, 0x75, 0x6e, 0x69, + 0x31, 0x46, 0x39, 0x46, 0x2e, 0x61, 0x6c, 0x74, 0x0b, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x41, 0x38, + 0x2e, 0x61, 0x6c, 0x74, 0x0b, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x41, 0x39, 0x2e, 0x61, 0x6c, 0x74, + 0x0b, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x41, 0x41, 0x2e, 0x61, 0x6c, 0x74, 0x0b, 0x75, 0x6e, 0x69, + 0x31, 0x46, 0x41, 0x42, 0x2e, 0x61, 0x6c, 0x74, 0x0b, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x41, 0x43, + 0x2e, 0x61, 0x6c, 0x74, 0x0b, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x41, 0x44, 0x2e, 0x61, 0x6c, 0x74, + 0x0b, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x41, 0x45, 0x2e, 0x61, 0x6c, 0x74, 0x0b, 0x75, 0x6e, 0x69, + 0x31, 0x46, 0x41, 0x46, 0x2e, 0x61, 0x6c, 0x74, 0x0b, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x42, 0x43, + 0x2e, 0x61, 0x6c, 0x74, 0x0b, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x43, 0x43, 0x2e, 0x61, 0x6c, 0x74, + 0x0b, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x46, 0x43, 0x2e, 0x61, 0x6c, 0x74, 0x07, 0x75, 0x6e, 0x69, + 0x32, 0x30, 0x42, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x45, 0x30, 0x46, 0x46, 0x07, 0x75, 0x6e, 0x69, + 0x46, 0x30, 0x30, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x46, 0x46, 0x46, 0x44, 0x07, 0x75, 0x6e, 0x69, + 0x45, 0x46, 0x46, 0x44, 0x0c, 0x53, 0x46, 0x30, 0x34, 0x30, 0x30, 0x30, 0x30, 0x2e, 0x30, 0x30, + 0x31, 0x0c, 0x53, 0x46, 0x30, 0x32, 0x30, 0x30, 0x30, 0x30, 0x2e, 0x30, 0x30, 0x31, 0x0c, 0x53, + 0x46, 0x30, 0x31, 0x30, 0x30, 0x30, 0x30, 0x2e, 0x30, 0x30, 0x31, 0x0c, 0x53, 0x46, 0x31, 0x31, + 0x30, 0x30, 0x30, 0x30, 0x2e, 0x30, 0x30, 0x31, 0x0c, 0x53, 0x46, 0x31, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x2e, 0x30, 0x30, 0x31, 0x0c, 0x53, 0x46, 0x30, 0x39, 0x30, 0x30, 0x30, 0x30, 0x2e, 0x30, + 0x30, 0x31, 0x0c, 0x53, 0x46, 0x30, 0x36, 0x30, 0x30, 0x30, 0x30, 0x2e, 0x30, 0x30, 0x31, 0x0c, + 0x53, 0x46, 0x30, 0x37, 0x30, 0x30, 0x30, 0x30, 0x2e, 0x30, 0x30, 0x31, 0x0c, 0x53, 0x46, 0x30, + 0x38, 0x30, 0x30, 0x30, 0x30, 0x2e, 0x30, 0x30, 0x31, 0x0c, 0x53, 0x46, 0x30, 0x35, 0x30, 0x30, + 0x30, 0x30, 0x2e, 0x30, 0x30, 0x31, 0x0c, 0x53, 0x46, 0x35, 0x34, 0x30, 0x30, 0x30, 0x30, 0x2e, + 0x30, 0x30, 0x31, 0x0c, 0x53, 0x46, 0x35, 0x33, 0x30, 0x30, 0x30, 0x30, 0x2e, 0x30, 0x30, 0x31, + 0x0c, 0x53, 0x46, 0x30, 0x33, 0x30, 0x30, 0x30, 0x30, 0x2e, 0x30, 0x30, 0x31, 0x08, 0x53, 0x46, + 0x31, 0x39, 0x30, 0x30, 0x30, 0x30, 0x08, 0x53, 0x46, 0x33, 0x36, 0x30, 0x30, 0x30, 0x30, 0x08, + 0x53, 0x46, 0x34, 0x35, 0x30, 0x30, 0x30, 0x30, 0x08, 0x53, 0x46, 0x32, 0x38, 0x30, 0x30, 0x30, + 0x30, 0x08, 0x53, 0x46, 0x35, 0x30, 0x30, 0x30, 0x30, 0x30, 0x08, 0x53, 0x46, 0x34, 0x37, 0x30, + 0x30, 0x30, 0x30, 0x08, 0x53, 0x46, 0x32, 0x32, 0x30, 0x30, 0x30, 0x30, 0x08, 0x53, 0x46, 0x35, + 0x31, 0x30, 0x30, 0x30, 0x30, 0x08, 0x53, 0x46, 0x32, 0x34, 0x30, 0x30, 0x30, 0x30, 0x08, 0x53, + 0x46, 0x34, 0x34, 0x30, 0x30, 0x30, 0x30, 0x08, 0x53, 0x46, 0x32, 0x33, 0x30, 0x30, 0x30, 0x30, + 0x08, 0x53, 0x46, 0x34, 0x32, 0x30, 0x30, 0x30, 0x30, 0x08, 0x53, 0x46, 0x34, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x08, 0x53, 0x46, 0x32, 0x36, 0x30, 0x30, 0x30, 0x30, 0x08, 0x53, 0x46, 0x33, 0x38, + 0x30, 0x30, 0x30, 0x30, 0x08, 0x53, 0x46, 0x34, 0x31, 0x30, 0x30, 0x30, 0x30, 0x08, 0x53, 0x46, + 0x32, 0x35, 0x30, 0x30, 0x30, 0x30, 0x08, 0x53, 0x46, 0x33, 0x39, 0x30, 0x30, 0x30, 0x30, 0x08, + 0x53, 0x46, 0x34, 0x33, 0x30, 0x30, 0x30, 0x30, 0x08, 0x53, 0x46, 0x32, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x08, 0x53, 0x46, 0x33, 0x37, 0x30, 0x30, 0x30, 0x30, 0x08, 0x53, 0x46, 0x34, 0x36, 0x30, + 0x30, 0x30, 0x30, 0x08, 0x53, 0x46, 0x32, 0x37, 0x30, 0x30, 0x30, 0x30, 0x08, 0x53, 0x46, 0x34, + 0x39, 0x30, 0x30, 0x30, 0x30, 0x08, 0x53, 0x46, 0x34, 0x38, 0x30, 0x30, 0x30, 0x30, 0x08, 0x53, + 0x46, 0x32, 0x31, 0x30, 0x30, 0x30, 0x30, 0x08, 0x53, 0x46, 0x35, 0x32, 0x30, 0x30, 0x30, 0x30, + 0x05, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x07, 0x6c, 0x74, 0x73, 0x68, 0x61, 0x64, 0x65, 0x05, 0x73, + 0x68, 0x61, 0x64, 0x65, 0x07, 0x64, 0x6b, 0x73, 0x68, 0x61, 0x64, 0x65, 0x08, 0x53, 0x46, 0x35, + 0x33, 0x30, 0x30, 0x30, 0x30, 0x08, 0x53, 0x46, 0x35, 0x34, 0x30, 0x30, 0x30, 0x30, 0x08, 0x53, + 0x46, 0x30, 0x34, 0x30, 0x30, 0x30, 0x30, 0x08, 0x53, 0x46, 0x30, 0x32, 0x30, 0x30, 0x30, 0x30, + 0x08, 0x53, 0x46, 0x30, 0x31, 0x30, 0x30, 0x30, 0x30, 0x08, 0x53, 0x46, 0x31, 0x31, 0x30, 0x30, + 0x30, 0x30, 0x08, 0x53, 0x46, 0x31, 0x30, 0x30, 0x30, 0x30, 0x30, 0x08, 0x53, 0x46, 0x30, 0x39, + 0x30, 0x30, 0x30, 0x30, 0x08, 0x53, 0x46, 0x30, 0x36, 0x30, 0x30, 0x30, 0x30, 0x08, 0x53, 0x46, + 0x30, 0x37, 0x30, 0x30, 0x30, 0x30, 0x08, 0x53, 0x46, 0x30, 0x38, 0x30, 0x30, 0x30, 0x30, 0x08, + 0x53, 0x46, 0x30, 0x35, 0x30, 0x30, 0x30, 0x30, 0x08, 0x53, 0x46, 0x30, 0x33, 0x30, 0x30, 0x30, + 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x0a, 0x01, 0x74, 0x07, 0x16, 0x00, 0x03, 0x63, 0x79, 0x72, 0x6c, 0x00, 0x14, 0x67, 0x72, + 0x65, 0x6b, 0x00, 0x90, 0x6c, 0x61, 0x74, 0x6e, 0x00, 0xb0, 0x00, 0x16, 0x00, 0x03, 0x42, 0x47, + 0x52, 0x20, 0x00, 0x2e, 0x4d, 0x4b, 0x44, 0x20, 0x00, 0x48, 0x53, 0x52, 0x42, 0x20, 0x00, 0x62, + 0x00, 0x00, 0xff, 0xff, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x14, 0x00, 0x1f, 0x00, 0x30, + 0x00, 0x3e, 0x00, 0x4b, 0x00, 0x56, 0x00, 0x61, 0x00, 0x00, 0xff, 0xff, 0x00, 0x0a, 0x00, 0x01, + 0x00, 0x0c, 0x00, 0x15, 0x00, 0x20, 0x00, 0x2a, 0x00, 0x31, 0x00, 0x3f, 0x00, 0x4c, 0x00, 0x57, + 0x00, 0x62, 0x00, 0x00, 0xff, 0xff, 0x00, 0x0a, 0x00, 0x02, 0x00, 0x0d, 0x00, 0x16, 0x00, 0x21, + 0x00, 0x2b, 0x00, 0x32, 0x00, 0x40, 0x00, 0x4d, 0x00, 0x58, 0x00, 0x63, 0x00, 0x00, 0xff, 0xff, + 0x00, 0x0a, 0x00, 0x03, 0x00, 0x0e, 0x00, 0x17, 0x00, 0x22, 0x00, 0x2c, 0x00, 0x33, 0x00, 0x41, + 0x00, 0x4e, 0x00, 0x59, 0x00, 0x64, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x0b, + 0x00, 0x04, 0x00, 0x0f, 0x00, 0x18, 0x00, 0x23, 0x00, 0x34, 0x00, 0x3c, 0x00, 0x42, 0x00, 0x49, + 0x00, 0x4f, 0x00, 0x5a, 0x00, 0x65, 0x00, 0x22, 0x00, 0x05, 0x41, 0x5a, 0x45, 0x20, 0x00, 0x40, + 0x43, 0x52, 0x54, 0x20, 0x00, 0x5a, 0x4d, 0x4f, 0x4c, 0x20, 0x00, 0x74, 0x52, 0x4f, 0x4d, 0x20, + 0x00, 0x8a, 0x54, 0x52, 0x4b, 0x20, 0x00, 0xa0, 0x00, 0x00, 0xff, 0xff, 0x00, 0x0c, 0x00, 0x05, + 0x00, 0x10, 0x00, 0x19, 0x00, 0x24, 0x00, 0x35, 0x00, 0x3b, 0x00, 0x3d, 0x00, 0x43, 0x00, 0x4a, + 0x00, 0x50, 0x00, 0x5b, 0x00, 0x66, 0x00, 0x00, 0xff, 0xff, 0x00, 0x0a, 0x00, 0x06, 0x00, 0x11, + 0x00, 0x1a, 0x00, 0x25, 0x00, 0x2d, 0x00, 0x36, 0x00, 0x44, 0x00, 0x51, 0x00, 0x5c, 0x00, 0x67, + 0x00, 0x00, 0xff, 0xff, 0x00, 0x0a, 0x00, 0x07, 0x00, 0x12, 0x00, 0x1b, 0x00, 0x26, 0x00, 0x2e, + 0x00, 0x37, 0x00, 0x45, 0x00, 0x52, 0x00, 0x5d, 0x00, 0x68, 0x00, 0x00, 0xff, 0xff, 0x00, 0x08, + 0x00, 0x08, 0x00, 0x1c, 0x00, 0x27, 0x00, 0x38, 0x00, 0x46, 0x00, 0x53, 0x00, 0x5e, 0x00, 0x69, + 0x00, 0x00, 0xff, 0xff, 0x00, 0x08, 0x00, 0x09, 0x00, 0x1d, 0x00, 0x28, 0x00, 0x39, 0x00, 0x47, + 0x00, 0x54, 0x00, 0x5f, 0x00, 0x6a, 0x00, 0x00, 0xff, 0xff, 0x00, 0x0a, 0x00, 0x0a, 0x00, 0x13, + 0x00, 0x1e, 0x00, 0x29, 0x00, 0x2f, 0x00, 0x3a, 0x00, 0x48, 0x00, 0x55, 0x00, 0x60, 0x00, 0x6b, + 0x00, 0x6c, 0x61, 0x66, 0x72, 0x63, 0x02, 0x8a, 0x61, 0x66, 0x72, 0x63, 0x02, 0x94, 0x61, 0x66, + 0x72, 0x63, 0x02, 0x9e, 0x61, 0x66, 0x72, 0x63, 0x02, 0xa8, 0x61, 0x66, 0x72, 0x63, 0x02, 0xb2, + 0x61, 0x66, 0x72, 0x63, 0x02, 0xbc, 0x61, 0x66, 0x72, 0x63, 0x02, 0xc6, 0x61, 0x66, 0x72, 0x63, + 0x02, 0xd0, 0x61, 0x66, 0x72, 0x63, 0x02, 0xda, 0x61, 0x66, 0x72, 0x63, 0x02, 0xe4, 0x61, 0x66, + 0x72, 0x63, 0x02, 0xee, 0x63, 0x61, 0x73, 0x65, 0x02, 0xf8, 0x63, 0x61, 0x73, 0x65, 0x03, 0x00, + 0x63, 0x61, 0x73, 0x65, 0x03, 0x08, 0x63, 0x61, 0x73, 0x65, 0x03, 0x10, 0x63, 0x61, 0x73, 0x65, + 0x03, 0x18, 0x63, 0x61, 0x73, 0x65, 0x03, 0x20, 0x63, 0x61, 0x73, 0x65, 0x03, 0x28, 0x63, 0x61, + 0x73, 0x65, 0x03, 0x30, 0x63, 0x61, 0x73, 0x65, 0x03, 0x38, 0x64, 0x6e, 0x6f, 0x6d, 0x03, 0x40, + 0x64, 0x6e, 0x6f, 0x6d, 0x03, 0x46, 0x64, 0x6e, 0x6f, 0x6d, 0x03, 0x4c, 0x64, 0x6e, 0x6f, 0x6d, + 0x03, 0x52, 0x64, 0x6e, 0x6f, 0x6d, 0x03, 0x58, 0x64, 0x6e, 0x6f, 0x6d, 0x03, 0x5e, 0x64, 0x6e, + 0x6f, 0x6d, 0x03, 0x64, 0x64, 0x6e, 0x6f, 0x6d, 0x03, 0x6a, 0x64, 0x6e, 0x6f, 0x6d, 0x03, 0x70, + 0x64, 0x6e, 0x6f, 0x6d, 0x03, 0x76, 0x64, 0x6e, 0x6f, 0x6d, 0x03, 0x7c, 0x66, 0x72, 0x61, 0x63, + 0x03, 0x82, 0x66, 0x72, 0x61, 0x63, 0x03, 0x8a, 0x66, 0x72, 0x61, 0x63, 0x03, 0x92, 0x66, 0x72, + 0x61, 0x63, 0x03, 0x9a, 0x66, 0x72, 0x61, 0x63, 0x03, 0xa2, 0x66, 0x72, 0x61, 0x63, 0x03, 0xaa, + 0x66, 0x72, 0x61, 0x63, 0x03, 0xb2, 0x66, 0x72, 0x61, 0x63, 0x03, 0xba, 0x66, 0x72, 0x61, 0x63, + 0x03, 0xc2, 0x66, 0x72, 0x61, 0x63, 0x03, 0xca, 0x66, 0x72, 0x61, 0x63, 0x03, 0xd2, 0x6c, 0x6f, + 0x63, 0x6c, 0x03, 0xda, 0x6c, 0x6f, 0x63, 0x6c, 0x03, 0xe0, 0x6c, 0x6f, 0x63, 0x6c, 0x03, 0xe6, + 0x6c, 0x6f, 0x63, 0x6c, 0x03, 0xec, 0x6c, 0x6f, 0x63, 0x6c, 0x03, 0xf2, 0x6c, 0x6f, 0x63, 0x6c, + 0x03, 0xf8, 0x6e, 0x75, 0x6d, 0x72, 0x03, 0xfe, 0x6e, 0x75, 0x6d, 0x72, 0x04, 0x04, 0x6e, 0x75, + 0x6d, 0x72, 0x04, 0x0a, 0x6e, 0x75, 0x6d, 0x72, 0x04, 0x10, 0x6e, 0x75, 0x6d, 0x72, 0x04, 0x16, + 0x6e, 0x75, 0x6d, 0x72, 0x04, 0x1c, 0x6e, 0x75, 0x6d, 0x72, 0x04, 0x22, 0x6e, 0x75, 0x6d, 0x72, + 0x04, 0x28, 0x6e, 0x75, 0x6d, 0x72, 0x04, 0x2e, 0x6e, 0x75, 0x6d, 0x72, 0x04, 0x34, 0x6e, 0x75, + 0x6d, 0x72, 0x04, 0x3a, 0x6f, 0x72, 0x64, 0x6e, 0x04, 0x40, 0x73, 0x61, 0x6c, 0x74, 0x04, 0x46, + 0x73, 0x61, 0x6c, 0x74, 0x04, 0x50, 0x73, 0x69, 0x6e, 0x66, 0x04, 0x5a, 0x73, 0x69, 0x6e, 0x66, + 0x04, 0x60, 0x73, 0x69, 0x6e, 0x66, 0x04, 0x66, 0x73, 0x69, 0x6e, 0x66, 0x04, 0x6c, 0x73, 0x69, + 0x6e, 0x66, 0x04, 0x72, 0x73, 0x69, 0x6e, 0x66, 0x04, 0x78, 0x73, 0x69, 0x6e, 0x66, 0x04, 0x7e, + 0x73, 0x69, 0x6e, 0x66, 0x04, 0x84, 0x73, 0x69, 0x6e, 0x66, 0x04, 0x8a, 0x73, 0x69, 0x6e, 0x66, + 0x04, 0x90, 0x73, 0x69, 0x6e, 0x66, 0x04, 0x96, 0x73, 0x73, 0x30, 0x31, 0x04, 0x9c, 0x73, 0x73, + 0x30, 0x31, 0x04, 0xa6, 0x73, 0x73, 0x30, 0x32, 0x04, 0xb0, 0x73, 0x73, 0x30, 0x32, 0x04, 0xba, + 0x73, 0x73, 0x30, 0x32, 0x04, 0xc4, 0x73, 0x73, 0x30, 0x32, 0x04, 0xce, 0x73, 0x73, 0x30, 0x32, + 0x04, 0xd8, 0x73, 0x73, 0x30, 0x32, 0x04, 0xe2, 0x73, 0x73, 0x30, 0x32, 0x04, 0xec, 0x73, 0x73, + 0x30, 0x32, 0x04, 0xf6, 0x73, 0x73, 0x30, 0x32, 0x05, 0x00, 0x73, 0x73, 0x30, 0x32, 0x05, 0x0a, + 0x73, 0x73, 0x30, 0x32, 0x05, 0x14, 0x73, 0x75, 0x62, 0x73, 0x05, 0x1e, 0x73, 0x75, 0x62, 0x73, + 0x05, 0x24, 0x73, 0x75, 0x62, 0x73, 0x05, 0x2a, 0x73, 0x75, 0x62, 0x73, 0x05, 0x30, 0x73, 0x75, + 0x62, 0x73, 0x05, 0x36, 0x73, 0x75, 0x62, 0x73, 0x05, 0x3c, 0x73, 0x75, 0x62, 0x73, 0x05, 0x42, + 0x73, 0x75, 0x62, 0x73, 0x05, 0x48, 0x73, 0x75, 0x62, 0x73, 0x05, 0x4e, 0x73, 0x75, 0x62, 0x73, + 0x05, 0x54, 0x73, 0x75, 0x62, 0x73, 0x05, 0x5a, 0x73, 0x75, 0x70, 0x73, 0x05, 0x60, 0x73, 0x75, + 0x70, 0x73, 0x05, 0x66, 0x73, 0x75, 0x70, 0x73, 0x05, 0x6c, 0x73, 0x75, 0x70, 0x73, 0x05, 0x72, + 0x73, 0x75, 0x70, 0x73, 0x05, 0x78, 0x73, 0x75, 0x70, 0x73, 0x05, 0x7e, 0x73, 0x75, 0x70, 0x73, + 0x05, 0x84, 0x73, 0x75, 0x70, 0x73, 0x05, 0x8a, 0x73, 0x75, 0x70, 0x73, 0x05, 0x90, 0x73, 0x75, + 0x70, 0x73, 0x05, 0x96, 0x73, 0x75, 0x70, 0x73, 0x05, 0x9c, 0x00, 0x00, 0x00, 0x03, 0x00, 0x0e, + 0x00, 0x0f, 0x00, 0x10, 0x00, 0x00, 0x00, 0x03, 0x00, 0x0e, 0x00, 0x0f, 0x00, 0x10, 0x00, 0x00, + 0x00, 0x03, 0x00, 0x0e, 0x00, 0x0f, 0x00, 0x10, 0x00, 0x00, 0x00, 0x03, 0x00, 0x0e, 0x00, 0x0f, + 0x00, 0x10, 0x00, 0x00, 0x00, 0x03, 0x00, 0x0e, 0x00, 0x0f, 0x00, 0x10, 0x00, 0x00, 0x00, 0x03, + 0x00, 0x0e, 0x00, 0x0f, 0x00, 0x10, 0x00, 0x00, 0x00, 0x03, 0x00, 0x0e, 0x00, 0x0f, 0x00, 0x10, + 0x00, 0x00, 0x00, 0x03, 0x00, 0x0e, 0x00, 0x0f, 0x00, 0x10, 0x00, 0x00, 0x00, 0x03, 0x00, 0x0e, + 0x00, 0x0f, 0x00, 0x10, 0x00, 0x00, 0x00, 0x03, 0x00, 0x0e, 0x00, 0x0f, 0x00, 0x10, 0x00, 0x00, + 0x00, 0x03, 0x00, 0x0e, 0x00, 0x0f, 0x00, 0x10, 0x00, 0x00, 0x00, 0x02, 0x00, 0x11, 0x00, 0x12, + 0x00, 0x00, 0x00, 0x02, 0x00, 0x11, 0x00, 0x12, 0x00, 0x00, 0x00, 0x02, 0x00, 0x11, 0x00, 0x12, + 0x00, 0x00, 0x00, 0x02, 0x00, 0x11, 0x00, 0x12, 0x00, 0x00, 0x00, 0x02, 0x00, 0x11, 0x00, 0x12, + 0x00, 0x00, 0x00, 0x02, 0x00, 0x11, 0x00, 0x12, 0x00, 0x00, 0x00, 0x02, 0x00, 0x11, 0x00, 0x12, + 0x00, 0x00, 0x00, 0x02, 0x00, 0x11, 0x00, 0x12, 0x00, 0x00, 0x00, 0x02, 0x00, 0x11, 0x00, 0x12, + 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x00, 0x00, 0x01, + 0x00, 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, + 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x00, 0x00, 0x01, + 0x00, 0x08, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0c, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0c, + 0x00, 0x0d, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0c, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0c, + 0x00, 0x0d, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0c, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0c, + 0x00, 0x0d, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0c, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0c, + 0x00, 0x0d, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0c, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0c, + 0x00, 0x0d, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0c, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x01, 0x00, 0x03, + 0x00, 0x00, 0x00, 0x01, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x05, 0x00, 0x00, 0x00, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x06, 0x00, 0x00, 0x00, 0x01, 0x00, 0x06, 0x00, 0x00, 0x00, 0x01, 0x00, 0x06, + 0x00, 0x00, 0x00, 0x01, 0x00, 0x06, 0x00, 0x00, 0x00, 0x01, 0x00, 0x06, 0x00, 0x00, 0x00, 0x01, + 0x00, 0x06, 0x00, 0x00, 0x00, 0x01, 0x00, 0x06, 0x00, 0x00, 0x00, 0x01, 0x00, 0x06, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x06, 0x00, 0x00, 0x00, 0x01, 0x00, 0x06, 0x00, 0x00, 0x00, 0x01, 0x00, 0x06, + 0x00, 0x00, 0x00, 0x01, 0x00, 0x07, 0x00, 0x00, 0x00, 0x03, 0x00, 0x13, 0x00, 0x14, 0x00, 0x15, + 0x00, 0x00, 0x00, 0x03, 0x00, 0x13, 0x00, 0x14, 0x00, 0x15, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0b, + 0x00, 0x00, 0x00, 0x01, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x01, + 0x00, 0x0b, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0b, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0b, + 0x00, 0x00, 0x00, 0x01, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x03, + 0x00, 0x13, 0x00, 0x14, 0x00, 0x15, 0x00, 0x00, 0x00, 0x03, 0x00, 0x13, 0x00, 0x14, 0x00, 0x15, + 0x00, 0x00, 0x00, 0x03, 0x00, 0x0e, 0x00, 0x0f, 0x00, 0x10, 0x00, 0x00, 0x00, 0x03, 0x00, 0x0e, + 0x00, 0x0f, 0x00, 0x10, 0x00, 0x00, 0x00, 0x03, 0x00, 0x0e, 0x00, 0x0f, 0x00, 0x10, 0x00, 0x00, + 0x00, 0x03, 0x00, 0x0e, 0x00, 0x0f, 0x00, 0x10, 0x00, 0x00, 0x00, 0x03, 0x00, 0x0e, 0x00, 0x0f, + 0x00, 0x10, 0x00, 0x00, 0x00, 0x03, 0x00, 0x0e, 0x00, 0x0f, 0x00, 0x10, 0x00, 0x00, 0x00, 0x03, + 0x00, 0x0e, 0x00, 0x0f, 0x00, 0x10, 0x00, 0x00, 0x00, 0x03, 0x00, 0x0e, 0x00, 0x0f, 0x00, 0x10, + 0x00, 0x00, 0x00, 0x03, 0x00, 0x0e, 0x00, 0x0f, 0x00, 0x10, 0x00, 0x00, 0x00, 0x03, 0x00, 0x0e, + 0x00, 0x0f, 0x00, 0x10, 0x00, 0x00, 0x00, 0x03, 0x00, 0x0e, 0x00, 0x0f, 0x00, 0x10, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0a, + 0x00, 0x00, 0x00, 0x01, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x01, + 0x00, 0x0a, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0a, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0a, + 0x00, 0x00, 0x00, 0x01, 0x00, 0x09, 0x00, 0x00, 0x00, 0x01, 0x00, 0x09, 0x00, 0x00, 0x00, 0x01, + 0x00, 0x09, 0x00, 0x00, 0x00, 0x01, 0x00, 0x09, 0x00, 0x00, 0x00, 0x01, 0x00, 0x09, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x09, 0x00, 0x00, 0x00, 0x01, 0x00, 0x09, 0x00, 0x00, 0x00, 0x01, 0x00, 0x09, + 0x00, 0x00, 0x00, 0x01, 0x00, 0x09, 0x00, 0x00, 0x00, 0x01, 0x00, 0x09, 0x00, 0x00, 0x00, 0x01, + 0x00, 0x09, 0x00, 0x17, 0x00, 0x30, 0x00, 0x38, 0x00, 0x40, 0x00, 0x48, 0x00, 0x50, 0x00, 0x58, + 0x00, 0x60, 0x00, 0x68, 0x00, 0x70, 0x00, 0x78, 0x00, 0x80, 0x00, 0x88, 0x00, 0x90, 0x00, 0x98, + 0x00, 0xa0, 0x00, 0xa8, 0x00, 0xb0, 0x00, 0xb8, 0x00, 0xc0, 0x00, 0xc8, 0x00, 0xd0, 0x00, 0xd8, + 0x00, 0xe0, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0xb8, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, + 0x00, 0xb6, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0xb4, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, + 0x00, 0xb2, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0xb0, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, + 0x00, 0xae, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0xac, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, + 0x00, 0xfa, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0xfc, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, + 0x01, 0x4a, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x98, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, + 0x01, 0xe6, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x02, 0x34, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, + 0x02, 0x36, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x1d, 0x32, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, + 0x1d, 0x34, 0x00, 0x06, 0x00, 0x00, 0x00, 0x01, 0x1d, 0x82, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, + 0x1d, 0x8c, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x1d, 0xb4, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, + 0x1e, 0xb0, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x1e, 0xc0, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, + 0x1e, 0xd0, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x1e, 0xe0, 0x00, 0x01, 0x1e, 0xf2, 0x00, 0xc1, + 0x00, 0x01, 0x1e, 0xec, 0x00, 0xc1, 0x00, 0x01, 0x1e, 0xe6, 0x00, 0xc1, 0x00, 0x01, 0x1e, 0xe6, + 0x00, 0x2f, 0x00, 0x01, 0x1e, 0xe0, 0x00, 0x2f, 0x00, 0x01, 0x1e, 0xda, 0x00, 0x2f, 0x00, 0x02, + 0x1e, 0xda, 0x00, 0x28, 0x01, 0x6f, 0x00, 0x94, 0x00, 0x8d, 0x00, 0x8e, 0x01, 0x70, 0x01, 0x71, + 0x01, 0x72, 0x01, 0x73, 0x01, 0x74, 0x01, 0x75, 0x01, 0x6f, 0x00, 0x94, 0x00, 0x8d, 0x00, 0x8e, + 0x01, 0x70, 0x01, 0x71, 0x01, 0x72, 0x01, 0x73, 0x01, 0x74, 0x01, 0x75, 0x01, 0x6f, 0x00, 0x94, + 0x00, 0x8d, 0x00, 0x8e, 0x01, 0x70, 0x01, 0x71, 0x01, 0x72, 0x01, 0x73, 0x01, 0x74, 0x01, 0x75, + 0x01, 0x6f, 0x00, 0x94, 0x00, 0x8d, 0x00, 0x8e, 0x01, 0x70, 0x01, 0x71, 0x01, 0x72, 0x01, 0x73, + 0x01, 0x74, 0x01, 0x75, 0x00, 0x02, 0x1e, 0x9a, 0x00, 0x02, 0x00, 0x85, 0x00, 0x95, 0x00, 0x02, + 0x1e, 0x98, 0x00, 0x28, 0x01, 0x76, 0x01, 0x77, 0x01, 0x78, 0x01, 0x79, 0x01, 0x7a, 0x01, 0x7b, + 0x01, 0x7c, 0x01, 0x7d, 0x01, 0x7e, 0x01, 0x7f, 0x01, 0x78, 0x01, 0x79, 0x01, 0x77, 0x01, 0x76, + 0x01, 0x7a, 0x01, 0x7b, 0x01, 0x7c, 0x01, 0x7d, 0x01, 0x7e, 0x01, 0x7f, 0x01, 0x76, 0x01, 0x77, + 0x01, 0x78, 0x01, 0x79, 0x01, 0x7a, 0x01, 0x7b, 0x01, 0x7c, 0x01, 0x7d, 0x01, 0x7e, 0x01, 0x7f, + 0x01, 0x76, 0x01, 0x77, 0x01, 0x78, 0x01, 0x79, 0x01, 0x7a, 0x01, 0x7b, 0x01, 0x7c, 0x01, 0x7d, + 0x01, 0x7e, 0x01, 0x7f, 0x00, 0x02, 0x1e, 0x64, 0x00, 0x28, 0x01, 0xae, 0x01, 0xaf, 0x01, 0xb0, + 0x01, 0xb1, 0x01, 0xb2, 0x01, 0xb3, 0x01, 0xb4, 0x01, 0xb5, 0x01, 0xb6, 0x01, 0xb7, 0x01, 0xb0, + 0x01, 0xb1, 0x01, 0xaf, 0x01, 0xae, 0x01, 0xb2, 0x01, 0xb3, 0x01, 0xb4, 0x01, 0xb5, 0x01, 0xb6, + 0x01, 0xb7, 0x01, 0xae, 0x01, 0xaf, 0x01, 0xb0, 0x01, 0xb1, 0x01, 0xb2, 0x01, 0xb3, 0x01, 0xb4, + 0x01, 0xb5, 0x01, 0xb6, 0x01, 0xb7, 0x01, 0xae, 0x01, 0xaf, 0x01, 0xb0, 0x01, 0xb1, 0x01, 0xb2, + 0x01, 0xb3, 0x01, 0xb4, 0x01, 0xb5, 0x01, 0xb6, 0x01, 0xb7, 0x00, 0x02, 0x1e, 0x30, 0x00, 0x28, + 0x01, 0xb8, 0x01, 0xb9, 0x01, 0xba, 0x01, 0xbb, 0x01, 0xbc, 0x01, 0xbd, 0x01, 0xbe, 0x01, 0xbf, + 0x01, 0xc0, 0x01, 0xc1, 0x01, 0xba, 0x01, 0xbb, 0x01, 0xb9, 0x01, 0xb8, 0x01, 0xbc, 0x01, 0xbd, + 0x01, 0xbe, 0x01, 0xbf, 0x01, 0xc0, 0x01, 0xc1, 0x01, 0xb8, 0x01, 0xb9, 0x01, 0xba, 0x01, 0xbb, + 0x01, 0xbc, 0x01, 0xbd, 0x01, 0xbe, 0x01, 0xbf, 0x01, 0xc0, 0x01, 0xc1, 0x01, 0xb8, 0x01, 0xb9, + 0x01, 0xba, 0x01, 0xbb, 0x01, 0xbc, 0x01, 0xbd, 0x01, 0xbe, 0x01, 0xbf, 0x01, 0xc0, 0x01, 0xc1, + 0x00, 0x02, 0x1d, 0xda, 0x00, 0x28, 0x01, 0xb8, 0x01, 0xb9, 0x01, 0xba, 0x01, 0xbb, 0x01, 0xbc, + 0x01, 0xbd, 0x01, 0xbe, 0x01, 0xbf, 0x01, 0xc0, 0x01, 0xc1, 0x01, 0xba, 0x01, 0xbb, 0x01, 0xb9, + 0x01, 0xb8, 0x01, 0xbc, 0x01, 0xbd, 0x01, 0xbe, 0x01, 0xbf, 0x01, 0xc0, 0x01, 0xc1, 0x01, 0xb8, + 0x01, 0xb9, 0x01, 0xba, 0x01, 0xbb, 0x01, 0xbc, 0x01, 0xbd, 0x01, 0xbe, 0x01, 0xbf, 0x01, 0xc0, + 0x01, 0xc1, 0x01, 0xb8, 0x01, 0xb9, 0x01, 0xba, 0x01, 0xbb, 0x01, 0xbc, 0x01, 0xbd, 0x01, 0xbe, + 0x01, 0xbf, 0x01, 0xc0, 0x01, 0xc1, 0x00, 0x02, 0x1d, 0xa6, 0x00, 0x02, 0x01, 0x6e, 0x01, 0x6e, + 0x00, 0x01, 0x1d, 0xa4, 0x00, 0x28, 0x00, 0x56, 0x01, 0xe8, 0x02, 0xb2, 0x03, 0x7c, 0x04, 0x14, + 0x04, 0xde, 0x05, 0x12, 0x05, 0x78, 0x05, 0xac, 0x06, 0x76, 0x07, 0x40, 0x08, 0xd2, 0x09, 0x6a, + 0x0a, 0x34, 0x0a, 0x68, 0x0a, 0xce, 0x0b, 0x02, 0x0c, 0x94, 0x0d, 0x5e, 0x0e, 0x28, 0x0e, 0xc0, + 0x0f, 0x8a, 0x0f, 0xbe, 0x10, 0x24, 0x10, 0x58, 0x11, 0xea, 0x12, 0xb4, 0x13, 0x7e, 0x14, 0x16, + 0x14, 0xe0, 0x15, 0x14, 0x15, 0x7a, 0x15, 0xae, 0x17, 0x40, 0x18, 0x0a, 0x18, 0xd4, 0x19, 0x6c, + 0x1a, 0x36, 0x1a, 0x6a, 0x1a, 0xd0, 0x00, 0x28, 0x00, 0x52, 0x00, 0x5a, 0x00, 0x62, 0x00, 0x6a, + 0x00, 0x72, 0x00, 0x7a, 0x00, 0x82, 0x00, 0x8a, 0x00, 0x92, 0x00, 0x9a, 0x00, 0xa2, 0x00, 0xaa, + 0x00, 0xb2, 0x00, 0xba, 0x00, 0xc2, 0x00, 0xca, 0x00, 0xd2, 0x00, 0xda, 0x00, 0xe2, 0x00, 0xea, + 0x00, 0xf2, 0x00, 0xfa, 0x01, 0x02, 0x01, 0x0a, 0x01, 0x12, 0x01, 0x1a, 0x01, 0x22, 0x01, 0x2a, + 0x01, 0x32, 0x01, 0x3a, 0x01, 0x42, 0x01, 0x4a, 0x01, 0x52, 0x01, 0x5a, 0x01, 0x62, 0x01, 0x6a, + 0x01, 0x72, 0x01, 0x7a, 0x01, 0x82, 0x01, 0x8a, 0x00, 0x98, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x15, + 0x01, 0x82, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x16, 0x00, 0x97, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x17, + 0x01, 0x88, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x18, 0x01, 0x8c, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x19, + 0x01, 0x8e, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x1a, 0x01, 0x84, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x1b, + 0x01, 0x94, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x1c, 0x00, 0x98, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x8d, + 0x01, 0x82, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x8e, 0x00, 0x97, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x70, + 0x01, 0x88, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x71, 0x01, 0x8c, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x72, + 0x01, 0x8e, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x73, 0x01, 0x84, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x74, + 0x01, 0x94, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x75, 0x00, 0x98, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x78, + 0x01, 0x82, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x79, 0x00, 0x97, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x7a, + 0x01, 0x88, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x7b, 0x01, 0x8c, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x7c, + 0x01, 0x8e, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x7d, 0x01, 0x84, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x7e, + 0x01, 0x94, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x7f, 0x00, 0x98, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb0, + 0x01, 0x82, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb1, 0x00, 0x97, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb2, + 0x01, 0x88, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb3, 0x01, 0x8c, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb4, + 0x01, 0x8e, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb5, 0x01, 0x84, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb6, + 0x01, 0x94, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb7, 0x00, 0x98, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xba, + 0x01, 0x82, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xbb, 0x00, 0x97, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xbc, + 0x01, 0x88, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xbd, 0x01, 0x8c, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xbe, + 0x01, 0x8e, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xbf, 0x01, 0x84, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xc0, + 0x01, 0x94, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xc1, 0x00, 0x14, 0x00, 0x2a, 0x00, 0x32, 0x00, 0x3a, + 0x00, 0x42, 0x00, 0x4a, 0x00, 0x52, 0x00, 0x5a, 0x00, 0x62, 0x00, 0x6a, 0x00, 0x72, 0x00, 0x7a, + 0x00, 0x82, 0x00, 0x8a, 0x00, 0x92, 0x00, 0x9a, 0x00, 0xa2, 0x00, 0xaa, 0x00, 0xb2, 0x00, 0xba, + 0x00, 0xc2, 0x01, 0x83, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x16, 0x01, 0x89, 0x00, 0x03, 0x01, 0x6e, + 0x00, 0x18, 0x01, 0x8f, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x1a, 0x01, 0x95, 0x00, 0x03, 0x01, 0x6e, + 0x00, 0x1c, 0x01, 0x83, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x8e, 0x01, 0x89, 0x00, 0x03, 0x01, 0x6e, + 0x01, 0x71, 0x01, 0x8f, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x73, 0x01, 0x95, 0x00, 0x03, 0x01, 0x6e, + 0x01, 0x75, 0x01, 0x83, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x79, 0x01, 0x89, 0x00, 0x03, 0x01, 0x6e, + 0x01, 0x7b, 0x01, 0x8f, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x7d, 0x01, 0x95, 0x00, 0x03, 0x01, 0x6e, + 0x01, 0x7f, 0x01, 0x83, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb1, 0x01, 0x89, 0x00, 0x03, 0x01, 0x6e, + 0x01, 0xb3, 0x01, 0x8f, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb5, 0x01, 0x95, 0x00, 0x03, 0x01, 0x6e, + 0x01, 0xb7, 0x01, 0x83, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xbb, 0x01, 0x89, 0x00, 0x03, 0x01, 0x6e, + 0x01, 0xbd, 0x01, 0x8f, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xbf, 0x01, 0x95, 0x00, 0x03, 0x01, 0x6e, + 0x01, 0xc1, 0x00, 0x14, 0x00, 0x2a, 0x00, 0x32, 0x00, 0x3a, 0x00, 0x42, 0x00, 0x4a, 0x00, 0x52, + 0x00, 0x5a, 0x00, 0x62, 0x00, 0x6a, 0x00, 0x72, 0x00, 0x7a, 0x00, 0x82, 0x00, 0x8a, 0x00, 0x92, + 0x00, 0x9a, 0x00, 0xa2, 0x00, 0xaa, 0x00, 0xb2, 0x00, 0xba, 0x00, 0xc2, 0x00, 0x99, 0x00, 0x03, + 0x01, 0x6e, 0x00, 0x17, 0x01, 0x8a, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x18, 0x01, 0x90, 0x00, 0x03, + 0x01, 0x6e, 0x00, 0x1a, 0x01, 0x85, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x1b, 0x00, 0x99, 0x00, 0x03, + 0x01, 0x6e, 0x01, 0x70, 0x01, 0x8a, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x71, 0x01, 0x90, 0x00, 0x03, + 0x01, 0x6e, 0x01, 0x73, 0x01, 0x85, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x74, 0x00, 0x99, 0x00, 0x03, + 0x01, 0x6e, 0x01, 0x7a, 0x01, 0x8a, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x7b, 0x01, 0x90, 0x00, 0x03, + 0x01, 0x6e, 0x01, 0x7d, 0x01, 0x85, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x7e, 0x00, 0x99, 0x00, 0x03, + 0x01, 0x6e, 0x01, 0xb2, 0x01, 0x8a, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb3, 0x01, 0x90, 0x00, 0x03, + 0x01, 0x6e, 0x01, 0xb5, 0x01, 0x85, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb6, 0x00, 0x99, 0x00, 0x03, + 0x01, 0x6e, 0x01, 0xbc, 0x01, 0x8a, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xbd, 0x01, 0x90, 0x00, 0x03, + 0x01, 0x6e, 0x01, 0xbf, 0x01, 0x85, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xc0, 0x00, 0x0f, 0x00, 0x20, + 0x00, 0x28, 0x00, 0x30, 0x00, 0x38, 0x00, 0x40, 0x00, 0x48, 0x00, 0x50, 0x00, 0x58, 0x00, 0x60, + 0x00, 0x68, 0x00, 0x70, 0x00, 0x78, 0x00, 0x80, 0x00, 0x88, 0x00, 0x90, 0x01, 0x8b, 0x00, 0x03, + 0x01, 0x6e, 0x00, 0x18, 0x01, 0x91, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x1a, 0x01, 0x96, 0x00, 0x03, + 0x01, 0x6e, 0x00, 0x1c, 0x01, 0x8b, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x71, 0x01, 0x91, 0x00, 0x03, + 0x01, 0x6e, 0x01, 0x73, 0x01, 0x96, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x75, 0x01, 0x8b, 0x00, 0x03, + 0x01, 0x6e, 0x01, 0x7b, 0x01, 0x91, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x7d, 0x01, 0x96, 0x00, 0x03, + 0x01, 0x6e, 0x01, 0x7f, 0x01, 0x8b, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb3, 0x01, 0x91, 0x00, 0x03, + 0x01, 0x6e, 0x01, 0xb5, 0x01, 0x96, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb7, 0x01, 0x8b, 0x00, 0x03, + 0x01, 0x6e, 0x01, 0xbd, 0x01, 0x91, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xbf, 0x01, 0x96, 0x00, 0x03, + 0x01, 0x6e, 0x01, 0xc1, 0x00, 0x14, 0x00, 0x2a, 0x00, 0x32, 0x00, 0x3a, 0x00, 0x42, 0x00, 0x4a, + 0x00, 0x52, 0x00, 0x5a, 0x00, 0x62, 0x00, 0x6a, 0x00, 0x72, 0x00, 0x7a, 0x00, 0x82, 0x00, 0x8a, + 0x00, 0x92, 0x00, 0x9a, 0x00, 0xa2, 0x00, 0xaa, 0x00, 0xb2, 0x00, 0xba, 0x00, 0xc2, 0x01, 0x8d, + 0x00, 0x03, 0x01, 0x6e, 0x00, 0x19, 0x01, 0x92, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x1a, 0x01, 0x86, + 0x00, 0x03, 0x01, 0x6e, 0x00, 0x1b, 0x01, 0x97, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x1c, 0x01, 0x8d, + 0x00, 0x03, 0x01, 0x6e, 0x01, 0x72, 0x01, 0x92, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x73, 0x01, 0x86, + 0x00, 0x03, 0x01, 0x6e, 0x01, 0x74, 0x01, 0x97, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x75, 0x01, 0x8d, + 0x00, 0x03, 0x01, 0x6e, 0x01, 0x7c, 0x01, 0x92, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x7d, 0x01, 0x86, + 0x00, 0x03, 0x01, 0x6e, 0x01, 0x7e, 0x01, 0x97, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x7f, 0x01, 0x8d, + 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb4, 0x01, 0x92, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb5, 0x01, 0x86, + 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb6, 0x01, 0x97, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb7, 0x01, 0x8d, + 0x00, 0x03, 0x01, 0x6e, 0x01, 0xbe, 0x01, 0x92, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xbf, 0x01, 0x86, + 0x00, 0x03, 0x01, 0x6e, 0x01, 0xc0, 0x01, 0x97, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xc1, 0x00, 0x05, + 0x00, 0x0c, 0x00, 0x14, 0x00, 0x1c, 0x00, 0x24, 0x00, 0x2c, 0x01, 0x93, 0x00, 0x03, 0x01, 0x6e, + 0x00, 0x1a, 0x01, 0x93, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x73, 0x01, 0x93, 0x00, 0x03, 0x01, 0x6e, + 0x01, 0x7d, 0x01, 0x93, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb5, 0x01, 0x93, 0x00, 0x03, 0x01, 0x6e, + 0x01, 0xbf, 0x00, 0x0a, 0x00, 0x16, 0x00, 0x1e, 0x00, 0x26, 0x00, 0x2e, 0x00, 0x36, 0x00, 0x3e, + 0x00, 0x46, 0x00, 0x4e, 0x00, 0x56, 0x00, 0x5e, 0x01, 0x87, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x1b, + 0x01, 0x98, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x1c, 0x01, 0x87, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x74, + 0x01, 0x98, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x75, 0x01, 0x87, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x7e, + 0x01, 0x98, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x7f, 0x01, 0x87, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb6, + 0x01, 0x98, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb7, 0x01, 0x87, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xc0, + 0x01, 0x98, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xc1, 0x00, 0x05, 0x00, 0x0c, 0x00, 0x14, 0x00, 0x1c, + 0x00, 0x24, 0x00, 0x2c, 0x01, 0x99, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x1c, 0x01, 0x99, 0x00, 0x03, + 0x01, 0x6e, 0x01, 0x75, 0x01, 0x99, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x7f, 0x01, 0x99, 0x00, 0x03, + 0x01, 0x6e, 0x01, 0xb7, 0x01, 0x99, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xc1, 0x00, 0x14, 0x00, 0x2a, + 0x00, 0x32, 0x00, 0x3a, 0x00, 0x42, 0x00, 0x4a, 0x00, 0x52, 0x00, 0x5a, 0x00, 0x62, 0x00, 0x6a, + 0x00, 0x72, 0x00, 0x7a, 0x00, 0x82, 0x00, 0x8a, 0x00, 0x92, 0x00, 0x9a, 0x00, 0xa2, 0x00, 0xaa, + 0x00, 0xb2, 0x00, 0xba, 0x00, 0xc2, 0x01, 0x83, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x16, 0x01, 0x89, + 0x00, 0x03, 0x01, 0x6e, 0x00, 0x18, 0x01, 0x8f, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x1a, 0x01, 0x95, + 0x00, 0x03, 0x01, 0x6e, 0x00, 0x1c, 0x01, 0x83, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x8e, 0x01, 0x89, + 0x00, 0x03, 0x01, 0x6e, 0x01, 0x71, 0x01, 0x8f, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x73, 0x01, 0x95, + 0x00, 0x03, 0x01, 0x6e, 0x01, 0x75, 0x01, 0x83, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x79, 0x01, 0x89, + 0x00, 0x03, 0x01, 0x6e, 0x01, 0x7b, 0x01, 0x8f, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x7d, 0x01, 0x95, + 0x00, 0x03, 0x01, 0x6e, 0x01, 0x7f, 0x01, 0x83, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb1, 0x01, 0x89, + 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb3, 0x01, 0x8f, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb5, 0x01, 0x95, + 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb7, 0x01, 0x83, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xbb, 0x01, 0x89, + 0x00, 0x03, 0x01, 0x6e, 0x01, 0xbd, 0x01, 0x8f, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xbf, 0x01, 0x95, + 0x00, 0x03, 0x01, 0x6e, 0x01, 0xc1, 0x00, 0x14, 0x00, 0x2a, 0x00, 0x32, 0x00, 0x3a, 0x00, 0x42, + 0x00, 0x4a, 0x00, 0x52, 0x00, 0x5a, 0x00, 0x62, 0x00, 0x6a, 0x00, 0x72, 0x00, 0x7a, 0x00, 0x82, + 0x00, 0x8a, 0x00, 0x92, 0x00, 0x9a, 0x00, 0xa2, 0x00, 0xaa, 0x00, 0xb2, 0x00, 0xba, 0x00, 0xc2, + 0x00, 0x99, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x17, 0x01, 0x8a, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x18, + 0x01, 0x90, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x1a, 0x01, 0x85, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x1b, + 0x00, 0x99, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x70, 0x01, 0x8a, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x71, + 0x01, 0x90, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x73, 0x01, 0x85, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x74, + 0x00, 0x99, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x7a, 0x01, 0x8a, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x7b, + 0x01, 0x90, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x7d, 0x01, 0x85, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x7e, + 0x00, 0x99, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb2, 0x01, 0x8a, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb3, + 0x01, 0x90, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb5, 0x01, 0x85, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb6, + 0x00, 0x99, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xbc, 0x01, 0x8a, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xbd, + 0x01, 0x90, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xbf, 0x01, 0x85, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xc0, + 0x00, 0x28, 0x00, 0x52, 0x00, 0x5a, 0x00, 0x62, 0x00, 0x6a, 0x00, 0x72, 0x00, 0x7a, 0x00, 0x82, + 0x00, 0x8a, 0x00, 0x92, 0x00, 0x9a, 0x00, 0xa2, 0x00, 0xaa, 0x00, 0xb2, 0x00, 0xba, 0x00, 0xc2, + 0x00, 0xca, 0x00, 0xd2, 0x00, 0xda, 0x00, 0xe2, 0x00, 0xea, 0x00, 0xf2, 0x00, 0xfa, 0x01, 0x02, + 0x01, 0x0a, 0x01, 0x12, 0x01, 0x1a, 0x01, 0x22, 0x01, 0x2a, 0x01, 0x32, 0x01, 0x3a, 0x01, 0x42, + 0x01, 0x4a, 0x01, 0x52, 0x01, 0x5a, 0x01, 0x62, 0x01, 0x6a, 0x01, 0x72, 0x01, 0x7a, 0x01, 0x82, + 0x01, 0x8a, 0x00, 0x98, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x15, 0x01, 0x82, 0x00, 0x03, 0x01, 0x6e, + 0x00, 0x16, 0x00, 0x97, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x17, 0x01, 0x88, 0x00, 0x03, 0x01, 0x6e, + 0x00, 0x18, 0x01, 0x8c, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x19, 0x01, 0x8e, 0x00, 0x03, 0x01, 0x6e, + 0x00, 0x1a, 0x01, 0x84, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x1b, 0x01, 0x94, 0x00, 0x03, 0x01, 0x6e, + 0x00, 0x1c, 0x00, 0x98, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x8d, 0x01, 0x82, 0x00, 0x03, 0x01, 0x6e, + 0x00, 0x8e, 0x00, 0x97, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x70, 0x01, 0x88, 0x00, 0x03, 0x01, 0x6e, + 0x01, 0x71, 0x01, 0x8c, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x72, 0x01, 0x8e, 0x00, 0x03, 0x01, 0x6e, + 0x01, 0x73, 0x01, 0x84, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x74, 0x01, 0x94, 0x00, 0x03, 0x01, 0x6e, + 0x01, 0x75, 0x00, 0x98, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x78, 0x01, 0x82, 0x00, 0x03, 0x01, 0x6e, + 0x01, 0x79, 0x00, 0x97, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x7a, 0x01, 0x88, 0x00, 0x03, 0x01, 0x6e, + 0x01, 0x7b, 0x01, 0x8c, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x7c, 0x01, 0x8e, 0x00, 0x03, 0x01, 0x6e, + 0x01, 0x7d, 0x01, 0x84, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x7e, 0x01, 0x94, 0x00, 0x03, 0x01, 0x6e, + 0x01, 0x7f, 0x00, 0x98, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb0, 0x01, 0x82, 0x00, 0x03, 0x01, 0x6e, + 0x01, 0xb1, 0x00, 0x97, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb2, 0x01, 0x88, 0x00, 0x03, 0x01, 0x6e, + 0x01, 0xb3, 0x01, 0x8c, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb4, 0x01, 0x8e, 0x00, 0x03, 0x01, 0x6e, + 0x01, 0xb5, 0x01, 0x84, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb6, 0x01, 0x94, 0x00, 0x03, 0x01, 0x6e, + 0x01, 0xb7, 0x00, 0x98, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xba, 0x01, 0x82, 0x00, 0x03, 0x01, 0x6e, + 0x01, 0xbb, 0x00, 0x97, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xbc, 0x01, 0x88, 0x00, 0x03, 0x01, 0x6e, + 0x01, 0xbd, 0x01, 0x8c, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xbe, 0x01, 0x8e, 0x00, 0x03, 0x01, 0x6e, + 0x01, 0xbf, 0x01, 0x84, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xc0, 0x01, 0x94, 0x00, 0x03, 0x01, 0x6e, + 0x01, 0xc1, 0x00, 0x0f, 0x00, 0x20, 0x00, 0x28, 0x00, 0x30, 0x00, 0x38, 0x00, 0x40, 0x00, 0x48, + 0x00, 0x50, 0x00, 0x58, 0x00, 0x60, 0x00, 0x68, 0x00, 0x70, 0x00, 0x78, 0x00, 0x80, 0x00, 0x88, + 0x00, 0x90, 0x01, 0x8b, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x18, 0x01, 0x91, 0x00, 0x03, 0x01, 0x6e, + 0x00, 0x1a, 0x01, 0x96, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x1c, 0x01, 0x8b, 0x00, 0x03, 0x01, 0x6e, + 0x01, 0x71, 0x01, 0x91, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x73, 0x01, 0x96, 0x00, 0x03, 0x01, 0x6e, + 0x01, 0x75, 0x01, 0x8b, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x7b, 0x01, 0x91, 0x00, 0x03, 0x01, 0x6e, + 0x01, 0x7d, 0x01, 0x96, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x7f, 0x01, 0x8b, 0x00, 0x03, 0x01, 0x6e, + 0x01, 0xb3, 0x01, 0x91, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb5, 0x01, 0x96, 0x00, 0x03, 0x01, 0x6e, + 0x01, 0xb7, 0x01, 0x8b, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xbd, 0x01, 0x91, 0x00, 0x03, 0x01, 0x6e, + 0x01, 0xbf, 0x01, 0x96, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xc1, 0x00, 0x14, 0x00, 0x2a, 0x00, 0x32, + 0x00, 0x3a, 0x00, 0x42, 0x00, 0x4a, 0x00, 0x52, 0x00, 0x5a, 0x00, 0x62, 0x00, 0x6a, 0x00, 0x72, + 0x00, 0x7a, 0x00, 0x82, 0x00, 0x8a, 0x00, 0x92, 0x00, 0x9a, 0x00, 0xa2, 0x00, 0xaa, 0x00, 0xb2, + 0x00, 0xba, 0x00, 0xc2, 0x01, 0x8d, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x19, 0x01, 0x92, 0x00, 0x03, + 0x01, 0x6e, 0x00, 0x1a, 0x01, 0x86, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x1b, 0x01, 0x97, 0x00, 0x03, + 0x01, 0x6e, 0x00, 0x1c, 0x01, 0x8d, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x72, 0x01, 0x92, 0x00, 0x03, + 0x01, 0x6e, 0x01, 0x73, 0x01, 0x86, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x74, 0x01, 0x97, 0x00, 0x03, + 0x01, 0x6e, 0x01, 0x75, 0x01, 0x8d, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x7c, 0x01, 0x92, 0x00, 0x03, + 0x01, 0x6e, 0x01, 0x7d, 0x01, 0x86, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x7e, 0x01, 0x97, 0x00, 0x03, + 0x01, 0x6e, 0x01, 0x7f, 0x01, 0x8d, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb4, 0x01, 0x92, 0x00, 0x03, + 0x01, 0x6e, 0x01, 0xb5, 0x01, 0x86, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb6, 0x01, 0x97, 0x00, 0x03, + 0x01, 0x6e, 0x01, 0xb7, 0x01, 0x8d, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xbe, 0x01, 0x92, 0x00, 0x03, + 0x01, 0x6e, 0x01, 0xbf, 0x01, 0x86, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xc0, 0x01, 0x97, 0x00, 0x03, + 0x01, 0x6e, 0x01, 0xc1, 0x00, 0x05, 0x00, 0x0c, 0x00, 0x14, 0x00, 0x1c, 0x00, 0x24, 0x00, 0x2c, + 0x01, 0x93, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x1a, 0x01, 0x93, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x73, + 0x01, 0x93, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x7d, 0x01, 0x93, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb5, + 0x01, 0x93, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xbf, 0x00, 0x0a, 0x00, 0x16, 0x00, 0x1e, 0x00, 0x26, + 0x00, 0x2e, 0x00, 0x36, 0x00, 0x3e, 0x00, 0x46, 0x00, 0x4e, 0x00, 0x56, 0x00, 0x5e, 0x01, 0x87, + 0x00, 0x03, 0x01, 0x6e, 0x00, 0x1b, 0x01, 0x98, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x1c, 0x01, 0x87, + 0x00, 0x03, 0x01, 0x6e, 0x01, 0x74, 0x01, 0x98, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x75, 0x01, 0x87, + 0x00, 0x03, 0x01, 0x6e, 0x01, 0x7e, 0x01, 0x98, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x7f, 0x01, 0x87, + 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb6, 0x01, 0x98, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb7, 0x01, 0x87, + 0x00, 0x03, 0x01, 0x6e, 0x01, 0xc0, 0x01, 0x98, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xc1, 0x00, 0x05, + 0x00, 0x0c, 0x00, 0x14, 0x00, 0x1c, 0x00, 0x24, 0x00, 0x2c, 0x01, 0x99, 0x00, 0x03, 0x01, 0x6e, + 0x00, 0x1c, 0x01, 0x99, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x75, 0x01, 0x99, 0x00, 0x03, 0x01, 0x6e, + 0x01, 0x7f, 0x01, 0x99, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb7, 0x01, 0x99, 0x00, 0x03, 0x01, 0x6e, + 0x01, 0xc1, 0x00, 0x28, 0x00, 0x52, 0x00, 0x5a, 0x00, 0x62, 0x00, 0x6a, 0x00, 0x72, 0x00, 0x7a, + 0x00, 0x82, 0x00, 0x8a, 0x00, 0x92, 0x00, 0x9a, 0x00, 0xa2, 0x00, 0xaa, 0x00, 0xb2, 0x00, 0xba, + 0x00, 0xc2, 0x00, 0xca, 0x00, 0xd2, 0x00, 0xda, 0x00, 0xe2, 0x00, 0xea, 0x00, 0xf2, 0x00, 0xfa, + 0x01, 0x02, 0x01, 0x0a, 0x01, 0x12, 0x01, 0x1a, 0x01, 0x22, 0x01, 0x2a, 0x01, 0x32, 0x01, 0x3a, + 0x01, 0x42, 0x01, 0x4a, 0x01, 0x52, 0x01, 0x5a, 0x01, 0x62, 0x01, 0x6a, 0x01, 0x72, 0x01, 0x7a, + 0x01, 0x82, 0x01, 0x8a, 0x00, 0x98, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x15, 0x01, 0x82, 0x00, 0x03, + 0x01, 0x6e, 0x00, 0x16, 0x00, 0x97, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x17, 0x01, 0x88, 0x00, 0x03, + 0x01, 0x6e, 0x00, 0x18, 0x01, 0x8c, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x19, 0x01, 0x8e, 0x00, 0x03, + 0x01, 0x6e, 0x00, 0x1a, 0x01, 0x84, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x1b, 0x01, 0x94, 0x00, 0x03, + 0x01, 0x6e, 0x00, 0x1c, 0x00, 0x98, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x8d, 0x01, 0x82, 0x00, 0x03, + 0x01, 0x6e, 0x00, 0x8e, 0x00, 0x97, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x70, 0x01, 0x88, 0x00, 0x03, + 0x01, 0x6e, 0x01, 0x71, 0x01, 0x8c, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x72, 0x01, 0x8e, 0x00, 0x03, + 0x01, 0x6e, 0x01, 0x73, 0x01, 0x84, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x74, 0x01, 0x94, 0x00, 0x03, + 0x01, 0x6e, 0x01, 0x75, 0x00, 0x98, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x78, 0x01, 0x82, 0x00, 0x03, + 0x01, 0x6e, 0x01, 0x79, 0x00, 0x97, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x7a, 0x01, 0x88, 0x00, 0x03, + 0x01, 0x6e, 0x01, 0x7b, 0x01, 0x8c, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x7c, 0x01, 0x8e, 0x00, 0x03, + 0x01, 0x6e, 0x01, 0x7d, 0x01, 0x84, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x7e, 0x01, 0x94, 0x00, 0x03, + 0x01, 0x6e, 0x01, 0x7f, 0x00, 0x98, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb0, 0x01, 0x82, 0x00, 0x03, + 0x01, 0x6e, 0x01, 0xb1, 0x00, 0x97, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb2, 0x01, 0x88, 0x00, 0x03, + 0x01, 0x6e, 0x01, 0xb3, 0x01, 0x8c, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb4, 0x01, 0x8e, 0x00, 0x03, + 0x01, 0x6e, 0x01, 0xb5, 0x01, 0x84, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb6, 0x01, 0x94, 0x00, 0x03, + 0x01, 0x6e, 0x01, 0xb7, 0x00, 0x98, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xba, 0x01, 0x82, 0x00, 0x03, + 0x01, 0x6e, 0x01, 0xbb, 0x00, 0x97, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xbc, 0x01, 0x88, 0x00, 0x03, + 0x01, 0x6e, 0x01, 0xbd, 0x01, 0x8c, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xbe, 0x01, 0x8e, 0x00, 0x03, + 0x01, 0x6e, 0x01, 0xbf, 0x01, 0x84, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xc0, 0x01, 0x94, 0x00, 0x03, + 0x01, 0x6e, 0x01, 0xc1, 0x00, 0x14, 0x00, 0x2a, 0x00, 0x32, 0x00, 0x3a, 0x00, 0x42, 0x00, 0x4a, + 0x00, 0x52, 0x00, 0x5a, 0x00, 0x62, 0x00, 0x6a, 0x00, 0x72, 0x00, 0x7a, 0x00, 0x82, 0x00, 0x8a, + 0x00, 0x92, 0x00, 0x9a, 0x00, 0xa2, 0x00, 0xaa, 0x00, 0xb2, 0x00, 0xba, 0x00, 0xc2, 0x01, 0x83, + 0x00, 0x03, 0x01, 0x6e, 0x00, 0x16, 0x01, 0x89, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x18, 0x01, 0x8f, + 0x00, 0x03, 0x01, 0x6e, 0x00, 0x1a, 0x01, 0x95, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x1c, 0x01, 0x83, + 0x00, 0x03, 0x01, 0x6e, 0x00, 0x8e, 0x01, 0x89, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x71, 0x01, 0x8f, + 0x00, 0x03, 0x01, 0x6e, 0x01, 0x73, 0x01, 0x95, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x75, 0x01, 0x83, + 0x00, 0x03, 0x01, 0x6e, 0x01, 0x79, 0x01, 0x89, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x7b, 0x01, 0x8f, + 0x00, 0x03, 0x01, 0x6e, 0x01, 0x7d, 0x01, 0x95, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x7f, 0x01, 0x83, + 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb1, 0x01, 0x89, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb3, 0x01, 0x8f, + 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb5, 0x01, 0x95, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb7, 0x01, 0x83, + 0x00, 0x03, 0x01, 0x6e, 0x01, 0xbb, 0x01, 0x89, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xbd, 0x01, 0x8f, + 0x00, 0x03, 0x01, 0x6e, 0x01, 0xbf, 0x01, 0x95, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xc1, 0x00, 0x14, + 0x00, 0x2a, 0x00, 0x32, 0x00, 0x3a, 0x00, 0x42, 0x00, 0x4a, 0x00, 0x52, 0x00, 0x5a, 0x00, 0x62, + 0x00, 0x6a, 0x00, 0x72, 0x00, 0x7a, 0x00, 0x82, 0x00, 0x8a, 0x00, 0x92, 0x00, 0x9a, 0x00, 0xa2, + 0x00, 0xaa, 0x00, 0xb2, 0x00, 0xba, 0x00, 0xc2, 0x00, 0x99, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x17, + 0x01, 0x8a, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x18, 0x01, 0x90, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x1a, + 0x01, 0x85, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x1b, 0x00, 0x99, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x70, + 0x01, 0x8a, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x71, 0x01, 0x90, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x73, + 0x01, 0x85, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x74, 0x00, 0x99, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x7a, + 0x01, 0x8a, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x7b, 0x01, 0x90, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x7d, + 0x01, 0x85, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x7e, 0x00, 0x99, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb2, + 0x01, 0x8a, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb3, 0x01, 0x90, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb5, + 0x01, 0x85, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb6, 0x00, 0x99, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xbc, + 0x01, 0x8a, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xbd, 0x01, 0x90, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xbf, + 0x01, 0x85, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xc0, 0x00, 0x0f, 0x00, 0x20, 0x00, 0x28, 0x00, 0x30, + 0x00, 0x38, 0x00, 0x40, 0x00, 0x48, 0x00, 0x50, 0x00, 0x58, 0x00, 0x60, 0x00, 0x68, 0x00, 0x70, + 0x00, 0x78, 0x00, 0x80, 0x00, 0x88, 0x00, 0x90, 0x01, 0x8b, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x18, + 0x01, 0x91, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x1a, 0x01, 0x96, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x1c, + 0x01, 0x8b, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x71, 0x01, 0x91, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x73, + 0x01, 0x96, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x75, 0x01, 0x8b, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x7b, + 0x01, 0x91, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x7d, 0x01, 0x96, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x7f, + 0x01, 0x8b, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb3, 0x01, 0x91, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb5, + 0x01, 0x96, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb7, 0x01, 0x8b, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xbd, + 0x01, 0x91, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xbf, 0x01, 0x96, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xc1, + 0x00, 0x14, 0x00, 0x2a, 0x00, 0x32, 0x00, 0x3a, 0x00, 0x42, 0x00, 0x4a, 0x00, 0x52, 0x00, 0x5a, + 0x00, 0x62, 0x00, 0x6a, 0x00, 0x72, 0x00, 0x7a, 0x00, 0x82, 0x00, 0x8a, 0x00, 0x92, 0x00, 0x9a, + 0x00, 0xa2, 0x00, 0xaa, 0x00, 0xb2, 0x00, 0xba, 0x00, 0xc2, 0x01, 0x8d, 0x00, 0x03, 0x01, 0x6e, + 0x00, 0x19, 0x01, 0x92, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x1a, 0x01, 0x86, 0x00, 0x03, 0x01, 0x6e, + 0x00, 0x1b, 0x01, 0x97, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x1c, 0x01, 0x8d, 0x00, 0x03, 0x01, 0x6e, + 0x01, 0x72, 0x01, 0x92, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x73, 0x01, 0x86, 0x00, 0x03, 0x01, 0x6e, + 0x01, 0x74, 0x01, 0x97, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x75, 0x01, 0x8d, 0x00, 0x03, 0x01, 0x6e, + 0x01, 0x7c, 0x01, 0x92, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x7d, 0x01, 0x86, 0x00, 0x03, 0x01, 0x6e, + 0x01, 0x7e, 0x01, 0x97, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x7f, 0x01, 0x8d, 0x00, 0x03, 0x01, 0x6e, + 0x01, 0xb4, 0x01, 0x92, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb5, 0x01, 0x86, 0x00, 0x03, 0x01, 0x6e, + 0x01, 0xb6, 0x01, 0x97, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb7, 0x01, 0x8d, 0x00, 0x03, 0x01, 0x6e, + 0x01, 0xbe, 0x01, 0x92, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xbf, 0x01, 0x86, 0x00, 0x03, 0x01, 0x6e, + 0x01, 0xc0, 0x01, 0x97, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xc1, 0x00, 0x05, 0x00, 0x0c, 0x00, 0x14, + 0x00, 0x1c, 0x00, 0x24, 0x00, 0x2c, 0x01, 0x93, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x1a, 0x01, 0x93, + 0x00, 0x03, 0x01, 0x6e, 0x01, 0x73, 0x01, 0x93, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x7d, 0x01, 0x93, + 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb5, 0x01, 0x93, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xbf, 0x00, 0x0a, + 0x00, 0x16, 0x00, 0x1e, 0x00, 0x26, 0x00, 0x2e, 0x00, 0x36, 0x00, 0x3e, 0x00, 0x46, 0x00, 0x4e, + 0x00, 0x56, 0x00, 0x5e, 0x01, 0x87, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x1b, 0x01, 0x98, 0x00, 0x03, + 0x01, 0x6e, 0x00, 0x1c, 0x01, 0x87, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x74, 0x01, 0x98, 0x00, 0x03, + 0x01, 0x6e, 0x01, 0x75, 0x01, 0x87, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x7e, 0x01, 0x98, 0x00, 0x03, + 0x01, 0x6e, 0x01, 0x7f, 0x01, 0x87, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb6, 0x01, 0x98, 0x00, 0x03, + 0x01, 0x6e, 0x01, 0xb7, 0x01, 0x87, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xc0, 0x01, 0x98, 0x00, 0x03, + 0x01, 0x6e, 0x01, 0xc1, 0x00, 0x05, 0x00, 0x0c, 0x00, 0x14, 0x00, 0x1c, 0x00, 0x24, 0x00, 0x2c, + 0x01, 0x99, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x1c, 0x01, 0x99, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x75, + 0x01, 0x99, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x7f, 0x01, 0x99, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb7, + 0x01, 0x99, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xc1, 0x00, 0x28, 0x00, 0x52, 0x00, 0x5a, 0x00, 0x62, + 0x00, 0x6a, 0x00, 0x72, 0x00, 0x7a, 0x00, 0x82, 0x00, 0x8a, 0x00, 0x92, 0x00, 0x9a, 0x00, 0xa2, + 0x00, 0xaa, 0x00, 0xb2, 0x00, 0xba, 0x00, 0xc2, 0x00, 0xca, 0x00, 0xd2, 0x00, 0xda, 0x00, 0xe2, + 0x00, 0xea, 0x00, 0xf2, 0x00, 0xfa, 0x01, 0x02, 0x01, 0x0a, 0x01, 0x12, 0x01, 0x1a, 0x01, 0x22, + 0x01, 0x2a, 0x01, 0x32, 0x01, 0x3a, 0x01, 0x42, 0x01, 0x4a, 0x01, 0x52, 0x01, 0x5a, 0x01, 0x62, + 0x01, 0x6a, 0x01, 0x72, 0x01, 0x7a, 0x01, 0x82, 0x01, 0x8a, 0x00, 0x98, 0x00, 0x03, 0x01, 0x6e, + 0x00, 0x15, 0x01, 0x82, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x16, 0x00, 0x97, 0x00, 0x03, 0x01, 0x6e, + 0x00, 0x17, 0x01, 0x88, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x18, 0x01, 0x8c, 0x00, 0x03, 0x01, 0x6e, + 0x00, 0x19, 0x01, 0x8e, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x1a, 0x01, 0x84, 0x00, 0x03, 0x01, 0x6e, + 0x00, 0x1b, 0x01, 0x94, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x1c, 0x00, 0x98, 0x00, 0x03, 0x01, 0x6e, + 0x00, 0x8d, 0x01, 0x82, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x8e, 0x00, 0x97, 0x00, 0x03, 0x01, 0x6e, + 0x01, 0x70, 0x01, 0x88, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x71, 0x01, 0x8c, 0x00, 0x03, 0x01, 0x6e, + 0x01, 0x72, 0x01, 0x8e, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x73, 0x01, 0x84, 0x00, 0x03, 0x01, 0x6e, + 0x01, 0x74, 0x01, 0x94, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x75, 0x00, 0x98, 0x00, 0x03, 0x01, 0x6e, + 0x01, 0x78, 0x01, 0x82, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x79, 0x00, 0x97, 0x00, 0x03, 0x01, 0x6e, + 0x01, 0x7a, 0x01, 0x88, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x7b, 0x01, 0x8c, 0x00, 0x03, 0x01, 0x6e, + 0x01, 0x7c, 0x01, 0x8e, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x7d, 0x01, 0x84, 0x00, 0x03, 0x01, 0x6e, + 0x01, 0x7e, 0x01, 0x94, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x7f, 0x00, 0x98, 0x00, 0x03, 0x01, 0x6e, + 0x01, 0xb0, 0x01, 0x82, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb1, 0x00, 0x97, 0x00, 0x03, 0x01, 0x6e, + 0x01, 0xb2, 0x01, 0x88, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb3, 0x01, 0x8c, 0x00, 0x03, 0x01, 0x6e, + 0x01, 0xb4, 0x01, 0x8e, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb5, 0x01, 0x84, 0x00, 0x03, 0x01, 0x6e, + 0x01, 0xb6, 0x01, 0x94, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb7, 0x00, 0x98, 0x00, 0x03, 0x01, 0x6e, + 0x01, 0xba, 0x01, 0x82, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xbb, 0x00, 0x97, 0x00, 0x03, 0x01, 0x6e, + 0x01, 0xbc, 0x01, 0x88, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xbd, 0x01, 0x8c, 0x00, 0x03, 0x01, 0x6e, + 0x01, 0xbe, 0x01, 0x8e, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xbf, 0x01, 0x84, 0x00, 0x03, 0x01, 0x6e, + 0x01, 0xc0, 0x01, 0x94, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xc1, 0x00, 0x14, 0x00, 0x2a, 0x00, 0x32, + 0x00, 0x3a, 0x00, 0x42, 0x00, 0x4a, 0x00, 0x52, 0x00, 0x5a, 0x00, 0x62, 0x00, 0x6a, 0x00, 0x72, + 0x00, 0x7a, 0x00, 0x82, 0x00, 0x8a, 0x00, 0x92, 0x00, 0x9a, 0x00, 0xa2, 0x00, 0xaa, 0x00, 0xb2, + 0x00, 0xba, 0x00, 0xc2, 0x01, 0x83, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x16, 0x01, 0x89, 0x00, 0x03, + 0x01, 0x6e, 0x00, 0x18, 0x01, 0x8f, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x1a, 0x01, 0x95, 0x00, 0x03, + 0x01, 0x6e, 0x00, 0x1c, 0x01, 0x83, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x8e, 0x01, 0x89, 0x00, 0x03, + 0x01, 0x6e, 0x01, 0x71, 0x01, 0x8f, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x73, 0x01, 0x95, 0x00, 0x03, + 0x01, 0x6e, 0x01, 0x75, 0x01, 0x83, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x79, 0x01, 0x89, 0x00, 0x03, + 0x01, 0x6e, 0x01, 0x7b, 0x01, 0x8f, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x7d, 0x01, 0x95, 0x00, 0x03, + 0x01, 0x6e, 0x01, 0x7f, 0x01, 0x83, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb1, 0x01, 0x89, 0x00, 0x03, + 0x01, 0x6e, 0x01, 0xb3, 0x01, 0x8f, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb5, 0x01, 0x95, 0x00, 0x03, + 0x01, 0x6e, 0x01, 0xb7, 0x01, 0x83, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xbb, 0x01, 0x89, 0x00, 0x03, + 0x01, 0x6e, 0x01, 0xbd, 0x01, 0x8f, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xbf, 0x01, 0x95, 0x00, 0x03, + 0x01, 0x6e, 0x01, 0xc1, 0x00, 0x14, 0x00, 0x2a, 0x00, 0x32, 0x00, 0x3a, 0x00, 0x42, 0x00, 0x4a, + 0x00, 0x52, 0x00, 0x5a, 0x00, 0x62, 0x00, 0x6a, 0x00, 0x72, 0x00, 0x7a, 0x00, 0x82, 0x00, 0x8a, + 0x00, 0x92, 0x00, 0x9a, 0x00, 0xa2, 0x00, 0xaa, 0x00, 0xb2, 0x00, 0xba, 0x00, 0xc2, 0x00, 0x99, + 0x00, 0x03, 0x01, 0x6e, 0x00, 0x17, 0x01, 0x8a, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x18, 0x01, 0x90, + 0x00, 0x03, 0x01, 0x6e, 0x00, 0x1a, 0x01, 0x85, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x1b, 0x00, 0x99, + 0x00, 0x03, 0x01, 0x6e, 0x01, 0x70, 0x01, 0x8a, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x71, 0x01, 0x90, + 0x00, 0x03, 0x01, 0x6e, 0x01, 0x73, 0x01, 0x85, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x74, 0x00, 0x99, + 0x00, 0x03, 0x01, 0x6e, 0x01, 0x7a, 0x01, 0x8a, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x7b, 0x01, 0x90, + 0x00, 0x03, 0x01, 0x6e, 0x01, 0x7d, 0x01, 0x85, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x7e, 0x00, 0x99, + 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb2, 0x01, 0x8a, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb3, 0x01, 0x90, + 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb5, 0x01, 0x85, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb6, 0x00, 0x99, + 0x00, 0x03, 0x01, 0x6e, 0x01, 0xbc, 0x01, 0x8a, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xbd, 0x01, 0x90, + 0x00, 0x03, 0x01, 0x6e, 0x01, 0xbf, 0x01, 0x85, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xc0, 0x00, 0x0f, + 0x00, 0x20, 0x00, 0x28, 0x00, 0x30, 0x00, 0x38, 0x00, 0x40, 0x00, 0x48, 0x00, 0x50, 0x00, 0x58, + 0x00, 0x60, 0x00, 0x68, 0x00, 0x70, 0x00, 0x78, 0x00, 0x80, 0x00, 0x88, 0x00, 0x90, 0x01, 0x8b, + 0x00, 0x03, 0x01, 0x6e, 0x00, 0x18, 0x01, 0x91, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x1a, 0x01, 0x96, + 0x00, 0x03, 0x01, 0x6e, 0x00, 0x1c, 0x01, 0x8b, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x71, 0x01, 0x91, + 0x00, 0x03, 0x01, 0x6e, 0x01, 0x73, 0x01, 0x96, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x75, 0x01, 0x8b, + 0x00, 0x03, 0x01, 0x6e, 0x01, 0x7b, 0x01, 0x91, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x7d, 0x01, 0x96, + 0x00, 0x03, 0x01, 0x6e, 0x01, 0x7f, 0x01, 0x8b, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb3, 0x01, 0x91, + 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb5, 0x01, 0x96, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb7, 0x01, 0x8b, + 0x00, 0x03, 0x01, 0x6e, 0x01, 0xbd, 0x01, 0x91, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xbf, 0x01, 0x96, + 0x00, 0x03, 0x01, 0x6e, 0x01, 0xc1, 0x00, 0x14, 0x00, 0x2a, 0x00, 0x32, 0x00, 0x3a, 0x00, 0x42, + 0x00, 0x4a, 0x00, 0x52, 0x00, 0x5a, 0x00, 0x62, 0x00, 0x6a, 0x00, 0x72, 0x00, 0x7a, 0x00, 0x82, + 0x00, 0x8a, 0x00, 0x92, 0x00, 0x9a, 0x00, 0xa2, 0x00, 0xaa, 0x00, 0xb2, 0x00, 0xba, 0x00, 0xc2, + 0x01, 0x8d, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x19, 0x01, 0x92, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x1a, + 0x01, 0x86, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x1b, 0x01, 0x97, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x1c, + 0x01, 0x8d, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x72, 0x01, 0x92, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x73, + 0x01, 0x86, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x74, 0x01, 0x97, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x75, + 0x01, 0x8d, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x7c, 0x01, 0x92, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x7d, + 0x01, 0x86, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x7e, 0x01, 0x97, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x7f, + 0x01, 0x8d, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb4, 0x01, 0x92, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb5, + 0x01, 0x86, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb6, 0x01, 0x97, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb7, + 0x01, 0x8d, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xbe, 0x01, 0x92, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xbf, + 0x01, 0x86, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xc0, 0x01, 0x97, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xc1, + 0x00, 0x05, 0x00, 0x0c, 0x00, 0x14, 0x00, 0x1c, 0x00, 0x24, 0x00, 0x2c, 0x01, 0x93, 0x00, 0x03, + 0x01, 0x6e, 0x00, 0x1a, 0x01, 0x93, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x73, 0x01, 0x93, 0x00, 0x03, + 0x01, 0x6e, 0x01, 0x7d, 0x01, 0x93, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb5, 0x01, 0x93, 0x00, 0x03, + 0x01, 0x6e, 0x01, 0xbf, 0x00, 0x0a, 0x00, 0x16, 0x00, 0x1e, 0x00, 0x26, 0x00, 0x2e, 0x00, 0x36, + 0x00, 0x3e, 0x00, 0x46, 0x00, 0x4e, 0x00, 0x56, 0x00, 0x5e, 0x01, 0x87, 0x00, 0x03, 0x01, 0x6e, + 0x00, 0x1b, 0x01, 0x98, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x1c, 0x01, 0x87, 0x00, 0x03, 0x01, 0x6e, + 0x01, 0x74, 0x01, 0x98, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x75, 0x01, 0x87, 0x00, 0x03, 0x01, 0x6e, + 0x01, 0x7e, 0x01, 0x98, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x7f, 0x01, 0x87, 0x00, 0x03, 0x01, 0x6e, + 0x01, 0xb6, 0x01, 0x98, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb7, 0x01, 0x87, 0x00, 0x03, 0x01, 0x6e, + 0x01, 0xc0, 0x01, 0x98, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xc1, 0x00, 0x05, 0x00, 0x0c, 0x00, 0x14, + 0x00, 0x1c, 0x00, 0x24, 0x00, 0x2c, 0x01, 0x99, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x1c, 0x01, 0x99, + 0x00, 0x03, 0x01, 0x6e, 0x01, 0x75, 0x01, 0x99, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x7f, 0x01, 0x99, + 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb7, 0x01, 0x99, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xc1, 0x00, 0x28, + 0x00, 0x52, 0x00, 0x5a, 0x00, 0x62, 0x00, 0x6a, 0x00, 0x72, 0x00, 0x7a, 0x00, 0x82, 0x00, 0x8a, + 0x00, 0x92, 0x00, 0x9a, 0x00, 0xa2, 0x00, 0xaa, 0x00, 0xb2, 0x00, 0xba, 0x00, 0xc2, 0x00, 0xca, + 0x00, 0xd2, 0x00, 0xda, 0x00, 0xe2, 0x00, 0xea, 0x00, 0xf2, 0x00, 0xfa, 0x01, 0x02, 0x01, 0x0a, + 0x01, 0x12, 0x01, 0x1a, 0x01, 0x22, 0x01, 0x2a, 0x01, 0x32, 0x01, 0x3a, 0x01, 0x42, 0x01, 0x4a, + 0x01, 0x52, 0x01, 0x5a, 0x01, 0x62, 0x01, 0x6a, 0x01, 0x72, 0x01, 0x7a, 0x01, 0x82, 0x01, 0x8a, + 0x00, 0x98, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x15, 0x01, 0x82, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x16, + 0x00, 0x97, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x17, 0x01, 0x88, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x18, + 0x01, 0x8c, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x19, 0x01, 0x8e, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x1a, + 0x01, 0x84, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x1b, 0x01, 0x94, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x1c, + 0x00, 0x98, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x8d, 0x01, 0x82, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x8e, + 0x00, 0x97, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x70, 0x01, 0x88, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x71, + 0x01, 0x8c, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x72, 0x01, 0x8e, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x73, + 0x01, 0x84, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x74, 0x01, 0x94, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x75, + 0x00, 0x98, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x78, 0x01, 0x82, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x79, + 0x00, 0x97, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x7a, 0x01, 0x88, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x7b, + 0x01, 0x8c, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x7c, 0x01, 0x8e, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x7d, + 0x01, 0x84, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x7e, 0x01, 0x94, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x7f, + 0x00, 0x98, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb0, 0x01, 0x82, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb1, + 0x00, 0x97, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb2, 0x01, 0x88, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb3, + 0x01, 0x8c, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb4, 0x01, 0x8e, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb5, + 0x01, 0x84, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb6, 0x01, 0x94, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb7, + 0x00, 0x98, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xba, 0x01, 0x82, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xbb, + 0x00, 0x97, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xbc, 0x01, 0x88, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xbd, + 0x01, 0x8c, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xbe, 0x01, 0x8e, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xbf, + 0x01, 0x84, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xc0, 0x01, 0x94, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xc1, + 0x00, 0x14, 0x00, 0x2a, 0x00, 0x32, 0x00, 0x3a, 0x00, 0x42, 0x00, 0x4a, 0x00, 0x52, 0x00, 0x5a, + 0x00, 0x62, 0x00, 0x6a, 0x00, 0x72, 0x00, 0x7a, 0x00, 0x82, 0x00, 0x8a, 0x00, 0x92, 0x00, 0x9a, + 0x00, 0xa2, 0x00, 0xaa, 0x00, 0xb2, 0x00, 0xba, 0x00, 0xc2, 0x01, 0x83, 0x00, 0x03, 0x01, 0x6e, + 0x00, 0x16, 0x01, 0x89, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x18, 0x01, 0x8f, 0x00, 0x03, 0x01, 0x6e, + 0x00, 0x1a, 0x01, 0x95, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x1c, 0x01, 0x83, 0x00, 0x03, 0x01, 0x6e, + 0x00, 0x8e, 0x01, 0x89, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x71, 0x01, 0x8f, 0x00, 0x03, 0x01, 0x6e, + 0x01, 0x73, 0x01, 0x95, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x75, 0x01, 0x83, 0x00, 0x03, 0x01, 0x6e, + 0x01, 0x79, 0x01, 0x89, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x7b, 0x01, 0x8f, 0x00, 0x03, 0x01, 0x6e, + 0x01, 0x7d, 0x01, 0x95, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x7f, 0x01, 0x83, 0x00, 0x03, 0x01, 0x6e, + 0x01, 0xb1, 0x01, 0x89, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb3, 0x01, 0x8f, 0x00, 0x03, 0x01, 0x6e, + 0x01, 0xb5, 0x01, 0x95, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb7, 0x01, 0x83, 0x00, 0x03, 0x01, 0x6e, + 0x01, 0xbb, 0x01, 0x89, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xbd, 0x01, 0x8f, 0x00, 0x03, 0x01, 0x6e, + 0x01, 0xbf, 0x01, 0x95, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xc1, 0x00, 0x14, 0x00, 0x2a, 0x00, 0x32, + 0x00, 0x3a, 0x00, 0x42, 0x00, 0x4a, 0x00, 0x52, 0x00, 0x5a, 0x00, 0x62, 0x00, 0x6a, 0x00, 0x72, + 0x00, 0x7a, 0x00, 0x82, 0x00, 0x8a, 0x00, 0x92, 0x00, 0x9a, 0x00, 0xa2, 0x00, 0xaa, 0x00, 0xb2, + 0x00, 0xba, 0x00, 0xc2, 0x00, 0x99, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x17, 0x01, 0x8a, 0x00, 0x03, + 0x01, 0x6e, 0x00, 0x18, 0x01, 0x90, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x1a, 0x01, 0x85, 0x00, 0x03, + 0x01, 0x6e, 0x00, 0x1b, 0x00, 0x99, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x70, 0x01, 0x8a, 0x00, 0x03, + 0x01, 0x6e, 0x01, 0x71, 0x01, 0x90, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x73, 0x01, 0x85, 0x00, 0x03, + 0x01, 0x6e, 0x01, 0x74, 0x00, 0x99, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x7a, 0x01, 0x8a, 0x00, 0x03, + 0x01, 0x6e, 0x01, 0x7b, 0x01, 0x90, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x7d, 0x01, 0x85, 0x00, 0x03, + 0x01, 0x6e, 0x01, 0x7e, 0x00, 0x99, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb2, 0x01, 0x8a, 0x00, 0x03, + 0x01, 0x6e, 0x01, 0xb3, 0x01, 0x90, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb5, 0x01, 0x85, 0x00, 0x03, + 0x01, 0x6e, 0x01, 0xb6, 0x00, 0x99, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xbc, 0x01, 0x8a, 0x00, 0x03, + 0x01, 0x6e, 0x01, 0xbd, 0x01, 0x90, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xbf, 0x01, 0x85, 0x00, 0x03, + 0x01, 0x6e, 0x01, 0xc0, 0x00, 0x0f, 0x00, 0x20, 0x00, 0x28, 0x00, 0x30, 0x00, 0x38, 0x00, 0x40, + 0x00, 0x48, 0x00, 0x50, 0x00, 0x58, 0x00, 0x60, 0x00, 0x68, 0x00, 0x70, 0x00, 0x78, 0x00, 0x80, + 0x00, 0x88, 0x00, 0x90, 0x01, 0x8b, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x18, 0x01, 0x91, 0x00, 0x03, + 0x01, 0x6e, 0x00, 0x1a, 0x01, 0x96, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x1c, 0x01, 0x8b, 0x00, 0x03, + 0x01, 0x6e, 0x01, 0x71, 0x01, 0x91, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x73, 0x01, 0x96, 0x00, 0x03, + 0x01, 0x6e, 0x01, 0x75, 0x01, 0x8b, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x7b, 0x01, 0x91, 0x00, 0x03, + 0x01, 0x6e, 0x01, 0x7d, 0x01, 0x96, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x7f, 0x01, 0x8b, 0x00, 0x03, + 0x01, 0x6e, 0x01, 0xb3, 0x01, 0x91, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb5, 0x01, 0x96, 0x00, 0x03, + 0x01, 0x6e, 0x01, 0xb7, 0x01, 0x8b, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xbd, 0x01, 0x91, 0x00, 0x03, + 0x01, 0x6e, 0x01, 0xbf, 0x01, 0x96, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xc1, 0x00, 0x14, 0x00, 0x2a, + 0x00, 0x32, 0x00, 0x3a, 0x00, 0x42, 0x00, 0x4a, 0x00, 0x52, 0x00, 0x5a, 0x00, 0x62, 0x00, 0x6a, + 0x00, 0x72, 0x00, 0x7a, 0x00, 0x82, 0x00, 0x8a, 0x00, 0x92, 0x00, 0x9a, 0x00, 0xa2, 0x00, 0xaa, + 0x00, 0xb2, 0x00, 0xba, 0x00, 0xc2, 0x01, 0x8d, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x19, 0x01, 0x92, + 0x00, 0x03, 0x01, 0x6e, 0x00, 0x1a, 0x01, 0x86, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x1b, 0x01, 0x97, + 0x00, 0x03, 0x01, 0x6e, 0x00, 0x1c, 0x01, 0x8d, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x72, 0x01, 0x92, + 0x00, 0x03, 0x01, 0x6e, 0x01, 0x73, 0x01, 0x86, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x74, 0x01, 0x97, + 0x00, 0x03, 0x01, 0x6e, 0x01, 0x75, 0x01, 0x8d, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x7c, 0x01, 0x92, + 0x00, 0x03, 0x01, 0x6e, 0x01, 0x7d, 0x01, 0x86, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x7e, 0x01, 0x97, + 0x00, 0x03, 0x01, 0x6e, 0x01, 0x7f, 0x01, 0x8d, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb4, 0x01, 0x92, + 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb5, 0x01, 0x86, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb6, 0x01, 0x97, + 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb7, 0x01, 0x8d, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xbe, 0x01, 0x92, + 0x00, 0x03, 0x01, 0x6e, 0x01, 0xbf, 0x01, 0x86, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xc0, 0x01, 0x97, + 0x00, 0x03, 0x01, 0x6e, 0x01, 0xc1, 0x00, 0x05, 0x00, 0x0c, 0x00, 0x14, 0x00, 0x1c, 0x00, 0x24, + 0x00, 0x2c, 0x01, 0x93, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x1a, 0x01, 0x93, 0x00, 0x03, 0x01, 0x6e, + 0x01, 0x73, 0x01, 0x93, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x7d, 0x01, 0x93, 0x00, 0x03, 0x01, 0x6e, + 0x01, 0xb5, 0x01, 0x93, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xbf, 0x00, 0x0a, 0x00, 0x16, 0x00, 0x1e, + 0x00, 0x26, 0x00, 0x2e, 0x00, 0x36, 0x00, 0x3e, 0x00, 0x46, 0x00, 0x4e, 0x00, 0x56, 0x00, 0x5e, + 0x01, 0x87, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x1b, 0x01, 0x98, 0x00, 0x03, 0x01, 0x6e, 0x00, 0x1c, + 0x01, 0x87, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x74, 0x01, 0x98, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x75, + 0x01, 0x87, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x7e, 0x01, 0x98, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x7f, + 0x01, 0x87, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb6, 0x01, 0x98, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb7, + 0x01, 0x87, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xc0, 0x01, 0x98, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xc1, + 0x00, 0x05, 0x00, 0x0c, 0x00, 0x14, 0x00, 0x1c, 0x00, 0x24, 0x00, 0x2c, 0x01, 0x99, 0x00, 0x03, + 0x01, 0x6e, 0x00, 0x1c, 0x01, 0x99, 0x00, 0x03, 0x01, 0x6e, 0x01, 0x75, 0x01, 0x99, 0x00, 0x03, + 0x01, 0x6e, 0x01, 0x7f, 0x01, 0x99, 0x00, 0x03, 0x01, 0x6e, 0x01, 0xb7, 0x01, 0x99, 0x00, 0x03, + 0x01, 0x6e, 0x01, 0xc1, 0x00, 0x02, 0x02, 0x98, 0x00, 0x02, 0x01, 0x6e, 0x01, 0x6e, 0x00, 0x02, + 0x02, 0x0a, 0x00, 0x28, 0x01, 0x6f, 0x00, 0x94, 0x00, 0x8d, 0x00, 0x8e, 0x01, 0x70, 0x01, 0x71, + 0x01, 0x72, 0x01, 0x73, 0x01, 0x74, 0x01, 0x75, 0x01, 0x6f, 0x00, 0x94, 0x00, 0x8d, 0x00, 0x8e, + 0x01, 0x70, 0x01, 0x71, 0x01, 0x72, 0x01, 0x73, 0x01, 0x74, 0x01, 0x75, 0x01, 0x6f, 0x00, 0x94, + 0x00, 0x8d, 0x00, 0x8e, 0x01, 0x70, 0x01, 0x71, 0x01, 0x72, 0x01, 0x73, 0x01, 0x74, 0x01, 0x75, + 0x01, 0x6f, 0x00, 0x94, 0x00, 0x8d, 0x00, 0x8e, 0x01, 0x70, 0x01, 0x71, 0x01, 0x72, 0x01, 0x73, + 0x01, 0x74, 0x01, 0x75, 0x00, 0x03, 0x00, 0x01, 0x02, 0x6e, 0x00, 0x01, 0x02, 0x7e, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x16, 0x00, 0x02, 0x02, 0x82, 0x00, 0x15, 0x01, 0xc6, 0x01, 0xc7, + 0x01, 0xc8, 0x01, 0xc9, 0x01, 0xca, 0x01, 0xcb, 0x01, 0xcc, 0x01, 0xcd, 0x01, 0xce, 0x01, 0xcf, + 0x01, 0xd0, 0x01, 0xd1, 0x01, 0xd2, 0x01, 0xd3, 0x01, 0xd4, 0x01, 0xd5, 0x01, 0xd6, 0x01, 0xd7, + 0x01, 0xd8, 0x00, 0x36, 0x00, 0x2d, 0x00, 0x02, 0x02, 0x80, 0x00, 0x7f, 0x00, 0x24, 0x00, 0x25, + 0x00, 0x26, 0x00, 0x27, 0x00, 0x28, 0x00, 0x29, 0x00, 0x2a, 0x00, 0x2b, 0x00, 0x2c, 0x00, 0x2d, + 0x00, 0x2e, 0x00, 0x2f, 0x00, 0x30, 0x00, 0x31, 0x00, 0x32, 0x00, 0x33, 0x00, 0x34, 0x00, 0x35, + 0x00, 0x36, 0x00, 0x37, 0x00, 0x38, 0x00, 0x39, 0x00, 0x3a, 0x00, 0x3b, 0x00, 0x3c, 0x00, 0x3d, + 0x00, 0x6b, 0x00, 0x6d, 0x00, 0x9b, 0x00, 0x9c, 0x00, 0x9d, 0x00, 0x9e, 0x00, 0x9f, 0x00, 0xa0, + 0x00, 0xa1, 0x00, 0xa2, 0x00, 0xa3, 0x00, 0xa4, 0x00, 0xa5, 0x00, 0xa6, 0x00, 0xa7, 0x00, 0xa8, + 0x00, 0xa9, 0x00, 0xaa, 0x00, 0xab, 0x00, 0xac, 0x00, 0xad, 0x00, 0xae, 0x00, 0xaf, 0x00, 0xb0, + 0x00, 0xb1, 0x00, 0xb3, 0x00, 0xb4, 0x00, 0xb5, 0x00, 0xb6, 0x00, 0xb7, 0x00, 0xb8, 0x00, 0xb9, + 0x00, 0x7a, 0x00, 0xdb, 0x00, 0xdd, 0x00, 0xdf, 0x00, 0xe1, 0x00, 0xe3, 0x00, 0xe5, 0x00, 0xe7, + 0x00, 0xe9, 0x00, 0xeb, 0x00, 0xed, 0x00, 0xef, 0x00, 0xf1, 0x00, 0xf3, 0x00, 0xf5, 0x00, 0xf7, + 0x00, 0xf9, 0x00, 0xfb, 0x00, 0xfd, 0x00, 0xff, 0x01, 0x01, 0x01, 0x03, 0x01, 0x05, 0x01, 0x07, + 0x01, 0x09, 0x01, 0x0b, 0x01, 0x0e, 0x01, 0x10, 0x01, 0x12, 0x01, 0x14, 0x01, 0x16, 0x01, 0x18, + 0x01, 0x1a, 0x01, 0x1c, 0x01, 0x1e, 0x01, 0x20, 0x01, 0x22, 0x01, 0x24, 0x01, 0x26, 0x01, 0x28, + 0x01, 0x2a, 0x01, 0x2c, 0x01, 0x2e, 0x01, 0x30, 0x01, 0x32, 0x01, 0x34, 0x01, 0x36, 0x01, 0x38, + 0x01, 0x3a, 0x01, 0x3c, 0x01, 0x3e, 0x01, 0x40, 0x01, 0x42, 0x01, 0x44, 0x01, 0x46, 0x01, 0x48, + 0x01, 0x4a, 0x01, 0x4c, 0x01, 0x4e, 0x01, 0x50, 0x01, 0x52, 0x01, 0x54, 0x01, 0x56, 0x01, 0x59, + 0x01, 0x5b, 0x01, 0x66, 0x01, 0x68, 0x01, 0x6a, 0x01, 0x6c, 0x00, 0x02, 0x02, 0x7e, 0x00, 0x09, + 0x04, 0xc2, 0x04, 0xc3, 0x04, 0xc4, 0x04, 0xc5, 0x04, 0xc6, 0x04, 0xc7, 0x04, 0xc8, 0x04, 0xc9, + 0x04, 0xda, 0x00, 0x02, 0x02, 0x76, 0x00, 0x09, 0x04, 0xca, 0x04, 0xcb, 0x04, 0xcc, 0x04, 0xcd, + 0x04, 0xce, 0x04, 0xcf, 0x04, 0xd0, 0x04, 0xd1, 0x04, 0xdb, 0x00, 0x02, 0x02, 0x6e, 0x00, 0x09, + 0x04, 0xd2, 0x04, 0xd3, 0x04, 0xd4, 0x04, 0xd5, 0x04, 0xd6, 0x04, 0xd7, 0x04, 0xd8, 0x04, 0xd9, + 0x04, 0xdc, 0x00, 0x02, 0x00, 0xf0, 0x00, 0x0a, 0x01, 0x78, 0x01, 0x79, 0x01, 0x77, 0x01, 0x76, + 0x01, 0x7a, 0x01, 0x7b, 0x01, 0x7c, 0x01, 0x7d, 0x01, 0x7e, 0x01, 0x7f, 0x00, 0x01, 0x00, 0x01, + 0x00, 0x4c, 0x00, 0x01, 0x00, 0x01, 0x02, 0xe4, 0x00, 0x02, 0x00, 0x03, 0x00, 0x13, 0x00, 0x1c, + 0x00, 0x00, 0x01, 0x76, 0x01, 0x7f, 0x00, 0x0a, 0x01, 0xae, 0x01, 0xc1, 0x00, 0x14, 0x00, 0x01, + 0x00, 0x02, 0x00, 0x44, 0x00, 0x52, 0x00, 0x02, 0x00, 0x05, 0x00, 0x13, 0x00, 0x1c, 0x00, 0x00, + 0x00, 0x8d, 0x00, 0x8e, 0x00, 0x0a, 0x00, 0x94, 0x00, 0x94, 0x00, 0x0c, 0x01, 0x6f, 0x01, 0x75, + 0x00, 0x0d, 0x01, 0xae, 0x01, 0xc1, 0x00, 0x14, 0x00, 0x02, 0x00, 0x05, 0x00, 0x13, 0x00, 0x1c, + 0x00, 0x00, 0x00, 0x8d, 0x00, 0x8e, 0x00, 0x0a, 0x00, 0x94, 0x00, 0x94, 0x00, 0x0c, 0x01, 0x6f, + 0x01, 0x7f, 0x00, 0x0d, 0x01, 0xb8, 0x01, 0xc1, 0x00, 0x1e, 0x00, 0x02, 0x00, 0x05, 0x00, 0x13, + 0x00, 0x1c, 0x00, 0x00, 0x00, 0x8d, 0x00, 0x8e, 0x00, 0x0a, 0x00, 0x94, 0x00, 0x94, 0x00, 0x0c, + 0x01, 0x6f, 0x01, 0x7f, 0x00, 0x0d, 0x01, 0xae, 0x01, 0xb7, 0x00, 0x1e, 0x00, 0x01, 0x00, 0x02, + 0x00, 0x12, 0x01, 0xa0, 0x00, 0x02, 0x00, 0x07, 0x00, 0x14, 0x00, 0x1b, 0x00, 0x00, 0x00, 0x8d, + 0x00, 0x8e, 0x00, 0x08, 0x00, 0x94, 0x00, 0x94, 0x00, 0x0a, 0x01, 0x70, 0x01, 0x74, 0x00, 0x0b, + 0x01, 0x77, 0x01, 0x7e, 0x00, 0x10, 0x01, 0xaf, 0x01, 0xb6, 0x00, 0x18, 0x01, 0xb9, 0x01, 0xc0, + 0x00, 0x20, 0x00, 0x02, 0x00, 0x02, 0x01, 0x6e, 0x01, 0x6e, 0x00, 0x00, 0x01, 0x76, 0x01, 0x7f, + 0x00, 0x01, 0x00, 0x02, 0x00, 0x03, 0x00, 0x8d, 0x00, 0x8e, 0x00, 0x00, 0x00, 0x94, 0x00, 0x94, + 0x00, 0x02, 0x01, 0x6f, 0x01, 0x75, 0x00, 0x03, 0x00, 0x01, 0x00, 0x15, 0x00, 0x0b, 0x00, 0x0c, + 0x00, 0x10, 0x00, 0x12, 0x00, 0x23, 0x00, 0x3e, 0x00, 0x3f, 0x00, 0x40, 0x00, 0x5e, 0x00, 0x60, + 0x00, 0x6c, 0x00, 0x72, 0x00, 0x73, 0x00, 0x74, 0x00, 0x78, 0x00, 0x7c, 0x00, 0x86, 0x00, 0x96, + 0x00, 0x9a, 0x01, 0x58, 0x01, 0x5d, 0x00, 0x01, 0x00, 0x7f, 0x00, 0x44, 0x00, 0x45, 0x00, 0x46, + 0x00, 0x47, 0x00, 0x48, 0x00, 0x49, 0x00, 0x4a, 0x00, 0x4b, 0x00, 0x4c, 0x00, 0x4d, 0x00, 0x4e, + 0x00, 0x4f, 0x00, 0x50, 0x00, 0x51, 0x00, 0x52, 0x00, 0x53, 0x00, 0x54, 0x00, 0x55, 0x00, 0x56, + 0x00, 0x57, 0x00, 0x58, 0x00, 0x59, 0x00, 0x5a, 0x00, 0x5b, 0x00, 0x5c, 0x00, 0x5d, 0x00, 0x77, + 0x00, 0x79, 0x00, 0xbb, 0x00, 0xbc, 0x00, 0xbd, 0x00, 0xbe, 0x00, 0xbf, 0x00, 0xc0, 0x00, 0xc1, + 0x00, 0xc2, 0x00, 0xc3, 0x00, 0xc4, 0x00, 0xc5, 0x00, 0xc6, 0x00, 0xc7, 0x00, 0xc8, 0x00, 0xc9, + 0x00, 0xca, 0x00, 0xcb, 0x00, 0xcc, 0x00, 0xcd, 0x00, 0xce, 0x00, 0xcf, 0x00, 0xd0, 0x00, 0xd1, + 0x00, 0xd3, 0x00, 0xd4, 0x00, 0xd5, 0x00, 0xd6, 0x00, 0xd7, 0x00, 0xd8, 0x00, 0xd9, 0x00, 0xda, + 0x00, 0xdc, 0x00, 0xde, 0x00, 0xe0, 0x00, 0xe2, 0x00, 0xe4, 0x00, 0xe6, 0x00, 0xe8, 0x00, 0xea, + 0x00, 0xec, 0x00, 0xee, 0x00, 0xf0, 0x00, 0xf2, 0x00, 0xf4, 0x00, 0xf6, 0x00, 0xf8, 0x00, 0xfa, + 0x00, 0xfc, 0x00, 0xfe, 0x01, 0x00, 0x01, 0x02, 0x01, 0x04, 0x01, 0x06, 0x01, 0x08, 0x01, 0x0a, + 0x01, 0x0d, 0x01, 0x0f, 0x01, 0x11, 0x01, 0x13, 0x01, 0x15, 0x01, 0x17, 0x01, 0x19, 0x01, 0x1b, + 0x01, 0x1d, 0x01, 0x1f, 0x01, 0x21, 0x01, 0x23, 0x01, 0x25, 0x01, 0x27, 0x01, 0x29, 0x01, 0x2b, + 0x01, 0x2d, 0x01, 0x2f, 0x01, 0x31, 0x01, 0x33, 0x01, 0x35, 0x01, 0x37, 0x01, 0x39, 0x01, 0x3b, + 0x01, 0x3d, 0x01, 0x3f, 0x01, 0x41, 0x01, 0x43, 0x01, 0x45, 0x01, 0x47, 0x01, 0x49, 0x01, 0x4b, + 0x01, 0x4d, 0x01, 0x4f, 0x01, 0x51, 0x01, 0x53, 0x01, 0x55, 0x01, 0x57, 0x01, 0x5a, 0x01, 0x5c, + 0x01, 0x67, 0x01, 0x69, 0x01, 0x6b, 0x01, 0x6d, 0x00, 0x02, 0x00, 0x02, 0x04, 0x53, 0x04, 0x5a, + 0x00, 0x00, 0x04, 0x86, 0x04, 0x86, 0x00, 0x08, 0x00, 0x02, 0x00, 0x02, 0x04, 0x63, 0x04, 0x6a, + 0x00, 0x00, 0x04, 0x95, 0x04, 0x95, 0x00, 0x08, 0x00, 0x02, 0x00, 0x02, 0x04, 0x73, 0x04, 0x7a, + 0x00, 0x00, 0x04, 0xbf, 0x04, 0xbf, 0x00, 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, + 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x19, 0x1a, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x19, 0x12, 0x30, 0x82, 0x19, 0x0e, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, + 0x01, 0x07, 0x02, 0xa0, 0x82, 0x18, 0xff, 0x30, 0x82, 0x18, 0xfb, 0x02, 0x01, 0x01, 0x31, 0x0b, + 0x30, 0x09, 0x06, 0x05, 0x2b, 0x0e, 0x03, 0x02, 0x1a, 0x05, 0x00, 0x30, 0x61, 0x06, 0x0a, 0x2b, + 0x06, 0x01, 0x04, 0x01, 0x82, 0x37, 0x02, 0x01, 0x04, 0xa0, 0x53, 0x30, 0x51, 0x30, 0x2c, 0x06, + 0x0a, 0x2b, 0x06, 0x01, 0x04, 0x01, 0x82, 0x37, 0x02, 0x01, 0x1c, 0xa2, 0x1e, 0x80, 0x1c, 0x00, + 0x3c, 0x00, 0x3c, 0x00, 0x3c, 0x00, 0x4f, 0x00, 0x62, 0x00, 0x73, 0x00, 0x6f, 0x00, 0x6c, 0x00, + 0x65, 0x00, 0x74, 0x00, 0x65, 0x00, 0x3e, 0x00, 0x3e, 0x00, 0x3e, 0x30, 0x21, 0x30, 0x09, 0x06, + 0x05, 0x2b, 0x0e, 0x03, 0x02, 0x1a, 0x05, 0x00, 0x04, 0x14, 0x00, 0x8a, 0x3b, 0xb1, 0xaa, 0x92, + 0x68, 0xb3, 0xa5, 0x2c, 0x13, 0x77, 0x35, 0xa6, 0x42, 0xdb, 0xf5, 0x52, 0x22, 0xa8, 0xa0, 0x82, + 0x13, 0x82, 0x30, 0x82, 0x05, 0x56, 0x30, 0x82, 0x04, 0x3e, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, + 0x02, 0x20, 0x05, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, + 0x05, 0x00, 0x30, 0x81, 0xcf, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, + 0x55, 0x53, 0x31, 0x10, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x04, 0x08, 0x13, 0x07, 0x41, 0x72, 0x69, + 0x7a, 0x6f, 0x6e, 0x61, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x07, 0x13, 0x0a, 0x53, + 0x63, 0x6f, 0x74, 0x74, 0x73, 0x64, 0x61, 0x6c, 0x65, 0x31, 0x25, 0x30, 0x23, 0x06, 0x03, 0x55, + 0x04, 0x0a, 0x13, 0x1c, 0x53, 0x74, 0x61, 0x72, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x20, 0x54, 0x65, + 0x63, 0x68, 0x6e, 0x6f, 0x6c, 0x6f, 0x67, 0x69, 0x65, 0x73, 0x2c, 0x20, 0x49, 0x6e, 0x63, 0x2e, + 0x31, 0x3a, 0x30, 0x38, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x31, 0x68, 0x74, 0x74, 0x70, 0x3a, + 0x2f, 0x2f, 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x73, 0x2e, 0x73, + 0x74, 0x61, 0x72, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x74, 0x65, 0x63, 0x68, 0x2e, 0x63, 0x6f, 0x6d, + 0x2f, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x2f, 0x31, 0x36, 0x30, 0x34, + 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x2d, 0x53, 0x74, 0x61, 0x72, 0x66, 0x69, 0x65, 0x6c, 0x64, + 0x20, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, + 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, + 0x72, 0x69, 0x74, 0x79, 0x30, 0x1e, 0x17, 0x0d, 0x31, 0x31, 0x30, 0x35, 0x30, 0x33, 0x30, 0x37, + 0x30, 0x30, 0x30, 0x30, 0x5a, 0x17, 0x0d, 0x31, 0x36, 0x30, 0x35, 0x30, 0x33, 0x30, 0x37, 0x30, + 0x30, 0x30, 0x30, 0x5a, 0x30, 0x81, 0xc1, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, + 0x13, 0x02, 0x55, 0x53, 0x31, 0x10, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x04, 0x08, 0x13, 0x07, 0x41, + 0x72, 0x69, 0x7a, 0x6f, 0x6e, 0x61, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x07, 0x13, + 0x0a, 0x53, 0x63, 0x6f, 0x74, 0x74, 0x73, 0x64, 0x61, 0x6c, 0x65, 0x31, 0x25, 0x30, 0x23, 0x06, + 0x03, 0x55, 0x04, 0x0a, 0x13, 0x1c, 0x53, 0x74, 0x61, 0x72, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x20, + 0x54, 0x65, 0x63, 0x68, 0x6e, 0x6f, 0x6c, 0x6f, 0x67, 0x69, 0x65, 0x73, 0x2c, 0x20, 0x49, 0x6e, + 0x63, 0x2e, 0x31, 0x33, 0x30, 0x31, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x2a, 0x68, 0x74, 0x74, + 0x70, 0x3a, 0x2f, 0x2f, 0x63, 0x65, 0x72, 0x74, 0x73, 0x2e, 0x73, 0x74, 0x61, 0x72, 0x66, 0x69, + 0x65, 0x6c, 0x64, 0x74, 0x65, 0x63, 0x68, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x72, 0x65, 0x70, 0x6f, + 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x2f, 0x31, 0x2f, 0x30, 0x2d, 0x06, 0x03, 0x55, 0x04, 0x03, + 0x13, 0x26, 0x53, 0x74, 0x61, 0x72, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x20, 0x53, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x73, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x20, 0x41, + 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, + 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xf2, 0xb3, 0x91, 0xa5, 0xba, 0xd7, 0xd6, + 0x49, 0x0d, 0xf6, 0x7d, 0xd6, 0xc2, 0x2d, 0x90, 0xce, 0xfb, 0xe9, 0x60, 0x5a, 0x1a, 0x63, 0x15, + 0x19, 0x9c, 0xb4, 0x30, 0xa0, 0x9b, 0xd4, 0x78, 0xea, 0x06, 0x43, 0x3b, 0xed, 0x9d, 0x23, 0x28, + 0x32, 0x26, 0x5f, 0x32, 0x25, 0xe8, 0x95, 0x85, 0x0d, 0x3e, 0x4f, 0x80, 0xb4, 0x20, 0xb0, 0x9c, + 0xa2, 0x5e, 0x3e, 0x51, 0x8f, 0xfa, 0x93, 0x2e, 0xbb, 0xb2, 0xca, 0xc6, 0x3b, 0x11, 0x02, 0x56, + 0x00, 0x20, 0x8b, 0x41, 0x29, 0x84, 0xb4, 0x2b, 0x35, 0x79, 0xfb, 0xb0, 0x69, 0x07, 0xf1, 0x88, + 0x5d, 0x72, 0xad, 0xc0, 0xe2, 0xcb, 0x45, 0x0e, 0x25, 0xaf, 0xc4, 0xb4, 0xc2, 0xd6, 0xac, 0x65, + 0xb4, 0x61, 0x1a, 0xe2, 0xdf, 0x2d, 0x12, 0x0c, 0x76, 0x97, 0x63, 0x19, 0x4c, 0x79, 0x3c, 0xbb, + 0x0c, 0x74, 0x66, 0xf5, 0x01, 0x19, 0x59, 0x50, 0xe2, 0x0d, 0x9b, 0x5f, 0x59, 0x24, 0xfa, 0x39, + 0x1f, 0x99, 0xd3, 0x89, 0x70, 0x55, 0x48, 0xa6, 0x99, 0xa6, 0x0b, 0xe0, 0x7b, 0xa6, 0x28, 0x20, + 0xe5, 0x8a, 0xcb, 0x5d, 0x92, 0xad, 0x50, 0x28, 0xff, 0x80, 0x20, 0xcc, 0x2a, 0x2f, 0xd3, 0xbf, + 0xf1, 0xb9, 0xab, 0x4a, 0x5e, 0x3d, 0x97, 0x7a, 0x75, 0x08, 0xa1, 0x15, 0x99, 0x02, 0x5f, 0x5e, + 0xed, 0xcc, 0xa7, 0x40, 0xd6, 0x81, 0x55, 0x5d, 0xe8, 0x45, 0x27, 0xee, 0xbb, 0xff, 0x9d, 0xf8, + 0x18, 0xc2, 0x80, 0xf5, 0xb7, 0xec, 0x74, 0xb0, 0xce, 0xc2, 0x3f, 0x3e, 0x33, 0xf7, 0xef, 0xc1, + 0x1c, 0x0b, 0xd5, 0x48, 0xc9, 0x65, 0x32, 0x37, 0x6d, 0x0b, 0x55, 0xc9, 0x55, 0x4f, 0xcd, 0x22, + 0x1c, 0xbf, 0x9f, 0xf1, 0x94, 0x2f, 0x2b, 0xab, 0xa0, 0xa8, 0x30, 0x74, 0x43, 0x2c, 0xe7, 0x8a, + 0x4b, 0x20, 0x0d, 0x22, 0xab, 0x40, 0x78, 0x51, 0xcb, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x82, + 0x01, 0x46, 0x30, 0x82, 0x01, 0x42, 0x30, 0x0c, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, + 0x04, 0x02, 0x30, 0x00, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, + 0x03, 0x02, 0x06, 0xc0, 0x30, 0x16, 0x06, 0x03, 0x55, 0x1d, 0x25, 0x01, 0x01, 0xff, 0x04, 0x0c, + 0x30, 0x0a, 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x03, 0x08, 0x30, 0x1d, 0x06, 0x03, + 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0xca, 0x23, 0xa3, 0x20, 0xb4, 0xb1, 0x6b, 0x72, 0x9f, + 0xba, 0x6f, 0x9a, 0x83, 0x3e, 0x0b, 0xc9, 0xd8, 0xb1, 0xd8, 0xa7, 0x30, 0x1f, 0x06, 0x03, 0x55, + 0x1d, 0x23, 0x04, 0x18, 0x30, 0x16, 0x80, 0x14, 0xb4, 0xc6, 0x7f, 0x1a, 0x43, 0xcc, 0x9b, 0x75, + 0x5d, 0x2f, 0xc4, 0x4b, 0xf2, 0x8b, 0x98, 0x10, 0xe9, 0xf1, 0x51, 0x10, 0x30, 0x3a, 0x06, 0x08, + 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x01, 0x01, 0x04, 0x2e, 0x30, 0x2c, 0x30, 0x2a, 0x06, 0x08, + 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x30, 0x01, 0x86, 0x1e, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, + 0x2f, 0x6f, 0x63, 0x73, 0x70, 0x2e, 0x73, 0x74, 0x61, 0x72, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x74, + 0x65, 0x63, 0x68, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x30, 0x39, 0x06, 0x03, 0x55, 0x1d, 0x1f, 0x04, + 0x32, 0x30, 0x30, 0x30, 0x2e, 0xa0, 0x2c, 0xa0, 0x2a, 0x86, 0x28, 0x68, 0x74, 0x74, 0x70, 0x3a, + 0x2f, 0x2f, 0x63, 0x72, 0x6c, 0x2e, 0x73, 0x74, 0x61, 0x72, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x74, + 0x65, 0x63, 0x68, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x73, 0x66, 0x73, 0x72, 0x6f, 0x6f, 0x74, 0x2e, + 0x63, 0x72, 0x6c, 0x30, 0x53, 0x06, 0x03, 0x55, 0x1d, 0x20, 0x04, 0x4c, 0x30, 0x4a, 0x30, 0x48, + 0x06, 0x0b, 0x60, 0x86, 0x48, 0x01, 0x86, 0xfd, 0x6e, 0x01, 0x07, 0x18, 0x02, 0x30, 0x39, 0x30, + 0x37, 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x02, 0x01, 0x16, 0x2b, 0x68, 0x74, 0x74, + 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x63, 0x65, 0x72, 0x74, 0x73, 0x2e, 0x73, 0x74, 0x61, 0x72, 0x66, + 0x69, 0x65, 0x6c, 0x64, 0x74, 0x65, 0x63, 0x68, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x72, 0x65, 0x70, + 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x2f, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, + 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, 0x18, 0x53, 0x7e, 0x74, + 0xac, 0xa7, 0x7a, 0xa3, 0x2b, 0xea, 0x78, 0x59, 0xd2, 0x3c, 0xc2, 0xf9, 0xc2, 0xf7, 0x25, 0x5f, + 0x42, 0x37, 0x5b, 0x3c, 0x11, 0x61, 0x1c, 0xa6, 0x03, 0xff, 0x34, 0x6a, 0x68, 0xbe, 0xda, 0x22, + 0xa4, 0x21, 0x5a, 0x48, 0x85, 0x90, 0x55, 0x4d, 0xce, 0xab, 0xa6, 0xcb, 0x34, 0xc6, 0xc0, 0xc6, + 0xad, 0xba, 0xb6, 0x80, 0xbe, 0x0b, 0x79, 0xc0, 0xa7, 0xe4, 0xda, 0xa7, 0x1a, 0xe7, 0xcf, 0x57, + 0x1e, 0xc8, 0x39, 0xf9, 0xef, 0xdf, 0x30, 0x30, 0xd0, 0xa0, 0x2a, 0xaf, 0x5c, 0x8d, 0x25, 0x53, + 0x2d, 0x4c, 0xf7, 0xf5, 0x6d, 0xb4, 0x7b, 0x72, 0xae, 0x52, 0xa3, 0xb7, 0xb9, 0xea, 0x55, 0x83, + 0x3e, 0x3a, 0x45, 0x4b, 0x94, 0x1a, 0x96, 0x64, 0x16, 0xd6, 0xe8, 0x60, 0xe3, 0xaf, 0x35, 0x8d, + 0x54, 0x25, 0x4c, 0x5b, 0xf8, 0xd6, 0x37, 0xd9, 0x04, 0xab, 0xb8, 0x36, 0xe0, 0x4a, 0x89, 0xfb, + 0x0a, 0x69, 0x6f, 0xcc, 0x57, 0xe1, 0xea, 0xdc, 0x22, 0xb2, 0xb5, 0xc5, 0x41, 0x1e, 0xd7, 0x63, + 0xe9, 0x9e, 0x64, 0xac, 0xb2, 0xc3, 0xc7, 0xbe, 0xda, 0x77, 0xe0, 0x58, 0x9d, 0x36, 0x01, 0x99, + 0xae, 0x86, 0x17, 0x66, 0x38, 0x1d, 0xbd, 0x64, 0xf6, 0xc6, 0x52, 0x5e, 0x10, 0x2f, 0x60, 0xd0, + 0xca, 0xcb, 0xc3, 0xc4, 0x72, 0x6f, 0x36, 0x85, 0x44, 0x22, 0x40, 0x9c, 0xc5, 0x41, 0x54, 0x33, + 0x23, 0x6c, 0x7b, 0xa3, 0x8e, 0xd9, 0x58, 0x85, 0xf1, 0xaa, 0xb8, 0x34, 0x7e, 0xbb, 0xb5, 0xae, + 0x68, 0x54, 0x78, 0x20, 0x0c, 0x52, 0x93, 0x4d, 0xb2, 0x4b, 0x01, 0xf2, 0xc1, 0x88, 0x47, 0x95, + 0xcd, 0x6c, 0xd2, 0x53, 0xa8, 0x4c, 0xf0, 0x18, 0x3e, 0x8c, 0x33, 0xa3, 0xc4, 0x8a, 0xcf, 0xce, + 0x73, 0x92, 0x49, 0x22, 0x8f, 0xed, 0xbb, 0xc8, 0x9c, 0x7c, 0x63, 0xab, 0x30, 0x82, 0x04, 0x00, + 0x30, 0x82, 0x02, 0xe8, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x01, 0x00, 0x30, 0x0d, 0x06, 0x09, + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, 0x63, 0x31, 0x0b, 0x30, + 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x21, 0x30, 0x1f, 0x06, 0x03, + 0x55, 0x04, 0x0a, 0x13, 0x18, 0x54, 0x68, 0x65, 0x20, 0x47, 0x6f, 0x20, 0x44, 0x61, 0x64, 0x64, + 0x79, 0x20, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x2c, 0x20, 0x49, 0x6e, 0x63, 0x2e, 0x31, 0x31, 0x30, + 0x2f, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x28, 0x47, 0x6f, 0x20, 0x44, 0x61, 0x64, 0x64, 0x79, + 0x20, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x20, 0x32, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, + 0x30, 0x1e, 0x17, 0x0d, 0x30, 0x34, 0x30, 0x36, 0x32, 0x39, 0x31, 0x37, 0x30, 0x36, 0x32, 0x30, + 0x5a, 0x17, 0x0d, 0x33, 0x34, 0x30, 0x36, 0x32, 0x39, 0x31, 0x37, 0x30, 0x36, 0x32, 0x30, 0x5a, + 0x30, 0x63, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, + 0x21, 0x30, 0x1f, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x18, 0x54, 0x68, 0x65, 0x20, 0x47, 0x6f, + 0x20, 0x44, 0x61, 0x64, 0x64, 0x79, 0x20, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x2c, 0x20, 0x49, 0x6e, + 0x63, 0x2e, 0x31, 0x31, 0x30, 0x2f, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x28, 0x47, 0x6f, 0x20, + 0x44, 0x61, 0x64, 0x64, 0x79, 0x20, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x20, 0x32, 0x20, 0x43, 0x65, + 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x75, 0x74, 0x68, + 0x6f, 0x72, 0x69, 0x74, 0x79, 0x30, 0x82, 0x01, 0x20, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, + 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0d, 0x00, 0x30, 0x82, 0x01, + 0x08, 0x02, 0x82, 0x01, 0x01, 0x00, 0xde, 0x9d, 0xd7, 0xea, 0x57, 0x18, 0x49, 0xa1, 0x5b, 0xeb, + 0xd7, 0x5f, 0x48, 0x86, 0xea, 0xbe, 0xdd, 0xff, 0xe4, 0xef, 0x67, 0x1c, 0xf4, 0x65, 0x68, 0xb3, + 0x57, 0x71, 0xa0, 0x5e, 0x77, 0xbb, 0xed, 0x9b, 0x49, 0xe9, 0x70, 0x80, 0x3d, 0x56, 0x18, 0x63, + 0x08, 0x6f, 0xda, 0xf2, 0xcc, 0xd0, 0x3f, 0x7f, 0x02, 0x54, 0x22, 0x54, 0x10, 0xd8, 0xb2, 0x81, + 0xd4, 0xc0, 0x75, 0x3d, 0x4b, 0x7f, 0xc7, 0x77, 0xc3, 0x3e, 0x78, 0xab, 0x1a, 0x03, 0xb5, 0x20, + 0x6b, 0x2f, 0x6a, 0x2b, 0xb1, 0xc5, 0x88, 0x7e, 0xc4, 0xbb, 0x1e, 0xb0, 0xc1, 0xd8, 0x45, 0x27, + 0x6f, 0xaa, 0x37, 0x58, 0xf7, 0x87, 0x26, 0xd7, 0xd8, 0x2d, 0xf6, 0xa9, 0x17, 0xb7, 0x1f, 0x72, + 0x36, 0x4e, 0xa6, 0x17, 0x3f, 0x65, 0x98, 0x92, 0xdb, 0x2a, 0x6e, 0x5d, 0xa2, 0xfe, 0x88, 0xe0, + 0x0b, 0xde, 0x7f, 0xe5, 0x8d, 0x15, 0xe1, 0xeb, 0xcb, 0x3a, 0xd5, 0xe2, 0x12, 0xa2, 0x13, 0x2d, + 0xd8, 0x8e, 0xaf, 0x5f, 0x12, 0x3d, 0xa0, 0x08, 0x05, 0x08, 0xb6, 0x5c, 0xa5, 0x65, 0x38, 0x04, + 0x45, 0x99, 0x1e, 0xa3, 0x60, 0x60, 0x74, 0xc5, 0x41, 0xa5, 0x72, 0x62, 0x1b, 0x62, 0xc5, 0x1f, + 0x6f, 0x5f, 0x1a, 0x42, 0xbe, 0x02, 0x51, 0x65, 0xa8, 0xae, 0x23, 0x18, 0x6a, 0xfc, 0x78, 0x03, + 0xa9, 0x4d, 0x7f, 0x80, 0xc3, 0xfa, 0xab, 0x5a, 0xfc, 0xa1, 0x40, 0xa4, 0xca, 0x19, 0x16, 0xfe, + 0xb2, 0xc8, 0xef, 0x5e, 0x73, 0x0d, 0xee, 0x77, 0xbd, 0x9a, 0xf6, 0x79, 0x98, 0xbc, 0xb1, 0x07, + 0x67, 0xa2, 0x15, 0x0d, 0xdd, 0xa0, 0x58, 0xc6, 0x44, 0x7b, 0x0a, 0x3e, 0x62, 0x28, 0x5f, 0xba, + 0x41, 0x07, 0x53, 0x58, 0xcf, 0x11, 0x7e, 0x38, 0x74, 0xc5, 0xf8, 0xff, 0xb5, 0x69, 0x90, 0x8f, + 0x84, 0x74, 0xea, 0x97, 0x1b, 0xaf, 0x02, 0x01, 0x03, 0xa3, 0x81, 0xc0, 0x30, 0x81, 0xbd, 0x30, + 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0xd2, 0xc4, 0xb0, 0xd2, 0x91, 0xd4, + 0x4c, 0x11, 0x71, 0xb3, 0x61, 0xcb, 0x3d, 0xa1, 0xfe, 0xdd, 0xa8, 0x6a, 0xd4, 0xe3, 0x30, 0x81, + 0x8d, 0x06, 0x03, 0x55, 0x1d, 0x23, 0x04, 0x81, 0x85, 0x30, 0x81, 0x82, 0x80, 0x14, 0xd2, 0xc4, + 0xb0, 0xd2, 0x91, 0xd4, 0x4c, 0x11, 0x71, 0xb3, 0x61, 0xcb, 0x3d, 0xa1, 0xfe, 0xdd, 0xa8, 0x6a, + 0xd4, 0xe3, 0xa1, 0x67, 0xa4, 0x65, 0x30, 0x63, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, + 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x21, 0x30, 0x1f, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x18, + 0x54, 0x68, 0x65, 0x20, 0x47, 0x6f, 0x20, 0x44, 0x61, 0x64, 0x64, 0x79, 0x20, 0x47, 0x72, 0x6f, + 0x75, 0x70, 0x2c, 0x20, 0x49, 0x6e, 0x63, 0x2e, 0x31, 0x31, 0x30, 0x2f, 0x06, 0x03, 0x55, 0x04, + 0x0b, 0x13, 0x28, 0x47, 0x6f, 0x20, 0x44, 0x61, 0x64, 0x64, 0x79, 0x20, 0x43, 0x6c, 0x61, 0x73, + 0x73, 0x20, 0x32, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x82, 0x01, 0x00, 0x30, 0x0c, + 0x06, 0x03, 0x55, 0x1d, 0x13, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x0d, 0x06, 0x09, + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, + 0x32, 0x4b, 0xf3, 0xb2, 0xca, 0x3e, 0x91, 0xfc, 0x12, 0xc6, 0xa1, 0x07, 0x8c, 0x8e, 0x77, 0xa0, + 0x33, 0x06, 0x14, 0x5c, 0x90, 0x1e, 0x18, 0xf7, 0x08, 0xa6, 0x3d, 0x0a, 0x19, 0xf9, 0x87, 0x80, + 0x11, 0x6e, 0x69, 0xe4, 0x96, 0x17, 0x30, 0xff, 0x34, 0x91, 0x63, 0x72, 0x38, 0xee, 0xcc, 0x1c, + 0x01, 0xa3, 0x1d, 0x94, 0x28, 0xa4, 0x31, 0xf6, 0x7a, 0xc4, 0x54, 0xd7, 0xf6, 0xe5, 0x31, 0x58, + 0x03, 0xa2, 0xcc, 0xce, 0x62, 0xdb, 0x94, 0x45, 0x73, 0xb5, 0xbf, 0x45, 0xc9, 0x24, 0xb5, 0xd5, + 0x82, 0x02, 0xad, 0x23, 0x79, 0x69, 0x8d, 0xb8, 0xb6, 0x4d, 0xce, 0xcf, 0x4c, 0xca, 0x33, 0x23, + 0xe8, 0x1c, 0x88, 0xaa, 0x9d, 0x8b, 0x41, 0x6e, 0x16, 0xc9, 0x20, 0xe5, 0x89, 0x9e, 0xcd, 0x3b, + 0xda, 0x70, 0xf7, 0x7e, 0x99, 0x26, 0x20, 0x14, 0x54, 0x25, 0xab, 0x6e, 0x73, 0x85, 0xe6, 0x9b, + 0x21, 0x9d, 0x0a, 0x6c, 0x82, 0x0e, 0xa8, 0xf8, 0xc2, 0x0c, 0xfa, 0x10, 0x1e, 0x6c, 0x96, 0xef, + 0x87, 0x0d, 0xc4, 0x0f, 0x61, 0x8b, 0xad, 0xee, 0x83, 0x2b, 0x95, 0xf8, 0x8e, 0x92, 0x84, 0x72, + 0x39, 0xeb, 0x20, 0xea, 0x83, 0xed, 0x83, 0xcd, 0x97, 0x6e, 0x08, 0xbc, 0xeb, 0x4e, 0x26, 0xb6, + 0x73, 0x2b, 0xe4, 0xd3, 0xf6, 0x4c, 0xfe, 0x26, 0x71, 0xe2, 0x61, 0x11, 0x74, 0x4a, 0xff, 0x57, + 0x1a, 0x87, 0x0f, 0x75, 0x48, 0x2e, 0xcf, 0x51, 0x69, 0x17, 0xa0, 0x02, 0x12, 0x61, 0x95, 0xd5, + 0xd1, 0x40, 0xb2, 0x10, 0x4c, 0xee, 0xc4, 0xac, 0x10, 0x43, 0xa6, 0xa5, 0x9e, 0x0a, 0xd5, 0x95, + 0x62, 0x9a, 0x0d, 0xcf, 0x88, 0x82, 0xc5, 0x32, 0x0c, 0xe4, 0x2b, 0x9f, 0x45, 0xe6, 0x0d, 0x9f, + 0x28, 0x9c, 0xb1, 0xb9, 0x2a, 0x5a, 0x57, 0xad, 0x37, 0x0f, 0xaf, 0x1d, 0x7f, 0xdb, 0xbd, 0x9f, + 0x30, 0x82, 0x04, 0xde, 0x30, 0x82, 0x03, 0xc6, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x02, 0x03, + 0x01, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, + 0x30, 0x63, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, + 0x21, 0x30, 0x1f, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x18, 0x54, 0x68, 0x65, 0x20, 0x47, 0x6f, + 0x20, 0x44, 0x61, 0x64, 0x64, 0x79, 0x20, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x2c, 0x20, 0x49, 0x6e, + 0x63, 0x2e, 0x31, 0x31, 0x30, 0x2f, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x28, 0x47, 0x6f, 0x20, + 0x44, 0x61, 0x64, 0x64, 0x79, 0x20, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x20, 0x32, 0x20, 0x43, 0x65, + 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x75, 0x74, 0x68, + 0x6f, 0x72, 0x69, 0x74, 0x79, 0x30, 0x1e, 0x17, 0x0d, 0x30, 0x36, 0x31, 0x31, 0x31, 0x36, 0x30, + 0x31, 0x35, 0x34, 0x33, 0x37, 0x5a, 0x17, 0x0d, 0x32, 0x36, 0x31, 0x31, 0x31, 0x36, 0x30, 0x31, + 0x35, 0x34, 0x33, 0x37, 0x5a, 0x30, 0x81, 0xca, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, + 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x10, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x04, 0x08, 0x13, 0x07, + 0x41, 0x72, 0x69, 0x7a, 0x6f, 0x6e, 0x61, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x07, + 0x13, 0x0a, 0x53, 0x63, 0x6f, 0x74, 0x74, 0x73, 0x64, 0x61, 0x6c, 0x65, 0x31, 0x1a, 0x30, 0x18, + 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x11, 0x47, 0x6f, 0x44, 0x61, 0x64, 0x64, 0x79, 0x2e, 0x63, + 0x6f, 0x6d, 0x2c, 0x20, 0x49, 0x6e, 0x63, 0x2e, 0x31, 0x33, 0x30, 0x31, 0x06, 0x03, 0x55, 0x04, + 0x0b, 0x13, 0x2a, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, + 0x69, 0x63, 0x61, 0x74, 0x65, 0x73, 0x2e, 0x67, 0x6f, 0x64, 0x61, 0x64, 0x64, 0x79, 0x2e, 0x63, + 0x6f, 0x6d, 0x2f, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x31, 0x30, 0x30, + 0x2e, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x27, 0x47, 0x6f, 0x20, 0x44, 0x61, 0x64, 0x64, 0x79, + 0x20, 0x53, 0x65, 0x63, 0x75, 0x72, 0x65, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x31, + 0x11, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x04, 0x05, 0x13, 0x08, 0x30, 0x37, 0x39, 0x36, 0x39, 0x32, + 0x38, 0x37, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, + 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, + 0x01, 0x01, 0x00, 0xc4, 0x2d, 0xd5, 0x15, 0x8c, 0x9c, 0x26, 0x4c, 0xec, 0x32, 0x35, 0xeb, 0x5f, + 0xb8, 0x59, 0x01, 0x5a, 0xa6, 0x61, 0x81, 0x59, 0x3b, 0x70, 0x63, 0xab, 0xe3, 0xdc, 0x3d, 0xc7, + 0x2a, 0xb8, 0xc9, 0x33, 0xd3, 0x79, 0xe4, 0x3a, 0xed, 0x3c, 0x30, 0x23, 0x84, 0x8e, 0xb3, 0x30, + 0x14, 0xb6, 0xb2, 0x87, 0xc3, 0x3d, 0x95, 0x54, 0x04, 0x9e, 0xdf, 0x99, 0xdd, 0x0b, 0x25, 0x1e, + 0x21, 0xde, 0x65, 0x29, 0x7e, 0x35, 0xa8, 0xa9, 0x54, 0xeb, 0xf6, 0xf7, 0x32, 0x39, 0xd4, 0x26, + 0x55, 0x95, 0xad, 0xef, 0xfb, 0xfe, 0x58, 0x86, 0xd7, 0x9e, 0xf4, 0x00, 0x8d, 0x8c, 0x2a, 0x0c, + 0xbd, 0x42, 0x04, 0xce, 0xa7, 0x3f, 0x04, 0xf6, 0xee, 0x80, 0xf2, 0xaa, 0xef, 0x52, 0xa1, 0x69, + 0x66, 0xda, 0xbe, 0x1a, 0xad, 0x5d, 0xda, 0x2c, 0x66, 0xea, 0x1a, 0x6b, 0xbb, 0xe5, 0x1a, 0x51, + 0x4a, 0x00, 0x2f, 0x48, 0xc7, 0x98, 0x75, 0xd8, 0xb9, 0x29, 0xc8, 0xee, 0xf8, 0x66, 0x6d, 0x0a, + 0x9c, 0xb3, 0xf3, 0xfc, 0x78, 0x7c, 0xa2, 0xf8, 0xa3, 0xf2, 0xb5, 0xc3, 0xf3, 0xb9, 0x7a, 0x91, + 0xc1, 0xa7, 0xe6, 0x25, 0x2e, 0x9c, 0xa8, 0xed, 0x12, 0x65, 0x6e, 0x6a, 0xf6, 0x12, 0x44, 0x53, + 0x70, 0x30, 0x95, 0xc3, 0x9c, 0x2b, 0x58, 0x2b, 0x3d, 0x08, 0x74, 0x4a, 0xf2, 0xbe, 0x51, 0xb0, + 0xbf, 0x87, 0xd0, 0x4c, 0x27, 0x58, 0x6b, 0xb5, 0x35, 0xc5, 0x9d, 0xaf, 0x17, 0x31, 0xf8, 0x0b, + 0x8f, 0xee, 0xad, 0x81, 0x36, 0x05, 0x89, 0x08, 0x98, 0xcf, 0x3a, 0xaf, 0x25, 0x87, 0xc0, 0x49, + 0xea, 0xa7, 0xfd, 0x67, 0xf7, 0x45, 0x8e, 0x97, 0xcc, 0x14, 0x39, 0xe2, 0x36, 0x85, 0xb5, 0x7e, + 0x1a, 0x37, 0xfd, 0x16, 0xf6, 0x71, 0x11, 0x9a, 0x74, 0x30, 0x16, 0xfe, 0x13, 0x94, 0xa3, 0x3f, + 0x84, 0x0d, 0x4f, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x82, 0x01, 0x32, 0x30, 0x82, 0x01, 0x2e, + 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0xfd, 0xac, 0x61, 0x32, 0x93, + 0x6c, 0x45, 0xd6, 0xe2, 0xee, 0x85, 0x5f, 0x9a, 0xba, 0xe7, 0x76, 0x99, 0x68, 0xcc, 0xe7, 0x30, + 0x1f, 0x06, 0x03, 0x55, 0x1d, 0x23, 0x04, 0x18, 0x30, 0x16, 0x80, 0x14, 0xd2, 0xc4, 0xb0, 0xd2, + 0x91, 0xd4, 0x4c, 0x11, 0x71, 0xb3, 0x61, 0xcb, 0x3d, 0xa1, 0xfe, 0xdd, 0xa8, 0x6a, 0xd4, 0xe3, + 0x30, 0x12, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x08, 0x30, 0x06, 0x01, 0x01, + 0xff, 0x02, 0x01, 0x00, 0x30, 0x33, 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x01, 0x01, + 0x04, 0x27, 0x30, 0x25, 0x30, 0x23, 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x30, 0x01, + 0x86, 0x17, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x6f, 0x63, 0x73, 0x70, 0x2e, 0x67, 0x6f, + 0x64, 0x61, 0x64, 0x64, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x30, 0x46, 0x06, 0x03, 0x55, 0x1d, 0x1f, + 0x04, 0x3f, 0x30, 0x3d, 0x30, 0x3b, 0xa0, 0x39, 0xa0, 0x37, 0x86, 0x35, 0x68, 0x74, 0x74, 0x70, + 0x3a, 0x2f, 0x2f, 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x73, 0x2e, + 0x67, 0x6f, 0x64, 0x61, 0x64, 0x64, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x72, 0x65, 0x70, 0x6f, + 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x2f, 0x67, 0x64, 0x72, 0x6f, 0x6f, 0x74, 0x2e, 0x63, 0x72, + 0x6c, 0x30, 0x4b, 0x06, 0x03, 0x55, 0x1d, 0x20, 0x04, 0x44, 0x30, 0x42, 0x30, 0x40, 0x06, 0x04, + 0x55, 0x1d, 0x20, 0x00, 0x30, 0x38, 0x30, 0x36, 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, + 0x02, 0x01, 0x16, 0x2a, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x63, 0x65, 0x72, 0x74, 0x69, + 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x73, 0x2e, 0x67, 0x6f, 0x64, 0x61, 0x64, 0x64, 0x79, 0x2e, + 0x63, 0x6f, 0x6d, 0x2f, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x30, 0x0e, + 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x0d, + 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x03, 0x82, 0x01, + 0x01, 0x00, 0xd2, 0x86, 0xc0, 0xec, 0xbd, 0xf9, 0xa1, 0xb6, 0x67, 0xee, 0x66, 0x0b, 0xa2, 0x06, + 0x3a, 0x04, 0x50, 0x8e, 0x15, 0x72, 0xac, 0x4a, 0x74, 0x95, 0x53, 0xcb, 0x37, 0xcb, 0x44, 0x49, + 0xef, 0x07, 0x90, 0x6b, 0x33, 0xd9, 0x96, 0xf0, 0x94, 0x56, 0xa5, 0x13, 0x30, 0x05, 0x3c, 0x85, + 0x32, 0x21, 0x7b, 0xc9, 0xc7, 0x0a, 0xa8, 0x24, 0xa4, 0x90, 0xde, 0x46, 0xd3, 0x25, 0x23, 0x14, + 0x03, 0x67, 0xc2, 0x10, 0xd6, 0x6f, 0x0f, 0x5d, 0x7b, 0x7a, 0xcc, 0x9f, 0xc5, 0x58, 0x2a, 0xc1, + 0xc4, 0x9e, 0x21, 0xa8, 0x5a, 0xf3, 0xac, 0xa4, 0x46, 0xf3, 0x9e, 0xe4, 0x63, 0xcb, 0x2f, 0x90, + 0xa4, 0x29, 0x29, 0x01, 0xd9, 0x72, 0x2c, 0x29, 0xdf, 0x37, 0x01, 0x27, 0xbc, 0x4f, 0xee, 0x68, + 0xd3, 0x21, 0x8f, 0xc0, 0xb3, 0xe4, 0xf5, 0x09, 0xed, 0xd2, 0x10, 0xaa, 0x53, 0xb4, 0xbe, 0xf0, + 0xcc, 0x59, 0x0b, 0xd6, 0x3b, 0x96, 0x1c, 0x95, 0x24, 0x49, 0xdf, 0xce, 0xec, 0xfd, 0xa7, 0x48, + 0x91, 0x14, 0x45, 0x0e, 0x3a, 0x36, 0x6f, 0xda, 0x45, 0xb3, 0x45, 0xa2, 0x41, 0xc9, 0xd4, 0xd7, + 0x44, 0x4e, 0x3e, 0xb9, 0x74, 0x76, 0xd5, 0xa2, 0x13, 0x55, 0x2c, 0xc6, 0x87, 0xa3, 0xb5, 0x99, + 0xac, 0x06, 0x84, 0x87, 0x7f, 0x75, 0x06, 0xfc, 0xbf, 0x14, 0x4c, 0x0e, 0xcc, 0x6e, 0xc4, 0xdf, + 0x3d, 0xb7, 0x12, 0x71, 0xf4, 0xe8, 0xf1, 0x51, 0x40, 0x22, 0x28, 0x49, 0xe0, 0x1d, 0x4b, 0x87, + 0xa8, 0x34, 0xcc, 0x06, 0xa2, 0xdd, 0x12, 0x5a, 0xd1, 0x86, 0x36, 0x64, 0x03, 0x35, 0x6f, 0x6f, + 0x77, 0x6e, 0xeb, 0xf2, 0x85, 0x50, 0x98, 0x5e, 0xab, 0x03, 0x53, 0xad, 0x91, 0x23, 0x63, 0x1f, + 0x16, 0x9c, 0xcd, 0xb9, 0xb2, 0x05, 0x63, 0x3a, 0xe1, 0xf4, 0x68, 0x1b, 0x17, 0x05, 0x35, 0x95, + 0x53, 0xee, 0x30, 0x82, 0x05, 0x3e, 0x30, 0x82, 0x04, 0x26, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, + 0x06, 0x0b, 0xef, 0xf4, 0xbf, 0x69, 0x7b, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, + 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, 0x81, 0xca, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, + 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x10, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x04, 0x08, 0x13, + 0x07, 0x41, 0x72, 0x69, 0x7a, 0x6f, 0x6e, 0x61, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, + 0x07, 0x13, 0x0a, 0x53, 0x63, 0x6f, 0x74, 0x74, 0x73, 0x64, 0x61, 0x6c, 0x65, 0x31, 0x1a, 0x30, + 0x18, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x11, 0x47, 0x6f, 0x44, 0x61, 0x64, 0x64, 0x79, 0x2e, + 0x63, 0x6f, 0x6d, 0x2c, 0x20, 0x49, 0x6e, 0x63, 0x2e, 0x31, 0x33, 0x30, 0x31, 0x06, 0x03, 0x55, + 0x04, 0x0b, 0x13, 0x2a, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x63, 0x65, 0x72, 0x74, 0x69, + 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x73, 0x2e, 0x67, 0x6f, 0x64, 0x61, 0x64, 0x64, 0x79, 0x2e, + 0x63, 0x6f, 0x6d, 0x2f, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x31, 0x30, + 0x30, 0x2e, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x27, 0x47, 0x6f, 0x20, 0x44, 0x61, 0x64, 0x64, + 0x79, 0x20, 0x53, 0x65, 0x63, 0x75, 0x72, 0x65, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, + 0x31, 0x11, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x04, 0x05, 0x13, 0x08, 0x30, 0x37, 0x39, 0x36, 0x39, + 0x32, 0x38, 0x37, 0x30, 0x1e, 0x17, 0x0d, 0x30, 0x39, 0x30, 0x39, 0x32, 0x34, 0x31, 0x33, 0x34, + 0x34, 0x32, 0x33, 0x5a, 0x17, 0x0d, 0x31, 0x32, 0x30, 0x39, 0x32, 0x34, 0x31, 0x33, 0x34, 0x34, + 0x32, 0x33, 0x5a, 0x30, 0x6b, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, + 0x47, 0x42, 0x31, 0x0f, 0x30, 0x0d, 0x06, 0x03, 0x55, 0x04, 0x08, 0x13, 0x06, 0x4c, 0x6f, 0x6e, + 0x64, 0x6f, 0x6e, 0x31, 0x0f, 0x30, 0x0d, 0x06, 0x03, 0x55, 0x04, 0x07, 0x13, 0x06, 0x4c, 0x6f, + 0x6e, 0x64, 0x6f, 0x6e, 0x31, 0x1c, 0x30, 0x1a, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x13, 0x44, + 0x61, 0x6c, 0x74, 0x6f, 0x6e, 0x20, 0x4d, 0x61, 0x61, 0x67, 0x20, 0x4c, 0x69, 0x6d, 0x69, 0x74, + 0x65, 0x64, 0x31, 0x1c, 0x30, 0x1a, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x13, 0x44, 0x61, 0x6c, + 0x74, 0x6f, 0x6e, 0x20, 0x4d, 0x61, 0x61, 0x67, 0x20, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x64, + 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, + 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, + 0x00, 0xa2, 0x04, 0x5f, 0xe6, 0xd8, 0xdb, 0xd2, 0xa1, 0xa2, 0xf3, 0x7e, 0xc5, 0x34, 0xe7, 0x72, + 0xd8, 0xae, 0xfb, 0x95, 0xcf, 0xec, 0xa4, 0xea, 0x0e, 0x1d, 0x00, 0x07, 0x92, 0xdb, 0x16, 0xf6, + 0xac, 0x53, 0x1f, 0x35, 0xf1, 0x94, 0x01, 0x9c, 0xa3, 0x8e, 0x90, 0x99, 0x08, 0x46, 0xe0, 0x05, + 0x0f, 0x2b, 0x91, 0xb6, 0xa6, 0xff, 0x0b, 0x1b, 0x0c, 0xba, 0x2b, 0x46, 0x6e, 0x62, 0xe6, 0x89, + 0xa7, 0x0b, 0x41, 0xf5, 0x14, 0xe6, 0xc0, 0xea, 0x6b, 0x55, 0x72, 0x11, 0x5d, 0x8e, 0xcf, 0xdc, + 0x58, 0x33, 0x89, 0xff, 0xe5, 0x90, 0x75, 0xdc, 0xc3, 0xcc, 0x2d, 0x60, 0x3e, 0xd6, 0x03, 0xe9, + 0xa9, 0xc6, 0x54, 0x3e, 0x94, 0xbc, 0xec, 0x8a, 0x91, 0x36, 0x7a, 0xed, 0x55, 0xfd, 0xd8, 0x3d, + 0x6b, 0x27, 0x46, 0x09, 0x5f, 0xd4, 0xdb, 0xc1, 0x5f, 0xa2, 0xf7, 0x88, 0xe4, 0x88, 0x7e, 0xfa, + 0xe3, 0x82, 0xe0, 0x2f, 0x42, 0x62, 0x51, 0x46, 0xbb, 0xc6, 0x30, 0x71, 0x7b, 0xb2, 0xcc, 0x8c, + 0x33, 0x76, 0xed, 0xe0, 0xb5, 0x99, 0xad, 0xc3, 0x1d, 0x0d, 0xe3, 0x88, 0x77, 0x78, 0x31, 0x3c, + 0x54, 0x52, 0x15, 0x6c, 0xde, 0xdc, 0xcc, 0x70, 0x97, 0x1c, 0x9b, 0x85, 0xf4, 0x38, 0xf7, 0x05, + 0x47, 0x4b, 0x27, 0xb0, 0x5d, 0xa3, 0x3c, 0x66, 0x22, 0xa5, 0x28, 0x97, 0x0a, 0x76, 0x94, 0x67, + 0xc1, 0xbb, 0x8f, 0x9f, 0x1a, 0xf0, 0x06, 0x7c, 0x80, 0x91, 0x58, 0x1a, 0x75, 0x20, 0x20, 0x06, + 0x94, 0x5a, 0x0b, 0x71, 0xef, 0x26, 0xed, 0xf2, 0x5e, 0x82, 0xd3, 0x9a, 0x0b, 0xe6, 0x93, 0xb7, + 0x07, 0x16, 0x41, 0xea, 0x62, 0xd5, 0xd4, 0xd2, 0x8c, 0x93, 0xaa, 0xf8, 0xc1, 0x34, 0xd7, 0x8a, + 0xfb, 0x8d, 0x45, 0x4c, 0x6e, 0x6f, 0x8c, 0x7c, 0xaf, 0x01, 0x8d, 0x66, 0xf4, 0x31, 0xeb, 0xae, + 0x1d, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x82, 0x01, 0x86, 0x30, 0x82, 0x01, 0x82, 0x30, 0x0f, + 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0x00, 0x30, + 0x13, 0x06, 0x03, 0x55, 0x1d, 0x25, 0x04, 0x0c, 0x30, 0x0a, 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05, + 0x05, 0x07, 0x03, 0x03, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, + 0x03, 0x02, 0x07, 0x80, 0x30, 0x32, 0x06, 0x03, 0x55, 0x1d, 0x1f, 0x04, 0x2b, 0x30, 0x29, 0x30, + 0x27, 0xa0, 0x25, 0xa0, 0x23, 0x86, 0x21, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x63, 0x72, + 0x6c, 0x2e, 0x67, 0x6f, 0x64, 0x61, 0x64, 0x64, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x64, + 0x73, 0x32, 0x2d, 0x30, 0x2e, 0x63, 0x72, 0x6c, 0x30, 0x53, 0x06, 0x03, 0x55, 0x1d, 0x20, 0x04, + 0x4c, 0x30, 0x4a, 0x30, 0x48, 0x06, 0x0b, 0x60, 0x86, 0x48, 0x01, 0x86, 0xfd, 0x6d, 0x01, 0x07, + 0x17, 0x02, 0x30, 0x39, 0x30, 0x37, 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x02, 0x01, + 0x16, 0x2b, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, + 0x63, 0x61, 0x74, 0x65, 0x73, 0x2e, 0x67, 0x6f, 0x64, 0x61, 0x64, 0x64, 0x79, 0x2e, 0x63, 0x6f, + 0x6d, 0x2f, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x2f, 0x30, 0x81, 0x80, + 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x01, 0x01, 0x04, 0x74, 0x30, 0x72, 0x30, 0x24, + 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x30, 0x01, 0x86, 0x18, 0x68, 0x74, 0x74, 0x70, + 0x3a, 0x2f, 0x2f, 0x6f, 0x63, 0x73, 0x70, 0x2e, 0x67, 0x6f, 0x64, 0x61, 0x64, 0x64, 0x79, 0x2e, + 0x63, 0x6f, 0x6d, 0x2f, 0x30, 0x4a, 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x30, 0x02, + 0x86, 0x3e, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, + 0x63, 0x61, 0x74, 0x65, 0x73, 0x2e, 0x67, 0x6f, 0x64, 0x61, 0x64, 0x64, 0x79, 0x2e, 0x63, 0x6f, + 0x6d, 0x2f, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x2f, 0x67, 0x64, 0x5f, + 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74, 0x65, 0x2e, 0x63, 0x72, 0x74, + 0x30, 0x1f, 0x06, 0x03, 0x55, 0x1d, 0x23, 0x04, 0x18, 0x30, 0x16, 0x80, 0x14, 0xfd, 0xac, 0x61, + 0x32, 0x93, 0x6c, 0x45, 0xd6, 0xe2, 0xee, 0x85, 0x5f, 0x9a, 0xba, 0xe7, 0x76, 0x99, 0x68, 0xcc, + 0xe7, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x68, 0x66, 0x30, 0x10, + 0x67, 0x55, 0xa1, 0xb3, 0xa1, 0xe9, 0x37, 0xc6, 0x75, 0x11, 0x89, 0x33, 0xe3, 0x85, 0xd7, 0x13, + 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x03, + 0x82, 0x01, 0x01, 0x00, 0xbd, 0x56, 0x3e, 0x09, 0xb4, 0x13, 0x7d, 0xfa, 0xed, 0xd3, 0xfe, 0x45, + 0xb6, 0xdf, 0xdf, 0x19, 0x48, 0xf8, 0xa3, 0x8c, 0xd5, 0x11, 0x54, 0x8f, 0xd4, 0x92, 0x44, 0x13, + 0xc1, 0x71, 0x69, 0xa3, 0xc3, 0x30, 0x06, 0x80, 0x1d, 0xda, 0x37, 0xae, 0xca, 0x47, 0x68, 0xd9, + 0xb3, 0x25, 0x09, 0x36, 0x0c, 0xe9, 0x04, 0x3b, 0xe2, 0xdb, 0x51, 0x10, 0x74, 0xfe, 0x10, 0x5e, + 0xc9, 0xde, 0x3b, 0x0f, 0x24, 0x03, 0xb1, 0x9e, 0x39, 0x96, 0xc3, 0xa0, 0x0f, 0x4c, 0x52, 0xca, + 0xe7, 0x42, 0x66, 0x11, 0x5a, 0x75, 0x68, 0x49, 0x3a, 0x2d, 0x23, 0x6b, 0x5e, 0x06, 0xc4, 0x43, + 0xf1, 0x9e, 0x01, 0xb1, 0x2f, 0x0b, 0xa5, 0x9c, 0x12, 0x1e, 0x3e, 0x3d, 0x18, 0x6e, 0x5a, 0xb0, + 0x95, 0x74, 0x3f, 0x2e, 0x4b, 0xe1, 0x30, 0x6d, 0x73, 0xc3, 0x9e, 0x6f, 0xaf, 0xe3, 0x0f, 0x47, + 0xfa, 0xdd, 0x24, 0x60, 0x64, 0xa7, 0x5c, 0x63, 0x00, 0xdd, 0xa9, 0xb7, 0x50, 0x34, 0x65, 0xc7, + 0x28, 0x05, 0x49, 0xfe, 0x5a, 0x7a, 0x18, 0xea, 0x1c, 0xc0, 0x46, 0xb6, 0x9a, 0x2a, 0xd9, 0x81, + 0x65, 0xb2, 0x91, 0xca, 0x0c, 0xd6, 0x7b, 0x88, 0xf0, 0xea, 0x3e, 0xe9, 0x18, 0x55, 0x30, 0x87, + 0xcf, 0xaf, 0x91, 0xa8, 0x1e, 0x23, 0x08, 0x6b, 0x45, 0x90, 0x99, 0x06, 0xdc, 0x91, 0x37, 0x0d, + 0xbf, 0xd4, 0xdd, 0x66, 0x5f, 0x55, 0x00, 0xf4, 0xf1, 0xe3, 0xed, 0x60, 0x34, 0x95, 0x3e, 0x97, + 0xa2, 0xc2, 0xca, 0x6a, 0x8d, 0x61, 0x40, 0x30, 0x91, 0xc4, 0xa5, 0x01, 0x06, 0x5b, 0xd0, 0x60, + 0x6d, 0x4f, 0x34, 0x1f, 0x7e, 0x9d, 0x09, 0x31, 0x53, 0xe5, 0xe9, 0x78, 0x96, 0xd0, 0x83, 0xc4, + 0xaa, 0xbd, 0xe5, 0x62, 0xaa, 0x32, 0x1c, 0x22, 0x23, 0x4e, 0x12, 0x2e, 0x7c, 0x08, 0xb6, 0x9f, + 0xdf, 0x5c, 0x23, 0x96, 0x31, 0x82, 0x04, 0xfe, 0x30, 0x82, 0x04, 0xfa, 0x02, 0x01, 0x01, 0x30, + 0x81, 0xd5, 0x30, 0x81, 0xca, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, + 0x55, 0x53, 0x31, 0x10, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x04, 0x08, 0x13, 0x07, 0x41, 0x72, 0x69, + 0x7a, 0x6f, 0x6e, 0x61, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x07, 0x13, 0x0a, 0x53, + 0x63, 0x6f, 0x74, 0x74, 0x73, 0x64, 0x61, 0x6c, 0x65, 0x31, 0x1a, 0x30, 0x18, 0x06, 0x03, 0x55, + 0x04, 0x0a, 0x13, 0x11, 0x47, 0x6f, 0x44, 0x61, 0x64, 0x64, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x2c, + 0x20, 0x49, 0x6e, 0x63, 0x2e, 0x31, 0x33, 0x30, 0x31, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x2a, + 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, + 0x74, 0x65, 0x73, 0x2e, 0x67, 0x6f, 0x64, 0x61, 0x64, 0x64, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, + 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x31, 0x30, 0x30, 0x2e, 0x06, 0x03, + 0x55, 0x04, 0x03, 0x13, 0x27, 0x47, 0x6f, 0x20, 0x44, 0x61, 0x64, 0x64, 0x79, 0x20, 0x53, 0x65, + 0x63, 0x75, 0x72, 0x65, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x31, 0x11, 0x30, 0x0f, + 0x06, 0x03, 0x55, 0x04, 0x05, 0x13, 0x08, 0x30, 0x37, 0x39, 0x36, 0x39, 0x32, 0x38, 0x37, 0x02, + 0x06, 0x0b, 0xef, 0xf4, 0xbf, 0x69, 0x7b, 0x30, 0x09, 0x06, 0x05, 0x2b, 0x0e, 0x03, 0x02, 0x1a, + 0x05, 0x00, 0xa0, 0x81, 0x86, 0x30, 0x10, 0x06, 0x0a, 0x2b, 0x06, 0x01, 0x04, 0x01, 0x82, 0x37, + 0x02, 0x01, 0x0c, 0x31, 0x02, 0x30, 0x00, 0x30, 0x14, 0x06, 0x09, 0x2b, 0x06, 0x01, 0x04, 0x01, + 0x82, 0x37, 0x28, 0x01, 0x31, 0x07, 0x03, 0x05, 0x00, 0x03, 0x00, 0x00, 0x00, 0x30, 0x19, 0x06, + 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x09, 0x03, 0x31, 0x0c, 0x06, 0x0a, 0x2b, 0x06, + 0x01, 0x04, 0x01, 0x82, 0x37, 0x02, 0x01, 0x04, 0x30, 0x1c, 0x06, 0x0a, 0x2b, 0x06, 0x01, 0x04, + 0x01, 0x82, 0x37, 0x02, 0x01, 0x0b, 0x31, 0x0e, 0x30, 0x0c, 0x06, 0x0a, 0x2b, 0x06, 0x01, 0x04, + 0x01, 0x82, 0x37, 0x02, 0x01, 0x15, 0x30, 0x23, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, + 0x01, 0x09, 0x04, 0x31, 0x16, 0x04, 0x14, 0x56, 0xf8, 0xd0, 0xcb, 0x04, 0x98, 0xa9, 0x9a, 0xc2, + 0x61, 0x15, 0x65, 0x95, 0xa0, 0x7f, 0xc6, 0x0c, 0x9d, 0x15, 0xbd, 0x30, 0x0d, 0x06, 0x09, 0x2a, + 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x04, 0x82, 0x01, 0x00, 0x1b, 0x1f, + 0x30, 0x16, 0x4c, 0x23, 0x8c, 0xca, 0x4b, 0xfc, 0x2d, 0xe8, 0x0f, 0x5b, 0x55, 0xf2, 0x7b, 0xbb, + 0x09, 0x45, 0x2d, 0x26, 0xef, 0x4e, 0xc4, 0x99, 0x30, 0x73, 0x75, 0xf7, 0xdd, 0x9b, 0xb4, 0x16, + 0x37, 0x33, 0x39, 0x11, 0x84, 0x05, 0x24, 0xdf, 0x8a, 0x5a, 0x12, 0x9b, 0x46, 0xd0, 0x48, 0x3a, + 0x65, 0x82, 0xb0, 0x93, 0x61, 0x5f, 0x77, 0xe3, 0xca, 0x1b, 0xec, 0xcb, 0x48, 0xc0, 0xd2, 0x57, + 0x17, 0x37, 0x89, 0x55, 0x57, 0x01, 0xee, 0xe8, 0x27, 0x39, 0x24, 0xf5, 0xfe, 0x3d, 0xfb, 0x2f, + 0x78, 0x60, 0xc2, 0xa8, 0x6f, 0x24, 0xf7, 0xf5, 0xd2, 0x40, 0x10, 0x4e, 0x8f, 0x43, 0xd3, 0xe8, + 0x3f, 0x7b, 0x48, 0xf1, 0xc8, 0x33, 0x8b, 0xd7, 0xaf, 0x2b, 0xda, 0x0f, 0x13, 0x5d, 0xd3, 0xec, + 0x32, 0xd9, 0xdc, 0x26, 0xdd, 0x86, 0x7e, 0x28, 0x32, 0xd1, 0xe3, 0x76, 0x2a, 0xd8, 0x99, 0x60, + 0xfe, 0x5b, 0xf5, 0xa8, 0x84, 0x86, 0x9a, 0x2e, 0x24, 0x4a, 0xff, 0xbb, 0x15, 0x8c, 0xf5, 0x1e, + 0x94, 0x1e, 0xdf, 0x6e, 0xee, 0x11, 0xae, 0xdb, 0x1f, 0x3d, 0xe9, 0x15, 0xfb, 0xd2, 0x60, 0xeb, + 0xb8, 0x1b, 0x72, 0x61, 0xe2, 0x6a, 0x1b, 0xe4, 0x3b, 0xd9, 0x5d, 0x40, 0xff, 0x3d, 0x06, 0xbb, + 0xcb, 0x10, 0x4d, 0xd6, 0xe4, 0x3e, 0x9a, 0x8d, 0x89, 0x51, 0xf3, 0x02, 0x0d, 0x2e, 0xf9, 0x9c, + 0xee, 0x5b, 0x9b, 0x64, 0x43, 0x51, 0x4e, 0x03, 0xf6, 0x9c, 0xbd, 0x46, 0x20, 0xe7, 0xdf, 0x0c, + 0x32, 0x80, 0xb6, 0x26, 0xad, 0xcb, 0x49, 0x23, 0x95, 0xcc, 0x88, 0xd0, 0x6c, 0xa4, 0xd3, 0x87, + 0x9f, 0xc5, 0xc7, 0x94, 0x51, 0x7e, 0x42, 0x35, 0x78, 0x54, 0x5e, 0x77, 0x78, 0x2e, 0xfd, 0xc0, + 0x0b, 0xb9, 0x80, 0x78, 0xd5, 0x82, 0xcf, 0xb4, 0x86, 0x8a, 0x65, 0x66, 0xb6, 0xd0, 0xa1, 0x82, + 0x02, 0x74, 0x30, 0x82, 0x02, 0x70, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x09, + 0x06, 0x31, 0x82, 0x02, 0x61, 0x30, 0x82, 0x02, 0x5d, 0x02, 0x01, 0x01, 0x30, 0x81, 0xd6, 0x30, + 0x81, 0xcf, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, + 0x10, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x04, 0x08, 0x13, 0x07, 0x41, 0x72, 0x69, 0x7a, 0x6f, 0x6e, + 0x61, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x07, 0x13, 0x0a, 0x53, 0x63, 0x6f, 0x74, + 0x74, 0x73, 0x64, 0x61, 0x6c, 0x65, 0x31, 0x25, 0x30, 0x23, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, + 0x1c, 0x53, 0x74, 0x61, 0x72, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x20, 0x54, 0x65, 0x63, 0x68, 0x6e, + 0x6f, 0x6c, 0x6f, 0x67, 0x69, 0x65, 0x73, 0x2c, 0x20, 0x49, 0x6e, 0x63, 0x2e, 0x31, 0x3a, 0x30, + 0x38, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x31, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x63, + 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x73, 0x2e, 0x73, 0x74, 0x61, 0x72, + 0x66, 0x69, 0x65, 0x6c, 0x64, 0x74, 0x65, 0x63, 0x68, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x72, 0x65, + 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x2f, 0x31, 0x36, 0x30, 0x34, 0x06, 0x03, 0x55, + 0x04, 0x03, 0x13, 0x2d, 0x53, 0x74, 0x61, 0x72, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x20, 0x53, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x65, 0x72, 0x74, + 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, + 0x79, 0x02, 0x02, 0x20, 0x05, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, + 0x01, 0x05, 0x05, 0x00, 0xa0, 0x5d, 0x30, 0x18, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, + 0x01, 0x09, 0x03, 0x31, 0x0b, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x07, 0x01, + 0x30, 0x1c, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x09, 0x05, 0x31, 0x0f, 0x17, + 0x0d, 0x31, 0x31, 0x30, 0x39, 0x32, 0x32, 0x31, 0x35, 0x34, 0x34, 0x34, 0x32, 0x5a, 0x30, 0x23, + 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x09, 0x04, 0x31, 0x16, 0x04, 0x14, 0x3f, + 0xf3, 0x7d, 0x21, 0x51, 0xa4, 0x0b, 0x6b, 0x6e, 0x41, 0xee, 0x34, 0x06, 0x20, 0x46, 0x5a, 0x4e, + 0xe3, 0xe5, 0x1f, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, + 0x05, 0x00, 0x04, 0x82, 0x01, 0x00, 0xc4, 0xfb, 0x13, 0x49, 0x33, 0x78, 0xa8, 0x08, 0xad, 0x0c, + 0xc8, 0x9b, 0x7c, 0xa6, 0xfb, 0x1e, 0xd2, 0xe0, 0xc3, 0xdf, 0x40, 0xbc, 0x47, 0xe0, 0x64, 0x29, + 0x7e, 0x38, 0x55, 0x9c, 0xba, 0x86, 0x9e, 0xea, 0x2b, 0x89, 0x84, 0x64, 0x08, 0x8c, 0x77, 0x27, + 0xf1, 0xdd, 0x2c, 0x71, 0xca, 0xf2, 0x2e, 0x50, 0xbd, 0xa5, 0x16, 0xe2, 0x17, 0x3f, 0xd8, 0xfe, + 0x50, 0x62, 0xf9, 0x44, 0x7f, 0x71, 0x73, 0x9c, 0x65, 0xf8, 0x66, 0x3c, 0x7b, 0x0b, 0x00, 0xf3, + 0x9e, 0xd0, 0x5c, 0x07, 0xe8, 0x41, 0x9c, 0xaf, 0xc7, 0x69, 0x84, 0x1b, 0x9e, 0x4c, 0xb6, 0xad, + 0x46, 0x77, 0xc1, 0xd4, 0x09, 0x6a, 0xc6, 0x38, 0xe8, 0xa7, 0xcc, 0xc8, 0x9e, 0x6a, 0x91, 0x55, + 0x21, 0xe6, 0x17, 0xab, 0xb7, 0xc0, 0x70, 0xe8, 0xae, 0x6b, 0x4a, 0x64, 0xe2, 0xda, 0x53, 0x3b, + 0x7c, 0x01, 0xc2, 0xe4, 0x70, 0x57, 0x9f, 0xdc, 0x08, 0xc6, 0x7e, 0xd7, 0x66, 0x73, 0x2f, 0x6d, + 0xf8, 0x6e, 0x05, 0x09, 0x0a, 0xc3, 0x52, 0x1a, 0x69, 0x41, 0x68, 0x17, 0xc7, 0x29, 0x68, 0x8e, + 0xcc, 0x4f, 0xe6, 0x2e, 0x78, 0x49, 0x8b, 0x7d, 0xdf, 0x5c, 0x60, 0xd9, 0xca, 0x95, 0xfd, 0xb2, + 0x50, 0x13, 0xee, 0xc0, 0x9a, 0xa1, 0x61, 0x27, 0x87, 0xf8, 0x56, 0xb6, 0xb0, 0xc9, 0xe5, 0x31, + 0xb2, 0x3d, 0xcf, 0xbd, 0x46, 0xce, 0x7e, 0xd7, 0x67, 0x24, 0xe8, 0xe4, 0x41, 0xf6, 0x2b, 0x4b, + 0xee, 0xc5, 0x71, 0xe8, 0x44, 0xbf, 0x81, 0xf4, 0xbe, 0xf6, 0x59, 0xbe, 0x75, 0x71, 0x58, 0xf2, + 0xed, 0x96, 0x71, 0x6c, 0x6e, 0xc3, 0x0b, 0xce, 0xe1, 0x07, 0x61, 0xaa, 0x97, 0xa9, 0xf1, 0xe1, + 0x98, 0x63, 0x66, 0xc6, 0xac, 0xfa, 0xf6, 0x69, 0x22, 0x0c, 0x37, 0xe6, 0xa0, 0x60, 0xb8, 0xee, + 0xbc, 0xe5, 0x4e, 0xcb, 0xb3, 0x5a, 0x00, 0x00 +}; + +size_t ubuntu_font_size = sizeof(ubuntu_font); diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/unity/generate_test_runner.rb b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/tests/unity/generate_test_runner.rb similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/unity/generate_test_runner.rb rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/tests/unity/generate_test_runner.rb diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/unity/run_test.erb b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/tests/unity/run_test.erb similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/unity/run_test.erb rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/tests/unity/run_test.erb diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/unity/type_sanitizer.rb b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/tests/unity/type_sanitizer.rb similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/unity/type_sanitizer.rb rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/tests/unity/type_sanitizer.rb diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/unity/unity.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/tests/unity/unity.c similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/unity/unity.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/tests/unity/unity.c diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/unity/unity.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/tests/unity/unity.h similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/unity/unity.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/tests/unity/unity.h diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/unity/unity_internals.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/tests/unity/unity_internals.h similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/unity/unity_internals.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/tests/unity/unity_internals.h diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/tests/unity/unity_support.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/tests/unity/unity_support.c new file mode 100644 index 0000000..39aea99 --- /dev/null +++ b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/tests/unity/unity_support.c @@ -0,0 +1,307 @@ +/** + * @file lv_test_assert.c + * + * Copyright 2002-2010 Guillaume Cottenceau. + * + * This software may be freely redistributed under the terms + * of the X11 license. + * + */ + +/********************* + * INCLUDES + *********************/ +#if LV_BUILD_TEST +#include "../lvgl.h" + +#include +#include +#include +#include +#include +#include "unity.h" +#define PNG_DEBUG 3 +#include + +/********************* + * DEFINES + *********************/ +//#define REF_IMGS_PATH "lvgl/tests/lv_test_ref_imgs/" +#define REF_IMGS_PATH "ref_imgs/" +#define ERR_FILE_NOT_FOUND -1 +#define ERR_PNG -2 + +/********************** + * TYPEDEFS + **********************/ +typedef struct { + int width, height; + png_byte color_type; + png_byte bit_depth; + + png_structp png_ptr; + png_infop info_ptr; + int number_of_passes; + png_bytep * row_pointers; +} png_img_t; + +/********************** + * STATIC PROTOTYPES + **********************/ +static int read_png_file(png_img_t * p, const char * file_name); +static int write_png_file(void * raw_img, uint32_t width, uint32_t height, char * file_name); +static void png_release(png_img_t * p); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +bool lv_test_assert_img_eq(const char * fn_ref) +{ + char fn_ref_full[512]; + sprintf(fn_ref_full, "%s%s", REF_IMGS_PATH, fn_ref); + + uint8_t * screen_buf; + + lv_obj_invalidate(lv_scr_act()); + lv_refr_now(NULL); + + extern lv_color32_t test_fb[]; + + screen_buf = (uint8_t *)test_fb; + + png_img_t p; + int res = read_png_file(&p, fn_ref_full); + if(res == ERR_FILE_NOT_FOUND) { + TEST_PRINTF("%s%s", fn_ref_full, " was not found, creating is now from the rendered screen"); + fflush(stderr); + write_png_file(screen_buf, 800, 480, fn_ref_full); + + return true; + } + else if(res == ERR_PNG) { + return false; + } + + uint8_t * ptr_act = NULL; + const png_byte * ptr_ref = NULL; + + bool err = false; + int x, y, i_buf = 0; + for(y = 0; y < p.height; y++) { + png_byte * row = p.row_pointers[y]; + + for(x = 0; x < p.width; x++) { + ptr_ref = &(row[x * 3]); + ptr_act = &(screen_buf[i_buf * 4]); + + uint32_t ref_px = 0; + uint32_t act_px = 0; + memcpy(&ref_px, ptr_ref, 3); + memcpy(&act_px, ptr_act, 3); + //printf("0xFF%06x, ", act_px); + + uint8_t act_swap[3] = {ptr_act[2], ptr_act[1], ptr_act[0]}; + + if(memcmp(act_swap, ptr_ref, 3) != 0) { + err = true; + break; + } + i_buf++; + } + if(err) break; + } + + if(err) { + char fn_ref_no_ext[64]; + strcpy(fn_ref_no_ext, fn_ref); + fn_ref_no_ext[strlen(fn_ref_no_ext) - 4] = '\0'; + + char fn_err_full[512]; + sprintf(fn_err_full, "%s%s_err.png", REF_IMGS_PATH, fn_ref_no_ext); + + write_png_file(screen_buf, 800, 480, fn_err_full); + } + + png_release(&p); + + return !err; + +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static int read_png_file(png_img_t * p, const char * file_name) +{ + char header[8]; // 8 is the maximum size that can be checked + + /*open file and test for it being a png*/ + FILE * fp = fopen(file_name, "rb"); + if(!fp) { + TEST_PRINTF("[read_png_file %s] could not be opened for reading", file_name); + return ERR_FILE_NOT_FOUND; + } + + size_t rcnt = fread(header, 1, 8, fp); + if(rcnt != 8 || png_sig_cmp((png_const_bytep)header, 0, 8)) { + TEST_PRINTF("[read_png_file %s] not recognized as a PNG file", file_name); + return ERR_PNG; + } + + /*initialize stuff*/ + p->png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); + + if(!p->png_ptr) { + TEST_PRINTF("[read_png_file %s] png_create_read_struct failed", file_name); + return ERR_PNG; + } + + p->info_ptr = png_create_info_struct(p->png_ptr); + if(!p->info_ptr) { + TEST_PRINTF("[read_png_file %s] png_create_info_struct failed", file_name); + return ERR_PNG; + } + if(setjmp(png_jmpbuf(p->png_ptr))) { + TEST_PRINTF("[read_png_file %s] Error during init_io", file_name); + return ERR_PNG; + } + png_init_io(p->png_ptr, fp); + png_set_sig_bytes(p->png_ptr, 8); + + png_read_info(p->png_ptr, p->info_ptr); + + p->width = png_get_image_width(p->png_ptr, p->info_ptr); + p->height = png_get_image_height(p->png_ptr, p->info_ptr); + p->color_type = png_get_color_type(p->png_ptr, p->info_ptr); + p->bit_depth = png_get_bit_depth(p->png_ptr, p->info_ptr); + + p->number_of_passes = png_set_interlace_handling(p->png_ptr); + png_read_update_info(p->png_ptr, p->info_ptr); + + /*read file*/ + if(setjmp(png_jmpbuf(p->png_ptr))) { + TEST_PRINTF("[read_png_file %s] Error during read_image", file_name); + return ERR_PNG; + } + p->row_pointers = (png_bytep *) malloc(sizeof(png_bytep) * p->height); + + int y; + for(y = 0; y < p->height; y++) + p->row_pointers[y] = (png_byte *) malloc(png_get_rowbytes(p->png_ptr, p->info_ptr)); + + png_read_image(p->png_ptr, p->row_pointers); + + fclose(fp); + return 0; +} + + +static int write_png_file(void * raw_img, uint32_t width, uint32_t height, char * file_name) +{ + png_structp png_ptr; + png_infop info_ptr; + + /* create file */ + FILE * fp = fopen(file_name, "wb"); + if(!fp) { + printf("###### %s\n", file_name); + fflush(stdout); + TEST_PRINTF("[write_png_file %s] could not be opened for writing", file_name); + TEST_PRINTF("%s", file_name); + return -1; + } + + /* initialize stuff */ + png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); + + if(!png_ptr) { + TEST_PRINTF("[write_png_file %s] png_create_write_struct failed", file_name); + return -1; + } + + info_ptr = png_create_info_struct(png_ptr); + if(!info_ptr) { + TEST_PRINTF("[write_png_file %s] png_create_info_struct failed", file_name); + return -1; + } + + if(setjmp(png_jmpbuf(png_ptr))) { + TEST_PRINTF("[write_png_file %s] Error during init_io", file_name); + return -1; + } + + png_init_io(png_ptr, fp); + + /* write header */ + if(setjmp(png_jmpbuf(png_ptr))) { + TEST_PRINTF("[write_png_file %s] Error during writing header", file_name); + return -1; + } + + png_set_IHDR(png_ptr, info_ptr, width, height, + 8, PNG_COLOR_TYPE_RGB, PNG_INTERLACE_NONE, + PNG_COMPRESSION_TYPE_BASE, PNG_FILTER_TYPE_BASE); + + png_write_info(png_ptr, info_ptr); + + + /* write bytes */ + if(setjmp(png_jmpbuf(png_ptr))) { + TEST_PRINTF("[write_png_file %s] Error during writing bytes", file_name); + return -1; + } + + uint8_t * raw_img8 = (uint8_t *)raw_img; + png_bytep * row_pointers = (png_bytep *) malloc(sizeof(png_bytep) * height); + for(uint32_t y = 0; y < height; y++) { + row_pointers[y] = malloc(3 * width); + uint8_t * line = raw_img8 + y * width * 4; + for(uint32_t x = 0; x < width; x++) { + row_pointers[y][x * 3 + 0] = line[x * 4 + 2]; + row_pointers[y][x * 3 + 1] = line[x * 4 + 1]; + row_pointers[y][x * 3 + 2] = line[x * 4 + 0]; + } + } + png_write_image(png_ptr, row_pointers); + + + /* end write */ + if(setjmp(png_jmpbuf(png_ptr))) { + TEST_PRINTF("[write_png_file %s] Error during end of write", file_name); + return -1; + } + png_write_end(png_ptr, NULL); + + /* cleanup heap allocation */ + for(uint32_t y = 0; y < height; y++) free(row_pointers[y]); + free(row_pointers); + + png_destroy_write_struct(&png_ptr, &info_ptr); + + fclose(fp); + return 0; +} + + +static void png_release(png_img_t * p) +{ + int y; + for(y = 0; y < p->height; y++) free(p->row_pointers[y]); + + free(p->row_pointers); + + png_destroy_read_struct(&p->png_ptr, &p->info_ptr, NULL); +} + + +#endif diff --git a/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/unity/unity_support.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/tests/unity/unity_support.h similarity index 100% rename from src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/unity/unity_support.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.4/tests/unity/unity_support.h diff --git a/src/W800_SDK_v1.00.10/tools/w800/inc.mk b/src/W800_SDK_v1.00.10/tools/w800/inc.mk index 539bfa8..6fa6dcb 100644 --- a/src/W800_SDK_v1.00.10/tools/w800/inc.mk +++ b/src/W800_SDK_v1.00.10/tools/w800/inc.mk @@ -58,7 +58,7 @@ INCLUDES += -I $(TOP_DIR)/app/persistency INCLUDES += -I $(TOP_DIR)/app/translation #lvgl include -INCLUDES += -I $(TOP_DIR)/lvgl/lvgl_v8.3 +INCLUDES += -I $(TOP_DIR)/lvgl/lvgl_v8.4 INCLUDES += -I $(TOP_DIR)/lvgl/lvgl_port #nimble host