diff --git a/docs/libs/fs.rst b/docs/libs/fs.rst index 7beafd584..0435da83f 100644 --- a/docs/libs/fs.rst +++ b/docs/libs/fs.rst @@ -11,6 +11,7 @@ LVG has built in support for: - 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) +- MEMFS (read a file from a memory buffer) You still need to provide the drivers and libraries, this extension provides only the bridge between FATFS, STDIO, POSIX, WIN32 and LVGL. @@ -30,6 +31,23 @@ Cached reading is also supported if ``LV_FS_..._CACHE_SIZE`` is set to not ``0`` value. :c:func:`lv_fs_read` caches this size of data to lower the number of actual reads from the storage. +To use the memory-mapped file emulation an ``lv_fs_path_ex_t`` object must be +created and initialized. This object can be passed to :c:func:`lv_fs_open()` as +the file name: + +.. code:: c + + lv_fs_path_ex_t mempath; + lv_fs_file_t file; + uint8_t *buffer; + uint32_t size; + + /*Initialize buffer*/ + ... + + lv_fs_make_path_from_buffer(&mempath, LV_FS_MEMFS_LETTER, (void*)buffer, size); + lv_fs_res_t res = lv_fs_open(&file, (const char *)&mempath, LV_FS_MODE_RD); + API *** diff --git a/docs/overview/font.rst b/docs/overview/font.rst index b9efc92f3..d5f5c6f83 100644 --- a/docs/overview/font.rst +++ b/docs/overview/font.rst @@ -287,6 +287,35 @@ Example /*Free the font if not required anymore*/ lv_font_free(my_font); +Load a font from a memory buffer at run-time +****************************************** + +:cpp:func:`lv_font_load_from_buffer` can be used to load a font from a memory buffer. +This function may be useful to load a font from an external file system, which is not +supported by LVGL. The font needs to be in the same format as if it were loaded from a file. + +:note: To load a font from a buffer `LVGL's filesystem `__ + needs to be enabled and the MEMFS driver must be added. + +Example + +.. code:: c + + lv_font_t * my_font; + uint8_t *buf; + uint32_t bufsize; + + /*Read font file into the buffer from the external file system*/ + ... + + /*Load font from the buffer*/ + my_font = lv_font_load_from_buffer((void *)buf, buf)); + + /*Use the font*/ + + /*Free the font if not required anymore*/ + lv_font_free(my_font); + Add a new font engine ********************* diff --git a/lv_conf_template.h b/lv_conf_template.h index 0e1f27740..26aa3adfd 100644 --- a/lv_conf_template.h +++ b/lv_conf_template.h @@ -569,6 +569,12 @@ #define LV_FS_FATFS_CACHE_SIZE 0 /*>0 to cache this number of bytes in lv_fs_read()*/ #endif +/*API for memory-mapped file access. */ +#define LV_USE_FS_MEMFS 0 +#if LV_USE_FS_MEMFS + #define LV_FS_MEMFS_LETTER '\0' /*Set an upper cased letter on which the drive will accessible (e.g. 'A')*/ +#endif + /*PNG decoder library*/ #define LV_USE_PNG 0 diff --git a/src/core/lv_obj.c b/src/core/lv_obj.c index 63b56ee27..503c363fe 100644 --- a/src/core/lv_obj.c +++ b/src/core/lv_obj.c @@ -1,4 +1,4 @@ -/** +/** * @file lv_obj.c * */ diff --git a/src/font/lv_font_loader.c b/src/font/lv_font_loader.c index a99e43b18..2e1d7d1ae 100644 --- a/src/font/lv_font_loader.c +++ b/src/font/lv_font_loader.c @@ -78,11 +78,7 @@ static unsigned int read_bits(bit_iterator_t * it, int n_bits, lv_fs_res_t * res * GLOBAL FUNCTIONS **********************/ -/** - * Loads a `lv_font_t` object from a binary font file - * @param font_name filename where the font file is located - * @return a pointer to the font or NULL in case of error - */ + lv_font_t * lv_font_load(const char * font_name) { lv_fs_file_t file; @@ -110,10 +106,16 @@ lv_font_t * lv_font_load(const char * font_name) return font; } -/** - * Frees the memory allocated by the `lv_font_load()` function - * @param font lv_font_t object created by the lv_font_load function - */ +#if LV_USE_FS_MEMFS +lv_font_t * lv_font_load_from_buffer(void * buffer, uint32_t size) +{ + lv_fs_path_ex_t mempath; + + lv_fs_make_path_from_buffer(&mempath, LV_FS_MEMFS_LETTER, buffer, size); + return lv_font_load((const char *)&mempath); +} +#endif + void lv_font_free(lv_font_t * font) { if(NULL != font) { diff --git a/src/font/lv_font_loader.h b/src/font/lv_font_loader.h index 783cb2e75..b9e51c529 100644 --- a/src/font/lv_font_loader.h +++ b/src/font/lv_font_loader.h @@ -1,4 +1,4 @@ -/** +/** * @file lv_font_loader.h * */ @@ -26,7 +26,29 @@ extern "C" { * GLOBAL PROTOTYPES **********************/ +/** + * Loads a `lv_font_t` object from a binary font file + * @param font_name filename where the font file is located + * @return a pointer to the font or NULL in case of error + */ lv_font_t * lv_font_load(const char * fontName); + + +#if LV_USE_FS_MEMFS +/** + * Loads a `lv_font_t` object from a memory buffer containing the binary font file. + * Requires LV_USE_FS_MEMFS + * @param buffer address of the font file in the memory + * @param size size of the font file buffer + * @return a pointer to the font or NULL in case of error + */ +lv_font_t * lv_font_load_from_buffer(void * buffer, uint32_t size); +#endif + +/** + * Frees the memory allocated by the `lv_font_load()` function + * @param font lv_font_t object created by the lv_font_load function + */ void lv_font_free(lv_font_t * font); /********************** diff --git a/src/libs/fsdrv/lv_fs_memfs.c b/src/libs/fsdrv/lv_fs_memfs.c new file mode 100644 index 000000000..7b1cb0055 --- /dev/null +++ b/src/libs/fsdrv/lv_fs_memfs.c @@ -0,0 +1,218 @@ +/** + * @file lv_fs_memfs.c + * + * File System Interface driver for memory-mapped files + * + * This driver allows using a memory area as a file that can be read by normal file operations. It can + * be used, e.g., to store font files in slow flash memory, and load them into RAM on demand. + * + * You can enable it in lv_conf.h: + * + * #define LV_USE_FS_MEMFS 1 + * + * The actual implementation uses the built-in cache mechanism of the file system interface. + * + * Since this is not an actual file system, file write and directories are not supported. + * + * The default drive letter is 'M', but this can be changed in lv_conf.h: + * + * #define LV_FS_MEMFS_LETTER 'M' + * + * To use it seamlessly with the file system interface a new extended path object has been introduced: + * + * lv_fs_path_ex_t mempath; + * + * This structure can be initialized with the helper function: + * + * lv_fs_make_path_ex(&mempath, (const uint8_t *) & my_mem_buffer, sizeof(my_mem_buffer)); + * + * Then the "file" can be opened with: + * + * lv_fs_file_t file; + * lv_fs_res_t res = lv_fs_open(&file, (const char *) & mempath, LV_FS_MODE_RD); + * + * The path object can be used at any place where a file path is required, e.g.: + * + * lv_font_t* my_font = lv_font_load((const char *) & mempath); + * + */ + + +/********************* + * INCLUDES + *********************/ +#include "../../../lvgl.h" +#if LV_USE_FS_MEMFS + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** +* STATIC PROTOTYPES +**********************/ + +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_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 VARIABLES + **********************/ + +static lv_fs_drv_t fs_drv; /*A driver descriptor*/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +/** + * Register a driver for the File system interface + */ +void lv_fs_memfs_init(void) +{ + /*--------------------------------------------------- + * Register the file system interface in LVGL + *--------------------------------------------------*/ + + /*Add a simple drive to open images*/ + lv_fs_drv_init(&fs_drv); + + /*Set up fields...*/ + fs_drv.letter = LV_FS_MEMFS_LETTER; + fs_drv.cache_size = LV_FS_CACHE_FROM_BUFFER; + + fs_drv.open_cb = fs_open; + fs_drv.close_cb = fs_close; + fs_drv.read_cb = fs_read; + fs_drv.write_cb = NULL; + fs_drv.seek_cb = fs_seek; + fs_drv.tell_cb = fs_tell; + + fs_drv.dir_close_cb = NULL; + fs_drv.dir_open_cb = NULL; + fs_drv.dir_read_cb = NULL; + + lv_fs_drv_register(&fs_drv); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +/** + * Open a file + * @param drv pointer to a driver where this function belongs + * @param path pointer to an extended path object containing the memory buffer address and size + * @param mode read: FS_MODE_RD (currently only reading from the buffer is supported) + * @return pointer to FIL struct or NULL in case of fail + */ +static void * fs_open(lv_fs_drv_t * drv, const char * path, lv_fs_mode_t mode) +{ + LV_UNUSED(drv); + LV_UNUSED(mode); + return (void *)path; +} + +/** + * Close an opened file + * @param drv pointer to a driver where this function belongs + * @param file_p pointer to a FILE variable. (opened with fs_open) + * @return LV_FS_RES_OK: no error, the file is read + * any error from lv_fs_res_t enum + */ +static lv_fs_res_t fs_close(lv_fs_drv_t * drv, void * file_p) +{ + LV_UNUSED(drv); + LV_UNUSED(file_p); + 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 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, the file is read + * 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) +{ + LV_UNUSED(drv); + LV_UNUSED(file_p); + LV_UNUSED(buf); + LV_UNUSED(btr); + *br = 0; + return LV_FS_RES_OK; +} + +/** + * Set the read pointer. + * @param drv pointer to a driver where this function belongs + * @param file_p pointer to a FILE variable. (opened with fs_open ) + * @param pos the new position of read pointer + * @return LV_FS_RES_OK: no error, the file is read + * 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) +{ + /* NOTE: this function is only called to determine the end of the buffer when LV_FS_SEEK_END was given to lv_fs_seek() */ + LV_UNUSED(drv); + lv_fs_file_t * fp = (lv_fs_file_t *)file_p; + switch(whence) { + case LV_FS_SEEK_SET: { + fp->cache->file_position = pos; + break; + } + case LV_FS_SEEK_CUR: { + fp->cache->file_position += pos; + break; + } + case LV_FS_SEEK_END: { + fp->cache->file_position = fp->cache->end - pos; + break; + } + } + if(fp->cache->file_position < fp->cache->start) + fp->cache->file_position = fp->cache->start; + else if(fp->cache->file_position > fp->cache->end) + fp->cache->file_position = fp->cache->end; + 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 variable. + * @param pos_p pointer to to store the result + * @return LV_FS_RES_OK: no error, the file is read + * 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) +{ + LV_UNUSED(drv); + *pos_p = ((lv_fs_file_t *)file_p)->cache->file_position; + return LV_FS_RES_OK; +} + + +#else /*LV_USE_FS_MEMFS == 0*/ + +#if defined(LV_FS_MEMFS_LETTER) && LV_FS_MEMFS_LETTER != '\0' + #warning "LV_USE_FS_MEMFS is not enabled but LV_FS_MEMFS_LETTER is set" +#endif + +#endif /*LV_USE_FS_MEMFS*/ + diff --git a/src/libs/fsdrv/lv_fsdrv.h b/src/libs/fsdrv/lv_fsdrv.h index b8a21e468..763d881af 100644 --- a/src/libs/fsdrv/lv_fsdrv.h +++ b/src/libs/fsdrv/lv_fsdrv.h @@ -1,4 +1,4 @@ -/** +/** * @file lv_fsdrv.h * */ @@ -27,22 +27,26 @@ extern "C" { * GLOBAL PROTOTYPES **********************/ -#if LV_USE_FS_FATFS != '\0' +#if LV_USE_FS_FATFS void lv_fs_fatfs_init(void); #endif -#if LV_USE_FS_STDIO != '\0' +#if LV_USE_FS_STDIO void lv_fs_stdio_init(void); #endif -#if LV_USE_FS_POSIX != '\0' +#if LV_USE_FS_POSIX void lv_fs_posix_init(void); #endif -#if LV_USE_FS_WIN32 != '\0' +#if LV_USE_FS_WIN32 void lv_fs_win32_init(void); #endif +#if LV_USE_FS_MEMFS +void lv_fs_memfs_init(void); +#endif + /********************** * MACROS **********************/ diff --git a/src/lv_conf_internal.h b/src/lv_conf_internal.h index 851654f8e..563d0cd77 100644 --- a/src/lv_conf_internal.h +++ b/src/lv_conf_internal.h @@ -1909,6 +1909,24 @@ #endif #endif +/*API for memory-mapped file access. */ +#ifndef LV_USE_FS_MEMFS + #ifdef CONFIG_LV_USE_FS_MEMFS + #define LV_USE_FS_MEMFS CONFIG_LV_USE_FS_MEMFS + #else + #define LV_USE_FS_MEMFS 0 + #endif +#endif +#if LV_USE_FS_MEMFS + #ifndef LV_FS_MEMFS_LETTER + #ifdef CONFIG_LV_FS_MEMFS_LETTER + #define LV_FS_MEMFS_LETTER CONFIG_LV_FS_MEMFS_LETTER + #else + #define LV_FS_MEMFS_LETTER '\0' /*Set an upper cased letter on which the drive will accessible (e.g. 'A')*/ + #endif + #endif +#endif + /*PNG decoder library*/ #ifndef LV_USE_PNG #ifdef CONFIG_LV_USE_PNG diff --git a/src/lv_init.c b/src/lv_init.c index b8cff850a..3a90b72e3 100644 --- a/src/lv_init.c +++ b/src/lv_init.c @@ -206,6 +206,10 @@ void lv_init(void) lv_fs_win32_init(); #endif +#if LV_USE_FS_MEMFS + lv_fs_memfs_init(); +#endif + #if LV_USE_PNG lv_png_init(); #endif diff --git a/src/misc/lv_fs.c b/src/misc/lv_fs.c index 71df1e8f8..c927e0513 100644 --- a/src/misc/lv_fs.c +++ b/src/misc/lv_fs.c @@ -1,4 +1,4 @@ -/** +/** * @file lv_fs.c * */ @@ -83,27 +83,53 @@ lv_fs_res_t lv_fs_open(lv_fs_file_t * file_p, const char * path, lv_fs_mode_t mo return LV_FS_RES_NOT_IMP; } - const char * real_path = lv_fs_get_real_path(path); - void * file_d = drv->open_cb(drv, real_path, mode); - - if(file_d == NULL || file_d == (void *)(-1)) { - return LV_FS_RES_UNKNOWN; - } - file_p->drv = drv; - file_p->file_d = file_d; + + /* For memory-mapped files we set the file handle to our file descriptor so that we can access the cache from the file operations */ + if(drv->cache_size == LV_FS_CACHE_FROM_BUFFER) { + file_p->file_d = file_p; + } + else { + const char * real_path = lv_fs_get_real_path(path); + void * file_d = drv->open_cb(drv, real_path, mode); + if(file_d == NULL || file_d == (void *)(-1)) { + return LV_FS_RES_UNKNOWN; + } + file_p->file_d = file_d; + } if(drv->cache_size) { file_p->cache = lv_malloc(sizeof(lv_fs_file_cache_t)); LV_ASSERT_MALLOC(file_p->cache); lv_memzero(file_p->cache, sizeof(lv_fs_file_cache_t)); - file_p->cache->start = UINT32_MAX; /*Set an invalid range by default*/ - file_p->cache->end = UINT32_MAX - 1; + + /* If this is a memory-mapped file, then set "cache" to the memory buffer */ + if(drv->cache_size == LV_FS_CACHE_FROM_BUFFER) { + lv_fs_path_ex_t * path_ex = (lv_fs_path_ex_t *)path; + file_p->cache->buffer = path_ex->buffer; + file_p->cache->start = 0; + file_p->cache->file_position = 0; + file_p->cache->end = path_ex->size; + } + /*Set an invalid range by default*/ + else { + file_p->cache->start = UINT32_MAX; + file_p->cache->end = UINT32_MAX - 1; + } } return LV_FS_RES_OK; } +void lv_fs_make_path_from_buffer(lv_fs_path_ex_t * path, char letter, void * buf, uint32_t size) +{ + path->path[0] = letter; + path->path[1] = ':'; + path->path[2] = 0; + path->buffer = buf; + path->size = size; +} + lv_fs_res_t lv_fs_close(lv_fs_file_t * file_p) { if(file_p->drv == NULL) { @@ -117,7 +143,8 @@ lv_fs_res_t lv_fs_close(lv_fs_file_t * file_p) lv_fs_res_t res = file_p->drv->close_cb(file_p->drv, file_p->file_d); if(file_p->drv->cache_size && file_p->cache) { - if(file_p->cache->buffer) { + /* Only free cache if it was pre-allocated (for memory-mapped files it is never allocated) */ + if(file_p->drv->cache_size != LV_FS_CACHE_FROM_BUFFER && file_p->cache->buffer) { lv_free(file_p->cache->buffer); } @@ -138,12 +165,18 @@ static lv_fs_res_t lv_fs_read_cached(lv_fs_file_t * file_p, char * buf, uint32_t uint32_t start = file_p->cache->start; uint32_t end = file_p->cache->end; char * buffer = file_p->cache->buffer; - uint16_t buffer_size = file_p->drv->cache_size; + uint32_t buffer_size = file_p->drv->cache_size; if(start <= file_position && file_position <= end) { /* Data can be read from cache buffer */ uint32_t buffer_remaining_length = (uint32_t)end - file_position + 1; - uint16_t buffer_offset = (end - start) - buffer_remaining_length + 1; + uint32_t buffer_offset = (end - start) - buffer_remaining_length + 1; + + /* Do not allow reading beyond the actual memory block for memory-mapped files */ + if(file_p->drv->cache_size == LV_FS_CACHE_FROM_BUFFER) { + if(btr > buffer_remaining_length) + btr = buffer_remaining_length; + } if(btr <= buffer_remaining_length) { /*Data is in cache buffer, and buffer end not reached, no need to read from FS*/ diff --git a/src/misc/lv_fs.h b/src/misc/lv_fs.h index 3601d04e6..651267e77 100644 --- a/src/misc/lv_fs.h +++ b/src/misc/lv_fs.h @@ -1,4 +1,4 @@ -/** +/** * @file lv_fs.h * */ @@ -24,6 +24,8 @@ extern "C" { #define LV_FS_MAX_FN_LENGTH 64 #define LV_FS_MAX_PATH_LENGTH 256 +#define LV_FS_CACHE_FROM_BUFFER UINT32_MAX + /********************** * TYPEDEFS **********************/ @@ -80,7 +82,7 @@ typedef enum { typedef struct _lv_fs_drv_t { char letter; - uint16_t cache_size; + uint32_t cache_size; bool (*ready_cb)(struct _lv_fs_drv_t * drv); void * (*open_cb)(struct _lv_fs_drv_t * drv, const char * path, lv_fs_mode_t mode); @@ -110,6 +112,13 @@ typedef struct { lv_fs_file_cache_t * cache; } lv_fs_file_t; +/* Extended path object to specify the buffer for memory-mapped files */ +typedef struct { + char path[4]; /* This is needed to make it compatible with a normal path */ + void * buffer; + uint32_t size; +} lv_fs_path_ex_t; + typedef struct { void * dir_d; lv_fs_drv_t * drv; @@ -164,6 +173,15 @@ bool lv_fs_is_ready(char letter); */ lv_fs_res_t lv_fs_open(lv_fs_file_t * file_p, const char * path, lv_fs_mode_t mode); +/** + * Make a path object for the memory-mapped file compatible with the file system interface + * @param path path to a lv_fs_path_ex object + * @param letter the letter of the driver. E.g. `LV_FS_MEMFS_LETTER` + * @param buf address of the memory buffer + * @param size size of the memory buffer in bytes + */ +void lv_fs_make_path_from_buffer(lv_fs_path_ex_t * path, char letter, void * buf, uint32_t size); + /** * Close an already opened file * @param file_p pointer to a lv_fs_file_t variable diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index d53f973ae..51da5a614 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -154,6 +154,9 @@ add_library(test_common src/test_assets/test_font_montserrat_ascii_2bpp.c src/test_assets/test_font_montserrat_ascii_4bpp.c src/test_assets/test_font_montserrat_ascii_4bpp_compressed.c + src/test_assets/font_1_bin.c + src/test_assets/font_2_bin.c + src/test_assets/font_3_bin.c src/test_assets/test_img_caret_down.c src/test_assets/test_arc_bg.c src/test_assets/ubuntu_font.c diff --git a/tests/ref_imgs/font_loader_1.png b/tests/ref_imgs/font_loader_1.png new file mode 100644 index 000000000..5772f2609 Binary files /dev/null and b/tests/ref_imgs/font_loader_1.png differ diff --git a/tests/src/lv_test_conf_full.h b/tests/src/lv_test_conf_full.h index 083cbb9c2..dfacc9c74 100644 --- a/tests/src/lv_test_conf_full.h +++ b/tests/src/lv_test_conf_full.h @@ -58,6 +58,8 @@ #define LV_FS_STDIO_CACHE_SIZE 512 #define LV_USE_FS_POSIX 1 #define LV_FS_POSIX_LETTER 'B' +#define LV_USE_FS_MEMFS 1 +#define LV_FS_MEMFS_LETTER 'M' #define LV_USE_PNG 1 #define LV_USE_BMP 1 diff --git a/tests/src/test_assets/font_1_bin.c b/tests/src/test_assets/font_1_bin.c new file mode 100644 index 000000000..a1f599ede --- /dev/null +++ b/tests/src/test_assets/font_1_bin.c @@ -0,0 +1,438 @@ +/* table exported by mirkes.de's tiny hexer + filename: D:\lvgl\test\lv_port_pc_visual_studio\LvglPlatform\lvgl\tests\src\test_assets\font_1.fnt + position 0, 6876 bytes */ + + +unsigned char const font_1_buf[6876] = +{ + 44, 0, 0, 0, 104, 101, 97, 100, 1, 0, 0, 0, 4, 0, 8, 0, + 8, 0, 254, 255, 8, 0, 254, 255, 0, 0, 254, 255, 8, 0, 0, 0, + 16, 0, 0, 0, 1, 4, 4, 4, 9, 1, 0, 0, 164, 0, 0, 0, + 99, 109, 97, 112, 2, 0, 0, 0, 44, 0, 0, 0, 32, 0, 0, 0, + 95, 0, 1, 0, 95, 0, 2, 0, 44, 0, 0, 0, 176, 0, 0, 0, + 243, 247, 96, 0, 59, 0, 3, 0, 0, 0, 114, 31, 81, 239, 88, 239, + 91, 239, 92, 239, 93, 239, 97, 239, 99, 239, 101, 239, 105, 239, 108, 239, + 113, 239, 118, 239, 119, 239, 120, 239, 142, 239, 152, 239, 155, 239, 156, 239, + 157, 239, 161, 239, 162, 239, 163, 239, 164, 239, 183, 239, 184, 239, 190, 239, + 192, 239, 193, 239, 196, 239, 199, 239, 200, 239, 201, 239, 203, 239, 227, 239, + 229, 239, 20, 240, 21, 240, 23, 240, 55, 240, 58, 240, 67, 240, 108, 240, + 116, 240, 171, 240, 59, 241, 144, 241, 145, 241, 146, 241, 147, 241, 148, 241, + 215, 241, 227, 241, 61, 242, 84, 242, 170, 244, 18, 247, 242, 247, 0, 0, + 68, 1, 0, 0, 108, 111, 99, 97, 155, 0, 0, 0, 8, 0, 8, 0, + 12, 0, 21, 0, 29, 0, 48, 0, 69, 0, 90, 0, 111, 0, 118, 0, + 133, 0, 144, 0, 154, 0, 167, 0, 174, 0, 179, 0, 185, 0, 206, 0, + 222, 0, 230, 0, 246, 0, 6, 1, 25, 1, 42, 1, 59, 1, 75, 1, + 91, 1, 107, 1, 115, 1, 125, 1, 141, 1, 151, 1, 167, 1, 183, 1, + 209, 1, 229, 1, 248, 1, 10, 2, 30, 2, 47, 2, 63, 2, 82, 2, + 98, 2, 104, 2, 118, 2, 137, 2, 147, 2, 168, 2, 185, 2, 206, 2, + 225, 2, 249, 2, 11, 3, 27, 3, 39, 3, 55, 3, 76, 3, 102, 3, + 121, 3, 141, 3, 160, 3, 171, 3, 190, 3, 198, 3, 209, 3, 214, 3, + 219, 3, 233, 3, 249, 3, 6, 4, 22, 4, 36, 4, 49, 4, 65, 4, + 80, 4, 88, 4, 100, 4, 115, 4, 122, 4, 140, 4, 153, 4, 165, 4, + 182, 4, 197, 4, 207, 4, 219, 4, 232, 4, 245, 4, 4, 5, 24, 5, + 38, 5, 57, 5, 69, 5, 82, 5, 90, 5, 103, 5, 112, 5, 120, 5, + 127, 5, 160, 5, 183, 5, 214, 5, 239, 5, 5, 6, 40, 6, 75, 6, + 113, 6, 141, 6, 168, 6, 211, 6, 227, 6, 250, 6, 30, 7, 54, 7, + 76, 7, 105, 7, 122, 7, 136, 7, 158, 7, 190, 7, 214, 7, 238, 7, + 9, 8, 18, 8, 48, 8, 94, 8, 135, 8, 169, 8, 191, 8, 213, 8, + 254, 8, 17, 9, 50, 9, 85, 9, 120, 9, 143, 9, 171, 9, 202, 9, + 229, 9, 1, 10, 27, 10, 68, 10, 85, 10, 124, 10, 148, 10, 175, 10, + 203, 10, 230, 10, 252, 10, 35, 11, 67, 11, 90, 11, 129, 11, 159, 11, + 182, 11, 0, 0, 212, 11, 0, 0, 103, 108, 121, 102, 17, 0, 0, 0, + 17, 0, 18, 172, 7, 136, 153, 89, 64, 25, 1, 25, 185, 200, 8, 57, + 72, 45, 0, 50, 130, 41, 48, 39, 228, 225, 161, 206, 65, 178, 69, 208, + 178, 194, 192, 128, 39, 135, 171, 128, 32, 0, 86, 180, 75, 171, 68, 252, + 176, 33, 11, 144, 180, 191, 75, 75, 102, 54, 0, 58, 172, 56, 49, 134, + 199, 152, 24, 83, 237, 131, 137, 62, 208, 171, 131, 81, 125, 32, 44, 7, + 179, 4, 204, 1, 21, 24, 0, 75, 224, 130, 107, 98, 1, 115, 6, 98, + 58, 153, 136, 13, 129, 17, 185, 0, 28, 128, 21, 135, 155, 132, 16, 25, + 8, 128, 136, 4, 64, 17, 0, 12, 128, 21, 135, 147, 185, 181, 9, 3, + 131, 137, 53, 0, 25, 129, 161, 164, 32, 19, 96, 61, 200, 0, 37, 0, + 170, 0, 8, 3, 64, 1, 37, 228, 82, 94, 68, 14, 135, 145, 128, 29, + 65, 0, 24, 129, 24, 173, 48, 14, 128, 17, 0, 29, 0, 22, 255, 171, + 128, 84, 1, 17, 0, 42, 160, 4, 68, 0, 38, 0, 90, 224, 1, 1, + 0, 0, 42, 128, 42, 133, 93, 137, 178, 234, 125, 64, 95, 212, 5, 219, + 46, 164, 23, 128, 26, 207, 20, 160, 7, 248, 36, 128, 42, 181, 92, 131, + 85, 168, 4, 168, 0, 130, 128, 150, 218, 48, 36, 128, 42, 189, 95, 3, + 208, 224, 1, 2, 192, 9, 70, 81, 84, 50, 43, 0, 50, 128, 18, 64, + 35, 233, 0, 12, 84, 16, 72, 82, 201, 69, 210, 65, 0, 36, 128, 42, + 158, 213, 1, 174, 168, 0, 218, 128, 91, 161, 55, 170, 25, 128, 39, 128, + 42, 132, 213, 13, 186, 168, 127, 233, 162, 240, 152, 131, 12, 199, 0, 38, + 128, 42, 229, 83, 90, 234, 130, 206, 13, 96, 21, 56, 1, 172, 0, 41, + 0, 42, 141, 82, 201, 50, 190, 146, 234, 110, 101, 89, 23, 211, 126, 39, + 128, 42, 165, 76, 131, 238, 65, 98, 228, 52, 234, 67, 78, 172, 84, 14, + 128, 18, 58, 58, 0, 29, 0, 14, 135, 19, 58, 58, 0, 29, 69, 216, + 128, 37, 0, 42, 128, 66, 0, 73, 144, 44, 84, 2, 234, 200, 128, 180, + 136, 37, 0, 169, 164, 204, 41, 51, 10, 76, 194, 37, 0, 42, 136, 6, + 41, 130, 3, 158, 241, 73, 45, 20, 148, 0, 0, 36, 128, 42, 181, 92, + 131, 85, 168, 5, 80, 1, 74, 0, 10, 192, 0, 66, 7, 195, 1, 195, + 186, 20, 10, 243, 121, 9, 106, 62, 165, 151, 64, 63, 84, 124, 200, 227, + 138, 240, 123, 41, 128, 47, 120, 58, 128, 87, 32, 24, 206, 16, 10, 38, + 80, 0, 70, 138, 65, 15, 201, 151, 64, 48, 128, 50, 150, 204, 172, 65, + 230, 70, 160, 243, 74, 160, 121, 174, 128, 121, 148, 104, 46, 128, 50, 131, + 221, 80, 151, 174, 168, 89, 64, 27, 40, 3, 47, 93, 80, 128, 53, 0, + 58, 151, 85, 216, 192, 9, 87, 94, 1, 194, 164, 1, 133, 72, 18, 174, + 188, 0, 43, 0, 42, 151, 85, 32, 18, 169, 0, 245, 68, 7, 170, 32, + 37, 82, 64, 40, 128, 42, 151, 85, 32, 18, 169, 0, 149, 68, 4, 170, + 32, 7, 0, 49, 128, 50, 131, 221, 80, 151, 174, 168, 89, 64, 2, 60, + 160, 3, 34, 245, 215, 32, 52, 0, 50, 149, 0, 10, 128, 62, 74, 164, + 128, 18, 169, 32, 31, 0, 20, 0, 18, 149, 0, 126, 33, 120, 42, 130, + 214, 168, 45, 80, 3, 251, 196, 38, 141, 0, 46, 0, 50, 149, 0, 209, + 0, 6, 160, 129, 183, 8, 0, 59, 202, 0, 113, 159, 64, 38, 0, 42, + 149, 0, 127, 241, 210, 168, 224, 61, 0, 58, 150, 0, 71, 128, 46, 0, + 128, 2, 113, 71, 128, 81, 34, 128, 16, 196, 128, 0, 52, 0, 50, 150, + 136, 21, 0, 208, 6, 111, 176, 12, 157, 192, 12, 182, 0, 54, 0, 58, + 131, 221, 198, 11, 215, 106, 241, 202, 0, 10, 46, 80, 0, 81, 85, 215, + 106, 241, 46, 0, 50, 151, 85, 36, 0, 149, 65, 64, 12, 78, 9, 84, + 195, 4, 170, 48, 0, 54, 7, 187, 3, 221, 198, 11, 215, 106, 241, 202, + 0, 10, 46, 80, 4, 138, 174, 187, 188, 65, 238, 10, 140, 46, 128, 50, + 151, 85, 36, 0, 149, 65, 64, 12, 78, 15, 88, 70, 15, 90, 66, 39, + 128, 42, 149, 84, 75, 149, 66, 126, 152, 16, 137, 200, 90, 167, 80, 37, + 128, 42, 213, 58, 154, 168, 84, 192, 31, 252, 48, 50, 128, 50, 156, 128, + 18, 0, 63, 248, 4, 160, 2, 225, 171, 172, 96, 45, 248, 58, 133, 136, + 1, 92, 62, 0, 28, 224, 138, 43, 128, 20, 66, 92, 2, 69, 176, 0, + 72, 0, 74, 202, 0, 60, 64, 230, 184, 25, 160, 170, 27, 6, 206, 1, + 24, 92, 152, 28, 224, 1, 153, 65, 76, 192, 43, 0, 50, 172, 1, 80, + 40, 60, 216, 2, 33, 194, 0, 171, 225, 7, 196, 154, 0, 41, 248, 58, + 133, 16, 2, 192, 23, 33, 48, 0, 30, 177, 48, 9, 90, 0, 56, 64, + 32, 42, 0, 50, 181, 83, 52, 26, 173, 240, 2, 169, 16, 5, 193, 0, + 33, 166, 168, 0, 21, 135, 155, 150, 160, 34, 0, 63, 248, 40, 128, 22, + 255, 171, 140, 128, 66, 96, 27, 212, 2, 95, 0, 198, 32, 21, 48, 4, + 122, 0, 21, 135, 147, 198, 64, 7, 244, 0, 37, 128, 169, 129, 224, 5, + 80, 160, 92, 152, 0, 32, 7, 160, 187, 224, 38, 130, 152, 131, 48, 38, + 128, 42, 20, 202, 0, 33, 80, 173, 129, 21, 252, 136, 0, 43, 128, 51, + 36, 0, 127, 201, 86, 160, 6, 171, 144, 15, 205, 84, 144, 36, 128, 42, + 13, 84, 51, 213, 65, 0, 233, 234, 160, 128, 43, 128, 43, 0, 107, 0, + 225, 170, 130, 58, 164, 3, 8, 71, 77, 128, 39, 0, 42, 12, 204, 48, + 2, 39, 28, 137, 105, 250, 160, 128, 22, 128, 35, 5, 80, 8, 40, 45, + 220, 22, 142, 1, 252, 44, 7, 170, 141, 76, 174, 58, 97, 192, 35, 8, + 234, 135, 2, 48, 128, 43, 128, 43, 36, 0, 127, 36, 218, 2, 205, 120, + 8, 11, 128, 112, 18, 0, 19, 27, 155, 164, 0, 120, 18, 127, 155, 129, + 184, 27, 129, 192, 7, 243, 70, 0, 39, 128, 43, 36, 0, 127, 212, 128, + 57, 40, 9, 82, 0, 86, 215, 18, 0, 19, 36, 0, 127, 128, 67, 128, + 66, 38, 77, 196, 218, 2, 204, 28, 223, 128, 128, 136, 0, 224, 31, 128, + 43, 128, 42, 38, 77, 160, 44, 215, 128, 128, 184, 7, 0, 40, 128, 42, + 13, 84, 51, 213, 54, 1, 211, 213, 54, 43, 135, 178, 166, 85, 168, 1, + 170, 228, 3, 243, 85, 36, 0, 149, 69, 0, 43, 135, 170, 141, 82, 110, + 58, 168, 1, 232, 234, 160, 13, 82, 64, 26, 0, 34, 37, 208, 0, 104, + 0, 64, 30, 32, 0, 34, 45, 202, 238, 82, 194, 34, 94, 119, 192, 26, + 128, 34, 148, 128, 45, 28, 45, 28, 3, 136, 146, 0, 43, 128, 42, 43, + 128, 216, 7, 15, 129, 2, 20, 208, 0, 36, 120, 50, 5, 128, 33, 3, + 156, 13, 1, 113, 248, 2, 218, 80, 57, 128, 66, 88, 3, 136, 40, 57, + 84, 244, 68, 5, 255, 73, 85, 0, 6, 65, 134, 64, 35, 128, 42, 51, + 141, 131, 117, 80, 0, 96, 96, 255, 82, 0, 36, 127, 178, 133, 136, 65, + 132, 72, 145, 129, 149, 200, 5, 192, 96, 10, 248, 0, 0, 33, 128, 34, + 44, 221, 150, 2, 130, 164, 101, 238, 0, 22, 135, 155, 133, 48, 51, 0, + 37, 112, 87, 0, 230, 96, 19, 7, 147, 148, 0, 127, 240, 0, 22, 135, + 155, 203, 132, 224, 7, 49, 131, 24, 5, 56, 0, 37, 1, 41, 20, 154, + 139, 202, 232, 128, 27, 1, 153, 147, 34, 177, 171, 144, 20, 0, 145, 128, + 23, 87, 192, 64, 7, 196, 128, 127, 240, 9, 175, 128, 17, 186, 148, 16, + 3, 144, 181, 0, 108, 233, 80, 12, 96, 31, 213, 225, 94, 1, 202, 0, + 80, 5, 125, 0, 64, 0, 67, 94, 230, 93, 86, 109, 153, 79, 154, 51, + 109, 244, 0, 252, 140, 219, 125, 13, 179, 41, 243, 64, 7, 196, 26, 10, + 38, 60, 182, 187, 216, 168, 104, 153, 69, 197, 223, 10, 25, 25, 228, 152, + 104, 119, 166, 80, 208, 239, 74, 161, 162, 101, 64, 0, 67, 0, 122, 104, + 3, 165, 130, 164, 1, 44, 180, 13, 50, 101, 160, 165, 102, 45, 0, 84, + 204, 160, 8, 44, 0, 51, 49, 128, 32, 171, 18, 157, 180, 173, 101, 5, + 192, 10, 20, 176, 88, 97, 47, 136, 0, 64, 7, 196, 0, 88, 162, 0, + 29, 113, 63, 112, 144, 112, 5, 192, 165, 0, 74, 46, 32, 11, 64, 9, + 40, 24, 144, 82, 15, 30, 45, 200, 125, 105, 38, 0, 64, 7, 196, 0, + 89, 128, 8, 98, 6, 104, 128, 203, 184, 68, 238, 154, 1, 238, 8, 80, + 7, 234, 1, 238, 8, 84, 187, 132, 78, 233, 24, 129, 154, 32, 32, 72, + 7, 204, 0, 99, 2, 32, 6, 172, 168, 128, 0, 116, 36, 20, 0, 126, + 163, 34, 232, 113, 5, 64, 69, 136, 95, 16, 32, 23, 88, 4, 118, 96, + 27, 81, 0, 136, 208, 64, 7, 196, 0, 95, 224, 15, 254, 67, 248, 3, + 220, 0, 236, 0, 103, 7, 142, 85, 116, 60, 60, 8, 161, 224, 2, 68, + 192, 72, 0, 75, 2, 255, 242, 128, 222, 127, 217, 99, 108, 96, 17, 181, + 171, 251, 3, 123, 168, 5, 63, 32, 17, 0, 124, 64, 64, 7, 69, 0, + 124, 96, 87, 254, 179, 194, 194, 238, 30, 5, 164, 139, 160, 2, 172, 0, + 145, 118, 117, 66, 34, 43, 221, 161, 0, 21, 64, 22, 53, 182, 128, 194, + 153, 30, 14, 20, 102, 32, 64, 32, 7, 163, 128, 82, 105, 141, 150, 96, + 28, 168, 0, 171, 176, 4, 156, 48, 7, 179, 128, 82, 0, 52, 198, 1, + 203, 48, 26, 0, 242, 32, 0, 53, 119, 0, 4, 0, 156, 0, 72, 7, + 204, 0, 121, 80, 3, 72, 19, 121, 153, 49, 128, 31, 16, 203, 48, 25, + 146, 184, 7, 242, 160, 0, 102, 74, 213, 118, 0, 190, 36, 0, 156, 4, + 222, 96, 64, 0, 67, 111, 255, 180, 190, 0, 49, 4, 88, 39, 32, 0, + 229, 44, 108, 1, 107, 96, 24, 191, 252, 64, 56, 15, 172, 32, 4, 86, + 65, 26, 0, 151, 0, 115, 0, 70, 1, 168, 64, 39, 193, 4, 50, 246, + 56, 7, 61, 0, 125, 180, 32, 24, 151, 156, 3, 209, 168, 1, 197, 116, + 1, 255, 21, 208, 5, 26, 128, 75, 206, 1, 109, 8, 6, 56, 7, 188, + 77, 200, 77, 203, 35, 3, 35, 0, 127, 245, 246, 244, 54, 244, 56, 7, + 188, 18, 39, 22, 221, 246, 128, 127, 245, 221, 19, 156, 56, 15, 172, 16, + 4, 155, 0, 86, 15, 32, 25, 184, 3, 24, 4, 52, 0, 44, 112, 108, + 35, 64, 56, 127, 204, 0, 98, 0, 250, 54, 0, 57, 220, 14, 224, 9, + 96, 2, 133, 0, 88, 7, 88, 2, 221, 250, 192, 20, 239, 212, 0, 84, + 78, 80, 40, 7, 172, 0, 76, 64, 7, 150, 7, 138, 69, 137, 80, 65, + 208, 0, 226, 216, 0, 177, 88, 0, 94, 192, 40, 7, 172, 19, 0, 77, + 46, 0, 74, 135, 0, 44, 194, 128, 52, 80, 45, 112, 89, 112, 129, 188, + 128, 0, 56, 7, 188, 0, 72, 1, 199, 102, 1, 156, 28, 0, 241, 193, + 208, 242, 234, 10, 243, 223, 97, 127, 192, 31, 202, 138, 0, 56, 1, 57, + 60, 71, 60, 187, 244, 128, 72, 0, 75, 0, 35, 50, 128, 0, 234, 237, + 122, 232, 233, 66, 71, 65, 107, 128, 32, 64, 53, 20, 116, 116, 22, 142, + 175, 95, 174, 8, 80, 127, 220, 14, 152, 7, 225, 141, 140, 202, 136, 2, + 92, 87, 136, 30, 160, 1, 227, 6, 237, 65, 66, 0, 91, 169, 4, 1, + 0, 58, 168, 219, 36, 44, 64, 21, 63, 137, 233, 226, 1, 54, 97, 198, + 206, 0, 72, 127, 220, 0, 99, 227, 0, 253, 227, 224, 31, 49, 156, 192, + 30, 130, 194, 128, 14, 129, 48, 49, 128, 8, 156, 5, 132, 28, 128, 18, + 0, 20, 16, 4, 0, 24, 0, 58, 32, 7, 0, 64, 7, 196, 0, 120, + 129, 16, 1, 38, 173, 93, 135, 44, 35, 184, 122, 60, 120, 0, 80, 80, + 11, 184, 58, 124, 121, 87, 131, 118, 8, 68, 0, 73, 170, 56, 0, 59, + 0, 127, 39, 32, 4, 150, 86, 128, 150, 248, 246, 158, 240, 16, 255, 112, + 1, 69, 128, 56, 0, 59, 0, 125, 112, 1, 69, 251, 192, 67, 250, 91, + 227, 218, 2, 89, 90, 0, 73, 200, 0, 80, 127, 219, 128, 37, 5, 19, + 0, 86, 215, 63, 245, 136, 0, 210, 58, 238, 16, 10, 0, 216, 0, 32, + 96, 24, 209, 11, 227, 234, 0, 204, 127, 182, 193, 84, 0, 123, 186, 23, + 96, 0, 64, 0, 67, 111, 250, 192, 49, 0, 19, 254, 208, 15, 136, 3, + 255, 136, 64, 30, 32, 64, 7, 196, 0, 83, 32, 14, 150, 100, 128, 78, + 192, 6, 112, 3, 248, 3, 220, 3, 249, 225, 0, 9, 15, 15, 78, 234, + 120, 0, 11, 185, 80, 0, 64, 127, 204, 128, 127, 240, 223, 168, 3, 210, + 40, 1, 226, 2, 0, 244, 5, 128, 112, 200, 184, 62, 226, 97, 104, 2, + 72, 236, 240, 192, 8, 39, 28, 96, 0, 56, 7, 196, 1, 128, 123, 59, + 0, 183, 0, 168, 203, 15, 130, 176, 52, 48, 129, 60, 0, 132, 0, 201, + 6, 89, 0, 21, 12, 195, 72, 86, 208, 61, 224, 0, 56, 7, 188, 0, + 63, 231, 71, 64, 8, 205, 24, 1, 92, 0, 127, 242, 142, 29, 232, 4, + 135, 116, 56, 56, 7, 188, 18, 38, 16, 223, 254, 32, 187, 195, 224, 137, + 128, 130, 237, 22, 1, 155, 24, 3, 34, 160, 1, 209, 185, 145, 192, 40, + 127, 188, 3, 255, 152, 2, 208, 2, 0, 76, 0, 167, 0, 16, 1, 240, + 1, 46, 33, 32, 7, 129, 114, 0, 140, 96, 3, 45, 128, 64, 56, 7, + 188, 60, 220, 184, 2, 25, 218, 0, 53, 59, 140, 2, 231, 117, 216, 3, + 198, 1, 206, 232, 112, 14, 120, 240, 12, 56, 7, 188, 0, 90, 1, 147, + 139, 140, 1, 34, 3, 192, 2, 0, 136, 12, 3, 142, 0, 58, 49, 223, + 181, 227, 31, 33, 128, 72, 0, 75, 111, 255, 218, 92, 238, 231, 119, 16, + 121, 19, 72, 158, 1, 255, 121, 86, 81, 120, 23, 63, 252, 252, 64, 64, + 127, 85, 0, 127, 241, 18, 240, 3, 151, 45, 28, 2, 110, 163, 0, 120, + 3, 100, 64, 35, 64, 5, 187, 140, 1, 32, 19, 68, 16, 5, 64, 63, + 64, 7, 218, 76, 1, 242, 232, 6, 48, 7, 180, 127, 209, 96, 28, 150, + 1, 35, 152, 4, 110, 224, 15, 254, 96, 80, 7, 212, 0, 72, 238, 64, + 13, 63, 119, 190, 67, 18, 255, 49, 246, 153, 218, 23, 254, 176, 222, 33, + 177, 170, 13, 137, 0, 253, 58, 87, 136, 7, 103, 128, 126, 105, 0, 192, + 80, 0, 83, 18, 39, 224, 223, 255, 166, 131, 21, 125, 10, 30, 35, 231, + 0, 108, 207, 161, 31, 183, 124, 48, 80, 0, 83, 18, 39, 224, 223, 255, + 166, 131, 21, 118, 92, 40, 120, 142, 240, 112, 6, 204, 237, 72, 71, 237, + 221, 222, 48, 80, 0, 83, 18, 39, 224, 223, 255, 166, 131, 21, 107, 186, + 20, 60, 70, 0, 156, 1, 179, 50, 37, 8, 253, 187, 127, 195, 0, 80, + 0, 83, 18, 39, 224, 223, 255, 166, 131, 23, 46, 244, 40, 120, 248, 6, + 112, 6, 206, 162, 104, 71, 237, 239, 252, 48, 80, 0, 83, 18, 39, 224, + 223, 255, 166, 2, 239, 232, 112, 15, 206, 0, 68, 250, 9, 255, 254, 30, + 80, 7, 220, 0, 127, 240, 223, 96, 3, 231, 75, 192, 13, 54, 60, 78, + 162, 228, 14, 146, 57, 51, 85, 134, 108, 66, 240, 63, 100, 8, 128, 6, + 38, 176, 15, 205, 216, 1, 0, 56, 7, 188, 3, 110, 176, 193, 36, 184, + 184, 52, 209, 172, 138, 60, 79, 6, 0, 120, 8, 57, 24, 191, 128, 233, + 178, 200, 146, 73, 104, 104, 0, 56, 7, 188, 60, 111, 236, 56, 1, 93, + 64, 30, 239, 222, 6, 103, 51, 0, 127, 242, 180, 204, 230, 109, 64, 127, + 76, 128, 121, 248, 192, 57, 48, 116, 3, 69, 146, 72, 5, 14, 13, 238, + 0, 135, 0, 58, 0, 29, 192, 7, 128, 10, 64, 15, 0, 28, 49, 0, + 14, 238, 56, 7, 0, 80, 0, 83, 0, 43, 255, 216, 22, 160, 198, 102, + 3, 164, 0, 46, 233, 64, 63, 248, 20, 128, 5, 221, 40, 5, 106, 12, + 102, 96, 48, 48, 7, 188, 3, 255, 220, 47, 147, 176, 68, 133, 219, 194, + 0, 10, 50, 8, 7, 255, 40, 192, 48, 144, 64, 128, 75, 0, 124, 96, + 2, 48, 8, 176, 11, 40, 138, 112, 7, 139, 110, 212, 0, 241, 109, 221, + 192, 89, 68, 88, 64, 0, 0, 0, 244, 12, 0, 0, 107, 101, 114, 110, + 3, 0, 0, 0, 155, 0, 61, 49, 0, 0, 1, 2, 0, 3, 4, 5, + 2, 6, 7, 8, 9, 10, 9, 10, 11, 12, 0, 13, 14, 15, 16, 17, + 18, 19, 12, 20, 20, 0, 0, 0, 21, 22, 23, 24, 25, 22, 26, 27, + 28, 29, 29, 30, 31, 32, 29, 29, 22, 33, 34, 35, 3, 36, 30, 37, + 37, 38, 39, 40, 41, 42, 43, 0, 44, 0, 45, 46, 47, 48, 49, 50, + 51, 45, 52, 52, 53, 48, 45, 45, 46, 46, 54, 55, 56, 57, 51, 58, + 58, 59, 58, 60, 41, 0, 0, 9, 61, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 2, 0, 3, 4, 5, 2, 6, 7, 8, 9, + 10, 9, 10, 11, 12, 13, 14, 15, 16, 17, 12, 18, 19, 20, 21, 21, + 0, 0, 0, 22, 23, 24, 25, 23, 25, 25, 25, 23, 25, 25, 26, 25, + 25, 25, 25, 23, 25, 23, 25, 3, 27, 28, 29, 29, 30, 31, 32, 33, + 34, 35, 0, 36, 0, 37, 38, 39, 39, 39, 0, 39, 38, 40, 41, 38, + 38, 42, 42, 39, 42, 39, 42, 43, 44, 45, 46, 46, 47, 46, 48, 0, + 0, 35, 9, 49, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 6, 0, 3, 253, 0, 0, 0, 0, 249, 248, 1, 6, 3, 2, 251, 1, + 6, 0, 5, 1, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 8, 1, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, + 0, 252, 0, 0, 0, 0, 0, 253, 2, 3, 0, 0, 255, 0, 255, 1, + 0, 255, 0, 255, 255, 253, 0, 0, 0, 0, 255, 0, 0, 254, 254, 0, + 0, 255, 0, 253, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 0, + 254, 0, 253, 0, 241, 0, 0, 253, 0, 3, 4, 0, 0, 253, 1, 1, + 4, 3, 254, 3, 0, 0, 249, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 253, 254, 250, 0, 251, 255, 0, 0, 0, 0, 0, 5, 0, 252, 255, + 0, 0, 0, 254, 0, 0, 255, 247, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 246, 255, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 1, + 0, 0, 253, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 251, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 3, 1, 4, 255, 0, 0, 3, 255, 252, 238, + 1, 3, 3, 0, 254, 0, 5, 0, 4, 0, 4, 0, 244, 0, 254, 4, + 0, 4, 255, 3, 1, 0, 0, 0, 255, 0, 0, 254, 10, 0, 10, 0, + 4, 0, 5, 2, 2, 4, 0, 0, 0, 251, 0, 0, 0, 0, 0, 255, + 0, 1, 254, 254, 253, 1, 0, 255, 0, 0, 0, 251, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 248, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 249, 0, 248, 0, 0, 0, 0, 255, + 0, 13, 254, 254, 1, 1, 255, 0, 254, 1, 0, 0, 249, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 244, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 248, 0, 8, 0, 0, 251, 0, 4, 0, + 247, 244, 247, 253, 4, 0, 0, 247, 0, 2, 253, 0, 254, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 4, 240, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 1, 0, 0, 0, 0, 0, + 1, 1, 254, 253, 0, 0, 0, 255, 0, 0, 255, 0, 0, 0, 253, 0, + 255, 0, 253, 253, 0, 253, 252, 252, 254, 0, 253, 0, 253, 0, 0, 0, + 0, 255, 0, 0, 1, 0, 1, 255, 0, 0, 0, 0, 0, 1, 255, 0, + 0, 0, 255, 1, 1, 0, 0, 0, 0, 254, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2, 255, 0, 254, 0, 254, 0, 0, 255, 0, 4, 0, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 255, 255, 0, 0, 255, 0, 255, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 0, 255, 254, 0, 0, 0, + 0, 0, 0, 0, 0, 255, 0, 255, 255, 255, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 255, 0, 0, 0, 0, 255, 254, 0, 254, 0, 252, 255, 252, + 3, 0, 0, 253, 1, 3, 3, 0, 253, 0, 254, 0, 0, 250, 1, 255, + 1, 249, 1, 0, 0, 0, 249, 0, 249, 255, 245, 255, 0, 250, 0, 3, + 4, 0, 2, 0, 0, 0, 0, 0, 0, 254, 254, 0, 252, 0, 0, 0, + 255, 0, 0, 0, 255, 0, 0, 0, 0, 0, 255, 255, 0, 255, 254, 0, + 0, 0, 0, 0, 0, 0, 255, 255, 0, 255, 254, 255, 0, 0, 255, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 0, 254, 0, 255, + 0, 253, 1, 0, 0, 254, 1, 1, 1, 0, 0, 0, 0, 0, 0, 255, + 0, 0, 0, 0, 0, 1, 0, 0, 255, 0, 255, 255, 254, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 255, 0, 0, 0, 0, 255, 254, 0, 254, 0, + 4, 255, 0, 252, 0, 0, 3, 250, 249, 251, 253, 1, 0, 255, 248, 254, + 0, 254, 0, 253, 2, 254, 248, 0, 253, 0, 0, 1, 0, 1, 255, 0, + 1, 0, 252, 251, 0, 250, 253, 253, 253, 252, 254, 253, 0, 254, 253, 1, + 0, 0, 0, 255, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 255, 0, 255, 0, 0, 255, 0, 254, 253, 253, 0, + 0, 252, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, 1, 255, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 254, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 255, 0, 0, 0, 254, 0, 0, 0, 0, 250, 252, 0, 0, 0, + 254, 250, 0, 0, 255, 1, 0, 253, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 254, 0, 0, 254, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 254, 0, 0, 0, 0, 2, 0, 1, 253, 253, 0, 255, + 255, 254, 0, 0, 0, 0, 0, 0, 252, 0, 255, 0, 254, 255, 0, 253, + 253, 252, 255, 0, 253, 0, 252, 0, 0, 0, 0, 10, 0, 0, 1, 0, + 0, 254, 0, 1, 0, 250, 0, 0, 0, 0, 0, 244, 254, 4, 4, 255, + 251, 0, 1, 254, 0, 250, 255, 254, 1, 247, 255, 2, 0, 2, 252, 254, + 251, 252, 251, 0, 0, 248, 0, 7, 0, 0, 255, 0, 0, 0, 255, 255, + 255, 253, 252, 0, 244, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, + 0, 255, 255, 254, 0, 0, 253, 0, 255, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 253, 0, 0, 3, 0, 2, + 0, 253, 1, 255, 0, 253, 255, 0, 254, 255, 255, 0, 254, 254, 0, 0, + 255, 0, 255, 254, 254, 0, 0, 255, 0, 1, 255, 0, 253, 0, 0, 0, + 253, 0, 254, 0, 254, 254, 1, 0, 0, 0, 0, 0, 0, 0, 0, 253, + 1, 0, 254, 0, 255, 254, 252, 255, 255, 255, 0, 255, 254, 0, 0, 0, + 0, 0, 0, 255, 255, 255, 0, 0, 0, 0, 2, 255, 0, 255, 0, 0, + 0, 255, 254, 255, 255, 254, 255, 0, 1, 5, 0, 0, 253, 0, 255, 3, + 0, 255, 251, 254, 2, 0, 0, 250, 254, 1, 254, 1, 0, 255, 255, 252, + 0, 254, 1, 0, 0, 254, 0, 0, 0, 1, 1, 253, 254, 0, 254, 255, + 254, 255, 255, 0, 254, 1, 254, 254, 4, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 254, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 254, 0, 0, 254, 0, 0, 255, 255, 0, 0, 0, 0, 255, 0, + 0, 0, 0, 255, 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, 254, 0, + 253, 0, 0, 0, 252, 0, 1, 253, 3, 0, 255, 250, 0, 0, 253, 255, + 0, 251, 253, 252, 0, 0, 250, 255, 251, 251, 250, 0, 253, 0, 1, 9, + 254, 0, 253, 255, 0, 255, 254, 253, 254, 251, 251, 253, 255, 0, 0, 255, + 0, 0, 0, 0, 247, 255, 4, 3, 253, 251, 0, 0, 252, 0, 250, 255, + 255, 3, 244, 254, 0, 0, 0, 248, 254, 249, 255, 247, 0, 0, 247, 0, + 8, 0, 0, 255, 0, 0, 0, 0, 255, 255, 251, 255, 0, 248, 0, 0, + 0, 0, 252, 0, 255, 0, 0, 252, 250, 0, 0, 255, 254, 252, 255, 0, + 255, 0, 0, 0, 0, 250, 255, 252, 252, 255, 254, 253, 255, 254, 0, 253, + 255, 252, 254, 0, 254, 254, 255, 254, 0, 1, 0, 255, 252, 0, 3, 0, + 254, 0, 0, 0, 0, 2, 0, 1, 253, 5, 0, 255, 255, 254, 0, 0, + 0, 0, 0, 0, 252, 0, 255, 0, 254, 255, 0, 253, 253, 252, 255, 0, + 253, 1, 5, 0, 0, 0, 0, 10, 0, 0, 1, 0, 0, 254, 0, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 253, + 0, 0, 0, 0, 0, 255, 0, 0, 0, 255, 255, 0, 0, 253, 255, 0, + 0, 253, 0, 2, 255, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, + 2, 3, 1, 255, 0, 252, 254, 0, 4, 252, 252, 253, 253, 5, 2, 1, + 245, 255, 3, 255, 0, 255, 1, 255, 252, 0, 255, 1, 254, 255, 252, 255, + 0, 0, 4, 3, 0, 252, 0, 249, 254, 4, 254, 251, 0, 254, 252, 252, + 255, 5, 1, 0, 254, 0, 253, 0, 1, 4, 253, 251, 251, 253, 4, 0, + 0, 247, 255, 1, 254, 255, 253, 0, 253, 251, 254, 254, 255, 0, 0, 253, + 253, 255, 0, 4, 3, 255, 249, 0, 249, 254, 0, 252, 249, 0, 252, 254, + 252, 252, 3, 0, 0, 254, 0, 253, 255, 0, 255, 254, 0, 2, 252, 1, + 0, 0, 249, 0, 255, 253, 254, 255, 252, 253, 252, 253, 0, 252, 255, 253, + 254, 252, 255, 0, 0, 0, 6, 254, 0, 252, 255, 0, 255, 253, 253, 253, + 252, 251, 254, 253, 3, 0, 254, 0, 250, 254, 1, 3, 252, 251, 253, 252, + 4, 255, 1, 244, 254, 3, 253, 254, 251, 0, 252, 251, 254, 255, 255, 255, + 253, 252, 0, 0, 0, 4, 4, 255, 248, 0, 248, 253, 3, 251, 247, 253, + 252, 251, 250, 252, 3, 0, 0, 0, 0, 254, 0, 0, 1, 254, 3, 1, + 254, 3, 0, 0, 252, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, + 0, 0, 255, 0, 0, 0, 0, 1, 4, 0, 0, 254, 0, 0, 0, 0, + 255, 255, 254, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 255, 0, + 5, 0, 2, 0, 0, 254, 0, 3, 0, 0, 0, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 4, 0, 4, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 248, 0, 255, 2, 0, 4, 0, 0, + 13, 2, 253, 253, 1, 1, 255, 0, 250, 0, 0, 6, 248, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 247, 5, 18, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 248, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 254, 0, 0, 254, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 0, 253, 0, 0, 0, + 0, 0, 1, 17, 253, 255, 4, 3, 253, 1, 0, 0, 1, 1, 254, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 239, 4, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 252, 0, 0, + 0, 253, 0, 0, 0, 0, 253, 255, 0, 0, 0, 253, 0, 254, 0, 250, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 247, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, 254, 0, 254, 0, 253, 0, + 0, 0, 254, 1, 254, 0, 0, 253, 255, 253, 0, 0, 253, 0, 255, 0, + 250, 0, 255, 0, 0, 246, 254, 251, 255, 251, 0, 0, 247, 0, 253, 255, + 0, 0, 0, 0, 0, 0, 0, 0, 254, 254, 255, 254, 0, 0, 0, 0, + 253, 0, 253, 2, 255, 3, 0, 255, 253, 255, 254, 254, 0, 254, 255, 255, + 1, 253, 0, 0, 0, 0, 245, 255, 254, 0, 253, 0, 255, 250, 255, 0, + 0, 255, 255, 0, 0, 0, 0, 1, 0, 255, 254, 255, 2, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 253, + 0, 255, 0, 0, 0, 253, 1, 0, 0, 0, 253, 255, 253, 0, 0, 252, + 0, 255, 0, 250, 0, 0, 0, 0, 244, 0, 253, 251, 250, 0, 0, 247, + 0, 255, 254, 0, 0, 0, 0, 0, 0, 0, 0, 255, 254, 255, 254, 0, + 0, 0, 2, 254, 0, 4, 6, 255, 255, 252, 2, 6, 2, 3, 253, 2, + 5, 2, 4, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 8, 6, 254, 255, 0, 255, 10, 6, 10, 0, 0, 0, 1, 0, 0, 5, + 0, 0, 254, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, + 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 245, 254, 255, 251, 250, 0, + 0, 247, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 254, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, + 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 245, 254, 255, 251, 250, + 0, 0, 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, 253, 1, 0, 255, 1, 2, + 1, 252, 0, 0, 255, 1, 0, 1, 0, 0, 0, 0, 253, 0, 255, 255, + 253, 0, 255, 251, 0, 8, 255, 0, 253, 255, 0, 255, 254, 0, 255, 252, + 253, 254, 0, 0, 0, 254, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, + 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 245, 254, 255, + 251, 250, 0, 0, 247, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 254, 0, 252, 254, 255, 4, 255, 255, 251, 0, + 255, 0, 255, 253, 0, 3, 0, 1, 0, 1, 253, 251, 254, 0, 251, 254, + 253, 251, 251, 0, 254, 253, 254, 254, 255, 255, 254, 255, 0, 255, 0, 2, + 0, 2, 255, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 255, 255, 255, 0, 0, 253, 0, 255, 0, 254, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 248, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 255, 255, 0, 254, 0, 0, 0, 0, 255, 0, 0, 254, 255, 1, + 0, 254, 254, 255, 0, 252, 255, 253, 255, 254, 0, 254, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 247, 0, 4, 0, 0, 254, 0, 0, 0, + 0, 254, 0, 255, 0, 0, 255, 0, 0, 255, 0, 253, 0, 0, 5, 254, + 252, 252, 1, 1, 1, 0, 252, 1, 2, 1, 4, 1, 4, 255, 253, 0, + 0, 251, 0, 0, 252, 253, 0, 0, 253, 0, 254, 254, 0, 254, 0, 254, + 0, 255, 2, 0, 255, 252, 255, 5, 0, 0, 255, 0, 253, 0, 0, 2, + 253, 0, 1, 255, 1, 0, 0, 252, 0, 255, 0, 0, 255, 1, 255, 0, + 0, 0, 251, 254, 253, 0, 252, 0, 0, 250, 0, 5, 255, 0, 254, 0, + 1, 0, 255, 0, 255, 252, 0, 255, 1, 0, 0, 0, 0, 255, 0, 0, + 1, 254, 0, 0, 0, 254, 255, 0, 254, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 248, 0, 3, 0, 0, 255, + 0, 0, 0, 0, 0, 0, 255, 255, 0, 0, 0, 3, 0, 3, 0, 0, + 0, 0, 0, 248, 249, 0, 6, 4, 2, 251, 1, 5, 0, 5, 0, 3, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }; diff --git a/tests/src/test_assets/font_2_bin.c b/tests/src/test_assets/font_2_bin.c new file mode 100644 index 000000000..06b92f0aa --- /dev/null +++ b/tests/src/test_assets/font_2_bin.c @@ -0,0 +1,462 @@ +/* table exported by mirkes.de's tiny hexer + filename: D:\lvgl\test\lv_port_pc_visual_studio\LvglPlatform\lvgl\tests\src\test_assets\font_2.fnt + position 0, 7252 bytes */ + + +unsigned char const font_2_buf[7252] = +{ + 44, 0, 0, 0, 104, 101, 97, 100, 1, 0, 0, 0, 4, 0, 8, 0, + 8, 0, 254, 255, 8, 0, 254, 255, 0, 0, 254, 255, 8, 0, 0, 0, + 16, 0, 0, 0, 1, 4, 4, 4, 9, 0, 0, 0, 164, 0, 0, 0, + 99, 109, 97, 112, 2, 0, 0, 0, 44, 0, 0, 0, 32, 0, 0, 0, + 95, 0, 1, 0, 95, 0, 2, 0, 44, 0, 0, 0, 176, 0, 0, 0, + 243, 247, 96, 0, 59, 0, 3, 0, 0, 0, 114, 31, 81, 239, 88, 239, + 91, 239, 92, 239, 93, 239, 97, 239, 99, 239, 101, 239, 105, 239, 108, 239, + 113, 239, 118, 239, 119, 239, 120, 239, 142, 239, 152, 239, 155, 239, 156, 239, + 157, 239, 161, 239, 162, 239, 163, 239, 164, 239, 183, 239, 184, 239, 190, 239, + 192, 239, 193, 239, 196, 239, 199, 239, 200, 239, 201, 239, 203, 239, 227, 239, + 229, 239, 20, 240, 21, 240, 23, 240, 55, 240, 58, 240, 67, 240, 108, 240, + 116, 240, 171, 240, 59, 241, 144, 241, 145, 241, 146, 241, 147, 241, 148, 241, + 215, 241, 227, 241, 61, 242, 84, 242, 170, 244, 18, 247, 242, 247, 0, 0, + 68, 1, 0, 0, 108, 111, 99, 97, 155, 0, 0, 0, 8, 0, 8, 0, + 12, 0, 21, 0, 29, 0, 48, 0, 69, 0, 90, 0, 112, 0, 119, 0, + 133, 0, 144, 0, 154, 0, 168, 0, 175, 0, 180, 0, 186, 0, 207, 0, + 223, 0, 234, 0, 250, 0, 10, 1, 29, 1, 45, 1, 61, 1, 77, 1, + 93, 1, 109, 1, 117, 1, 127, 1, 143, 1, 154, 1, 170, 1, 186, 1, + 214, 1, 235, 1, 254, 1, 17, 2, 38, 2, 54, 2, 70, 2, 89, 2, + 108, 2, 117, 2, 133, 2, 152, 2, 168, 2, 189, 2, 208, 2, 229, 2, + 248, 2, 17, 3, 36, 3, 52, 3, 68, 3, 87, 3, 108, 3, 134, 3, + 153, 3, 174, 3, 193, 3, 207, 3, 228, 3, 239, 3, 250, 3, 0, 4, + 5, 4, 19, 4, 41, 4, 55, 4, 74, 4, 88, 4, 104, 4, 120, 4, + 139, 4, 149, 4, 163, 4, 182, 4, 192, 4, 212, 4, 226, 4, 240, 4, + 3, 5, 19, 5, 31, 5, 43, 5, 57, 5, 71, 5, 87, 5, 107, 5, + 121, 5, 140, 5, 152, 5, 166, 5, 177, 5, 191, 5, 200, 5, 208, 5, + 215, 5, 255, 5, 27, 6, 63, 6, 91, 6, 113, 6, 149, 6, 185, 6, + 225, 6, 5, 7, 36, 7, 80, 7, 98, 7, 123, 7, 163, 7, 191, 7, + 215, 7, 254, 7, 30, 8, 62, 8, 86, 8, 126, 8, 150, 8, 174, 8, + 206, 8, 217, 8, 248, 8, 40, 9, 88, 9, 124, 9, 149, 9, 174, 9, + 216, 9, 244, 9, 24, 10, 68, 10, 104, 10, 136, 10, 168, 10, 200, 10, + 232, 10, 8, 11, 39, 11, 93, 11, 121, 11, 165, 11, 199, 11, 233, 11, + 11, 12, 45, 12, 79, 12, 127, 12, 159, 12, 191, 12, 235, 12, 13, 13, + 45, 13, 0, 0, 76, 13, 0, 0, 103, 108, 121, 102, 17, 0, 0, 0, + 17, 0, 18, 172, 43, 163, 17, 163, 0, 25, 1, 25, 185, 203, 148, 128, + 0, 45, 0, 50, 130, 41, 48, 37, 205, 209, 132, 3, 144, 54, 70, 64, + 132, 132, 128, 0, 39, 135, 171, 128, 64, 1, 94, 209, 59, 64, 0, 70, + 192, 128, 66, 74, 214, 217, 128, 64, 0, 54, 0, 58, 172, 56, 49, 132, + 4, 27, 0, 19, 172, 51, 136, 4, 19, 147, 3, 16, 68, 16, 44, 7, + 179, 4, 204, 128, 5, 157, 0, 12, 225, 16, 65, 141, 80, 29, 76, 201, + 0, 0, 0, 0, 13, 129, 17, 185, 57, 0, 0, 21, 135, 155, 132, 16, + 88, 13, 1, 192, 13, 0, 88, 4, 16, 21, 135, 147, 185, 140, 133, 134, + 5, 140, 185, 128, 25, 129, 161, 164, 32, 55, 64, 10, 136, 0, 37, 0, + 170, 0, 16, 0, 5, 0, 36, 236, 136, 5, 0, 0, 14, 135, 145, 128, + 58, 184, 128, 24, 129, 24, 173, 48, 14, 128, 17, 0, 58, 0, 22, 255, + 171, 128, 5, 0, 1, 64, 0, 65, 0, 5, 0, 2, 48, 0, 72, 128, + 12, 128, 0, 42, 128, 42, 133, 93, 147, 48, 13, 201, 128, 99, 48, 13, + 133, 93, 144, 23, 128, 26, 207, 16, 81, 5, 16, 81, 5, 16, 36, 128, + 42, 181, 92, 128, 0, 96, 0, 44, 0, 67, 128, 79, 85, 24, 36, 128, + 42, 189, 95, 0, 5, 16, 2, 84, 128, 0, 81, 69, 84, 128, 43, 0, + 50, 128, 36, 128, 1, 208, 0, 13, 132, 16, 69, 214, 217, 0, 4, 152, + 0, 36, 128, 42, 158, 213, 2, 176, 0, 45, 212, 0, 0, 73, 189, 85, + 0, 39, 128, 42, 132, 213, 27, 56, 0, 76, 77, 19, 64, 21, 4, 205, + 32, 38, 128, 42, 229, 86, 179, 128, 96, 0, 51, 128, 6, 0, 3, 56, + 0, 41, 0, 42, 141, 85, 146, 176, 36, 14, 214, 156, 32, 13, 157, 77, + 32, 39, 128, 42, 165, 76, 133, 136, 74, 157, 76, 192, 0, 74, 157, 92, + 0, 14, 128, 18, 58, 0, 0, 58, 0, 14, 135, 19, 58, 0, 0, 58, + 177, 0, 0, 37, 0, 42, 128, 0, 128, 36, 192, 46, 24, 0, 11, 72, + 128, 0, 0, 37, 0, 169, 164, 204, 136, 0, 0, 36, 204, 136, 37, 0, + 42, 136, 0, 1, 204, 16, 0, 54, 138, 74, 0, 0, 0, 0, 36, 128, + 42, 181, 92, 128, 0, 96, 0, 82, 0, 1, 128, 1, 64, 0, 66, 7, + 195, 1, 195, 188, 40, 20, 37, 78, 58, 192, 88, 5, 20, 64, 88, 5, + 20, 20, 36, 204, 211, 1, 196, 58, 128, 0, 47, 120, 58, 128, 5, 200, + 0, 1, 197, 8, 0, 88, 156, 128, 38, 204, 232, 133, 136, 1, 200, 48, + 128, 50, 150, 204, 216, 149, 0, 66, 22, 205, 104, 149, 0, 28, 150, 204, + 218, 0, 46, 128, 50, 131, 221, 81, 44, 128, 0, 73, 128, 0, 44, 128, + 0, 3, 221, 81, 0, 53, 0, 58, 151, 85, 217, 129, 80, 0, 224, 21, + 0, 4, 145, 80, 0, 224, 23, 85, 217, 128, 43, 0, 42, 151, 85, 65, + 80, 0, 22, 213, 33, 80, 0, 23, 85, 72, 40, 128, 42, 151, 85, 65, + 80, 0, 23, 85, 33, 80, 0, 21, 0, 0, 49, 128, 50, 131, 221, 81, + 44, 128, 0, 73, 128, 17, 172, 128, 35, 131, 221, 81, 128, 52, 0, 50, + 149, 0, 21, 21, 0, 21, 23, 85, 93, 21, 0, 21, 21, 0, 21, 0, + 20, 0, 18, 149, 21, 21, 21, 21, 0, 33, 120, 42, 130, 214, 168, 0, + 58, 128, 3, 168, 0, 66, 4, 213, 128, 46, 0, 50, 149, 0, 209, 21, + 13, 144, 22, 99, 128, 22, 140, 168, 21, 0, 82, 0, 38, 0, 42, 149, + 0, 1, 80, 0, 21, 0, 1, 80, 0, 23, 85, 56, 61, 0, 58, 150, + 0, 1, 225, 107, 128, 94, 20, 201, 66, 97, 72, 220, 134, 20, 129, 128, + 96, 52, 0, 50, 150, 136, 21, 22, 88, 21, 21, 37, 149, 21, 2, 229, + 21, 0, 61, 0, 54, 0, 58, 131, 221, 217, 130, 200, 0, 224, 201, 128, + 4, 34, 200, 0, 224, 131, 221, 217, 128, 46, 0, 50, 151, 85, 72, 21, + 0, 66, 21, 0, 81, 151, 85, 48, 21, 0, 0, 0, 54, 7, 187, 3, + 221, 217, 130, 200, 0, 224, 201, 128, 4, 34, 200, 0, 96, 131, 221, 217, + 128, 0, 28, 201, 128, 46, 128, 50, 151, 85, 72, 21, 0, 66, 21, 0, + 81, 150, 214, 64, 21, 0, 208, 128, 39, 128, 42, 149, 85, 19, 176, 0, + 4, 76, 8, 0, 36, 173, 85, 24, 37, 128, 42, 213, 117, 48, 6, 0, + 0, 96, 0, 6, 0, 0, 96, 0, 50, 128, 50, 156, 128, 36, 28, 128, + 36, 28, 128, 36, 14, 0, 51, 3, 93, 80, 0, 45, 248, 58, 133, 136, + 2, 184, 36, 128, 88, 0, 96, 171, 128, 2, 78, 0, 0, 6, 56, 0, + 72, 0, 74, 202, 0, 120, 129, 201, 208, 52, 184, 73, 134, 5, 133, 133, + 128, 60, 192, 68, 184, 0, 249, 1, 120, 128, 43, 0, 50, 172, 1, 80, + 4, 61, 136, 0, 122, 128, 5, 37, 136, 59, 1, 88, 0, 41, 248, 58, + 133, 16, 5, 128, 13, 132, 152, 0, 45, 192, 0, 0, 104, 0, 0, 6, + 0, 0, 42, 0, 50, 181, 86, 104, 0, 13, 136, 0, 89, 0, 5, 152, + 0, 70, 213, 80, 0, 21, 135, 155, 150, 161, 72, 20, 129, 72, 20, 129, + 72, 22, 160, 22, 255, 171, 140, 128, 0, 80, 0, 2, 168, 0, 5, 0, + 0, 72, 128, 1, 184, 0, 5, 0, 21, 135, 147, 198, 6, 6, 6, 6, + 6, 70, 0, 37, 128, 169, 129, 224, 0, 74, 40, 19, 132, 128, 32, 7, + 160, 187, 187, 128, 38, 130, 152, 131, 48, 38, 128, 42, 20, 204, 1, 76, + 104, 66, 6, 9, 220, 232, 128, 43, 128, 51, 36, 0, 0, 36, 0, 0, + 38, 85, 168, 37, 0, 96, 37, 0, 96, 38, 85, 40, 0, 36, 128, 42, + 13, 85, 12, 32, 0, 66, 0, 0, 213, 80, 128, 43, 128, 43, 0, 0, + 88, 0, 5, 141, 85, 92, 160, 29, 202, 1, 88, 212, 205, 128, 39, 0, + 42, 12, 204, 140, 204, 67, 66, 128, 128, 213, 88, 128, 22, 128, 35, 5, + 80, 21, 0, 78, 184, 20, 128, 20, 128, 20, 128, 0, 44, 7, 170, 141, + 76, 220, 160, 14, 74, 1, 96, 213, 85, 140, 77, 24, 43, 128, 43, 36, + 0, 2, 64, 0, 38, 77, 162, 72, 13, 164, 0, 98, 64, 6, 0, 18, + 0, 19, 27, 128, 36, 36, 36, 36, 0, 18, 127, 155, 129, 184, 0, 1, + 192, 28, 1, 192, 28, 53, 160, 39, 128, 43, 36, 0, 2, 64, 0, 36, + 5, 34, 78, 24, 38, 181, 2, 64, 59, 128, 18, 0, 19, 36, 36, 36, + 36, 36, 36, 0, 67, 128, 66, 38, 77, 196, 218, 36, 129, 216, 5, 164, + 1, 80, 6, 36, 1, 80, 6, 0, 43, 128, 42, 38, 77, 162, 72, 13, + 164, 0, 98, 64, 6, 0, 40, 128, 42, 13, 85, 12, 32, 29, 66, 1, + 208, 213, 80, 128, 43, 135, 178, 166, 85, 168, 37, 0, 96, 37, 0, 96, + 38, 85, 40, 36, 0, 0, 0, 43, 135, 170, 141, 84, 220, 160, 29, 202, + 1, 216, 213, 77, 128, 0, 88, 26, 0, 34, 37, 208, 37, 0, 36, 0, + 36, 0, 0, 32, 0, 34, 45, 202, 195, 152, 1, 188, 189, 83, 0, 26, + 128, 34, 148, 128, 78, 184, 20, 128, 20, 128, 5, 200, 0, 43, 128, 42, + 43, 128, 218, 184, 13, 164, 1, 216, 84, 205, 128, 36, 120, 50, 5, 128, + 66, 2, 184, 88, 0, 91, 168, 0, 54, 128, 0, 57, 128, 66, 88, 7, + 16, 80, 42, 172, 193, 64, 5, 80, 84, 16, 4, 192, 53, 128, 0, 35, + 128, 42, 51, 141, 128, 77, 136, 5, 89, 3, 168, 216, 0, 36, 127, 178, + 133, 136, 65, 129, 192, 208, 0, 85, 24, 0, 37, 0, 5, 89, 0, 0, + 33, 128, 34, 44, 221, 128, 216, 133, 144, 78, 76, 0, 22, 135, 155, 133, + 48, 96, 6, 2, 216, 6, 0, 96, 5, 48, 19, 7, 147, 148, 20, 20, + 20, 20, 20, 20, 0, 22, 135, 155, 203, 128, 88, 5, 128, 105, 133, 128, + 88, 75, 128, 37, 1, 41, 20, 154, 138, 131, 64, 0, 27, 1, 153, 147, + 35, 131, 147, 168, 20, 0, 145, 128, 46, 129, 0, 64, 7, 196, 128, 0, + 0, 0, 0, 0, 19, 95, 0, 70, 255, 255, 128, 127, 244, 175, 128, 121, + 128, 7, 128, 120, 0, 7, 128, 120, 5, 127, 215, 248, 5, 125, 87, 208, + 0, 0, 0, 64, 0, 67, 94, 230, 103, 85, 197, 128, 3, 172, 102, 179, + 53, 86, 102, 179, 53, 86, 69, 128, 3, 172, 94, 230, 103, 85, 128, 64, + 7, 196, 26, 10, 34, 33, 255, 191, 255, 255, 213, 165, 221, 221, 94, 46, + 102, 101, 255, 191, 255, 255, 179, 139, 196, 67, 127, 191, 255, 255, 213, 165, + 221, 221, 0, 64, 0, 67, 0, 0, 0, 77, 0, 0, 4, 253, 84, 128, + 79, 208, 87, 204, 253, 0, 5, 127, 208, 0, 0, 76, 128, 0, 0, 44, + 0, 51, 49, 128, 65, 103, 165, 122, 14, 255, 176, 5, 127, 152, 87, 190, + 249, 211, 0, 217, 128, 64, 7, 196, 0, 6, 40, 128, 14, 190, 183, 56, + 70, 134, 178, 248, 227, 134, 176, 115, 107, 131, 16, 115, 78, 128, 2, 121, + 15, 99, 199, 192, 0, 206, 227, 0, 0, 64, 7, 196, 0, 6, 96, 0, + 12, 71, 252, 64, 199, 255, 119, 252, 23, 240, 7, 121, 23, 240, 7, 121, + 71, 255, 119, 252, 12, 71, 252, 64, 128, 6, 96, 0, 0, 72, 7, 204, + 0, 0, 24, 17, 0, 0, 87, 213, 80, 0, 237, 53, 125, 1, 244, 95, + 220, 113, 219, 111, 255, 235, 88, 71, 253, 255, 192, 4, 126, 6, 124, 0, + 45, 192, 69, 168, 0, 64, 7, 196, 0, 7, 248, 0, 0, 7, 248, 0, + 0, 7, 248, 0, 3, 255, 255, 184, 0, 79, 252, 128, 60, 61, 83, 195, + 255, 253, 223, 255, 255, 255, 253, 223, 128, 72, 0, 75, 2, 255, 255, 250, + 128, 241, 128, 1, 240, 212, 0, 0, 4, 87, 255, 176, 55, 255, 255, 255, + 255, 255, 254, 255, 255, 255, 254, 128, 64, 7, 69, 0, 0, 0, 1, 129, + 95, 253, 159, 151, 72, 140, 127, 205, 0, 54, 127, 152, 128, 18, 34, 34, + 33, 0, 9, 255, 227, 0, 92, 255, 82, 173, 232, 249, 70, 100, 8, 24, + 0, 0, 0, 0, 32, 7, 163, 128, 4, 154, 103, 255, 255, 255, 255, 213, + 255, 128, 39, 128, 0, 128, 48, 7, 179, 128, 4, 128, 26, 103, 128, 255, + 255, 141, 255, 255, 141, 221, 255, 128, 128, 39, 128, 0, 0, 128, 0, 72, + 7, 204, 0, 0, 0, 42, 0, 0, 72, 17, 217, 154, 103, 129, 97, 223, + 255, 248, 218, 182, 127, 255, 141, 171, 101, 95, 248, 22, 29, 0, 39, 129, + 29, 152, 0, 8, 2, 160, 0, 64, 0, 67, 111, 255, 255, 254, 248, 63, + 255, 255, 252, 103, 216, 223, 253, 173, 128, 7, 248, 0, 0, 7, 239, 255, + 255, 254, 128, 56, 15, 172, 32, 0, 23, 144, 71, 249, 79, 255, 231, 255, + 255, 255, 255, 175, 127, 249, 23, 125, 136, 12, 128, 56, 7, 61, 0, 0, + 0, 6, 208, 128, 0, 127, 251, 128, 7, 255, 254, 160, 127, 255, 255, 215, + 255, 255, 253, 127, 255, 234, 7, 255, 184, 0, 109, 8, 0, 0, 0, 0, + 0, 0, 56, 7, 188, 77, 200, 77, 207, 255, 135, 255, 255, 248, 127, 255, + 255, 135, 255, 255, 248, 127, 255, 255, 135, 255, 255, 248, 127, 249, 33, 1, + 33, 0, 56, 7, 188, 18, 34, 34, 23, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 252, 93, 221, + 220, 0, 56, 15, 172, 16, 0, 39, 192, 23, 255, 201, 127, 255, 231, 255, + 255, 255, 255, 47, 254, 145, 124, 136, 13, 128, 56, 127, 204, 0, 0, 16, + 0, 0, 0, 71, 192, 0, 0, 63, 255, 184, 0, 47, 255, 255, 168, 7, + 127, 255, 255, 0, 44, 68, 68, 40, 7, 255, 255, 255, 128, 85, 221, 221, + 208, 0, 40, 7, 172, 0, 3, 16, 3, 250, 3, 250, 130, 251, 0, 15, + 88, 0, 23, 88, 0, 23, 48, 0, 8, 0, 40, 7, 172, 19, 0, 2, + 123, 128, 2, 251, 128, 3, 122, 128, 95, 8, 95, 16, 55, 16, 0, 8, + 0, 0, 56, 7, 188, 0, 2, 0, 0, 1, 249, 128, 0, 39, 160, 3, + 197, 125, 67, 247, 255, 255, 240, 2, 122, 0, 0, 39, 160, 0, 0, 216, + 128, 0, 56, 1, 57, 60, 68, 68, 63, 127, 255, 255, 0, 72, 0, 75, + 0, 70, 102, 64, 0, 238, 139, 30, 232, 231, 170, 246, 175, 229, 250, 239, + 234, 254, 14, 233, 185, 238, 136, 4, 110, 100, 8, 0, 80, 127, 220, 14, + 152, 0, 0, 0, 0, 47, 70, 102, 81, 0, 0, 22, 218, 36, 250, 0, + 61, 13, 127, 159, 240, 131, 253, 3, 123, 255, 136, 5, 121, 129, 247, 160, + 0, 3, 102, 56, 221, 136, 0, 0, 0, 0, 68, 128, 72, 127, 220, 0, + 0, 31, 24, 0, 0, 0, 6, 126, 0, 0, 0, 3, 126, 123, 0, 0, + 0, 118, 134, 240, 0, 0, 71, 240, 119, 192, 0, 23, 255, 183, 255, 144, + 5, 255, 241, 119, 253, 0, 111, 255, 255, 255, 232, 0, 64, 7, 196, 0, + 0, 0, 16, 34, 0, 2, 122, 247, 216, 231, 254, 128, 198, 104, 224, 128, + 238, 64, 224, 247, 224, 223, 254, 162, 0, 2, 122, 128, 0, 0, 16, 0, + 56, 0, 59, 0, 0, 0, 0, 2, 114, 0, 2, 126, 122, 2, 124, 4, + 122, 92, 0, 4, 88, 0, 0, 0, 0, 56, 0, 59, 0, 0, 0, 5, + 192, 0, 69, 167, 192, 71, 160, 39, 231, 160, 0, 39, 32, 0, 0, 0, + 0, 0, 80, 127, 219, 128, 74, 10, 34, 32, 0, 95, 252, 93, 223, 136, + 4, 91, 176, 0, 112, 128, 5, 160, 0, 15, 16, 0, 91, 162, 47, 126, + 168, 3, 221, 220, 47, 192, 0, 0, 0, 0, 16, 0, 64, 0, 67, 111, + 253, 128, 0, 127, 255, 255, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 239, 255, 255, 254, 128, 64, 7, 196, 0, 4, 200, 0, 0, + 79, 252, 128, 3, 255, 255, 184, 0, 7, 248, 0, 0, 7, 248, 0, 60, + 39, 250, 67, 255, 244, 71, 127, 255, 255, 253, 223, 128, 64, 127, 204, 128, + 0, 0, 0, 0, 0, 0, 3, 245, 0, 0, 0, 119, 240, 0, 0, 6, + 126, 0, 0, 0, 39, 184, 0, 0, 14, 240, 3, 238, 38, 249, 128, 119, + 255, 241, 128, 5, 118, 56, 0, 0, 56, 7, 196, 1, 128, 0, 0, 102, + 224, 22, 224, 115, 249, 119, 16, 37, 255, 241, 0, 2, 127, 208, 0, 102, + 252, 252, 128, 115, 240, 63, 200, 37, 32, 2, 40, 0, 56, 7, 188, 0, + 127, 251, 163, 167, 255, 163, 252, 127, 255, 255, 199, 255, 255, 252, 127, 255, + 255, 199, 255, 255, 253, 188, 68, 63, 255, 255, 128, 0, 56, 7, 188, 18, + 34, 32, 135, 221, 221, 241, 120, 0, 7, 239, 162, 34, 127, 255, 254, 127, + 255, 252, 132, 255, 255, 234, 239, 252, 93, 221, 220, 0, 40, 127, 188, 3, + 255, 176, 0, 87, 249, 0, 6, 127, 195, 128, 119, 255, 216, 3, 199, 121, + 0, 0, 124, 0, 0, 31, 0, 0, 3, 40, 0, 0, 56, 7, 188, 60, + 220, 184, 7, 254, 127, 128, 127, 180, 65, 135, 252, 127, 197, 255, 199, 252, + 71, 252, 127, 255, 188, 71, 255, 248, 3, 255, 255, 128, 56, 7, 188, 0, + 6, 128, 0, 39, 127, 24, 6, 255, 254, 128, 127, 255, 248, 31, 255, 255, + 157, 255, 255, 253, 188, 68, 68, 48, 2, 122, 0, 0, 72, 0, 75, 111, + 255, 255, 255, 239, 140, 64, 196, 15, 255, 85, 101, 87, 127, 245, 86, 85, + 119, 248, 192, 0, 64, 254, 255, 255, 255, 254, 128, 64, 127, 85, 0, 0, + 0, 0, 0, 0, 0, 0, 37, 224, 0, 0, 46, 127, 216, 0, 55, 127, + 255, 160, 6, 255, 255, 254, 0, 3, 68, 103, 250, 128, 0, 0, 71, 240, + 0, 0, 0, 71, 176, 0, 0, 0, 46, 128, 0, 0, 0, 0, 0, 0, + 0, 48, 7, 180, 127, 252, 88, 127, 252, 125, 255, 254, 68, 127, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 128, 80, 7, 212, + 0, 2, 59, 160, 0, 4, 255, 230, 127, 200, 102, 160, 0, 2, 110, 16, + 37, 255, 218, 1, 0, 253, 42, 215, 136, 0, 0, 16, 128, 0, 0, 0, + 119, 0, 0, 0, 0, 67, 128, 0, 0, 80, 0, 83, 18, 34, 34, 34, + 32, 125, 221, 221, 221, 237, 123, 247, 119, 119, 47, 252, 127, 255, 255, 151, + 250, 179, 51, 51, 85, 197, 221, 221, 221, 217, 128, 80, 0, 83, 18, 34, + 34, 34, 32, 125, 221, 221, 221, 237, 123, 247, 119, 56, 47, 252, 127, 255, + 192, 23, 250, 179, 51, 42, 85, 197, 221, 221, 221, 217, 128, 80, 0, 83, + 18, 34, 34, 34, 32, 125, 221, 221, 221, 237, 123, 247, 112, 0, 47, 252, + 127, 248, 0, 23, 250, 179, 50, 34, 85, 197, 221, 221, 221, 217, 128, 80, + 0, 83, 18, 34, 34, 34, 32, 125, 221, 221, 221, 237, 123, 243, 128, 0, + 47, 252, 124, 0, 0, 23, 250, 178, 162, 34, 85, 197, 221, 221, 221, 217, + 128, 80, 0, 83, 18, 34, 34, 34, 32, 125, 221, 221, 221, 236, 120, 0, + 0, 0, 47, 248, 0, 0, 0, 23, 250, 34, 34, 34, 86, 197, 221, 221, + 221, 217, 128, 80, 7, 220, 0, 0, 0, 0, 0, 0, 0, 3, 236, 0, + 0, 0, 3, 155, 32, 0, 4, 216, 200, 136, 139, 144, 119, 196, 108, 68, + 108, 129, 16, 3, 36, 56, 0, 0, 0, 3, 118, 0, 0, 0, 0, 0, + 0, 0, 0, 56, 7, 188, 3, 110, 225, 130, 127, 159, 104, 78, 90, 175, + 149, 251, 141, 122, 95, 192, 223, 156, 228, 178, 121, 39, 249, 239, 0, 54, + 246, 152, 0, 56, 7, 188, 60, 111, 236, 59, 196, 68, 67, 199, 255, 255, + 196, 102, 70, 100, 70, 100, 102, 68, 102, 70, 100, 70, 100, 102, 66, 255, + 255, 250, 128, 64, 127, 76, 128, 0, 0, 63, 24, 0, 0, 37, 255, 0, + 0, 71, 205, 184, 0, 71, 255, 160, 0, 71, 255, 192, 0, 63, 255, 192, + 0, 7, 127, 192, 0, 0, 119, 56, 0, 0, 0, 0, 0, 0, 0, 80, + 0, 83, 0, 87, 255, 255, 254, 5, 255, 206, 100, 255, 215, 255, 224, 142, + 127, 215, 255, 224, 142, 127, 133, 255, 206, 100, 255, 128, 87, 255, 255, 254, + 0, 48, 7, 188, 3, 255, 255, 11, 219, 19, 225, 255, 92, 223, 31, 255, + 255, 249, 255, 255, 255, 159, 255, 255, 249, 255, 255, 255, 158, 127, 255, 240, + 128, 64, 128, 75, 0, 0, 0, 1, 128, 17, 128, 1, 120, 23, 73, 17, + 47, 134, 255, 255, 255, 248, 23, 73, 17, 16, 128, 17, 128, 0, 0, 0, + 244, 12, 0, 0, 107, 101, 114, 110, 3, 0, 0, 0, 155, 0, 61, 49, + 0, 0, 1, 2, 0, 3, 4, 5, 2, 6, 7, 8, 9, 10, 9, 10, + 11, 12, 0, 13, 14, 15, 16, 17, 18, 19, 12, 20, 20, 0, 0, 0, + 21, 22, 23, 24, 25, 22, 26, 27, 28, 29, 29, 30, 31, 32, 29, 29, + 22, 33, 34, 35, 3, 36, 30, 37, 37, 38, 39, 40, 41, 42, 43, 0, + 44, 0, 45, 46, 47, 48, 49, 50, 51, 45, 52, 52, 53, 48, 45, 45, + 46, 46, 54, 55, 56, 57, 51, 58, 58, 59, 58, 60, 41, 0, 0, 9, + 61, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 0, + 3, 4, 5, 2, 6, 7, 8, 9, 10, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 12, 18, 19, 20, 21, 21, 0, 0, 0, 22, 23, 24, 25, 23, + 25, 25, 25, 23, 25, 25, 26, 25, 25, 25, 25, 23, 25, 23, 25, 3, + 27, 28, 29, 29, 30, 31, 32, 33, 34, 35, 0, 36, 0, 37, 38, 39, + 39, 39, 0, 39, 38, 40, 41, 38, 38, 42, 42, 39, 42, 39, 42, 43, + 44, 45, 46, 46, 47, 46, 48, 0, 0, 35, 9, 49, 9, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 3, 253, 0, 0, 0, 0, + 249, 248, 1, 6, 3, 2, 251, 1, 6, 0, 5, 1, 4, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 8, 1, 255, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 3, 0, 252, 0, 0, 0, 0, 0, 253, + 2, 3, 0, 0, 255, 0, 255, 1, 0, 255, 0, 255, 255, 253, 0, 0, + 0, 0, 255, 0, 0, 254, 254, 0, 0, 255, 0, 253, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 255, 255, 0, 254, 0, 253, 0, 241, 0, 0, 253, + 0, 3, 4, 0, 0, 253, 1, 1, 4, 3, 254, 3, 0, 0, 249, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 251, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 253, 254, 250, 0, 251, 255, 0, + 0, 0, 0, 0, 5, 0, 252, 255, 0, 0, 0, 254, 0, 0, 255, 247, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 246, 255, 5, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 251, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 4, 0, 1, 0, 0, 253, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 3, 1, + 4, 255, 0, 0, 3, 255, 252, 238, 1, 3, 3, 0, 254, 0, 5, 0, + 4, 0, 4, 0, 244, 0, 254, 4, 0, 4, 255, 3, 1, 0, 0, 0, + 255, 0, 0, 254, 10, 0, 10, 0, 4, 0, 5, 2, 2, 4, 0, 0, + 0, 251, 0, 0, 0, 0, 0, 255, 0, 1, 254, 254, 253, 1, 0, 255, + 0, 0, 0, 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 248, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 249, 0, 248, 0, 0, 0, 0, 255, 0, 13, 254, 254, 1, 1, 255, 0, + 254, 1, 0, 0, 249, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 244, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 248, + 0, 8, 0, 0, 251, 0, 4, 0, 247, 244, 247, 253, 4, 0, 0, 247, + 0, 2, 253, 0, 254, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 3, 4, 240, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 6, 0, 1, 0, 0, 0, 0, 0, 1, 1, 254, 253, 0, 0, 0, 255, + 0, 0, 255, 0, 0, 0, 253, 0, 255, 0, 253, 253, 0, 253, 252, 252, + 254, 0, 253, 0, 253, 0, 0, 0, 0, 255, 0, 0, 1, 0, 1, 255, + 0, 0, 0, 0, 0, 1, 255, 0, 0, 0, 255, 1, 1, 0, 0, 0, + 0, 254, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 255, 0, 254, 0, + 254, 0, 0, 255, 0, 4, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, + 255, 255, 0, 0, 255, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 255, 255, 0, 255, 254, 0, 0, 0, 0, 0, 0, 0, 0, 255, 0, 255, + 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, + 255, 254, 0, 254, 0, 252, 255, 252, 3, 0, 0, 253, 1, 3, 3, 0, + 253, 0, 254, 0, 0, 250, 1, 255, 1, 249, 1, 0, 0, 0, 249, 0, + 249, 255, 245, 255, 0, 250, 0, 3, 4, 0, 2, 0, 0, 0, 0, 0, + 0, 254, 254, 0, 252, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, + 0, 0, 255, 255, 0, 255, 254, 0, 0, 0, 0, 0, 0, 0, 255, 255, + 0, 255, 254, 255, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 255, 255, 0, 254, 0, 255, 0, 253, 1, 0, 0, 254, 1, 1, + 1, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 1, 0, 0, + 255, 0, 255, 255, 254, 0, 0, 0, 0, 0, 0, 0, 1, 0, 255, 0, + 0, 0, 0, 255, 254, 0, 254, 0, 4, 255, 0, 252, 0, 0, 3, 250, + 249, 251, 253, 1, 0, 255, 248, 254, 0, 254, 0, 253, 2, 254, 248, 0, + 253, 0, 0, 1, 0, 1, 255, 0, 1, 0, 252, 251, 0, 250, 253, 253, + 253, 252, 254, 253, 0, 254, 253, 1, 0, 0, 0, 255, 0, 0, 0, 1, + 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 0, 255, + 0, 0, 255, 0, 254, 253, 253, 0, 0, 252, 0, 0, 0, 0, 0, 0, + 255, 0, 0, 0, 0, 1, 255, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 255, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 254, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, 254, 0, + 0, 0, 0, 250, 252, 0, 0, 0, 254, 250, 0, 0, 255, 1, 0, 253, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 254, 0, 0, 254, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 254, 0, 0, 0, + 0, 2, 0, 1, 253, 253, 0, 255, 255, 254, 0, 0, 0, 0, 0, 0, + 252, 0, 255, 0, 254, 255, 0, 253, 253, 252, 255, 0, 253, 0, 252, 0, + 0, 0, 0, 10, 0, 0, 1, 0, 0, 254, 0, 1, 0, 250, 0, 0, + 0, 0, 0, 244, 254, 4, 4, 255, 251, 0, 1, 254, 0, 250, 255, 254, + 1, 247, 255, 2, 0, 2, 252, 254, 251, 252, 251, 0, 0, 248, 0, 7, + 0, 0, 255, 0, 0, 0, 255, 255, 255, 253, 252, 0, 244, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 255, 0, 255, 255, 254, 0, 0, 253, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 253, 0, 0, 3, 0, 2, 0, 253, 1, 255, 0, 253, 255, 0, + 254, 255, 255, 0, 254, 254, 0, 0, 255, 0, 255, 254, 254, 0, 0, 255, + 0, 1, 255, 0, 253, 0, 0, 0, 253, 0, 254, 0, 254, 254, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 253, 1, 0, 254, 0, 255, 254, 252, 255, + 255, 255, 0, 255, 254, 0, 0, 0, 0, 0, 0, 255, 255, 255, 0, 0, + 0, 0, 2, 255, 0, 255, 0, 0, 0, 255, 254, 255, 255, 254, 255, 0, + 1, 5, 0, 0, 253, 0, 255, 3, 0, 255, 251, 254, 2, 0, 0, 250, + 254, 1, 254, 1, 0, 255, 255, 252, 0, 254, 1, 0, 0, 254, 0, 0, + 0, 1, 1, 253, 254, 0, 254, 255, 254, 255, 255, 0, 254, 1, 254, 254, + 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 254, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 254, 0, 0, 254, 0, 0, + 255, 255, 0, 0, 0, 0, 255, 0, 0, 0, 0, 255, 0, 0, 0, 0, + 0, 255, 0, 0, 0, 0, 254, 0, 253, 0, 0, 0, 252, 0, 1, 253, + 3, 0, 255, 250, 0, 0, 253, 255, 0, 251, 253, 252, 0, 0, 250, 255, + 251, 251, 250, 0, 253, 0, 1, 9, 254, 0, 253, 255, 0, 255, 254, 253, + 254, 251, 251, 253, 255, 0, 0, 255, 0, 0, 0, 0, 247, 255, 4, 3, + 253, 251, 0, 0, 252, 0, 250, 255, 255, 3, 244, 254, 0, 0, 0, 248, + 254, 249, 255, 247, 0, 0, 247, 0, 8, 0, 0, 255, 0, 0, 0, 0, + 255, 255, 251, 255, 0, 248, 0, 0, 0, 0, 252, 0, 255, 0, 0, 252, + 250, 0, 0, 255, 254, 252, 255, 0, 255, 0, 0, 0, 0, 250, 255, 252, + 252, 255, 254, 253, 255, 254, 0, 253, 255, 252, 254, 0, 254, 254, 255, 254, + 0, 1, 0, 255, 252, 0, 3, 0, 254, 0, 0, 0, 0, 2, 0, 1, + 253, 5, 0, 255, 255, 254, 0, 0, 0, 0, 0, 0, 252, 0, 255, 0, + 254, 255, 0, 253, 253, 252, 255, 0, 253, 1, 5, 0, 0, 0, 0, 10, + 0, 0, 1, 0, 0, 254, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 255, 253, 0, 0, 0, 0, 0, 255, 0, 0, + 0, 255, 255, 0, 0, 253, 255, 0, 0, 253, 0, 2, 255, 0, 0, 0, + 0, 0, 0, 1, 0, 0, 0, 0, 2, 3, 1, 255, 0, 252, 254, 0, + 4, 252, 252, 253, 253, 5, 2, 1, 245, 255, 3, 255, 0, 255, 1, 255, + 252, 0, 255, 1, 254, 255, 252, 255, 0, 0, 4, 3, 0, 252, 0, 249, + 254, 4, 254, 251, 0, 254, 252, 252, 255, 5, 1, 0, 254, 0, 253, 0, + 1, 4, 253, 251, 251, 253, 4, 0, 0, 247, 255, 1, 254, 255, 253, 0, + 253, 251, 254, 254, 255, 0, 0, 253, 253, 255, 0, 4, 3, 255, 249, 0, + 249, 254, 0, 252, 249, 0, 252, 254, 252, 252, 3, 0, 0, 254, 0, 253, + 255, 0, 255, 254, 0, 2, 252, 1, 0, 0, 249, 0, 255, 253, 254, 255, + 252, 253, 252, 253, 0, 252, 255, 253, 254, 252, 255, 0, 0, 0, 6, 254, + 0, 252, 255, 0, 255, 253, 253, 253, 252, 251, 254, 253, 3, 0, 254, 0, + 250, 254, 1, 3, 252, 251, 253, 252, 4, 255, 1, 244, 254, 3, 253, 254, + 251, 0, 252, 251, 254, 255, 255, 255, 253, 252, 0, 0, 0, 4, 4, 255, + 248, 0, 248, 253, 3, 251, 247, 253, 252, 251, 250, 252, 3, 0, 0, 0, + 0, 254, 0, 0, 1, 254, 3, 1, 254, 3, 0, 0, 252, 0, 0, 0, + 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, 1, + 4, 0, 0, 254, 0, 0, 0, 0, 255, 255, 254, 0, 0, 0, 0, 1, + 0, 0, 0, 0, 1, 0, 255, 0, 5, 0, 2, 0, 0, 254, 0, 3, + 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, + 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 248, 0, 255, 2, 0, 4, 0, 0, 13, 2, 253, 253, 1, 1, 255, 0, + 250, 0, 0, 6, 248, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 247, 5, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 248, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 254, 0, 0, 254, 255, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 255, 0, 253, 0, 0, 0, 0, 0, 1, 17, 253, 255, 4, 3, + 253, 1, 0, 0, 1, 1, 254, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 239, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 252, 0, 0, 0, 253, 0, 0, 0, 0, 253, 255, + 0, 0, 0, 253, 0, 254, 0, 250, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 247, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, + 0, 0, 254, 0, 254, 0, 253, 0, 0, 0, 254, 1, 254, 0, 0, 253, + 255, 253, 0, 0, 253, 0, 255, 0, 250, 0, 255, 0, 0, 246, 254, 251, + 255, 251, 0, 0, 247, 0, 253, 255, 0, 0, 0, 0, 0, 0, 0, 0, + 254, 254, 255, 254, 0, 0, 0, 0, 253, 0, 253, 2, 255, 3, 0, 255, + 253, 255, 254, 254, 0, 254, 255, 255, 1, 253, 0, 0, 0, 0, 245, 255, + 254, 0, 253, 0, 255, 250, 255, 0, 0, 255, 255, 0, 0, 0, 0, 1, + 0, 255, 254, 255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 0, 0, 0, 0, 0, 0, 253, 0, 255, 0, 0, 0, 253, 1, 0, + 0, 0, 253, 255, 253, 0, 0, 252, 0, 255, 0, 250, 0, 0, 0, 0, + 244, 0, 253, 251, 250, 0, 0, 247, 0, 255, 254, 0, 0, 0, 0, 0, + 0, 0, 0, 255, 254, 255, 254, 0, 0, 0, 2, 254, 0, 4, 6, 255, + 255, 252, 2, 6, 2, 3, 253, 2, 5, 2, 4, 3, 3, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 8, 6, 254, 255, 0, 255, 10, 6, + 10, 0, 0, 0, 1, 0, 0, 5, 0, 0, 254, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, + 0, 0, 245, 254, 255, 251, 250, 0, 0, 247, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 254, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, + 0, 0, 0, 245, 254, 255, 251, 250, 0, 0, 251, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 0, + 0, 0, 253, 1, 0, 255, 1, 2, 1, 252, 0, 0, 255, 1, 0, 1, + 0, 0, 0, 0, 253, 0, 255, 255, 253, 0, 255, 251, 0, 8, 255, 0, + 253, 255, 0, 255, 254, 0, 255, 252, 253, 254, 0, 0, 0, 254, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 0, 0, 0, 0, 245, 254, 255, 251, 250, 0, 0, 247, 0, 0, 0, + 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 254, 0, + 252, 254, 255, 4, 255, 255, 251, 0, 255, 0, 255, 253, 0, 3, 0, 1, + 0, 1, 253, 251, 254, 0, 251, 254, 253, 251, 251, 0, 254, 253, 254, 254, + 255, 255, 254, 255, 0, 255, 0, 2, 0, 2, 255, 0, 4, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 0, 0, 253, 0, + 255, 0, 254, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 248, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 0, 254, 0, 0, + 0, 0, 255, 0, 0, 254, 255, 1, 0, 254, 254, 255, 0, 252, 255, 253, + 255, 254, 0, 254, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 247, + 0, 4, 0, 0, 254, 0, 0, 0, 0, 254, 0, 255, 0, 0, 255, 0, + 0, 255, 0, 253, 0, 0, 5, 254, 252, 252, 1, 1, 1, 0, 252, 1, + 2, 1, 4, 1, 4, 255, 253, 0, 0, 251, 0, 0, 252, 253, 0, 0, + 253, 0, 254, 254, 0, 254, 0, 254, 0, 255, 2, 0, 255, 252, 255, 5, + 0, 0, 255, 0, 253, 0, 0, 2, 253, 0, 1, 255, 1, 0, 0, 252, + 0, 255, 0, 0, 255, 1, 255, 0, 0, 0, 251, 254, 253, 0, 252, 0, + 0, 250, 0, 5, 255, 0, 254, 0, 1, 0, 255, 0, 255, 252, 0, 255, + 1, 0, 0, 0, 0, 255, 0, 0, 1, 254, 0, 0, 0, 254, 255, 0, + 254, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 248, 0, 3, 0, 0, 255, 0, 0, 0, 0, 0, 0, 255, 255, + 0, 0, 0, 3, 0, 3, 0, 0, 0, 0, 0, 248, 249, 0, 6, 4, + 2, 251, 1, 5, 0, 5, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0 + }; diff --git a/tests/src/test_assets/font_3_bin.c b/tests/src/test_assets/font_3_bin.c new file mode 100644 index 000000000..a3acfb672 --- /dev/null +++ b/tests/src/test_assets/font_3_bin.c @@ -0,0 +1,314 @@ +/* table exported by mirkes.de's tiny hexer + filename: D:\lvgl\test\lv_port_pc_visual_studio\LvglPlatform\lvgl\tests\src\test_assets\font_3.fnt + position 0, 4892 bytes */ + + +unsigned char const font_3_buf[4892] = +{ + 44, 0, 0, 0, 104, 101, 97, 100, 1, 0, 0, 0, 3, 0, 20, 0, + 17, 0, 251, 255, 21, 0, 251, 255, 0, 0, 251, 255, 17, 0, 12, 0, + 16, 0, 0, 0, 0, 4, 5, 5, 0, 1, 0, 0, 28, 0, 0, 0, + 99, 109, 97, 112, 1, 0, 0, 0, 28, 0, 0, 0, 32, 0, 0, 0, + 95, 0, 1, 0, 95, 0, 2, 0, 204, 0, 0, 0, 108, 111, 99, 97, + 96, 0, 0, 0, 8, 0, 8, 0, 11, 0, 27, 0, 43, 0, 130, 0, + 215, 0, 37, 1, 116, 1, 126, 1, 188, 1, 250, 1, 43, 2, 71, 2, + 86, 2, 94, 2, 103, 2, 156, 2, 230, 2, 252, 2, 65, 3, 135, 3, + 189, 3, 0, 4, 73, 4, 126, 4, 201, 4, 18, 5, 38, 5, 68, 5, + 111, 5, 130, 5, 176, 5, 237, 5, 72, 6, 147, 6, 213, 6, 19, 7, + 79, 7, 115, 7, 145, 7, 218, 7, 241, 7, 14, 8, 51, 8, 113, 8, + 130, 8, 184, 8, 235, 8, 49, 9, 97, 9, 189, 9, 252, 9, 73, 10, + 95, 10, 137, 10, 214, 10, 53, 11, 134, 11, 193, 11, 250, 11, 12, 12, + 62, 12, 81, 12, 114, 12, 123, 12, 132, 12, 187, 12, 240, 12, 37, 13, + 94, 13, 147, 13, 195, 13, 8, 14, 43, 14, 80, 14, 116, 14, 166, 14, + 193, 14, 225, 14, 255, 14, 55, 15, 114, 15, 170, 15, 193, 15, 250, 15, + 33, 16, 62, 16, 117, 16, 187, 16, 244, 16, 62, 17, 107, 17, 168, 17, + 175, 17, 235, 17, 8, 18, 0, 0, 103, 108, 121, 102, 0, 0, 0, 32, + 6, 241, 251, 0, 255, 230, 145, 7, 100, 3, 8, 23, 105, 139, 0, 26, + 140, 88, 224, 7, 176, 7, 198, 1, 24, 8, 4, 60, 160, 3, 112, 0, + 24, 240, 12, 94, 96, 126, 96, 28, 128, 96, 160, 96, 29, 228, 0, 243, + 0, 242, 160, 1, 84, 1, 87, 248, 219, 252, 109, 238, 29, 46, 15, 46, + 15, 40, 8, 216, 18, 218, 18, 198, 1, 24, 136, 8, 68, 1, 220, 64, + 13, 32, 12, 34, 86, 17, 51, 4, 0, 221, 195, 94, 225, 175, 96, 61, + 208, 69, 200, 77, 248, 10, 0, 25, 12, 25, 12, 2, 210, 16, 210, 0, + 241, 184, 1, 16, 1, 128, 15, 149, 48, 12, 190, 32, 31, 252, 71, 128, + 180, 0, 219, 6, 75, 110, 0, 130, 126, 221, 12, 8, 32, 64, 0, 164, + 28, 4, 3, 140, 128, 14, 14, 1, 38, 176, 88, 69, 160, 7, 14, 154, + 94, 168, 6, 44, 194, 149, 72, 7, 29, 105, 50, 18, 144, 4, 82, 26, + 244, 160, 25, 192, 208, 36, 64, 42, 13, 23, 31, 136, 99, 19, 132, 73, + 187, 137, 112, 2, 109, 97, 234, 16, 14, 16, 14, 0, 24, 240, 126, 228, + 0, 124, 145, 11, 117, 0, 246, 19, 42, 120, 15, 24, 4, 32, 29, 38, + 96, 6, 153, 137, 116, 94, 0, 37, 86, 106, 188, 18, 128, 106, 238, 88, + 180, 128, 120, 68, 16, 104, 1, 248, 154, 0, 63, 161, 17, 61, 199, 0, + 198, 176, 204, 168, 130, 0, 80, 135, 138, 140, 88, 1, 52, 0, 127, 180, + 195, 21, 24, 176, 3, 204, 202, 136, 32, 8, 22, 240, 2, 103, 235, 0, + 113, 89, 176, 202, 128, 106, 10, 156, 30, 0, 196, 14, 1, 56, 6, 48, + 112, 97, 176, 13, 65, 47, 42, 224, 24, 216, 225, 168, 3, 137, 0, 20, + 1, 195, 133, 1, 162, 11, 199, 3, 47, 35, 65, 162, 36, 6, 6, 84, + 117, 18, 49, 0, 168, 160, 164, 16, 80, 2, 160, 3, 4, 5, 212, 92, + 8, 64, 22, 170, 59, 71, 27, 32, 34, 134, 82, 245, 0, 225, 0, 56, + 24, 128, 30, 205, 96, 14, 16, 13, 146, 1, 88, 200, 1, 211, 132, 1, + 10, 96, 7, 9, 0, 172, 76, 0, 38, 128, 18, 134, 128, 68, 2, 1, + 8, 24, 7, 8, 4, 32, 32, 17, 129, 128, 78, 30, 1, 16, 168, 6, + 115, 16, 10, 194, 64, 34, 86, 0, 214, 20, 1, 14, 171, 128, 71, 168, + 30, 205, 98, 0, 238, 144, 13, 237, 0, 17, 195, 152, 4, 229, 224, 26, + 140, 192, 18, 133, 0, 68, 40, 1, 148, 132, 2, 16, 32, 8, 193, 192, + 33, 0, 225, 7, 0, 140, 8, 2, 113, 16, 4, 72, 1, 40, 120, 5, + 194, 160, 3, 72, 0, 184, 216, 1, 65, 160, 23, 224, 128, 64, 9, 84, + 160, 13, 62, 32, 31, 8, 8, 6, 16, 7, 128, 97, 46, 180, 17, 3, + 108, 10, 170, 228, 126, 76, 14, 187, 0, 13, 189, 32, 21, 10, 185, 128, + 102, 100, 88, 208, 4, 50, 76, 48, 142, 0, 27, 224, 3, 188, 0, 8, + 84, 176, 13, 16, 0, 252, 172, 1, 255, 214, 223, 248, 135, 254, 230, 34, + 128, 4, 90, 247, 98, 29, 219, 0, 63, 250, 64, 31, 8, 96, 175, 64, + 16, 9, 193, 128, 132, 148, 96, 22, 152, 0, 17, 144, 39, 136, 242, 83, + 191, 180, 32, 8, 48, 140, 49, 115, 145, 64, 240, 23, 211, 0, 15, 102, + 128, 120, 142, 128, 61, 64, 192, 30, 100, 16, 14, 65, 224, 15, 112, 40, + 7, 149, 128, 60, 193, 64, 30, 210, 48, 14, 20, 160, 15, 48, 40, 7, + 169, 8, 3, 140, 180, 3, 212, 12, 1, 230, 80, 15, 40, 112, 7, 128, + 8, 20, 240, 2, 95, 251, 16, 2, 91, 86, 97, 90, 128, 44, 126, 101, + 227, 64, 131, 34, 0, 25, 5, 48, 32, 12, 33, 190, 12, 1, 68, 128, + 136, 2, 27, 117, 0, 227, 196, 184, 0, 213, 129, 168, 1, 8, 50, 233, + 0, 128, 60, 30, 128, 56, 76, 60, 3, 40, 106, 12, 136, 5, 96, 161, + 99, 243, 46, 41, 0, 45, 171, 48, 173, 128, 16, 12, 240, 12, 72, 0, + 108, 220, 159, 147, 0, 50, 93, 128, 29, 104, 224, 1, 0, 255, 247, 128, + 0, 22, 240, 0, 207, 127, 64, 6, 47, 101, 98, 125, 0, 164, 110, 211, + 138, 78, 0, 67, 64, 10, 3, 0, 94, 64, 49, 128, 67, 10, 1, 144, + 48, 3, 244, 3, 0, 125, 37, 34, 1, 231, 101, 96, 15, 36, 29, 0, + 120, 236, 180, 3, 195, 163, 226, 1, 236, 29, 32, 15, 89, 26, 59, 241, + 130, 129, 196, 121, 64, 0, 20, 240, 0, 207, 127, 64, 4, 62, 202, 234, + 250, 0, 177, 171, 139, 114, 96, 65, 80, 10, 131, 3, 184, 1, 255, 194, + 176, 240, 8, 94, 117, 157, 64, 35, 134, 33, 192, 12, 95, 235, 59, 64, + 15, 39, 135, 128, 136, 3, 16, 168, 118, 0, 112, 152, 25, 32, 4, 192, + 129, 193, 118, 139, 146, 128, 46, 101, 117, 125, 16, 0, 22, 240, 15, 31, + 248, 3, 247, 128, 127, 49, 128, 126, 25, 67, 0, 250, 194, 128, 62, 69, + 129, 0, 250, 73, 192, 62, 114, 144, 15, 138, 21, 0, 62, 144, 176, 15, + 141, 3, 191, 227, 15, 240, 196, 120, 65, 224, 157, 252, 65, 14, 1, 255, + 202, 8, 20, 240, 7, 255, 202, 2, 2, 103, 194, 6, 13, 153, 200, 12, + 28, 1, 240, 129, 128, 124, 64, 113, 80, 96, 23, 132, 186, 190, 56, 3, + 138, 123, 146, 16, 64, 218, 194, 38, 128, 160, 15, 148, 12, 3, 227, 0, + 15, 216, 6, 32, 33, 52, 48, 10, 3, 3, 131, 42, 117, 16, 160, 90, + 168, 192, 246, 0, 8, 20, 240, 8, 99, 125, 64, 50, 115, 154, 48, 4, + 86, 21, 214, 96, 20, 133, 40, 7, 10, 26, 128, 121, 2, 197, 157, 64, + 34, 13, 233, 138, 209, 14, 5, 142, 227, 21, 0, 80, 226, 41, 36, 16, + 2, 0, 101, 5, 16, 96, 13, 224, 56, 26, 1, 180, 25, 9, 200, 0, + 74, 38, 28, 27, 84, 208, 160, 1, 226, 42, 147, 16, 0, 8, 20, 254, + 255, 253, 110, 205, 228, 3, 153, 248, 130, 64, 60, 44, 162, 1, 230, 9, + 0, 250, 72, 192, 60, 163, 96, 31, 72, 176, 7, 140, 204, 1, 244, 133, + 0, 120, 85, 8, 3, 210, 30, 1, 243, 18, 0, 121, 134, 128, 62, 176, + 96, 14, 8, 20, 240, 1, 87, 126, 168, 4, 58, 168, 193, 82, 0, 176, + 170, 78, 147, 16, 32, 40, 5, 64, 128, 96, 31, 24, 32, 40, 5, 64, + 129, 39, 84, 157, 42, 16, 5, 2, 177, 26, 0, 30, 87, 126, 139, 4, + 32, 168, 129, 108, 152, 193, 0, 50, 6, 0, 12, 3, 24, 0, 197, 72, + 2, 176, 208, 160, 218, 140, 99, 96, 76, 69, 113, 124, 0, 8, 20, 240, + 2, 103, 245, 16, 4, 214, 76, 170, 193, 0, 72, 252, 220, 141, 130, 132, + 136, 1, 137, 67, 64, 192, 50, 130, 120, 7, 184, 4, 128, 192, 55, 1, + 160, 72, 128, 13, 192, 197, 199, 230, 176, 64, 66, 36, 217, 225, 193, 128, + 13, 191, 174, 162, 64, 30, 51, 56, 7, 147, 70, 0, 37, 190, 176, 209, + 0, 181, 73, 252, 192, 0, 40, 8, 181, 251, 15, 4, 41, 54, 35, 201, + 0, 255, 226, 158, 64, 73, 185, 120, 25, 0, 39, 10, 240, 111, 160, 6, + 130, 128, 60, 220, 0, 153, 0, 31, 252, 244, 166, 0, 18, 240, 0, 64, + 55, 6, 0, 16, 144, 0, 252, 0, 8, 82, 160, 15, 146, 192, 57, 182, + 212, 0, 47, 210, 109, 131, 61, 5, 93, 36, 140, 55, 138, 1, 34, 141, + 210, 0, 67, 90, 203, 122, 226, 0, 41, 232, 56, 240, 12, 47, 210, 64, + 31, 54, 0, 9, 20, 99, 153, 252, 110, 205, 249, 83, 255, 243, 0, 127, + 138, 103, 241, 179, 127, 40, 8, 84, 163, 163, 0, 249, 215, 48, 160, 28, + 152, 199, 90, 224, 24, 231, 233, 163, 228, 64, 50, 222, 19, 32, 6, 91, + 194, 84, 2, 142, 165, 126, 161, 61, 115, 158, 129, 0, 58, 94, 176, 7, + 37, 160, 7, 192, 8, 20, 240, 1, 223, 126, 168, 4, 184, 138, 163, 168, + 0, 88, 109, 215, 139, 136, 158, 8, 0, 46, 4, 50, 224, 24, 192, 64, + 60, 74, 68, 0, 247, 4, 128, 123, 14, 16, 3, 164, 221, 192, 30, 113, + 128, 15, 137, 192, 63, 100, 128, 126, 17, 0, 124, 61, 224, 31, 132, 128, + 48, 0, 24, 240, 13, 27, 250, 224, 28, 58, 183, 106, 155, 0, 212, 218, + 200, 254, 172, 0, 69, 176, 159, 211, 187, 0, 62, 66, 82, 217, 84, 66, + 8, 162, 220, 128, 32, 68, 48, 36, 19, 7, 32, 23, 112, 129, 40, 0, + 92, 2, 19, 14, 32, 1, 8, 11, 9, 128, 12, 4, 12, 76, 148, 69, + 232, 138, 2, 148, 1, 38, 112, 178, 108, 91, 0, 92, 159, 114, 101, 218, + 32, 6, 77, 132, 67, 168, 7, 84, 165, 93, 156, 2, 0, 24, 240, 14, + 207, 0, 254, 19, 5, 0, 252, 224, 15, 0, 253, 160, 136, 0, 252, 139, + 162, 96, 30, 64, 199, 11, 0, 246, 131, 137, 40, 7, 156, 196, 20, 136, + 1, 140, 108, 1, 96, 160, 26, 195, 38, 96, 192, 12, 160, 140, 197, 4, + 16, 1, 17, 191, 245, 2, 0, 20, 52, 3, 32, 120, 3, 1, 0, 48, + 154, 0, 162, 0, 60, 130, 128, 8, 20, 244, 255, 221, 138, 1, 141, 152, + 133, 84, 0, 174, 101, 92, 106, 128, 31, 72, 96, 7, 198, 30, 1, 225, + 176, 80, 5, 196, 39, 202, 136, 0, 110, 230, 19, 96, 10, 63, 235, 28, + 48, 15, 39, 4, 0, 124, 96, 160, 31, 8, 24, 7, 208, 10, 0, 184, + 132, 235, 28, 0, 13, 220, 193, 24, 0, 8, 20, 240, 1, 95, 251, 24, + 2, 77, 85, 49, 76, 128, 20, 63, 83, 198, 198, 195, 2, 1, 120, 78, + 131, 128, 99, 83, 97, 16, 7, 84, 145, 128, 127, 244, 8, 192, 63, 48, + 136, 3, 166, 52, 28, 3, 27, 19, 12, 8, 5, 1, 33, 67, 243, 45, + 71, 48, 76, 87, 97, 152, 0, 8, 22, 247, 255, 187, 24, 3, 202, 238, + 25, 209, 0, 223, 19, 178, 88, 1, 249, 152, 76, 1, 250, 3, 64, 63, + 9, 32, 7, 240, 128, 127, 156, 4, 3, 243, 128, 128, 126, 16, 15, 225, + 36, 0, 253, 1, 160, 31, 59, 27, 0, 95, 19, 176, 90, 1, 149, 220, + 51, 162, 0, 8, 20, 243, 255, 252, 192, 2, 102, 242, 128, 18, 103, 198, + 1, 255, 222, 111, 254, 128, 8, 157, 251, 0, 36, 136, 228, 0, 255, 234, + 164, 71, 144, 0, 78, 254, 192, 8, 20, 242, 255, 253, 32, 2, 102, 246, + 0, 30, 103, 202, 1, 255, 222, 95, 254, 144, 8, 157, 251, 0, 39, 136, + 229, 0, 255, 243, 128, 0, 22, 240, 8, 175, 253, 138, 1, 147, 81, 10, + 85, 32, 21, 14, 221, 113, 178, 3, 140, 16, 5, 225, 225, 128, 224, 24, + 231, 129, 68, 64, 28, 202, 2, 64, 31, 252, 38, 136, 156, 3, 218, 239, + 72, 9, 0, 87, 254, 32, 2, 136, 128, 63, 104, 72, 7, 230, 39, 64, + 8, 136, 1, 120, 221, 166, 244, 40, 0, 94, 202, 204, 125, 64, 8, 20, + 249, 241, 0, 195, 242, 1, 255, 242, 239, 253, 192, 25, 157, 243, 0, 104, + 143, 0, 127, 250, 0, 8, 20, 244, 255, 252, 140, 216, 0, 205, 138, 102, + 1, 153, 136, 3, 255, 254, 1, 255, 205, 41, 152, 6, 102, 38, 108, 0, + 102, 192, 0, 22, 240, 15, 211, 230, 1, 255, 255, 0, 255, 230, 187, 0, + 113, 128, 85, 32, 28, 224, 97, 65, 32, 19, 146, 128, 28, 219, 103, 32, + 172, 2, 200, 6, 38, 193, 0, 8, 22, 244, 248, 0, 201, 250, 1, 241, + 80, 120, 7, 220, 52, 64, 30, 147, 101, 0, 242, 177, 72, 7, 138, 131, + 192, 60, 60, 16, 64, 30, 99, 10, 0, 252, 138, 80, 1, 226, 171, 23, + 32, 14, 81, 20, 7, 0, 126, 99, 51, 0, 126, 224, 129, 0, 248, 156, + 108, 3, 244, 18, 160, 8, 20, 240, 251, 0, 255, 255, 128, 127, 250, 150, + 35, 204, 0, 23, 127, 96, 8, 20, 248, 253, 0, 213, 246, 0, 34, 0, + 74, 1, 202, 0, 80, 14, 43, 0, 120, 136, 2, 67, 16, 86, 0, 218, + 14, 161, 96, 25, 139, 124, 76, 64, 50, 162, 184, 7, 172, 1, 160, 28, + 38, 34, 64, 15, 153, 128, 31, 162, 0, 31, 253, 96, 8, 20, 249, 247, + 0, 199, 242, 0, 144, 15, 225, 112, 15, 233, 0, 252, 162, 224, 31, 112, + 200, 7, 207, 2, 192, 31, 48, 192, 7, 232, 22, 0, 249, 134, 28, 3, + 233, 30, 0, 249, 197, 64, 63, 72, 7, 243, 136, 7, 244, 128, 0, 8, + 20, 240, 1, 223, 250, 200, 2, 76, 67, 50, 105, 128, 40, 119, 50, 13, + 6, 25, 32, 1, 192, 182, 3, 0, 102, 12, 113, 16, 6, 17, 57, 24, + 7, 140, 192, 32, 31, 8, 8, 7, 194, 70, 1, 227, 51, 136, 128, 48, + 137, 240, 24, 3, 48, 99, 12, 24, 0, 164, 88, 40, 50, 237, 163, 64, + 4, 212, 77, 136, 0, 8, 22, 242, 255, 238, 145, 0, 196, 239, 43, 121, + 0, 79, 17, 92, 140, 128, 126, 98, 65, 0, 252, 224, 96, 31, 152, 12, + 3, 229, 52, 16, 3, 196, 87, 67, 32, 17, 59, 202, 222, 64, 18, 255, + 221, 34, 1, 255, 237, 7, 89, 32, 8, 239, 253, 102, 1, 201, 136, 102, + 76, 64, 8, 108, 119, 49, 163, 98, 0, 96, 130, 0, 21, 131, 0, 44, + 24, 3, 40, 88, 0, 200, 3, 196, 96, 19, 0, 121, 128, 2, 1, 254, + 17, 0, 127, 132, 0, 192, 30, 96, 8, 200, 3, 196, 96, 11, 5, 0, + 202, 22, 0, 96, 178, 0, 21, 131, 0, 6, 199, 110, 218, 52, 32, 18, + 98, 36, 33, 160, 28, 119, 255, 27, 208, 7, 225, 196, 113, 0, 254, 189, + 16, 8, 22, 243, 255, 236, 96, 14, 55, 115, 20, 208, 6, 72, 132, 241, + 170, 128, 63, 120, 120, 7, 226, 1, 0, 252, 64, 32, 31, 188, 56, 2, + 72, 132, 241, 178, 0, 70, 238, 97, 153, 0, 103, 255, 80, 112, 7, 229, + 23, 16, 15, 208, 12, 1, 249, 134, 64, 63, 164, 92, 3, 243, 4, 128, + 8, 22, 240, 1, 223, 126, 40, 6, 92, 69, 81, 85, 128, 6, 135, 110, + 185, 16, 224, 128, 196, 1, 72, 80, 4, 32, 24, 166, 193, 1, 148, 3, + 51, 0, 108, 43, 24, 64, 57, 53, 14, 122, 0, 56, 175, 160, 95, 64, + 60, 47, 202, 84, 10, 192, 29, 64, 161, 210, 128, 31, 188, 36, 64, 39, + 4, 4, 114, 234, 156, 129, 144, 4, 90, 33, 134, 60, 128, 0, 24, 243, + 255, 255, 32, 179, 96, 3, 55, 20, 206, 33, 153, 196, 1, 255, 255, 0, + 255, 252, 128, 8, 20, 250, 241, 0, 197, 242, 1, 255, 199, 48, 15, 254, + 241, 128, 127, 243, 204, 4, 3, 8, 31, 130, 0, 100, 15, 112, 146, 0, + 20, 131, 141, 14, 213, 52, 104, 65, 113, 21, 73, 138, 0, 0, 24, 242, + 252, 0, 246, 248, 145, 12, 3, 132, 140, 65, 1, 64, 51, 133, 128, 52, + 48, 3, 96, 32, 1, 1, 192, 50, 9, 128, 74, 36, 0, 49, 112, 13, + 224, 128, 11, 13, 0, 200, 26, 0, 64, 64, 12, 38, 128, 38, 128, 30, + 176, 68, 6, 128, 121, 67, 60, 28, 3, 196, 69, 67, 16, 15, 144, 133, + 0, 63, 104, 2, 192, 63, 32, 9, 128, 96, 0, 24, 243, 247, 0, 95, + 128, 15, 220, 131, 128, 10, 4, 12, 4, 32, 96, 34, 7, 3, 1, 1, + 96, 32, 6, 135, 3, 1, 16, 20, 12, 128, 64, 129, 132, 60, 149, 192, + 132, 0, 64, 36, 254, 64, 196, 0, 224, 53, 34, 1, 27, 0, 8, 28, + 117, 65, 196, 128, 14, 24, 12, 34, 192, 240, 1, 3, 129, 129, 56, 16, + 0, 64, 72, 0, 162, 12, 1, 16, 48, 3, 128, 4, 1, 48, 24, 0, + 192, 2, 1, 16, 112, 1, 64, 128, 0, 0, 24, 240, 207, 80, 12, 63, + 225, 15, 8, 0, 214, 16, 32, 106, 76, 0, 37, 23, 0, 160, 32, 1, + 33, 96, 24, 156, 92, 208, 212, 3, 164, 103, 195, 192, 60, 48, 38, 134, + 1, 243, 128, 56, 3, 244, 128, 36, 3, 225, 114, 99, 80, 15, 88, 68, + 2, 0, 56, 212, 148, 92, 152, 3, 120, 72, 2, 66, 4, 0, 166, 100, + 0, 11, 140, 128, 32, 60, 3, 64, 185, 0, 0, 24, 242, 253, 0, 225, + 254, 2, 66, 80, 13, 33, 32, 8, 9, 0, 204, 12, 0, 51, 192, 6, + 23, 16, 10, 2, 64, 22, 18, 1, 144, 148, 84, 152, 64, 58, 2, 100, + 22, 1, 229, 39, 53, 32, 15, 172, 1, 32, 31, 152, 12, 192, 31, 253, + 103, 0, 255, 232, 128, 8, 20, 252, 255, 252, 150, 205, 224, 3, 60, 207, + 96, 41, 0, 122, 194, 192, 61, 3, 2, 1, 196, 228, 224, 30, 144, 144, + 15, 34, 21, 0, 61, 33, 96, 30, 114, 129, 0, 225, 130, 112, 15, 88, + 64, 7, 145, 81, 64, 61, 0, 8, 143, 32, 130, 59, 251, 0, 39, 75, + 70, 136, 130, 221, 224, 1, 127, 128, 63, 255, 224, 2, 136, 0, 78, 224, + 23, 209, 9, 241, 0, 234, 6, 0, 227, 42, 0, 245, 17, 128, 115, 5, + 128, 112, 163, 0, 123, 133, 0, 57, 71, 128, 60, 234, 32, 29, 64, 224, + 28, 101, 64, 30, 163, 32, 14, 96, 160, 14, 20, 96, 15, 112, 160, 7, + 40, 112, 31, 75, 64, 136, 152, 29, 235, 15, 241, 0, 127, 255, 192, 17, + 2, 0, 59, 128, 0, 17, 208, 128, 11, 116, 1, 198, 68, 48, 13, 64, + 10, 0, 204, 170, 96, 9, 131, 184, 10, 0, 161, 68, 12, 129, 27, 0, + 24, 202, 130, 128, 20, 20, 15, 212, 35, 119, 252, 105, 17, 249, 0, 35, + 8, 53, 115, 4, 174, 1, 243, 144, 8, 20, 176, 2, 103, 246, 40, 4, + 214, 46, 227, 166, 1, 146, 216, 157, 9, 0, 68, 128, 68, 128, 66, 232, + 1, 132, 2, 25, 223, 249, 64, 44, 100, 171, 196, 0, 49, 68, 170, 24, + 128, 126, 23, 0, 56, 196, 188, 249, 0, 139, 21, 225, 97, 193, 64, 8, + 20, 244, 248, 0, 255, 238, 62, 254, 176, 6, 120, 117, 57, 112, 8, 118, + 169, 131, 2, 0, 98, 0, 20, 131, 128, 124, 129, 224, 31, 8, 24, 7, + 194, 6, 1, 242, 135, 128, 20, 3, 88, 56, 0, 181, 219, 10, 4, 1, + 11, 50, 25, 112, 8, 20, 176, 1, 223, 126, 168, 4, 152, 142, 193, 82, + 0, 160, 201, 150, 163, 26, 139, 152, 5, 228, 186, 24, 1, 147, 88, 65, + 192, 62, 16, 112, 15, 180, 48, 3, 20, 34, 139, 144, 5, 14, 224, 160, + 217, 141, 87, 48, 76, 71, 112, 220, 0, 8, 20, 240, 15, 163, 208, 3, + 255, 168, 187, 252, 224, 25, 168, 149, 33, 192, 3, 35, 181, 77, 16, 3, + 131, 16, 0, 152, 1, 225, 128, 31, 24, 56, 7, 198, 14, 1, 247, 134, + 0, 124, 224, 196, 0, 21, 0, 12, 142, 213, 60, 128, 38, 162, 84, 104, + 0, 0, 8, 20, 176, 1, 87, 126, 40, 4, 122, 168, 229, 80, 0, 209, + 218, 142, 55, 38, 25, 32, 10, 65, 124, 50, 103, 120, 113, 130, 51, 101, + 3, 0, 103, 255, 171, 66, 192, 62, 96, 116, 0, 138, 200, 108, 46, 162, + 181, 76, 19, 85, 29, 239, 16, 8, 23, 0, 14, 38, 135, 64, 14, 125, + 151, 139, 0, 199, 5, 127, 237, 0, 214, 16, 128, 2, 0, 194, 12, 1, + 209, 254, 96, 207, 249, 2, 230, 70, 15, 51, 40, 27, 49, 66, 217, 161, + 0, 255, 255, 128, 127, 240, 128, 15, 20, 240, 3, 111, 244, 63, 160, 60, + 132, 74, 64, 0, 96, 113, 221, 134, 0, 112, 145, 0, 144, 1, 224, 96, + 31, 206, 1, 252, 224, 31, 120, 96, 7, 206, 12, 64, 1, 96, 0, 200, + 237, 83, 196, 2, 106, 37, 118, 112, 12, 187, 251, 4, 12, 16, 160, 17, + 41, 16, 14, 174, 43, 66, 64, 23, 46, 229, 76, 64, 8, 20, 244, 247, + 0, 255, 238, 29, 255, 72, 128, 87, 128, 198, 218, 1, 22, 220, 233, 25, + 128, 12, 64, 21, 2, 128, 60, 3, 8, 7, 241, 128, 127, 250, 0, 8, + 20, 240, 12, 222, 128, 31, 112, 16, 7, 209, 204, 1, 248, 64, 59, 255, + 152, 3, 51, 70, 1, 233, 154, 128, 63, 254, 211, 53, 5, 76, 156, 25, + 163, 3, 102, 80, 23, 15, 48, 13, 60, 64, 24, 196, 64, 26, 184, 192, + 56, 64, 127, 248, 197, 154, 32, 10, 102, 80, 15, 255, 145, 0, 112, 168, + 28, 66, 124, 32, 21, 216, 169, 192, 8, 22, 244, 248, 0, 255, 241, 175, + 232, 128, 121, 40, 176, 64, 57, 44, 124, 64, 56, 236, 112, 128, 56, 180, + 44, 128, 60, 162, 18, 1, 250, 212, 228, 3, 206, 150, 76, 160, 31, 15, + 5, 16, 7, 199, 33, 224, 31, 153, 74, 128, 8, 20, 240, 255, 230, 0, + 204, 209, 128, 122, 102, 160, 15, 255, 248, 7, 255, 78, 102, 160, 169, 147, + 131, 52, 96, 108, 202, 0, 24, 177, 249, 191, 213, 191, 211, 0, 155, 28, + 168, 160, 184, 2, 87, 129, 20, 186, 144, 4, 96, 3, 48, 0, 192, 64, + 63, 255, 224, 31, 192, 8, 20, 180, 245, 76, 253, 145, 0, 186, 217, 128, + 218, 1, 46, 212, 233, 152, 128, 12, 64, 21, 131, 128, 60, 3, 8, 24, + 7, 255, 192, 8, 20, 176, 2, 95, 250, 208, 2, 107, 86, 98, 219, 1, + 73, 124, 203, 202, 74, 130, 196, 0, 54, 20, 96, 224, 25, 0, 220, 4, + 3, 16, 59, 128, 64, 48, 131, 152, 32, 6, 64, 58, 8, 16, 0, 192, + 81, 73, 124, 203, 202, 72, 26, 201, 152, 86, 192, 15, 20, 244, 246, 125, + 253, 96, 13, 18, 234, 82, 224, 17, 253, 83, 2, 4, 0, 162, 0, 55, + 7, 0, 120, 6, 192, 224, 15, 156, 4, 3, 231, 1, 0, 251, 3, 64, + 22, 1, 19, 2, 0, 15, 102, 90, 48, 32, 7, 87, 98, 151, 0, 190, + 59, 245, 128, 63, 250, 128, 15, 20, 240, 2, 239, 244, 199, 160, 61, 4, + 194, 184, 0, 96, 113, 153, 136, 0, 112, 145, 0, 140, 1, 224, 96, 31, + 206, 1, 252, 224, 31, 120, 96, 7, 206, 12, 64, 1, 80, 0, 192, 228, + 203, 200, 2, 122, 54, 118, 112, 12, 187, 253, 0, 31, 253, 80, 24, 16, + 188, 240, 109, 254, 80, 4, 200, 136, 34, 0, 61, 254, 250, 0, 45, 0, + 60, 160, 31, 254, 144, 8, 20, 176, 1, 223, 126, 184, 4, 152, 174, 193, + 22, 0, 144, 249, 150, 162, 64, 16, 128, 83, 76, 22, 28, 230, 4, 164, + 13, 107, 25, 244, 64, 18, 95, 219, 46, 9, 58, 0, 18, 100, 44, 113, + 34, 1, 8, 8, 160, 190, 98, 224, 152, 30, 149, 157, 159, 0, 8, 20, + 224, 9, 156, 3, 245, 192, 7, 255, 14, 127, 196, 31, 248, 54, 100, 33, + 51, 129, 25, 134, 12, 216, 3, 255, 212, 192, 128, 31, 112, 93, 77, 152, + 4, 180, 74, 206, 0, 8, 20, 179, 248, 0, 209, 232, 1, 255, 232, 16, + 15, 132, 3, 248, 129, 192, 50, 128, 78, 54, 207, 166, 1, 68, 22, 106, + 224, 0, 0, 22, 176, 223, 0, 225, 252, 10, 5, 0, 206, 20, 12, 28, + 1, 168, 24, 5, 80, 64, 2, 108, 1, 112, 48, 1, 130, 128, 36, 42, + 0, 81, 24, 6, 162, 45, 64, 28, 193, 84, 6, 0, 225, 70, 85, 8, + 7, 188, 75, 128, 62, 65, 18, 0, 64, 0, 24, 182, 242, 0, 85, 128, + 95, 10, 14, 0, 68, 0, 12, 52, 195, 64, 132, 12, 20, 16, 8, 128, + 226, 72, 28, 34, 4, 112, 197, 124, 3, 80, 7, 144, 38, 97, 65, 76, + 0, 160, 132, 136, 19, 28, 0, 24, 112, 25, 13, 2, 128, 70, 168, 0, + 71, 17, 0, 74, 24, 0, 193, 80, 13, 224, 96, 4, 12, 0, 0, 8, + 22, 183, 249, 0, 207, 244, 14, 140, 160, 3, 130, 160, 5, 13, 136, 112, + 112, 4, 52, 53, 37, 6, 1, 145, 209, 145, 192, 61, 32, 15, 0, 250, + 192, 18, 1, 230, 85, 73, 72, 6, 41, 26, 100, 100, 0, 184, 52, 1, + 67, 66, 16, 110, 96, 1, 177, 160, 7, 24, 241, 254, 0, 247, 120, 137, + 69, 64, 50, 138, 136, 72, 112, 6, 224, 144, 1, 153, 8, 0, 40, 102, + 0, 164, 44, 0, 193, 32, 25, 73, 128, 18, 42, 1, 214, 12, 131, 32, + 30, 97, 190, 6, 0, 249, 137, 88, 64, 62, 144, 5, 128, 126, 17, 33, + 0, 126, 113, 240, 15, 197, 4, 128, 30, 58, 192, 224, 15, 149, 71, 102, + 1, 224, 8, 20, 181, 255, 252, 110, 254, 80, 1, 18, 35, 156, 40, 64, + 58, 137, 212, 3, 153, 78, 0, 56, 228, 116, 3, 135, 67, 68, 3, 168, + 100, 192, 58, 17, 88, 3, 145, 192, 157, 249, 8, 0, 241, 29, 160, 31, + 15, 64, 12, 153, 32, 17, 219, 88, 5, 1, 68, 1, 34, 0, 48, 128, + 126, 16, 12, 96, 30, 64, 208, 1, 52, 19, 0, 62, 79, 4, 1, 44, + 84, 1, 36, 194, 40, 6, 64, 192, 12, 64, 96, 30, 16, 12, 32, 224, + 28, 102, 0, 232, 9, 0, 201, 77, 64, 25, 126, 192, 47, 5, 59, 176, + 7, 255, 96, 31, 15, 74, 195, 0, 208, 248, 96, 17, 80, 72, 6, 18, + 64, 14, 17, 0, 127, 240, 28, 4, 3, 24, 40, 6, 145, 165, 32, 0, + 224, 84, 128, 92, 47, 224, 7, 57, 132, 0, 96, 56, 6, 112, 16, 15, + 248, 68, 1, 132, 148, 3, 80, 64, 5, 139, 102, 1, 111, 32, 6, 1, + 24, 64, 61, 253, 80, 12, 198, 58, 106, 117, 32, 2, 149, 113, 250, 229, + 110, 172, 22, 74, 16, 5, 73, 169, 96, 0, 0, 0 + }; diff --git a/tests/src/test_cases/test_font_loader.c b/tests/src/test_cases/test_font_loader.c index aa5a7bc8d..c600758a0 100644 --- a/tests/src/test_cases/test_font_loader.c +++ b/tests/src/test_cases/test_font_loader.c @@ -1,4 +1,4 @@ -/** +/** * @file test_font_loader.c * */ @@ -9,6 +9,7 @@ #if LV_BUILD_TEST #include "../../lvgl.h" +//#include "lvgl.h" #include "unity/unity.h" @@ -25,7 +26,9 @@ **********************/ static int compare_fonts(lv_font_t * f1, lv_font_t * f2); -void test_font_loader(void); +void test_font_loader_with_cache(void); +void test_font_loader_no_cache(void); +void test_font_loader_from_buffer(void); /********************** * STATIC VARIABLES @@ -39,37 +42,88 @@ void test_font_loader(void); * GLOBAL FUNCTIONS **********************/ +/* fonts converted to C structs using the LVGL Font Converter */ extern lv_font_t font_1; extern lv_font_t font_2; extern lv_font_t font_3; -void test_font_loader(void) -{ - /*Test with cache ('A' has cache)*/ - lv_font_t * font_1_bin = lv_font_load("A:src/test_assets/font_1.fnt"); - lv_font_t * font_2_bin = lv_font_load("A:src/test_assets/font_2.fnt"); - lv_font_t * font_3_bin = lv_font_load("A:src/test_assets/font_3.fnt"); +/* font binaries converted to plain C arrays */ +extern uint8_t const font_1_buf[6876]; +extern uint8_t const font_2_buf[7252]; +extern uint8_t const font_3_buf[4892]; - compare_fonts(&font_1, font_1_bin); - compare_fonts(&font_2, font_2_bin); - compare_fonts(&font_3, font_3_bin); +static lv_font_t * font_1_bin; +static lv_font_t * font_2_bin; +static lv_font_t * font_3_bin; + +void setUp(void) +{ + /* Function run before every test */ +} + +void tearDown(void) +{ + /* Function run after every test */ + lv_obj_clean(lv_scr_act()); lv_font_free(font_1_bin); lv_font_free(font_2_bin); lv_font_free(font_3_bin); +} - /*Test with cache ('B' has NO cache)*/ +static void common(void) +{ + compare_fonts(&font_1, font_1_bin); + compare_fonts(&font_2, font_2_bin); + compare_fonts(&font_3, font_3_bin); + + /* create labels for testing */ + lv_obj_t * scr = lv_scr_act(); + lv_obj_t * label1 = lv_label_create(scr); + lv_obj_t * label2 = lv_label_create(scr); + lv_obj_t * label3 = lv_label_create(scr); + + lv_obj_set_flex_flow(scr, LV_FLEX_FLOW_COLUMN); + lv_obj_set_flex_align(scr, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER); + + lv_label_set_text(label1, "The quick brown fox jumped over the lazy dog"); + lv_obj_set_style_text_font(label1, font_1_bin, 0); + lv_label_set_text(label2, "The quick brown fox jumped over the lazy dog"); + lv_obj_set_style_text_font(label2, font_2_bin, 0); + lv_label_set_text(label3, "The quick brown fox jumped over the lazy dog"); + lv_obj_set_style_text_font(label3, font_3_bin, 0); + + TEST_ASSERT_EQUAL_SCREENSHOT("font_loader_1.png"); +} + +void test_font_loader_with_cache(void) +{ + /*Test with cache ('A' has cache)*/ + font_1_bin = lv_font_load("A:src/test_assets/font_1.fnt"); + font_2_bin = lv_font_load("A:src/test_assets/font_2.fnt"); + font_3_bin = lv_font_load("A:src/test_assets/font_3.fnt"); + + common(); +} + +void test_font_loader_no_cache(void) +{ + /*Test without cache ('B' has NO cache)*/ font_1_bin = lv_font_load("B:src/test_assets/font_1.fnt"); font_2_bin = lv_font_load("B:src/test_assets/font_2.fnt"); font_3_bin = lv_font_load("B:src/test_assets/font_3.fnt"); - compare_fonts(&font_1, font_1_bin); - compare_fonts(&font_2, font_2_bin); - compare_fonts(&font_3, font_3_bin); + common(); +} - lv_font_free(font_1_bin); - lv_font_free(font_2_bin); - lv_font_free(font_3_bin); +void test_font_loader_from_buffer(void) +{ + /*Test with memfs*/ + font_1_bin = lv_font_load_from_buffer((void *)&font_1_buf, sizeof(font_1_buf)); + font_2_bin = lv_font_load_from_buffer((void *)&font_2_buf, sizeof(font_2_buf)); + font_3_bin = lv_font_load_from_buffer((void *)&font_3_buf, sizeof(font_3_buf)); + + common(); } static int compare_fonts(lv_font_t * f1, lv_font_t * f2)